Current File : //usr/share/texlive/texmf-dist/tex/luatex/lualibs/lualibs-lua.lua |
if not modules then modules = { } end modules ['l-lua'] = {
version = 1.001,
comment = "companion to luat-lib.mkiv",
author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
copyright = "PRAGMA ADE / ConTeXt Development Team",
license = "see context related readme files"
}
-- potential issues with 5.3:
-- i'm not sure yet if the int/float change is good for luatex
-- math.min
-- math.max
-- tostring
-- tonumber
-- utf.*
-- bit32
local next, type, tonumber = next, type, tonumber
-- compatibility hacks and helpers
LUAMAJORVERSION, LUAMINORVERSION = string.match(_VERSION,"^[^%d]+(%d+)%.(%d+).*$")
LUAMAJORVERSION = tonumber(LUAMAJORVERSION) or 5
LUAMINORVERSION = tonumber(LUAMINORVERSION) or 1
LUAVERSION = LUAMAJORVERSION + LUAMINORVERSION/10
if LUAVERSION < 5.2 and jit then
--
-- we want loadstring cum suis to behave like 5.2
--
MINORVERSION = 2
LUAVERSION = 5.2
end
-- this is lmtx only:
-- if lua and lua.openfile then
-- io.open = lua.openfile
-- end
-- lpeg
if not lpeg then
lpeg = require("lpeg")
end
-- if utf8 then
-- utf8lua = utf8
-- utf8 = nil
-- end
-- basics:
if loadstring then
local loadnormal = load
function load(first,...)
if type(first) == "string" then
return loadstring(first,...)
else
return loadnormal(first,...)
end
end
else
loadstring = load
end
-- table:
-- At some point it was announced that i[pairs would be dropped, which makes
-- sense. As we already used the for loop and # in most places the impact on
-- ConTeXt was not that large; the remaining ipairs already have been replaced.
-- Hm, actually ipairs was retained, but we no longer use it anyway (nor
-- pairs).
--
-- Just in case, we provide the fallbacks as discussed in Programming
-- in Lua (http://www.lua.org/pil/7.3.html):
if not ipairs then
-- for k, v in ipairs(t) do ... end
-- for k=1,#t do local v = t[k] ... end
local function iterate(a,i)
i = i + 1
local v = a[i]
if v ~= nil then
return i, v --, nil
end
end
function ipairs(a)
return iterate, a, 0
end
end
if not pairs then
-- for k, v in pairs(t) do ... end
-- for k, v in next, t do ... end
function pairs(t)
return next, t -- , nil
end
end
-- The unpack function has been moved to the table table, and for compatiility
-- reasons we provide both now.
if not table.unpack then
table.unpack = _G.unpack
elseif not unpack then
_G.unpack = table.unpack
end
-- package:
-- if not package.seachers then
--
-- package.searchers = package.loaders -- 5.2
--
-- elseif not package.loaders then
--
-- package.loaders = package.searchers
--
-- end
if not package.loaders then -- brr, searchers is a special "loadlib function" userdata type
package.loaders = package.searchers
end
-- moved from util-deb to here:
local print, select, tostring = print, select, tostring
local inspectors = { }
function setinspector(kind,inspector) -- global function
inspectors[kind] = inspector
end
function inspect(...) -- global function
for s=1,select("#",...) do
local value = select(s,...)
if value == nil then
print("nil")
else
local done = false
-- type driven (table)
local kind = type(value)
local inspector = inspectors[kind]
if inspector then
done = inspector(value)
if done then
break
end
end
-- whatever driven (token, node, ...)
for kind, inspector in next, inspectors do
done = inspector(value)
if done then
break
end
end
if not done then
print(tostring(value))
end
end
end
end
--
local dummy = function() end
function optionalrequire(...)
local ok, result = xpcall(require,dummy,...)
if ok then
return result
end
end
local flush = io.flush
if flush then
local execute = os.execute if execute then function os.execute(...) flush() return execute(...) end end
local exec = os.exec if exec then function os.exec (...) flush() return exec (...) end end
local spawn = os.spawn if spawn then function os.spawn (...) flush() return spawn (...) end end
local popen = io.popen if popen then function io.popen (...) flush() return popen (...) end end
end
-- new
FFISUPPORTED = type(ffi) == "table" and ffi.os ~= "" and ffi.arch ~= "" and ffi.load
if not FFISUPPORTED then
-- Maybe we should check for LUATEXENGINE but that's also a bit tricky as we still
-- can have a weird ffi library laying around. Checking for presence of 'jit' is
-- also not robust. So for now we hope for the best.
local okay ; okay, ffi = pcall(require,"ffi")
FFISUPPORTED = type(ffi) == "table" and ffi.os ~= "" and ffi.arch ~= "" and ffi.load
end
if not FFISUPPORTED then
ffi = nil
elseif not ffi.number then
ffi.number = tonumber
end
-- if not bit32 then -- and utf8 then
-- -- bit32 = load ( [[ -- replacement code with 5.3 syntax so that 5.2 doesn't bark on it ]] )
-- bit32 = require("l-bit32")
-- end
-- We need this due a bug in luatex socket loading:
-- local loaded = package.loaded
--
-- if not loaded["socket"] then loaded["socket"] = loaded["socket.core"] end
-- if not loaded["mime"] then loaded["mime"] = loaded["mime.core"] end
--
-- if not socket.mime then socket.mime = package.loaded["mime"] end
--
-- if not loaded["socket.mime"] then loaded["socket.mime"] = socket.mime end
-- if not loaded["socket.http"] then loaded["socket.http"] = socket.http end
-- if not loaded["socket.ftp"] then loaded["socket.ftp"] = socket.ftp end
-- if not loaded["socket.smtp"] then loaded["socket.smtp"] = socket.smtp end
-- if not loaded["socket.tp"] then loaded["socket.tp"] = socket.tp end
-- if not loaded["socket.url"] then loaded["socket.url"] = socket.url end
if LUAVERSION > 5.3 then
-- collectgarbage("collect")
-- collectgarbage("generational") -- crashes on unix
end
if status and os.setenv then
os.setenv("engine",string.lower(status.luatex_engine or "unknown"))
end