|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
--%%%%
--%
--% vtfontlib.lua - functions for dealing with VT fonts
--% Edrx, 2004jan10 (for Lua5)
--%
--%%%%
--% Our types:
--% rawarr: an array of raw char images, each padded to 32 bytes.
--% rawfont: a string of nchars*height bytes.
--% font: an array with entries nchars, height, 0..nchars-1 (w/len 32 each).
--% psf: four magic bytes followed by a rawfont.
--% gridstr: a user-friendly 2D representation, like demo_bigstr.
--% vcsa: nrows,ncols,crsr_x,crsr_y,nrows*ncols*(char,attr)
--%
--% The conversions (modulo extra info like height and nchars):
--% psffile <-> psf <-> rawfont <-> font <-> gridstr
--% rawfontfile <-> rawfont
--% isofont <-> pcfont
--% pixels <-> byte bytes <-> hex
--%
--% Here's how to do some of the conversions:
--% psffile -> psf readfile(fname)
--% psffile <- psf writefile(fname, psf)
--% psf -> font psftofont(psf)
--% psf <- font fonttopsf(font)
--% font -> gridstr fonttogridstr(font, 0, font.nchars-1)
--% font <- gridstr gridstrtofont(bigstr, nchars, height)
--%
--% rawfontfile -> rawfont readfile(fname)
--% rawfontfile <- rawfont writefile(fname, rawfont)
--% rawfont -> font rawfonttofont(rawfont, nchars, height)
--% rawfont <- font fonttorawfont(font, font.height)
--%
--% pixels -> byte pixelstobyte(pixels)
--% pixels <- byte bytetopixels(byte)
--% bytes -> hex bytestohex(bytes)
--% bytes <- hex hextobytes(hex)
--% "vcsa" corresponds to the contents of a "/dev/vcsann" in Linux,
--% and is used for taking screenshots.
--% «.tools_and_samples» (to "tools_and_samples")
--% «.demo_bigstr» (to "demo_bigstr")
--% «.psf_stuff» (to "psf_stuff")
--% «.psftofont» (to "psftofont")
--% «.fonttopsf» (to "fonttopsf")
--% «.gridstring_stuff» (to "gridstring_stuff")
--% «.bigstr_stuff» (to "bigstr_stuff")
--% «.bigstrtorawarr» (to "bigstrtorawarr")
--% «.bigstrtofont» (to "bigstrtofont")
--% «.fonttobigstr» (to "fonttobigstr")
--% «.other_conversions» (to "other_conversions")
--% «.rawfonttofont» (to "rawfonttofont")
--% «.fonttorawfont» (to "fonttorawfont")
--% «.vcsatounix» (to "vcsatounix")
--% «.explode» (to "explode")
--% «.split_clines» (to "split_clines")
--% «.changefont» (to "changefont")
--% «.makecomposes» (to "makecomposes")
--% «.trfont» (to "trfont")
--% «.setfont» (to "setfont")
--% «.e_scripts» (to "e_scripts")
--% «.vcsatoBIGstring» (to "vcsatoBIGstring")
-- «.gridstr-to-rawarr» (to "gridstr-to-rawarr")
--% (find-lua50file "etc/compat.lua")
--% (find-lua50ref "String Manipulation")
floor = math.floor
getn = table.getn
gsub = string.gsub
strbyte = string.byte
strlen = string.len
strrep = string.rep
strsub = string.sub
tinsert = table.insert
copy = function (arr)
local newarr = {}
for key,val in pairs(arr) do newarr[key] = arr[key] end
return newarr
end
append = function (table1, table2)
for i=1,table.getn(table2) do
table.insert(table1, table2[i])
end
return table1
end
-- (find-vtutil4file "lbitlib.c")
-- (find-vtutil4file "piofontx.c")
assertlbitlib = function ()
if not band then
assert(loadlib(scriptdir.."/lbitlib.so", "lua_bitlibopen"))()
end
end
assertpiofontx = function ()
if not piofontx then
assert(loadlib(scriptdir.."/piofontx.so", "piofontx_init"))()
end
end
assertlbitlib()
--%%%%%
--%
--% «tools_and_samples» (to ".tools_and_samples")
--%
--%%%%%
--% «demo_bigstr» (to ".demo_bigstr")
demo_bigstr = [[
+--------+--------+--------+--------+--------+--------+--------+--------+
| o | o | oo | | | | | |
| oo | o | oo o | o | o o | o o | |o |
|ooo o | ooo | oo | o o | o o | o o | oo oo |o |
| o | o o | oo | o o | o o | o o |o o o |oo oo |
| ooo | ooo | oo | o o | o o | o o |o o o |o o o |
| | o | oo | o o | o | oooooo | oo oo |o o oo |
| | o | o oo | | | | |oo o |
| | | oo | | | | | o |
+--------+--------+--------+--------+--------+--------+--------+--------+
| oooo | oooo |ooo ooo | | |
| o | o |o o | | |
| o | o |o o | | o o |
| o | o |o o |oo oooo |o o |
| | | |o o o o|o o |
| | | |o o o o|o o o |
| | | |o o o o| oo oo |
| | | | | |
+--------+--------+--------+--------+--------+]]
--%%%%
--%
--% pixels <-> byte
--%
--%%%%
bits = {128, 64, 32, 16, 8, 4, 2, 1}
padbytes_zeroes = strrep("\000", 32)
padbytes = function (bytes)
return strsub(bytes..padbytes_zeroes, 1, 32)
end
pixelstobyte = function (str)
local byte, i, bit = 0
for i, bit in bits do
if strbyte(str, i) ~= 32 then
byte = byte + bit
end
end
return byte
end
bytetopixels = function (byte)
local str, i, bit = ""
for i, bit in ipairs(bits) do
if band(byte, bit) ~= 0 then
str = str .. "o"
else
str = str .. " "
end
end
return str
end
--%%%%
--%
--% hex <-> bytes
--%
--%%%%
hextable = {
["0"]= 0, ["1"]= 1, ["2"]= 2, ["3"]= 3, ["4"]= 4,
["5"]= 5, ["6"]= 6, ["7"]= 7, ["8"]= 8, ["9"]= 9,
["a"]=10, ["b"]=11, ["c"]=12, ["d"]=13, ["e"]=14, ["f"]=15,
["A"]=10, ["B"]=11, ["C"]=12, ["D"]=13, ["E"]=14, ["F"]=15,
[0] ="0", [1] ="1", [2] ="2", [3] ="3", [4] ="5",
[5] ="5", [6] ="6", [7] ="7", [8] ="8", [9] ="9",
[10] ="a", [11] ="b", [12] ="c", [13] ="d", [14] ="e", [15] ="f"
}
hextobytes = function (hexstr)
local bytes = ""
for i=1,strlen(hexstr),2 do
local h1, h2 = substr(hexstr,i,i), substr(hexstr,i+1,i+1)
bytes = bytes .. string.char(hextable[h1]*16 + hextable[h2])
end
return bytes
end
bytetohex = function (n)
return hextable[iand(rshift(n, 4), 15)] .. hextable[iand(n, 15)]
end
bytestohex = function (bytes)
local s = ""
for i=1,strlen(bytes) do
s = s..bytetohex(string.byte(s, i))
end
return s
end
--%%%%
--%
--% psf <-> font
--%
--%%%%
psftofont = function (psf)
-- (find-fline "/usr/doc/console-tools/file-formats/psf" "psf_header =")
local magic1, magic2, filemode, height
magic1 = strbyte(psf, 1) -- 0x36
magic2 = strbyte(psf, 2) -- 0x04
filemode = strbyte(psf, 3) -- 0 means 256 chars, no unicode
height = strbyte(psf, 4) -- in scanlines; typically 8, 14 or 16
-- I'm not checking magic1, magic2, and filemode yet
return rawfonttofont(strsub(psf, 5), 256, height)
end
fonttopsf = function (font)
return string.char(54, 4, 0, font.height) .. fonttorawfont(font, font.height)
end
--%%%%%
--%
--% gridstr -> rawarr
--%
--%%%%%
--
-- «gridstr-to-rawarr» (to ".gridstr-to-rawarr")
stringtolines = function (str)
local lines = {}
local rest = string.gsub (str, "([^\n]*)\n", function (line)
table.insert(lines, line)
end)
if rest ~= "" then table.insert(lines, rest) end
return lines
end
linetobitmaps = function (line)
local pattern = "^|([ o][ o][ o][ o][ o][ o][ o][ o])(.*)"
local bitmaps = {n=0}
local found, _, bitmap, rest
while 1 do
found, _, bitmap, rest = string.find (line, pattern)
if not found then break end
table.insert(bitmaps, bitmap)
line = rest
end
return bitmaps
end
gridstrtorawarr = function (gridstr)
local lines = stringtolines(gridstr)
local nlines = table.getn(lines)
local bitmaps = {}
for i = 1,nlines do
table.insert(bitmaps, linetobitmaps(lines[i]))
end
local rawchars = {}
local i = 1
while i <= nlines do
if bitmaps[i].n > 0 then
local nbitmaps = bitmaps[i].n
local j = i
while 1 do
if j+1 <= nlines and bitmaps[j+1].n > 0 then
assert(nbitmaps == bitmaps[j+1].n, "bad gridstring (line "..j..")")
j = j+1
else break
end
end
for h = 1,nbitmaps do
local bytes = ""
for k = i,j do
bytes = bytes..string.char(pixelstobyte(bitmaps[k][h]))
end
table.insert(rawchars, padbytes(bytes))
end
i = j+1
else
i = i+1
end
end
return rawchars
end
--%%%%
--%
--% gridstr -> font
--%
--%%%%
-- gridstrtofont isn't very useful - gridstrs are used mainly
-- for modifying fonts, not for storing fonts in a readable format.
--
gridstrtofont = function (gridstr, nchars, height)
local font = {nchars = nchars, height = height}
local rawarr = bigstrtorawarr(bigstr)
local i
if getn(rawarr) ~= nchars then
printf("Warning: getn(rawarr)=%d, nchars=%d\n", getn(rawarr), nchars)
end
for i=0,nchars-1 do
font[i] = rawarr[i+1]
end
return font
end
--%%%%
--%
--% font -> gridstr
--% rawarr -> gridstr
--%
--%%%%
fonttogridstr_horizontalbar = function (nchars)
return "+" .. strrep("--------+", nchars) .. "\n"
end
fonttogridstr_bitmaps = function (font, c0, c1, v0, v1)
local gridstr = ""
for scanline = v0,v1 do
gridstr = gridstr .. "|"
for nchar = c0,c1 do
gridstr = gridstr..bytetopixels(strbyte(font[nchar], scanline)).."|"
end
gridstr = gridstr .. "\n"
end
return gridstr
end
fonttogridstr = function (font, c0, c2, charsperline, height)
c0 = c0 or 0
c2 = c2 or font.nchars
height = height or font.height
charsperline = charsperline or 8
local gridstr = fonttogridstr_horizontalbar(min(c2 - c0, charsperline))
while c0 < c2 do
local nchars = min(c2 - c0, charsperline)
gridstr = gridstr ..
fonttogridstr_bitmaps(font, c0, c0+nchars-1, 1, height) ..
fonttogridstr_horizontalbar(nchars)
c0 = c0 + nchars
end
return gridstr
end
rawarrtogridstr = fonttogridstr
--%%%%%
--%
--% font <-> rawfont
--%
--%%%%%
-- a "font" is a table with indices "nchars", "height", 0, 1, 2, ..., 255,
-- where each entry with a numeric index contains a char in raw form,
-- i.e., a string with length 32.
-- a "rawfont" is a string of nchars*height bytes.
rawfonttofont = function (rawfont, nchars, height)
nchars = nchars or 256
height = height or floor(strlen(rawfont)/nchars)
local font = {nchars = nchars, height = height}
local nchar
if strlen(rawfont) ~= nchars*height then
printf("Bad len: rawfont=%d nchars*height=%d\n",
strlen(rawfont), nchars*height)
end
for nchar=0,nchars-1 do
font[nchar] = padbytes(strsub(rawfont, nchar*height+1, (nchar+1)*height))
end
return font
end
fonttorawfont = function (font, scanlines)
local rawfont = ""
local nchar
for nchar=0,font.nchars-1 do
rawfont = rawfont .. strsub(font[nchar], 1, scanlines)
end
return rawfont
end
--%%%%%
--%
--% Functions for modifying fonts and keymaps
--%
--%%%%%
--% «changefont» (to ".changefont")
changefont = function (origfont, rawarr, cchars)
for i=1,getn(cchars) do
local c = cchars[i]
if strlen(c) == 1 and c ~= "." then
origfont[strbyte(c)] = rawarr[i]
end
end
return origfont
end
--% «makecomposes» (to ".makecomposes")
makecomposes = function (cchars, ckeyps)
local c, key1, key2, thiscompose
local composes = ""
local tickchar = function (c)
return "'"..gsub(c, "(['\\])", "\\%1").."'"
end
for i=1,getn(cchars) do
c = cchars[i]
if c ~= "." then
key1 = strsub(ckeyps[i], 1, 1)
key2 = strsub(ckeyps[i], 2, 2)
thiscompose = format("compose %s %s to %s\n",
tickchar(key1), tickchar(key2), tickchar(c))
if strlen(c) == 1 and c ~= "." then
composes = composes .. thiscompose
else
composes = composes .. "# " .. thiscompose
end
end
end
return composes
end
--%%%%
--%
--% pcfont <-> isofont
--%
--%%%%
-- (find-node "(elisp)Mapping Functions")
-- (find-fline "~/MTA/vtutil")
-- (find-fline "~/MTA/128")
-- (find-fline "~/MTA/128c")
-- (insert (mapconcat (lambda (c1) (format "\\%03d" c1)) "abcd" ""))
highglyphs_iso =
"\128\129\130\131\132\133\134\135\136\137\138\139\140\141\142\143" ..
"\144\145\146\147\148\149\150\151\152\153\154\155\156\157\158\159" ..
"\160\161\162\163\164\165\166\167\168\169\170\171\172\173\174\175" ..
"\176\177\178\179\180\181\182\183\184\185\186\187\188\189\190\191" ..
"\192\193\194\195\196\197\198\199\200\201\202\203\204\205\206\207" ..
"\208\209\210\211\212\213\214\215\216\217\218\219\220\221\222\223" ..
"\224\225\226\227\228\229\230\231\232\233\234\235\236\237\238\239" ..
"\240\241\242\243\244\245\246\247\248\249\250\251\252\253\254\255"
highglyphs_pc =
"\213\159\242\254\196\179\218\191\192\217\195\180\194\193\197\205" ..
"\186\201\187\200\188\204\185\203\202\206\223\220\219\176\177\178" ..
"\255\173\189\156\207\190\221\245\249\184\166\174\170\240\169\238" ..
"\248\241\253\252\239\230\244\250\247\251\167\175\172\171\243\168" ..
"\183\181\182\199\142\143\146\128\212\144\210\211\222\214\215\216" ..
"\209\165\227\224\226\229\153\158\157\235\233\234\154\237\232\225" ..
"\133\160\131\198\132\134\145\135\138\130\136\137\141\161\140\139" ..
"\208\164\149\162\147\228\148\246\155\151\163\150\129\236\231\152"
trfont = function (font, trstr1, trstr2)
local newfont = copy(font)
for i=1,strlen(trstr1) do
newfont[strbyte(trstr2, i)] = font[strbyte(trstr1, i)]
end
return newfont
end
isofonttopcfont = function (font)
return trfont(font, highglyphs_iso, highglyphs_pc)
end
pcfonttoisofont = function (font)
return trfont(font, highglyphs_pc, highglyphs_iso)
end
do
local idfont = {}
for i = 128,255 do idfont[i]=i end
local tmpfont = isofonttopcfont(idfont)
local tmpstr = ""
for i = 128,255 do tmpstr = tmpstr..string.char(tmpfont[i]) end
highglyphs_pc_reverse = tmpstr
end
--%%%%
--%
--% setfont
--%
--%%%%
-- (find-angg "LUA/piofontx.c")
setfont = function (font, forcedheight)
local rawfont32 = fonttorawfont(font, 32)
local err
assertpiofontx()
err = piofontx(rawfont32, font.nchars, forcedheight or font.height)
if err then
printf("piofontx error: %s\n", err)
end
end
setfont_force = function (font)
setfont(font, font.height-1)
setfont(font)
end
--%%%%
--%
--% vcsa -> text / pnm
--% (for screenshots of VTs)
--%
--%%%%
-- vcsatotext takes just the "char" bytes of a vcsa string (i.e., drop
-- the "fg/bg" bytes), trims the lines, and adds the "\n"s; the result
-- is a standard unix text file.
-- (find-angg ".zshrc" "vt")
-- (find-lua50ref "Patterns" "followed by `-'" "shortest")
-- mylua -e 'p(gsub("abcdefg", "(.).", "%1"))'
vcsatotext = function (vcsa)
local lines, columns, cursorx, cursory =
strbyte(vcsa, 1), strbyte(vcsa, 2), strbyte(vcsa, 3), strbyte(vcsa, 4)
local bigstr = ""
for y=1,lines-1 do
pairs = strsub(vcsa, y*columns*2+5, (y+1)*columns*2+4)
str = gsub(pairs, "(.).", "%1")
str = gsub(str, "(.) -", "%1")
bigstr = bigstr .. str .. "\n"
end
return bigstr
end
--[[
* (eepitch-lua51)
* (eepitch-kill)
* (eepitch-lua51)
dofile "vtfontlib.lua"
-- (find-sh "sudo cat /dev/vcsa5")
bigstr = getoutput "sudo cat /dev/vcsa5"
= vcsatotext(bigstr)
--]]
--% (find-k24file "drivers/char/vc_screen.c" "4 bytes lines,columns,x,y")
--% (find-angg "MTA/vtutilsh.c" "vcsa2pnmdata")
--% (find-angg "MTA/vtutil" "vcsa2pnm")
--% (find-status "netpbm-dev")
--% (find-vldifile "netpbm-dev.list")
--% (find-man "5 ppm")
vcsa_colors = {
[0]=" 0 0 0", [1]=" 0 0 2", [2]=" 0 2 0", [3]=" 0 2 2",
[4]=" 2 0 0", [5]=" 2 0 2", [6]=" 2 1 0", [7]=" 2 2 2",
[8]=" 1 1 1", [9]=" 1 1 3", [10]=" 1 3 1", [11]=" 1 3 3",
[12]=" 3 1 1", [13]=" 3 1 3", [14]=" 3 3 1", [15]=" 3 3 3",
}
digit_colors = {
"1", "2", "3", "4", "5", "6", "7",
"8", "9", "A", "B", "C", "D", "E", "F", [0]="0"
}
wordstoscreenshot = function (words, font, width, colors)
local bigstr, rowstr, char, attr, charscanline, fg, bg, minirowstr
bigstr = ""
for scanline=1,font.height do
rowstr = ""
for col=0,strlen(words)/2-1 do
char = strbyte(words, col*2+1)
attr = strbyte(words, col*2+2)
charscanline = strbyte(font[char], scanline)
bg = colors[rshift(attr, 4)]
fg = colors[band(attr, 15)]
minirowstr = ""
for i,bit in bits do
if band(charscanline, bit) ~= 0 then
minirowstr = minirowstr .. fg
else
minirowstr = minirowstr .. bg
end
end
if width == 9 then
minirowstr = minirowstr .. bg
end
rowstr = rowstr .. minirowstr
end
bigstr = bigstr .. rowstr .. "\n"
end
end
vcsatopnm0 = function (vcsa, font, width, colors)
local lines, columns, cursorx, cursory =
strbyte(vcsa, 1), strbyte(vcsa, 2), strbyte(vcsa, 3), strbyte(vcsa, 4)
local header = format("P3\n%d %d\n3\n", columns*width, lines*font.height)
local bigstr = ""
for bigy=0,lines-1 do
words = strsub(vcsa, bigy*columns*2+5, (bigy+1)*columns*2+4)
bigstr = bigstr .. wordstoscreenshot(words, font, width, colors)
end
return header .. bigstr
end
vcsatopnm = function (vcsa, font, width, colors)
local lines, columns, cursorx, cursory =
strbyte(vcsa, 1), strbyte(vcsa, 2), strbyte(vcsa, 3), strbyte(vcsa, 4)
local header = format("P3\n%d %d\n3\n", columns*width, lines*font.height)
local bigstr = ""
local bigy, rowpairs, bigrowstr, scanline, rowstr, col, char, attr,
charscanline, fg, bg, minirowstr, i, bit
for bigy=0,lines-1 do
rowpairs = strsub(vcsa, bigy*columns*2+5, (bigy+1)*columns*2+4)
bigrowstr = ""
for scanline=1,font.height do
rowstr = ""
for col=0,columns-1 do
char = strbyte(rowpairs, col*2+1)
attr = strbyte(rowpairs, col*2+2)
-- px(char, scanline)
charscanline = strbyte(font[char], scanline)
bg = colors[rshift(attr, 4)]
fg = colors[band(attr, 15)]
minirowstr = ""
for i,bit in bits do
if band(charscanline, bit) ~= 0 then
minirowstr = minirowstr .. fg
else
minirowstr = minirowstr .. bg
end
end
if width == 9 then
minirowstr = minirowstr .. bg
end
rowstr = rowstr .. minirowstr
end
bigrowstr = bigrowstr .. rowstr .. "\n"
end
bigstr = bigstr .. bigrowstr
end
return header .. bigstr
end
--%%%%
--%
--% loadfont and savefont
--%
--%%%%
loadfont = function (fname)
local str = readfile(fname)
if band(strlen(str), 255) == 0 then
return rawfonttofont(str)
elseif band(strlen(str), 255) == 4 then
return psftofont(str)
end
printf("loadfont: str is not a font (len=%d\n)", strlen(str))
end
savefont = function (font, fname, charsperline)
if strsub(fname, -4) == ".psf" then
writefile(fname, fonttopsf(font))
printf("Saved as psf: %s\n", fname)
elseif strsub(fname, -5) == ".grid" then
writefile(fname, fonttogridstr(font, nil, nil, charsperline))
printf("Saved as grid: %s\n", fname)
else
writefile(fname, fonttorawfont(font, font.height))
printf("Saved as raw font: %s\n", fname)
end
end
--%%%%
--%
--% functions dealing with modifying chars in a font
--%
--%%%%
isdefinablechar = function (str)
if string.find(str, "^[\001-\031\127-\255]$") then return true end
end
iscomposepair = function (str)
if string.find(str, "^[ -~][ -~]$") then return true end
end
mathcharstuff = function (gridstr, ...)
local strarr1 = {}
local strarr2 = {}
local strarr3 = {}
for i=1,getn(arg),3 do append(strarr1, split(arg[i])) end
for i=2,getn(arg),3 do append(strarr2, split(arg[i])) end
for i=3,getn(arg),3 do append(strarr3, split(arg[i])) end
return gridstrtorawarr(gridstr), strarr1, strarr2, strarr3
end
modifyfont = function (font, mimages, mchars)
for i=1,getn(mimages) do
local c = mchars[i]
if isdefinablechar(c) then
font[strbyte(c)] = mimages[i]
end
end
end
-- These ones should be moved elsewhere, but they're still experimental
Modifyfont = function ()
modifyfont(FONT, MIMAGES, MCHARS)
end
Prepidtom = function ()
IDTOM = IDTOM or {}
for i=1,getn(MIMAGES) do
local c, name, pair = MCHARS[i], MNAMES[i], MPAIRS[i]
if isdefinablechar(c) then IDTOM[c] = i end
if iscomposepair(pair) then IDTOM[pair] = i end
IDTOM[name] = i
end
end
--%%%%
--%
--% functions for making "compose.el"'s compose tables
--%
--%%%%
quote = function (str)
return string.gsub(str, "([\\\"])", "\\%1")
end
transformlines = function (str, f)
local newstr = ""
for _,line in ipairs(stringtolines(str)) do
newstr = newstr .. f(line) .. "\n"
end
return newstr
end
composeslinetoelline = function (str)
local compstr = ""
for _,w in split(str) do
if string.len(w) == 1 then
compstr = compstr .. " ?" .. quote(w)
else
compstr = compstr .. " \"" .. quote(w) .."\""
end
end
return compstr
end
composestoel = function (composes, setq)
setq = setq or "setq composes-localmath"
local comment = transformlines(composes, function (line)
return ";;" .. line
end)
local elpairs = transformlines(composes, composeslinetoelline)
return format("%s;;\n" ..
"(%s '(\n%s))\n" ..
"(composes-update)\n", comment, setq, elpairs)
end
COMPOSES = ""
COMPOSESN = 0 -- number of compose pairs in the last line of COMPOSES
Addcompose = function (pair, c, maxwidth)
if pair and c and iscomposepair(pair) and isdefinablechar(c) then
COMPOSES = COMPOSES .. " " .. pair .. " " .. c
COMPOSESN = COMPOSESN + 1
end
if maxwidth and COMPOSESN >= maxwidth then
COMPOSES = COMPOSES .. "\n"
COMPOSESN = 0
end
return COMPOSES
end
Addcomposechars = function (chars, maxwidth)
for i=1,strlen(chars) do
local c = strsub(chars, i, i)
print(c, c == "\n")
if c == "\n" then
Addcompose(nil, nil, 0)
elseif isdefinablechar(c) then
Addcompose(MPAIRS[IDTOM[c]], c, maxwidth or 8)
end
end
return COMPOSES
end
Mcomposes = function ()
for i=1,getn(MIMAGES) do
Addcompose(MPAIRS[i], MCHARS[i], 8)
end
return Addcompose(nil, nil, 1)
end
Composestoel = function (setq) return composestoel(COMPOSES, setq) end
--[[
#*
cd ~/vtutil4/
lua50 vtutil.lua -e 'Prepidtom();print(Mcomposes())' > ~/o
lua50 vtutil.lua -e 'Prepidtom();Mcomposes();print(Composestoel())' > ~/o2
# (find-fline "~/o")
# (find-fline "~/o2")
#*
cd ~/vtutil4/
lua50 vtutil.lua -e '
Prepidtom();
Addcomposechars([=[
ýÝÎþÌ¢
§®∧⊃¨
©³¿ÅÐ
ñÞ¤¥Ë¸Ñ
¯¦÷£î
Þ寨ð
ÛÏ]=]);
writefile("/tmp/o",Composestoel())
'
# (find-fline "/tmp/o")
#*
--]]
--%%%%
--%
--% functions using global variables
--%
--%%%%
Pctoiso = function () FONT = pcfonttoisofont(FONT) end
Loadfont = function (fname) FONT = loadfont(fname) end
Loadpcfont = function (fname) Loadfont(fname); Pctoiso() end
Writefont = function (fname, charsperline)
savefont(FONT, fname, charsperline)
end
Setfont = function () setfont(FONT) end
Readvcsa = function (devfname) VCSA = readfile(devfname) end
Vcsatotext = function () TEXT = vcsatotext(VCSA) end
Vcsatopnm = function (width)
PNM = vcsatopnm(VCSA, FONT, width or 9, vcsa_colors)
end
-- (find-luafile "README.rttpatch")
-- (find-luanode "For Statement")
-- (find-luanode "strbyte")
-- (find-lua50ref "Lexical Conventions" "long comment")
--[[
#*
cd ~/vtutil4/
lua50 vtutil.lua -e '
Loadfont("ega1-iso.8");
Modifyfont();
Writefont("isomath.8")
'
#*
cd ~/vtutil4/
lua50 vtutil.lua -e 'Readvcsa("/dev/vcsa5");Vcsatotext();print(TEXT)'
#*
cd ~/vtutil4/
lua50 vtutil.lua -e '
Readvcsa("/dev/vcsa1");Loadfont("isomath.8");
Vcsatopnm();writefile("/tmp/v.pnm",PNM)
'
cd /tmp/
pnmtojpeg v.pnm > v.jpeg
pnmtopng v.pnm > v.png
rm -fv /tmp/.xvpics/v.*
ls -l v.*
#*
--]]
-- ee-imenu-re: "\n\\([A-Za-z0-9_]+\\) ="
-- ee-comment-format: "-- %s\n"
-- Local Variables:
-- coding: raw-text-unix
-- ee-anchor-format: "\n%s ="
-- ee-anchor-format: "«%s»"
-- End: