summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/luatex/luatexbase/attr.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/luatex/luatexbase/attr.lua')
-rw-r--r--Master/texmf-dist/tex/luatex/luatexbase/attr.lua190
1 files changed, 186 insertions, 4 deletions
diff --git a/Master/texmf-dist/tex/luatex/luatexbase/attr.lua b/Master/texmf-dist/tex/luatex/luatexbase/attr.lua
index e21e47d0c11..3f66fd78e9d 100644
--- a/Master/texmf-dist/tex/luatex/luatexbase/attr.lua
+++ b/Master/texmf-dist/tex/luatex/luatexbase/attr.lua
@@ -8,8 +8,48 @@
--
-- See the aforementioned source file(s) for copyright and licensing information.
--
-module('luatexbase', package.seeall)
-attributes = {}
+--- locals
+local copynode = node.copy
+local newnode = node.new
+local nodesubtype = node.subtype
+local nodetype = node.id
+local stringfind = string.find
+local stringformat = string.format
+local tableunpack = unpack or table.unpack
+local texiowrite_nl = texio.write_nl
+local texiowrite = texio.write
+--- luatex internal types
+local whatsit_t = nodetype"whatsit"
+local user_defined_t = nodesubtype"user_defined"
+local unassociated = "__unassociated"
+luatexbase = luatexbase or { }
+local luatexbase = luatexbase
+local reporter = function (log, category, ...)
+ if log == true then
+ texiowrite_nl("log", "("..category..") ")
+ texiowrite("log", stringformat(...))
+ else
+ texiowrite_nl("("..category..") ")
+ texiowrite(stringformat(...))
+ end
+end
+local warning = function (...) reporter (false, "warning", ...) end
+----- info = function (...) reporter (false, "info", ...) end
+local log = function (...) reporter (true, "log", ...) end
+luatexbase.attributes = luatexbase.attributes or { }
+local attributes = luatexbase.attributes
+local new_attribute
+local unset_attribute
+local luatex_sty_counter = 'LuT@AllocAttribute'
+if tex.count[luatex_sty_counter] then
+ if tex.count[luatex_sty_counter] > -1 then
+ error("luatexbase error: attribute 0 has already been set by \newattribute"
+ .."macro from luatex.sty, not belonging to this package, this makes"
+ .."luaotfload unusable. Please report to the maintainer of luatex.sty")
+ else
+ tex.count[luatex_sty_counter] = 0
+ end
+end
local last_alloc = 0
function new_attribute(name, silent)
if last_alloc >= 65535 then
@@ -19,18 +59,160 @@ function new_attribute(name, silent)
error("No room for a new \\attribute", 1)
end
end
+ local lsc = tex.count[luatex_sty_counter]
+ if lsc and lsc > last_alloc then
+ last_alloc = lsc
+ end
last_alloc = last_alloc + 1
+ if lsc then
+ tex.setcount('global', luatex_sty_counter, last_alloc)
+ end
attributes[name] = last_alloc
unset_attribute(name)
if not silent then
- texio.write_nl('log', string.format(
- 'luatexbase.attributes[%q] = %d', name, last_alloc))
+ log('luatexbase.attributes[%q] = %d', name, last_alloc)
end
return last_alloc
end
+luatexbase.new_attribute = new_attribute
local unset_value = (luatexbase.luatexversion < 37) and -1 or -2147483647
function unset_attribute(name)
tex.setattribute(attributes[name], unset_value)
end
+luatexbase.unset_attribute = unset_attribute
+--- cf. luatexref-t.pdf, sect. 8.1.4.25
+local user_whatsits = { --- (package, (name, id hash)) hash
+ __unassociated = { }, --- those without package name
+}
+local whatsit_ids = { } --- (id, (name * package)) hash
+local whatsit_cap = 2^53 --- Lua numbers are doubles
+local current_whatsit = 0
+local anonymous_whatsits = 0
+local anonymous_prefix = "anon"
+--- string -> string -> int
+local new_user_whatsit_id = function (name, package)
+ if name then
+ if not package then
+ package = unassociated
+ end
+ else -- anonymous
+ anonymous_whatsits = anonymous_whatsits + 1
+ warning("defining anonymous user whatsit no. %d", anonymous_whatsits)
+ warning("dear package authors, please name your whatsits!")
+ package = unassociated
+ name = anonymous_prefix .. tostring(anonymous_whatsits)
+ end
+
+ local whatsitdata = user_whatsits[package]
+ if not whatsitdata then
+ whatsitdata = { }
+ user_whatsits[package] = whatsitdata
+ end
+
+ local id = whatsitdata[name]
+ if id then --- warning
+ warning("replacing whatsit %s:%s (%d)", package, name, id)
+ else --- new id
+ current_whatsit = current_whatsit + 1
+ if current_whatsit >= whatsit_cap then
+ warning("maximum of %d integral user whatsit ids reached",
+ whatsit_cap)
+ warning("further whatsit allocation may be inconsistent")
+ end
+ id = current_whatsit
+ whatsitdata[name] = id
+ whatsit_ids[id] = { name, package }
+ end
+ log("new user-defined whatsit %d (%s:%s)", id, package, name)
+ return id
+end
+luatexbase.new_user_whatsit_id = new_user_whatsit_id
+--- string -> string -> (unit -> node_t, int)
+local new_user_whatsit = function (name, package)
+ local id = new_user_whatsit_id(name, package)
+ local whatsit = newnode(whatsit_t, user_defined_t)
+ whatsit.user_id = id
+ --- unit -> node_t
+ return function ( ) return copynode(whatsit) end, id
+end
+luatexbase.new_user_whatsit = new_user_whatsit
+luatexbase.new_user_whatsit_factory = new_user_whatsit --- for Stephan
+--- string -> string -> int
+local get_user_whatsit_id = function (name, package)
+ if not package then
+ package = unassociated
+ end
+ return user_whatsits[package][name]
+end
+luatexbase.get_user_whatsit_id = get_user_whatsit_id
+--- int | fun | node -> (string, string)
+local get_user_whatsit_name = function (asked)
+ local id
+ if type(asked) == "number" then
+ id = asked
+ elseif type(asked) == "function" then
+ --- node generator
+ local n = asked()
+ id = n.user_id
+ else --- node
+ id = asked.user_id
+ end
+ local metadata = whatsit_ids[id]
+ if not metadata then -- unknown
+ warning("whatsit id %d unregistered; inconsistencies may arise", id)
+ return "", ""
+ end
+ return tableunpack(metadata)
+end
+luatexbase.get_user_whatsit_name = get_user_whatsit_name
+--- string -> unit
+local dump_registered_whatsits = function (asked_package)
+ local whatsit_list = { }
+ if asked_package then
+ local whatsitdata = user_whatsits[asked_package]
+ if not whatsitdata then
+ error("(no user whatsits registered for package %s)",
+ asked_package)
+ return
+ end
+ texiowrite_nl("(user whatsit allocation stats for " .. asked_package)
+ for name, id in next, whatsitdata do
+ whatsit_list[#whatsit_list+1] =
+ stringformat("(%s:%s %d)", asked_package, name, id)
+ end
+ else
+ texiowrite_nl("(user whatsit allocation stats")
+ texiowrite_nl(stringformat(" ((total %d)\n (anonymous %d))",
+ current_whatsit, anonymous_whatsits))
+ for package, whatsitdata in next, user_whatsits do
+ for name, id in next, whatsitdata do
+ whatsit_list[#whatsit_list+1] =
+ stringformat("(%s:%s %d)", package, name, id)
+ end
+ end
+ end
+
+ texiowrite_nl" ("
+ --- in an attempt to be clever the texio.write* functions
+ --- mess up line breaking, so concatenation is unusable ...
+ local first = true
+ for i=1, #whatsit_list do
+ if first then
+ first = false
+ else -- indent
+ texiowrite_nl" "
+ end
+ texiowrite(whatsit_list[i])
+ end
+ texiowrite"))\n"
+end
+luatexbase.dump_registered_whatsits = dump_registered_whatsits
+luatexbase.newattribute = new_attribute
+luatexbase.newuserwhatsit = new_user_whatsit
+luatexbase.newuserwhatsitfactory = new_user_whatsit_factory
+luatexbase.newuserwhatsitid = new_user_whatsit_id
+luatexbase.getuserwhatsitid = get_user_whatsit_id
+luatexbase.getuserwhatsitname = get_user_whatsit_name
+luatexbase.dumpregisteredwhatsits = dump_registered_whatsits
--
-- End of File `attr.lua'.