From 6c9a5085dc2cee2c277d69d2dfcb397dab7aeb19 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Thu, 2 Mar 2017 10:57:49 +0100 Subject: 2017-03-02 10:11:00 --- tex/generic/context/luatex/luatex-core.lua | 180 +++++++++++++++++++++ tex/generic/context/luatex/luatex-core.tex | 30 ++++ tex/generic/context/luatex/luatex-fonts-merged.lua | 4 +- 3 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 tex/generic/context/luatex/luatex-core.lua create mode 100644 tex/generic/context/luatex/luatex-core.tex (limited to 'tex/generic') diff --git a/tex/generic/context/luatex/luatex-core.lua b/tex/generic/context/luatex/luatex-core.lua new file mode 100644 index 000000000..ac552e70a --- /dev/null +++ b/tex/generic/context/luatex/luatex-core.lua @@ -0,0 +1,180 @@ +-- if not modules then modules = { } end modules ['luatex-core'] = { +-- version = 1.001, +-- comment = 'companion to luatex', +-- author = 'Hans Hagen & Luigi Scarso', +-- copyright = 'LuaTeX Development Team', +-- } + +LUATEXCOREVERSION = 1.001 + +-- This file overloads some Lua functions. The readline variants provide the same +-- functionality as LuaTeX <= 1.04 and doing it this way permits us to keep the +-- original io libraries clean. Performance is probably even a bit better now. + +local type, next, getmetatable, require = type, next, getmetatable, require +local find, gsub = string.find, string.gsub + +local io_open = io.open +local io_popen = io.popen +local io_line = io.lines + +local fio_readline = fio.readline +local fio_checkpermission = fio.checkpermission +local fio_recordfilename = fio.recordfilename + +local mt = getmetatable(io.stderr) +local mt_lines = mt.lines + +local saferoption = status.safer_option +local shellescape = status.shell_escape -- 0 (disabled) 1 (restricted) 2 (everything) +local kpseused = status.kpse_used -- 0 1 + +io.saved_open = io_open -- can be protected +io.saved_popen = io_popen -- can be protected +io.saved_lines = io_lines -- always readonly +mt.saved_lines = mt_lines -- always readonly + +local function luatex_io_open(name,how) + if not how then + how = 'r' + end + local f = io_open(name,how) + if f then + if type(how) == 'string' and find(how,'w') then + fio_recordfilename(name,'w') + else + fio_recordfilename(name,'r') + end + end + return f +end + +local function luatex_io_open_readonly(name,how) + if how then + how = 'r' + else + how = gsub(how,'[^rb]','') + if how == '' then + how = 'r' + end + end + local f = io_open(name,how) + if f then + fio_recordfilename(name,'r') + end + return f +end + +local function luatex_io_popen(name,...) + local okay, found = fio_checkpermission(name) + if okay and found then + return io_popen(found,...) + end +end + +local function luatex_io_lines(name) + local f = io_open(name,'r') + if f then + return function() + return fio_readline(f) + end + end +end + +local function luatex_io_readline(f) + return function() + return fio_readline(f) + end +end + +io.lines = luatex_io_lines +mt.lines = luatex_io_readline + +-- We assume management to be provided by the replacement of kpse. This is the +-- case in ConTeXt. + +if kpseused == 1 then + + io.open = luatex_io_open + io.popen = luatex_io_popen + + if saferoption then + + os.execute = nil + os.spawn = nil + os.exec = nil + os.setenv = nil + os.tempdir = nil + + io.popen = nil + io.open = nil + + os.rename = nil + os.remove = nil + + io.tmpfile = nil + io.output = nil + + lfs.chdir = nil + lfs.lock = nil + lfs.touch = nil + lfs.rmdir = nil + lfs.mkdir = nil + + io.saved_popen = nil + io.saved_open = luatex_io_open_readonly + + end + + if saferoption or shellescape ~= 2 then + local ffi = require('ffi') + for k, v in next, ffi do + if k ~= 'gc' then + ffi[k] = nil + end + ffi = nil + end + end + + -- os.[execute|os.spawn|os.exec] already are shellescape aware) + +end + +if utilities and utilities.merger and utilities.merger.compact then + + local byte, format, gmatch = string.byte, string.format, string.gmatch + local concat = table.concat + + local data = gsub(io.loaddata('luatex-core.lua'),'if%s+utilities.*','') + local t = { } + local r = { } + local n = 0 + local d = gsub(data,'\r\n','\n') -- be nice for unix + local s = utilities.merger.compact(d) -- no comments and less spaces + + -- t[#t+1] = format('/*\n\n%s\n\n*/',d) + t[#t+1] = 'int load_luatex_core_lua (lua_State * L)' + t[#t+1] = '{' + t[#t+1] = ' /* generated from and by luatex-core.lua */' + t[#t+1] = ' static unsigned char luatex_core_lua[] = {' + for c in gmatch(d,'.') do + if n == 16 then + n = 1 + t[#t+1] = ' ' .. concat(r,', ') .. ',' + else + n = n + 1 + end + r[n] = format('0x%02x',byte(c)) + end + n = n + 1 + r[n] = '0x00' + t[#t+1] = ' ' .. concat(r,', ',1,n) + t[#t+1] = ' };' + -- t[#t+1] = format('unsigned int luatex_core_lua_len = 0x%x;',#d+1) + t[#t+1] = ' return luaL_dostring(L, (const char*) luatex_core_lua);' + t[#t+1] = '}' + + io.savedata('luatex-core.c',concat(t,'\n')) + io.savedata('luatex-core-stripped.lua',s) + +end diff --git a/tex/generic/context/luatex/luatex-core.tex b/tex/generic/context/luatex/luatex-core.tex new file mode 100644 index 000000000..2e7c7d5d4 --- /dev/null +++ b/tex/generic/context/luatex/luatex-core.tex @@ -0,0 +1,30 @@ +\starttext + +\startluacode + + local report = logs.reporter("core") + + report("kpse used : %i",status.kpse_used) + report("shell escape : %i",status.shell_escape) + report("shell restricted : %i",status.shell_restricted) + report("safer option : %i",status.safer_option) + + if false then + + for l in io.open("luatex-core.lua"):lines() do + print(l) + end + + for l in io.lines("luatex-core.lua") do + print(l) + end + + end + +\stopluacode + +\startTEXpage[foregroundstyle=mono,offset=10pt] + LUATEXCOREVERSION: \cldcontext{LUATEXCOREVERSION} +\stopTEXpage + +\stoptext diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 2690045cf..90077e8f7 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : c:/data/develop/context/sources/luatex-fonts-merged.lua -- parent file : c:/data/develop/context/sources/luatex-fonts.lua --- merge date : 03/01/17 13:40:58 +-- merge date : 03/02/17 10:05:26 do -- begin closure to overcome local limits and interference @@ -2124,7 +2124,7 @@ function io.savedata(filename,data,joiner) return false end end -if fio.readline then +if fio and fio.readline then local readline=fio.readline function io.loadlines(filename,n) local f=open(filename,'r') -- cgit v1.2.3