summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/luat-cod.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/luat-cod.lmt')
-rw-r--r--tex/context/base/mkiv/luat-cod.lmt278
1 files changed, 278 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/luat-cod.lmt b/tex/context/base/mkiv/luat-cod.lmt
new file mode 100644
index 000000000..c7c868f42
--- /dev/null
+++ b/tex/context/base/mkiv/luat-cod.lmt
@@ -0,0 +1,278 @@
+if not modules then modules = { } end modules ['luat-cod'] = {
+ version = 1.001,
+ comment = "companion to luat-cod.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local type, loadfile, tonumber = type, loadfile, tonumber
+local match, gsub, find, format, gmatch = string.match, string.gsub, string.find, string.format, string.gmatch
+
+local texconfig, lua = texconfig, lua
+
+-- maybe pick up from commandline:
+--
+-- texconfig.interaction: 0=batchmode 1=nonstopmode 2=scrollmode 3=errornonstopmode 4=normal
+
+-- some basic housekeeping
+
+texconfig.kpse_init = false
+texconfig.shell_escape = 't'
+
+texconfig.error_line = 250 -- 79 -- frozen / large values can crash
+texconfig.expand_depth = 10000
+texconfig.half_error_line = 125 -- 50 -- frozen
+texconfig.max_in_open = 1000
+texconfig.max_print_line = 100000
+texconfig.max_strings = 500000
+texconfig.nest_size = 1000
+texconfig.param_size = 25000
+texconfig.save_size = 100000
+texconfig.stack_size = 10000
+texconfig.function_size = 32768
+texconfig.properties_size = 10000
+texconfig.fix_mem_init = 750000
+
+-- registering bytecode chunks
+
+local bytedata = lua.bytedata or { }
+local bytedone = lua.bytedone or { }
+
+---.bytecode = bytecode
+lua.bytedata = bytedata
+lua.bytedone = bytedone
+
+local setbytecode = lua.setbytecode
+----- getbytecode = lua.getbytecode
+
+lua.firstbytecode = 501
+lua.lastbytecode = lua.lastbytecode or (lua.firstbytecode - 1) -- as we load ourselves again ... maybe return earlier
+
+function lua.registeredcodes()
+ return lua.lastbytecode - lua.firstbytecode + 1
+end
+
+-- no file.* and utilities.parsers.* functions yet
+
+local strip = false if arg then for i=-1,#arg do if arg[i] == "--c:strip" then strip = true break end end end
+
+function lua.registercode(filename,options)
+ local barename = gsub(filename,"%.[%a%d]+$","")
+ local basename = match(barename,"^.+[/\\](.-)$") or barename
+ if not bytedone[basename] then
+ local opts = { }
+ if type(options) == "string" and options ~= "" then
+ for s in gmatch(options,"([a-z]+)") do
+ opts[s] = true
+ end
+ end
+ if barename == filename then
+ filename = filename .. (opts.autosuffix and CONTEXTLMTXMODE > 0 and ".lmt" or ".lua")
+ end
+ local code = environment.luafilechunk(filename,false,opts.optimize)
+ if code then
+ bytedone[basename] = true
+ if environment.initex and not opts.initexonly then
+ local n = lua.lastbytecode + 1
+ bytedata[n] = { name = barename, options = opts }
+ if strip or opts.strip then
+ setbytecode(n,code,true)
+ else
+ setbytecode(n,code)
+ end
+ lua.lastbytecode = n
+ end
+ elseif environment.initex then
+ texio.write_nl(format("\nerror loading file: %s (aborting)",filename))
+ os.exit()
+ end
+ end
+end
+
+local finalizers = { }
+
+function lua.registerfinalizer(f,comment)
+ comment = comment or "unknown"
+ if type(f) == "function" then
+ finalizers[#finalizers+1] = { action = f, comment = comment }
+ else
+ print(format("\nfatal error: invalid finalizer, action: %s\n",comment))
+ os.exit()
+ end
+end
+
+function lua.finalize(logger)
+ for i=1,#finalizers do
+ local finalizer = finalizers[i]
+ finalizer.action()
+ if logger then
+ logger("finalize action: %s",finalizer.comment)
+ end
+ end
+end
+
+-- A first start with environments. This will be overloaded later.
+
+environment = environment or { }
+local environment = environment
+
+-- no string.unquoted yet
+
+local sourcefile = gsub(arg and arg[1] or "","^\"(.*)\"$","%1")
+local sourcepath = find(sourcefile,"/",1,true) and gsub(sourcefile,"/[^/]+$","") or ""
+local targetpath = "."
+
+-- delayed (via metatable):
+--
+-- environment.jobname = tex.jobname
+-- environment.version = tostring(tex.toks.contextversiontoks)
+
+-- traditionally the revision has been a one character string and only
+-- pdftex went beyond "9" but anyway we test for it
+
+if LUATEXENGINE == nil then
+ LUATEXENGINE = status.luatex_engine and string.lower(status.luatex_engine)
+ or (find(status.banner,"LuajitTeX",1,true) and "luajittex" or "luatex")
+end
+
+if LUATEXVERSION == nil then
+ LUATEXVERSION = status.luatex_version/100
+ + tonumber(status.luatex_revision)/10000
+end
+
+if CONTEXTLMTXMODE == nil then
+ CONTEXTLMTXMODE = LUATEXENGINE == "luametatex" and 1 or 0
+end
+
+if LUATEXFUNCTIONALITY == nil then
+ LUATEXFUNCTIONALITY = status.development_id or 6346
+end
+
+if LUATEXFORMATID == nil then
+ LUATEXFORMATID = status.format_id or 0
+end
+
+if JITSUPPORTED == nil then
+ JITSUPPORTED = LUATEXENGINE == "luajittex" or jit -- "or jit" can go
+end
+
+if INITEXMODE == nil then
+ INITEXMODE = status.ini_version
+end
+
+environment.luatexengine = LUATEXENGINE
+environment.luatexversion = LUATEXVERSION
+environment.luatexfunctionality = LUATEXFUNCTIONALITY
+environment.jitsupported = JITSUPPORTED
+environment.initex = INITEXMODE
+environment.initexmode = INITEXMODE
+
+if not environment.luafilechunk then
+
+ function environment.luafilechunk(filename)
+ local fullname = filename
+ if sourcepath ~= "" then
+ fullname = sourcepath .. "/" .. filename
+ end
+ local data = loadfile(fullname)
+ texio.write("term and log","<",data and "+ " or "- ",fullname,">")
+ if data then
+-- package.loaded[gsub(filename,"%..-$"] =
+ data()
+ end
+ return data
+ end
+
+end
+
+if not environment.engineflags then -- raw flags
+
+ local engineflags = { }
+
+ for i=-10,#arg do
+ local a = arg[i]
+ if a then
+ local flag, content = match(a,"^%-%-([^=]+)=?(.-)$")
+ if flag then
+ engineflags[flag] = content or ""
+ end
+ end
+ end
+
+ environment.engineflags = engineflags
+
+end
+
+-- We need a few premature callbacks in the format generator. We
+-- also do this when the format is loaded as otherwise we get
+-- a kpse error when disabled. This is an engine issue that will
+-- be sorted out in due time.
+
+-- print("!!!!!!!!!!!!!!!!!!!!!!",lfs.isfile) os.exit()
+
+if not lfs.isfile then
+
+ local attributes = lfs.attributes
+
+ function lfs.isdir(name)
+ return attributes(name,"mode") == "directory"
+ end
+
+ function lfs.isfile(name)
+ local a = attributes(name,"mode")
+ return a == "file" or a == "link" or nil
+ end
+
+end
+
+local isfile = lfs.isfile
+
+local function source_file(name)
+ local fullname = sourcepath .. "/" .. name
+ if isfile(fullname) then
+ return fullname
+ end
+ fullname = fullname .. ".tex"
+ if isfile(fullname) then
+ return fullname
+ end
+ if isfile(name) then
+ return name
+ end
+ name = name .. ".tex"
+ if isfile(name) then
+ return name
+ end
+ return nil
+end
+
+local function target_file(name)
+ return targetpath .. "/" .. name
+end
+
+local function find_log_file(name)
+ return target_file(name)
+end
+
+local function find_data_file(name)
+ return source_file(name)
+end
+
+local function open_data_file(name)
+ local fullname = source_file(name)
+ if fullname then
+ local f = io.open(fullname,'rb')
+ return {
+ reader = function()
+ return f:read("*line")
+ end
+ }
+ else
+ return false
+ end
+end
+
+callback.register('find_log_file', find_log_file)
+callback.register('find_data_file' , find_data_file )
+callback.register('open_data_file' , open_data_file )