diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2008-06-12 10:42:53 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2008-06-12 10:42:53 +0000 |
commit | 0d01365d53c456d246da0ca1f0b3cd9868f02b35 (patch) | |
tree | 01a655c8028e17cfb371456b299c1848fe08c05b /Master/texmf-dist/tex/context/base/luat-env.lua | |
parent | 44f3714442da07fdfc36a7f2a8dcd5d4294c5d26 (diff) |
ConTeXt release 2008.05.21
git-svn-id: svn://tug.org/texlive/trunk@8691 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/luat-env.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/luat-env.lua | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/luat-env.lua b/Master/texmf-dist/tex/context/base/luat-env.lua new file mode 100644 index 00000000000..48563e2e7f2 --- /dev/null +++ b/Master/texmf-dist/tex/context/base/luat-env.lua @@ -0,0 +1,218 @@ +-- filename : luat-env.lua +-- comment : companion to luat-env.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- here we don't assume any extra libraries + +-- A former version provides functionality for non embeded core +-- scripts i.e. runtime library loading. Given the amount of +-- Lua code we use now, this no longer makes sense. Much of this +-- evolved before bytecode arrays were available. + +if not versions then versions = { } end versions['luat-env'] = 1.001 + +-- environment + +if not environment then environment = { } end + +--~ environment.useluc = true -- still testing, so we don't use luc yet + +if environment.silent == nil then environment.silent = false end +if environment.useluc == nil then environment.useluc = true end + +-- kpse is overloaded by this time + +--~ if environment.formatname == nil then if tex then environment.formatname = tex.formatname end end +--~ if environment.formatpath == nil then if kpse then environment.formatpath = kpse.find_file(tex.formatname,"fmt") or "." end end +--~ if environment.jobname == nil then if tex then environment.jobname = tex.jobname end end +--~ if environment.progname == nil then environment.progname = os.getenv("progname") or "luatex" end +--~ if environment.engine == nil then environment.engine = os.getenv("engine") or "context" end +--~ if environment.enginepath == nil then environment.enginepath = os.getenv("SELFAUTOLOC") or "." end +--~ if environment.initex == nil then if tex then environment.initex = tex.formatname == "" end end + +if not environment.formatname or environment.formatname == "" then if tex then environment.formatname = tex.formatname end end +if not environment.jobname or environment.jobname == "" then if tex then environment.jobname = tex.jobname end end + +if not environment.progname or environment.progname == "" then environment.progname = "context" end +if not environment.engine or environment.engine == "" then environment.engine = "luatex" end +if not environment.formatname or environment.formatname == "" then environment.formatname = "cont-en" end +if not environment.formatpath or environment.formatpath == "" then environment.formatpath = '.' end +if not environment.enginepath or environment.enginepath == "" then environment.enginepath = '.' end +if not environment.version or environment.version == "" then environment.version = "unknown" end + +environment.formatpath = string.gsub(environment.formatpath:gsub("\\","/"),"/([^/]-)$","") +environment.enginepath = string.gsub(environment.enginepath:gsub("\\","/"),"/([^/]-)$","") + +function environment.texfile(filename) + return input.find_file(texmf.instance,filename,'tex') +end + +function environment.luafile(filename) + return input.find_file(texmf.instance,filename,'tex') or input.find_file(texmf.instance,filename,'texmfscripts') +end + +function environment.showmessage(...) -- todo, cleaner + if not environment.silent then + if input and input.report then + input.report(table.concat({...}," ")) + elseif texio and texio.write_nl then + texio.write_nl("[[" .. table.concat({...}," ") .. "]]") + else + print("[[" .. table.concat({...}," ") .. "]]") + end + end +end + +if not environment.jobname then environment.jobname = "unknown" end + +function environment.setlucpath() + if environment.initex then + environment.lucpath = nil + else + environment.lucpath = environment.formatpath .. "/lua/" .. environment.progname + end +end + +environment.setlucpath() + +function environment.loadedluacode(fullname) + return loadfile(fullname) +end + +function environment.luafilechunk(filename) + local filename = filename:gsub("%.%a+$", "") .. ".lua" + local fullname = environment.luafile(filename) + if fullname and fullname ~= "" then + environment.showmessage("loading file", fullname) + return environment.loadedluacode(fullname) + else + environment.showmessage("unknown file", filename) + return nil + end +end + +-- the next ones can use the previous ones + +function environment.loadluafile(filename) + filename = filename:gsub("%.%a+$", "") .. ".lua" + local fullname = environment.luafile(filename) + if fullname and fullname ~= "" then + environment.showmessage("loading", fullname) + dofile(fullname) + else + environment.showmessage("unknown file", filename) + end +end + +function environment.loadlucfile(filename,version) + local filename = filename:gsub("%.%a+$", "") + local fullname = nil + if environment.initex or not environment.useluc then + environment.loadluafile(filename) + else + if environment.lucpath and environment.lucpath ~= "" then + fullname = environment.lucpath .. "/" .. filename .. ".luc" + local chunk = loadfile(fullname) -- this way we don't need a file exists check + if chunk then + environment.showmessage("loading", fullname) + assert(chunk)() + if version then + local v = version -- can be nil + if modules and modules[filename] then + v = modules[filename].version -- new + elseif versions and versions[filename] then + v = versions[filename] -- old + end + if v ~= version then + environment.showmessage("version mismatch", filename,"lua=" .. v, "luc=" ..version) + environment.loadluafile(filename) + end + + end + else + environment.loadluafile(filename) + end + else + environment.loadluafile(filename) + end + end +end + +-- -- -- the next function was posted by Peter Cawley on the lua list -- -- -- +-- -- -- -- -- -- +-- -- -- stripping makes the compressed format file about 1MB smaller -- -- -- +-- -- -- -- -- -- +-- -- -- using this trick is at your own risk -- -- -- + +local function strip_code(dump) + local version, format, endian, int, size, ins, num = dump:byte(5, 11) + local subint + if endian == 1 then + subint = function(dump, i, l) + local val = 0 + for n = l, 1, -1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + else + subint = function(dump, i, l) + local val = 0 + for n = 1, l, 1 do + val = val * 256 + dump:byte(i + n - 1) + end + return val, i + l + end + end + local strip_function + strip_function = function(dump) + local count, offset = subint(dump, 1, size) + local stripped, dirty = string.rep("\0", size), offset + count + offset = offset + count + int * 2 + 4 + offset = offset + int + subint(dump, offset, int) * ins + count, offset = subint(dump, offset, int) + for n = 1, count do + local t + t, offset = subint(dump, offset, 1) + if t == 1 then + offset = offset + 1 + elseif t == 4 then + offset = offset + size + subint(dump, offset, size) + elseif t == 3 then + offset = offset + num + end + end + count, offset = subint(dump, offset, int) + stripped = stripped .. dump:sub(dirty, offset - 1) + for n = 1, count do + local proto, off = strip_function(dump:sub(offset, -1)) + stripped, offset = stripped .. proto, offset + off - 1 + end + offset = offset + subint(dump, offset, int) * int + int + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + int * 2 + end + count, offset = subint(dump, offset, int) + for n = 1, count do + offset = offset + subint(dump, offset, size) + size + end + stripped = stripped .. string.rep("\0", int * 3) + return stripped, offset + end + return dump:sub(1,12) .. strip_function(dump:sub(13,-1)) +end + +environment.stripcode = false -- true + +function environment.loadedluacode(fullname) + if environment.stripcode then + return loadstring(strip_code(string.dump(loadstring(io.loaddata(fullname))))) + else + return loadfile(fullname) + end +end + +-- -- end of stripping code -- -- |