From 139e350aef0016037e1db086dbdb093627dd5a30 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Thu, 6 Dec 2007 16:24:00 +0100 Subject: stable 2007.12.06 16:24 --- scripts/context/lua/luatools.lua | 482 +++++++++++++++++++++++++++++--------- scripts/context/lua/mtxrun.lua | 326 +++++++++++++++++++------- tex/context/base/cont-new.tex | 2 +- tex/context/base/context.tex | 2 +- tex/context/base/core-syn.lua | 2 +- tex/context/base/font-def.lua | 17 +- tex/context/base/font-ini.tex | 6 +- tex/context/base/font-otf.lua | 140 ++++++++--- tex/context/base/l-os.lua | 2 + tex/context/base/luat-inp.lua | 2 +- tex/context/base/luat-tmp.lua | 4 +- tex/context/base/regi-ini.mkii | 2 +- tex/context/base/x-mmp.mkiv | 3 + tex/context/interface/keys-cz.xml | 2 +- tex/context/interface/keys-de.xml | 2 +- tex/context/interface/keys-en.xml | 2 +- tex/context/interface/keys-fr.xml | 2 +- tex/context/interface/keys-it.xml | 2 +- tex/context/interface/keys-nl.xml | 2 +- tex/context/interface/keys-ro.xml | 2 +- 20 files changed, 760 insertions(+), 244 deletions(-) diff --git a/scripts/context/lua/luatools.lua b/scripts/context/lua/luatools.lua index 1dc67519e..7740bf524 100644 --- a/scripts/context/lua/luatools.lua +++ b/scripts/context/lua/luatools.lua @@ -446,12 +446,17 @@ function table.sortedkeys(tab) srt[#srt+1] = key if kind == 3 then -- no further check - elseif type(key) == "string" then - if kind == 2 then kind = 3 else kind = 1 end - elseif type(key) == "number" then - if kind == 1 then kind = 3 else kind = 2 end else - kind = 3 + local tkey = type(key) + if tkey == "string" then + -- if kind == 2 then kind = 3 else kind = 1 end + kind = (kind == 2 and 3) or 1 + elseif tkey == "number" then + -- if kind == 1 then kind = 3 else kind = 2 end + kind = (kind == 1 and 3) or 2 + else + kind = 3 + end end end if kind == 0 or kind == 3 then @@ -474,52 +479,96 @@ function table.prepend(t, list) end end +--~ function table.merge(t, ...) +--~ for _, list in ipairs({...}) do +--~ for k,v in pairs(list) do +--~ t[k] = v +--~ end +--~ end +--~ return t +--~ end + function table.merge(t, ...) - for _, list in ipairs({...}) do - for k,v in pairs(list) do + local lst = {...} + for i=1,#lst do + for k, v in pairs(lst[i]) do t[k] = v end end return t end +--~ function table.merged(...) +--~ local tmp = { } +--~ for _, list in ipairs({...}) do +--~ for k,v in pairs(list) do +--~ tmp[k] = v +--~ end +--~ end +--~ return tmp +--~ end + function table.merged(...) - local tmp = { } - for _, list in ipairs({...}) do - for k,v in pairs(list) do + local tmp, lst = { }, {...} + for i=1,#lst do + for k, v in pairs(lst[i]) do tmp[k] = v end end return tmp end +--~ function table.imerge(t, ...) +--~ for _, list in ipairs({...}) do +--~ for _, v in ipairs(list) do +--~ t[#t+1] = v +--~ end +--~ end +--~ return t +--~ end + function table.imerge(t, ...) - for _, list in ipairs({...}) do - for k,v in ipairs(list) do - t[#t+1] = v + local lst = {...} + for i=1,#lst do + local nst = lst[i] + for j=1,#nst do + t[#t+1] = nst[j] end end return t end +--~ function table.imerged(...) +--~ local tmp = { } +--~ for _, list in ipairs({...}) do +--~ for _,v in pairs(list) do +--~ tmp[#tmp+1] = v +--~ end +--~ end +--~ return tmp +--~ end + function table.imerged(...) - local tmp = { } - for _, list in ipairs({...}) do - for _,v in pairs(list) do - tmp[#tmp+1] = v + local tmp, lst = { }, {...} + for i=1,#lst do + local nst = lst[i] + for j=1,#nst do + tmp[#tmp+1] = nst[j] end end return tmp end -if not table.fastcopy then +if not table.fastcopy then do + + local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable - function table.fastcopy(old) -- fast one + local function fastcopy(old) -- fast one if old then local new = { } for k,v in pairs(old) do if type(v) == "table" then - new[k] = table.fastcopy(v) -- was just table.copy + new[k] = fastcopy(v) -- was just table.copy else new[k] = v end @@ -534,11 +583,15 @@ if not table.fastcopy then end end -end + table.fastcopy = fastcopy + +end end + +if not table.copy then do -if not table.copy then + local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable - function table.copy(t, tables) -- taken from lua wiki, slightly adapted + local function copy(t, tables) -- taken from lua wiki, slightly adapted tables = tables or { } local tcopy = {} if not tables[t] then @@ -549,7 +602,7 @@ if not table.copy then if tables[i] then i = tables[i] else - i = table.copy(i, tables) + i = copy(i, tables) end end if type(v) ~= "table" then @@ -557,7 +610,7 @@ if not table.copy then elseif tables[v] then tcopy[i] = tables[v] else - tcopy[i] = table.copy(v, tables) + tcopy[i] = copy(v, tables) end end local mt = getmetatable(t) @@ -567,7 +620,9 @@ if not table.copy then return tcopy end -end + table.copy = copy + +end end -- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack) @@ -640,7 +695,9 @@ do end if n == #t then local tt = { } - for _,v in ipairs(t) do + -- for _,v in ipairs(t) do + for i=1,#t do + local v = t[i] local tv = type(v) if tv == "number" or tv == "boolean" then tt[#tt+1] = tostring(v) @@ -669,15 +726,16 @@ do end else depth = "" - if type(name) == "string" then + local tname = type(name) + if tname == "string" then if name == "return" then handle("return {") else handle(name .. "={") end - elseif type(name) == "number" then + elseif tname == "number" then handle("[" .. name .. "]={") - elseif type(name) == "boolean" then + elseif tname == "boolean" then if name then handle("return {") else @@ -692,7 +750,7 @@ do local inline = compact and table.serialize_inline local first, last = nil, 0 -- #root cannot be trusted here if compact then - for k,v in ipairs(root) do + for k,v in ipairs(root) do -- NOT: for k=1,#root do if not first then first = k end last = last + 1 end @@ -1059,32 +1117,53 @@ end do + local sb = string.byte + +--~ local nextchar = { +--~ [ 4] = function(f) +--~ return f:read(1), f:read(1), f:read(1), f:read(1) +--~ end, +--~ [ 2] = function(f) +--~ return f:read(1), f:read(1) +--~ end, +--~ [ 1] = function(f) +--~ return f:read(1) +--~ end, +--~ [-2] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ return b, a +--~ end, +--~ [-4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ return d, c, b, a +--~ end +--~ } + local nextchar = { [ 4] = function(f) - return f:read(1), f:read(1), f:read(1), f:read(1) + return f:read(1,1,1,1) end, [ 2] = function(f) - return f:read(1), f:read(1) + return f:read(1,1) end, [ 1] = function(f) return f:read(1) end, [-2] = function(f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) return b, a end, [-4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local c = f:read(1) + local a, b, c, d = f:read(1,1,1,1) return d, c, b, a end } function io.characters(f,n) - local sb = string.byte if f then return nextchar[n or 1], f else @@ -1096,12 +1175,62 @@ end do + local sb = string.byte + +--~ local nextbyte = { +--~ [4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ if d then +--~ return sb(a), sb(b), sb(c), sb(d) +--~ else +--~ return nil, nil, nil, nil +--~ end +--~ end, +--~ [2] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ if b then +--~ return sb(a), sb(b) +--~ else +--~ return nil, nil +--~ end +--~ end, +--~ [1] = function (f) +--~ local a = f:read(1) +--~ if a then +--~ return sb(a) +--~ else +--~ return nil +--~ end +--~ end, +--~ [-2] = function (f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ if b then +--~ return sb(b), sb(a) +--~ else +--~ return nil, nil +--~ end +--~ end, +--~ [-4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ if d then +--~ return sb(d), sb(c), sb(b), sb(a) +--~ else +--~ return nil, nil, nil, nil +--~ end +--~ end +--~ } + local nextbyte = { [4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local d = f:read(1) + local a, b, c, d = f:read(1,1,1,1) if d then return sb(a), sb(b), sb(c), sb(d) else @@ -1109,8 +1238,7 @@ do end end, [2] = function(f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) if b then return sb(a), sb(b) else @@ -1126,8 +1254,7 @@ do end end, [-2] = function (f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) if b then return sb(b), sb(a) else @@ -1135,10 +1262,7 @@ do end end, [-4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local d = f:read(1) + local a, b, c, d = f:read(1,1,1,1) if d then return sb(d), sb(c), sb(b), sb(a) else @@ -1148,7 +1272,6 @@ do } function io.bytes(f,n) - local sb = string.byte if f then return nextbyte[n or 1], f else @@ -1256,6 +1379,40 @@ if not os.setenv then function os.setenv() return false end end +if not os.times then + -- utime = user time + -- stime = system time + -- cutime = children user time + -- cstime = children system time + function os.times() + return { + utime = os.clock(), -- user + stime = 0, -- system + cutime = 0, -- children user + cstime = 0, -- children system + } + end +end + +if os.gettimeofday then + os.clock = os.gettimeofday +else + os.gettimeofday = os.clock +end + +do + local startuptime = os.gettimeofday() + function os.runtime() + return os.gettimeofday() - startuptime + end +end + +--~ print(os.gettimeofday()-os.time()) +--~ os.sleep(1.234) +--~ print (">>",os.runtime()) +--~ print(os.date("%H:%M:%S",os.gettimeofday())) +--~ print(os.date("%H:%M:%S",os.time())) + -- filename : l-md5.lua -- author : Hans Hagen, PRAGMA-ADE, Hasselt NL @@ -1490,35 +1647,25 @@ if lfs then --~ mkdirs(".","/a/b/c") --~ mkdirs("a","b","c") - function dir.mkdirs(...) -- root,... or ... ; root is not split - local pth, err = "", false - for k,v in pairs({...}) do - if k == 1 then - if not lfs.isdir(v) then - -- print("no root path " .. v) - err = true - else - pth = v - end - elseif lfs.isdir(pth .. "/" .. v) then - pth = pth .. "/" .. v + function dir.mkdirs(...) + local pth, err, lst = "", false, table.concat({...},"/") + for _, s in ipairs(lst:split("/")) do + if pth == "" then + pth = (s == "" and "/") or s else - for _,s in pairs(v:split("/")) do - pth = pth .. "/" .. s - if not lfs.isdir(pth) then - ok = lfs.mkdir(pth) - if not lfs.isdir(pth) then - err = true - end - end - if err then break end - end + pth = pth .. "/" .. s + end + if s == "" then + -- can be network path + elseif not lfs.isdir(pth) then + lfs.mkdir(pth) end - if err then break end end return pth, not err end + dir.makedirs = dir.mkdirs + end @@ -1537,11 +1684,12 @@ end function toboolean(str,tolerant) if tolerant then - if type(str) == "string" then + local tstr = type(str) + if tstr == "string" then return str == "true" or str == "yes" or str == "on" or str == "1" - elseif type(str) == "number" then + elseif tstr == "number" then return tonumber(str) ~= 0 - elseif type(str) == "nil" then + elseif tstr == "nil" then return false else return str @@ -2207,7 +2355,7 @@ end function input.bare_variable(str) -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") - return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") + return (str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")) end if texio then @@ -2269,27 +2417,35 @@ input.settrace(tonumber(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRA -- These functions can be used to test the performance, especially -- loading the database files. -function input.starttiming(instance) - if instance then - instance.starttime = os.clock() - if not instance.loadtime then - instance.loadtime = 0 +do + local clock = os.clock + + function input.starttiming(instance) + if instance then + instance.starttime = clock() + if not instance.loadtime then + instance.loadtime = 0 + end end end -end -function input.stoptiming(instance, report) - if instance and instance.starttime then - instance.stoptime = os.clock() - local loadtime = instance.stoptime - instance.starttime - instance.loadtime = instance.loadtime + loadtime - if report then - input.report('load time', string.format("%0.3f",loadtime)) + function input.stoptiming(instance, report) + if instance then + local starttime = instance.starttime + if starttime then + local stoptime = clock() + local loadtime = stoptime - starttime + instance.stoptime = stoptime + instance.loadtime = instance.loadtime + loadtime + if report then + input.report('load time', string.format("%0.3f",loadtime)) + end + return loadtime + end end - return loadtime - else return 0 end + end function input.elapsedtime(instance) @@ -4208,12 +4364,13 @@ caches.trace = false caches.tree = false caches.temp = caches.temp or os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil caches.paths = caches.paths or { caches.temp } +caches.force = false input.usecache = not toboolean(os.getenv("TEXMFSHARECACHE") or "false",true) -- true if caches.temp and caches.temp ~= "" and lfs.attributes(caches.temp,"mode") ~= "directory" then - if io.ask(string.format("Should I create the cache path %s?",caches.temp), "no", { "yes", "no" }) == "yes" then - lfs.mkdir(caches.temp) + if caches.force or io.ask(string.format("Should I create the cache path %s?",caches.temp), "no", { "yes", "no" }) == "yes" then + dir.mkdirs(caches.temp) end end if not caches.temp or caches.temp == "" then @@ -4419,7 +4576,7 @@ function input.aux.save_data(instance, dataname, check) input.report("preparing " .. dataname .. " in", luaname) for k, v in pairs(files) do if not check or check(v,k) then -- path, name - if #v == 1 then + if type(v) == "table" and #v == 1 then files[k] = v[1] end else @@ -4602,8 +4759,8 @@ end function input.storage.dump() for name, data in ipairs(input.storage.data) do local evaluate, message, original, target = data[1], data[2], data[3] ,data[4] - local name, initialize, finalize = nil, "", "" - for str in string.gmatch(target,"([^%.]+)") do + local name, initialize, finalize, code = nil, "", "", "" + for str in target:gmatch("([^%.]+)") do if name then name = name .. "." .. str else @@ -4617,15 +4774,15 @@ function input.storage.dump() input.storage.max = input.storage.max + 1 if input.storage.trace then logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max)) - lua.bytecode[input.storage.max] = loadstring( + code = initialize .. string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) .. table.serialize(original,name) .. finalize - ) else - lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize) + code = initialize .. table.serialize(original,name) .. finalize end + lua.bytecode[input.storage.max] = loadstring(code) end end @@ -4957,18 +5114,22 @@ if texconfig and not texlua then else input.logger('+ ' .. tag .. ' opener',filename) -- todo: file;name -> freeze / eerste regel scannen -> freeze + local filters = input.filters t = { reader = function(self) local line = file_handle:read() if line == "" then return "" - elseif input.filters.utf_translator then - return input.filters.utf_translator(line) - elseif input.filters.dynamic_translator then - return input.filters.dynamic_translator(line) - else - return line end + local translator = filters.utf_translator + if translator then + return translator(line) + end + translator = filters.dynamic_translator + if translator then + return translator(line) + end + return line end, close = function() input.logger('= ' .. tag .. ' closer',filename) @@ -5119,8 +5280,8 @@ if texconfig and not texlua then function input.register_start_actions(f) table.insert(input.start_actions, f) end function input.register_stop_actions (f) table.insert(input.stop_actions, f) end ---~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end) ---~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end) + --~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end) + --~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end) end @@ -5263,6 +5424,103 @@ function cs.testcase(b) end end +-- This is not the most ideal place, but it will do. Maybe we need to move +-- attributes to node-att.lua. + +if node then + + nodes = nodes or { } + + do + + -- just for testing + + local reserved = { } + + function nodes.register(n) + reserved[#reserved+1] = n + end + + function nodes.cleanup_reserved(nofboxes) -- todo + local nr, free = #reserved, node.free + for i=1,nr do + free(reserved[i]) + end + local nl, tb, flush = 0, tex.box, node.flush_list + if nofboxes then + for i=1,nofboxes do + local l = tb[i] + if l then + flush(l) + tb[i] = nil + nl = nl + 1 + end + end + end + reserved = { } + return nr, nl, nofboxes + end + + -- nodes.register = function() end + -- nodes.cleanup_reserved = function() end + + end + + do + + local pdfliteral = node.new("whatsit",8) pdfliteral.next, pdfliteral.prev = nil, nil pdfliteral.mode = 1 + local disc = node.new("disc") disc.next, disc.prev = nil, nil + local kern = node.new("kern",1) kern.next, kern.prev = nil, nil + local penalty = node.new("penalty") penalty.next, penalty.prev = nil, nil + local glue = node.new("glue") glue.next, glue.prev = nil, nil + local glue_spec = node.new("glue_spec") glue_spec.next, glue_spec.prev = nil, nil + + nodes.register(pdfliteral) + nodes.register(disc) + nodes.register(kern) + nodes.register(penalty) + nodes.register(glue) + nodes.register(glue_spec) + + local copy = node.copy + + function nodes.penalty(p) + local n = copy(penalty) + n.penalty = p + return n + end + function nodes.kern(k) + local n = copy(kern) + n.kern = k + return n + end + function nodes.glue(width,stretch,shrink) + local n = copy(glue) + local s = copy(glue_spec) + s.width, s.stretch, s.shrink = width, stretch, shrink + n.spec = s + return n + end + function nodes.glue_spec(width,stretch,shrink) + local s = copy(glue_spec) + s.width, s.stretch, s.shrink = width, stretch, shrink + return s + end + + function nodes.disc() + return copy(disc) + end + + function nodes.pdfliteral(str) + local t = copy(pdfliteral) + t.data = str + return t + end + + end + +end + if not modules then modules = { } end modules ['luat-kps'] = { version = 1.001, @@ -5754,7 +6012,7 @@ end if input.verbose then input.report("") - input.report("runtime: " .. os.clock() .. " seconds") + input.report("runtime: " .. os.runtime() .. " seconds") end --~ if ok then diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index d180fa9b9..fb7ad475f 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -461,12 +461,17 @@ function table.sortedkeys(tab) srt[#srt+1] = key if kind == 3 then -- no further check - elseif type(key) == "string" then - if kind == 2 then kind = 3 else kind = 1 end - elseif type(key) == "number" then - if kind == 1 then kind = 3 else kind = 2 end else - kind = 3 + local tkey = type(key) + if tkey == "string" then + -- if kind == 2 then kind = 3 else kind = 1 end + kind = (kind == 2 and 3) or 1 + elseif tkey == "number" then + -- if kind == 1 then kind = 3 else kind = 2 end + kind = (kind == 1 and 3) or 2 + else + kind = 3 + end end end if kind == 0 or kind == 3 then @@ -489,52 +494,96 @@ function table.prepend(t, list) end end +--~ function table.merge(t, ...) +--~ for _, list in ipairs({...}) do +--~ for k,v in pairs(list) do +--~ t[k] = v +--~ end +--~ end +--~ return t +--~ end + function table.merge(t, ...) - for _, list in ipairs({...}) do - for k,v in pairs(list) do + local lst = {...} + for i=1,#lst do + for k, v in pairs(lst[i]) do t[k] = v end end return t end +--~ function table.merged(...) +--~ local tmp = { } +--~ for _, list in ipairs({...}) do +--~ for k,v in pairs(list) do +--~ tmp[k] = v +--~ end +--~ end +--~ return tmp +--~ end + function table.merged(...) - local tmp = { } - for _, list in ipairs({...}) do - for k,v in pairs(list) do + local tmp, lst = { }, {...} + for i=1,#lst do + for k, v in pairs(lst[i]) do tmp[k] = v end end return tmp end +--~ function table.imerge(t, ...) +--~ for _, list in ipairs({...}) do +--~ for _, v in ipairs(list) do +--~ t[#t+1] = v +--~ end +--~ end +--~ return t +--~ end + function table.imerge(t, ...) - for _, list in ipairs({...}) do - for k,v in ipairs(list) do - t[#t+1] = v + local lst = {...} + for i=1,#lst do + local nst = lst[i] + for j=1,#nst do + t[#t+1] = nst[j] end end return t end +--~ function table.imerged(...) +--~ local tmp = { } +--~ for _, list in ipairs({...}) do +--~ for _,v in pairs(list) do +--~ tmp[#tmp+1] = v +--~ end +--~ end +--~ return tmp +--~ end + function table.imerged(...) - local tmp = { } - for _, list in ipairs({...}) do - for _,v in pairs(list) do - tmp[#tmp+1] = v + local tmp, lst = { }, {...} + for i=1,#lst do + local nst = lst[i] + for j=1,#nst do + tmp[#tmp+1] = nst[j] end end return tmp end -if not table.fastcopy then +if not table.fastcopy then do + + local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable - function table.fastcopy(old) -- fast one + local function fastcopy(old) -- fast one if old then local new = { } for k,v in pairs(old) do if type(v) == "table" then - new[k] = table.fastcopy(v) -- was just table.copy + new[k] = fastcopy(v) -- was just table.copy else new[k] = v end @@ -549,11 +598,15 @@ if not table.fastcopy then end end -end + table.fastcopy = fastcopy + +end end + +if not table.copy then do -if not table.copy then + local type, pairs, getmetatable, setmetatable = type, pairs, getmetatable, setmetatable - function table.copy(t, tables) -- taken from lua wiki, slightly adapted + local function copy(t, tables) -- taken from lua wiki, slightly adapted tables = tables or { } local tcopy = {} if not tables[t] then @@ -564,7 +617,7 @@ if not table.copy then if tables[i] then i = tables[i] else - i = table.copy(i, tables) + i = copy(i, tables) end end if type(v) ~= "table" then @@ -572,7 +625,7 @@ if not table.copy then elseif tables[v] then tcopy[i] = tables[v] else - tcopy[i] = table.copy(v, tables) + tcopy[i] = copy(v, tables) end end local mt = getmetatable(t) @@ -582,7 +635,9 @@ if not table.copy then return tcopy end -end + table.copy = copy + +end end -- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack) @@ -655,7 +710,9 @@ do end if n == #t then local tt = { } - for _,v in ipairs(t) do + -- for _,v in ipairs(t) do + for i=1,#t do + local v = t[i] local tv = type(v) if tv == "number" or tv == "boolean" then tt[#tt+1] = tostring(v) @@ -684,15 +741,16 @@ do end else depth = "" - if type(name) == "string" then + local tname = type(name) + if tname == "string" then if name == "return" then handle("return {") else handle(name .. "={") end - elseif type(name) == "number" then + elseif tname == "number" then handle("[" .. name .. "]={") - elseif type(name) == "boolean" then + elseif tname == "boolean" then if name then handle("return {") else @@ -707,7 +765,7 @@ do local inline = compact and table.serialize_inline local first, last = nil, 0 -- #root cannot be trusted here if compact then - for k,v in ipairs(root) do + for k,v in ipairs(root) do -- NOT: for k=1,#root do if not first then first = k end last = last + 1 end @@ -1074,32 +1132,53 @@ end do + local sb = string.byte + +--~ local nextchar = { +--~ [ 4] = function(f) +--~ return f:read(1), f:read(1), f:read(1), f:read(1) +--~ end, +--~ [ 2] = function(f) +--~ return f:read(1), f:read(1) +--~ end, +--~ [ 1] = function(f) +--~ return f:read(1) +--~ end, +--~ [-2] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ return b, a +--~ end, +--~ [-4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ return d, c, b, a +--~ end +--~ } + local nextchar = { [ 4] = function(f) - return f:read(1), f:read(1), f:read(1), f:read(1) + return f:read(1,1,1,1) end, [ 2] = function(f) - return f:read(1), f:read(1) + return f:read(1,1) end, [ 1] = function(f) return f:read(1) end, [-2] = function(f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) return b, a end, [-4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local c = f:read(1) + local a, b, c, d = f:read(1,1,1,1) return d, c, b, a end } function io.characters(f,n) - local sb = string.byte if f then return nextchar[n or 1], f else @@ -1111,12 +1190,62 @@ end do + local sb = string.byte + +--~ local nextbyte = { +--~ [4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ if d then +--~ return sb(a), sb(b), sb(c), sb(d) +--~ else +--~ return nil, nil, nil, nil +--~ end +--~ end, +--~ [2] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ if b then +--~ return sb(a), sb(b) +--~ else +--~ return nil, nil +--~ end +--~ end, +--~ [1] = function (f) +--~ local a = f:read(1) +--~ if a then +--~ return sb(a) +--~ else +--~ return nil +--~ end +--~ end, +--~ [-2] = function (f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ if b then +--~ return sb(b), sb(a) +--~ else +--~ return nil, nil +--~ end +--~ end, +--~ [-4] = function(f) +--~ local a = f:read(1) +--~ local b = f:read(1) +--~ local c = f:read(1) +--~ local d = f:read(1) +--~ if d then +--~ return sb(d), sb(c), sb(b), sb(a) +--~ else +--~ return nil, nil, nil, nil +--~ end +--~ end +--~ } + local nextbyte = { [4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local d = f:read(1) + local a, b, c, d = f:read(1,1,1,1) if d then return sb(a), sb(b), sb(c), sb(d) else @@ -1124,8 +1253,7 @@ do end end, [2] = function(f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) if b then return sb(a), sb(b) else @@ -1141,8 +1269,7 @@ do end end, [-2] = function (f) - local a = f:read(1) - local b = f:read(1) + local a, b = f:read(1,1) if b then return sb(b), sb(a) else @@ -1150,10 +1277,7 @@ do end end, [-4] = function(f) - local a = f:read(1) - local b = f:read(1) - local c = f:read(1) - local d = f:read(1) + local a, b, c, d = f:read(1,1,1,1) if d then return sb(d), sb(c), sb(b), sb(a) else @@ -1163,7 +1287,6 @@ do } function io.bytes(f,n) - local sb = string.byte if f then return nextbyte[n or 1], f else @@ -1291,6 +1414,40 @@ if not os.setenv then function os.setenv() return false end end +if not os.times then + -- utime = user time + -- stime = system time + -- cutime = children user time + -- cstime = children system time + function os.times() + return { + utime = os.clock(), -- user + stime = 0, -- system + cutime = 0, -- children user + cstime = 0, -- children system + } + end +end + +if os.gettimeofday then + os.clock = os.gettimeofday +else + os.gettimeofday = os.clock +end + +do + local startuptime = os.gettimeofday() + function os.runtime() + return os.gettimeofday() - startuptime + end +end + +--~ print(os.gettimeofday()-os.time()) +--~ os.sleep(1.234) +--~ print (">>",os.runtime()) +--~ print(os.date("%H:%M:%S",os.gettimeofday())) +--~ print(os.date("%H:%M:%S",os.time())) + -- filename : l-file.lua -- comment : split off from luat-lib @@ -1542,11 +1699,12 @@ end function toboolean(str,tolerant) if tolerant then - if type(str) == "string" then + local tstr = type(str) + if tstr == "string" then return str == "true" or str == "yes" or str == "on" or str == "1" - elseif type(str) == "number" then + elseif tstr == "number" then return tonumber(str) ~= 0 - elseif type(str) == "nil" then + elseif tstr == "nil" then return false else return str @@ -3961,7 +4119,7 @@ end function input.bare_variable(str) -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") - return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") + return (str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")) end if texio then @@ -4023,27 +4181,35 @@ input.settrace(tonumber(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRA -- These functions can be used to test the performance, especially -- loading the database files. -function input.starttiming(instance) - if instance then - instance.starttime = os.clock() - if not instance.loadtime then - instance.loadtime = 0 +do + local clock = os.clock + + function input.starttiming(instance) + if instance then + instance.starttime = clock() + if not instance.loadtime then + instance.loadtime = 0 + end end end -end -function input.stoptiming(instance, report) - if instance and instance.starttime then - instance.stoptime = os.clock() - local loadtime = instance.stoptime - instance.starttime - instance.loadtime = instance.loadtime + loadtime - if report then - input.report('load time', string.format("%0.3f",loadtime)) + function input.stoptiming(instance, report) + if instance then + local starttime = instance.starttime + if starttime then + local stoptime = clock() + local loadtime = stoptime - starttime + instance.stoptime = stoptime + instance.loadtime = instance.loadtime + loadtime + if report then + input.report('load time', string.format("%0.3f",loadtime)) + end + return loadtime + end end - return loadtime - else return 0 end + end function input.elapsedtime(instance) @@ -5968,7 +6134,7 @@ input.usecache = not toboolean(os.getenv("TEXMFSHARECACHE") or "false",true) -- if caches.temp and caches.temp ~= "" and lfs.attributes(caches.temp,"mode") ~= "directory" then if caches.force or io.ask(string.format("Should I create the cache path %s?",caches.temp), "no", { "yes", "no" }) == "yes" then - lfs.mkdirs(caches.temp) + dir.mkdirs(caches.temp) end end if not caches.temp or caches.temp == "" then @@ -6174,7 +6340,7 @@ function input.aux.save_data(instance, dataname, check) input.report("preparing " .. dataname .. " in", luaname) for k, v in pairs(files) do if not check or check(v,k) then -- path, name - if #v == 1 then + if type(v) == "table" and #v == 1 then files[k] = v[1] end else @@ -6357,8 +6523,8 @@ end function input.storage.dump() for name, data in ipairs(input.storage.data) do local evaluate, message, original, target = data[1], data[2], data[3] ,data[4] - local name, initialize, finalize = nil, "", "" - for str in string.gmatch(target,"([^%.]+)") do + local name, initialize, finalize, code = nil, "", "", "" + for str in target:gmatch("([^%.]+)") do if name then name = name .. "." .. str else @@ -6372,15 +6538,15 @@ function input.storage.dump() input.storage.max = input.storage.max + 1 if input.storage.trace then logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max)) - lua.bytecode[input.storage.max] = loadstring( + code = initialize .. string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) .. table.serialize(original,name) .. finalize - ) else - lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize) + code = initialize .. table.serialize(original,name) .. finalize end + lua.bytecode[input.storage.max] = loadstring(code) end end @@ -7308,7 +7474,7 @@ end --~ if input.verbose then --~ input.report("") ---~ input.report("runtime: " .. os.clock() .. " seconds") +--~ input.report("runtime: " .. os.runtime() .. " seconds") --~ end --~ if ok then diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex index 9e3a4eb37..0569696cb 100644 --- a/tex/context/base/cont-new.tex +++ b/tex/context/base/cont-new.tex @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2007.12.05 13:56} +\newcontextversion{2007.12.06 16:24} %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index c43b89b72..3a9c3e2c8 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -42,7 +42,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2007.12.05 13:56} +\edef\contextversion{2007.12.06 16:24} %D For those who want to use this: diff --git a/tex/context/base/core-syn.lua b/tex/context/base/core-syn.lua index 7f6ea7614..1b4eb1e92 100644 --- a/tex/context/base/core-syn.lua +++ b/tex/context/base/core-syn.lua @@ -105,7 +105,7 @@ function job.loadsortedlist(class) else entries[#entries+1] = { v[1], -- kind (e) - { { v[3], v[2] } }, -- entry, key + { { v[2], v[3] } }, -- entry, key v[4] -- optional meaning } end diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua index 84fb9d569..4fd54b5fc 100644 --- a/tex/context/base/font-def.lua +++ b/tex/context/base/font-def.lua @@ -425,14 +425,15 @@ function fonts.define.specify.preset_context(name,features) local fds = fonts.define.specify local setups, numbers, synonyms = fds.context_setups, fds.context_numbers, fds.synonyms local number = (setups[name] and setups[name].number) or 0 - local t = aux.settings_to_hash(features) - for k,v in pairs(t) do - k = synonyms[k] or k - t[k] = v:is_boolean() - if type(t[k]) == "nil" then - t[k] = v - end - end +--~ local t = aux.settings_to_hash(features) +--~ for k,v in pairs(t) do +--~ k = synonyms[k] or k +--~ t[k] = v:is_boolean() +--~ if type(t[k]) == "nil" then +--~ t[k] = v +--~ end +--~ end +local t = fonts.otf.meanings.resolve(aux.settings_to_hash(features)) -- todo: synonyms if number == 0 then numbers[#numbers+1] = name t.number = #numbers diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex index b15e3812d..8e08ef2d7 100644 --- a/tex/context/base/font-ini.tex +++ b/tex/context/base/font-ini.tex @@ -3536,15 +3536,15 @@ \definefontfeature [default] - [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes + [liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes \definefontfeature [smallcaps] - [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes + [liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes \definefontfeature [oldstyle] - [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes + [liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes %D The next auxilliary macro is an alternative to \type %D {\fontname}. diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua index 68142e4c4..b4558183e 100644 --- a/tex/context/base/font-otf.lua +++ b/tex/context/base/font-otf.lua @@ -612,26 +612,26 @@ fonts.otf.tables.features = { ['size'] = 'Optical Size', ['smcp'] = 'Small Capitals', ['smpl'] = 'Simplified Forms', - ['ss01'] = 'Sylistic Set 1', - ['ss02'] = 'Sylistic Set 2', - ['ss03'] = 'Sylistic Set 3', - ['ss04'] = 'Sylistic Set 4', - ['ss05'] = 'Sylistic Set 5', - ['ss06'] = 'Sylistic Set 6', - ['ss07'] = 'Sylistic Set 7', - ['ss08'] = 'Sylistic Set 8', - ['ss09'] = 'Sylistic Set 9', - ['ss10'] = 'Sylistic Set 10', - ['ss11'] = 'Sylistic Set 11', - ['ss12'] = 'Sylistic Set 12', - ['ss13'] = 'Sylistic Set 13', - ['ss14'] = 'Sylistic Set 14', - ['ss15'] = 'Sylistic Set 15', - ['ss16'] = 'Sylistic Set 16', - ['ss17'] = 'Sylistic Set 17', - ['ss18'] = 'Sylistic Set 18', - ['ss19'] = 'Sylistic Set 19', - ['ss20'] = 'Sylistic Set 20', + ['ss01'] = 'Stylistic Set 1', + ['ss02'] = 'Stylistic Set 2', + ['ss03'] = 'Stylistic Set 3', + ['ss04'] = 'Stylistic Set 4', + ['ss05'] = 'Stylistic Set 5', + ['ss06'] = 'Stylistic Set 6', + ['ss07'] = 'Stylistic Set 7', + ['ss08'] = 'Stylistic Set 8', + ['ss09'] = 'Stylistic Set 9', + ['ss10'] = 'Stylistic Set 10', + ['ss11'] = 'Stylistic Set 11', + ['ss12'] = 'Stylistic Set 12', + ['ss13'] = 'Stylistic Set 13', + ['ss14'] = 'Stylistic Set 14', + ['ss15'] = 'Stylistic Set 15', + ['ss16'] = 'Stylistic Set 16', + ['ss17'] = 'Stylistic Set 17', + ['ss18'] = 'Stylistic Set 18', + ['ss19'] = 'Stylistic Set 19', + ['ss20'] = 'Stylistic Set 20', ['subs'] = 'Subscript', ['sups'] = 'Superscript', ['swsh'] = 'Swash', @@ -690,6 +690,76 @@ function fonts.otf.meanings.baseline(id) return fonts.otf.meanings.resolve(fonts.otf.tables.baselines,id) end +function table.reverse_hash(h) + local r = { } + for k,v in pairs(h) do + r[v] = (k:gsub(" ","")):lower() + end + return r +end + +fonts.otf.tables.to_scripts = table.reverse_hash(fonts.otf.tables.scripts ) +fonts.otf.tables.to_languages = table.reverse_hash(fonts.otf.tables.languages) +fonts.otf.tables.to_features = table.reverse_hash(fonts.otf.tables.features ) + +do + + local scripts = fonts.otf.tables.scripts + local languages = fonts.otf.tables.languages + local features = fonts.otf.tables.features + + local to_scripts = fonts.otf.tables.to_scripts + local to_languages = fonts.otf.tables.to_languages + local to_features = fonts.otf.tables.to_features + + function fonts.otf.meanings.resolve(features) + local h = { } + for k,v in pairs(features) do + k = (k:gsub(" ","")):lower() + if k == "language" or k =="lang" then + v = (k:gsub(" ","")):lower() + k = language + if not languages[v] then + if to_languages[v] then + h.language = to_languages[v] + else + h.language = "dflt" + end + else + h.language = v + end + elseif k == "script" then + v = (k:gsub(" ","")):lower() + if not scripts[v] then + if to_scripts[v] then + h.script = to_scripts[v] + else + h.script = "dflt" + end + else + h.script = v + end + else + if type(v) == "string" then + local b = v:is_boolean() + if type(b) == "nil" then + v = (k:gsub(" ","")):lower() + else + v = b + end + end + if to_features[k] then + h[to_features[k]] = v + else + h[k] = v + end + end + end + return h + end + +end + --[[ldx--

Here we go.

--ldx]]-- @@ -1391,26 +1461,42 @@ function fonts.otf.features.prepare_base_kerns(tfmdata,kind,value) -- todo what for _, chr in pairs(tfmdata.characters) do local d = charlist[chr.index] if d then - local dk = d.kerns + local dk = d.mykerns if dk then local t, done = chr.kerns or { }, false - for _, v in pairs(dk) do - if somevalid[v.lookup] then - local k = unicodes[v.char] - if k > 0 then - t[k], done = v.off, true + for lookup,kerns in pairs(dk) do + if somevalid[lookup] then + for k, v in pairs(kerns) do + if v > 0 then + t[k], done = v, true + end end end end if done then chr.kerns = t -- no empty assignments end + else + dk = d.kerns + if dk then + local t, done = chr.kerns or { }, false + for _, v in pairs(dk) do + if somevalid[v.lookup] then + local k = unicodes[v.char] + if k > 0 then + t[k], done = v.off, true + end + end + end + if done then + chr.kerns = t -- no empty assignments + end + end end end end end end - function fonts.otf.copy_to_tfm(data) if data then local tfm = { characters = { }, parameters = { } } diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua index 1173a928e..522337a0f 100644 --- a/tex/context/base/l-os.lua +++ b/tex/context/base/l-os.lua @@ -43,6 +43,8 @@ end if os.gettimeofday then os.clock = os.gettimeofday +else + os.gettimeofday = os.clock end do diff --git a/tex/context/base/luat-inp.lua b/tex/context/base/luat-inp.lua index ba5d97c29..ec8d04976 100644 --- a/tex/context/base/luat-inp.lua +++ b/tex/context/base/luat-inp.lua @@ -195,7 +195,7 @@ end function input.bare_variable(str) -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") - return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") + return (str:gsub("\s*([\"\']?)(.+)%1\s*", "%2")) end if texio then diff --git a/tex/context/base/luat-tmp.lua b/tex/context/base/luat-tmp.lua index bd29f87f4..611e1f37a 100644 --- a/tex/context/base/luat-tmp.lua +++ b/tex/context/base/luat-tmp.lua @@ -40,7 +40,7 @@ input.usecache = not toboolean(os.getenv("TEXMFSHARECACHE") or "false",true) -- if caches.temp and caches.temp ~= "" and lfs.attributes(caches.temp,"mode") ~= "directory" then if caches.force or io.ask(string.format("Should I create the cache path %s?",caches.temp), "no", { "yes", "no" }) == "yes" then - lfs.mkdirs(caches.temp) + dir.mkdirs(caches.temp) end end if not caches.temp or caches.temp == "" then @@ -246,7 +246,7 @@ function input.aux.save_data(instance, dataname, check) input.report("preparing " .. dataname .. " in", luaname) for k, v in pairs(files) do if not check or check(v,k) then -- path, name - if #v == 1 then + if type(v) == "table" and #v == 1 then files[k] = v[1] end else diff --git a/tex/context/base/regi-ini.mkii b/tex/context/base/regi-ini.mkii index a5b2cf177..538db3bcf 100644 --- a/tex/context/base/regi-ini.mkii +++ b/tex/context/base/regi-ini.mkii @@ -50,7 +50,7 @@ \def\mkenableregime#1% {\doifelse{#1}{utf}% - {\writestatus\m!regime{mapping utf to utf-8}% + {\writestatus\m!regimes{mapping utf to utf-8}% \XeTeXinputencoding{utf-8}} {\XeTeXinputencoding{#1}}} diff --git a/tex/context/base/x-mmp.mkiv b/tex/context/base/x-mmp.mkiv index 3b5d483b9..0f5137661 100644 --- a/tex/context/base/x-mmp.mkiv +++ b/tex/context/base/x-mmp.mkiv @@ -177,6 +177,9 @@ \defineXMLentity[textcomma] {{,}} \defineXMLentity[textperiod] {{.}} +\defineXMLentity[_] {{\_}} +\defineXMLentity[^] {{\^}} + \startxmlsetups mml:mi % todo: mathvariant mathsize mathcolor mathbackground \edef\MMPidentifier{\xmlstripped{#1}{*}} \doifXMLentityelse{\detokenize\expandafter{\MMPidentifier}} { diff --git a/tex/context/interface/keys-cz.xml b/tex/context/interface/keys-cz.xml index 077d6f2b4..af511e420 100644 --- a/tex/context/interface/keys-cz.xml +++ b/tex/context/interface/keys-cz.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index 6a02edfe4..b369fddba 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index 2bc21ab38..3dfac6279 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index dee31e9e3..c5fceb1c1 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index bf14c9594..34d228a14 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index 859ee5984..c4f769ac5 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index 6c8083631..51bbaf816 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -1,6 +1,6 @@ - + -- cgit v1.2.3