summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Gesang <phg@phi-gamma.net>2015-06-21 00:21:33 +0200
committerPhilipp Gesang <phg@phi-gamma.net>2015-06-21 00:21:33 +0200
commit6f273e157c650d396cbad8e09e059b8b7c359818 (patch)
treefbf3a288f190c5f057a95eb796aee421ad5612a5 /src
parent90f398e1c9d2896b2d30d0b66f9c8a88255511a8 (diff)
parente8a56b051a32ed4c468c9325048ded01002a841a (diff)
downloadluaotfload-6f273e157c650d396cbad8e09e059b8b7c359818.tar.gz
Merge pull request #276 from phi-gamma/master
fixes; current progress regarding initialization
Diffstat (limited to 'src')
-rw-r--r--src/luaotfload-database.lua16
-rw-r--r--src/luaotfload-init.lua303
-rw-r--r--src/luaotfload-main.lua281
-rw-r--r--src/luaotfload-parsers.lua91
-rwxr-xr-xsrc/luaotfload-tool.lua12
5 files changed, 400 insertions, 303 deletions
diff --git a/src/luaotfload-database.lua b/src/luaotfload-database.lua
index 099c256..1831ca3 100644
--- a/src/luaotfload-database.lua
+++ b/src/luaotfload-database.lua
@@ -482,8 +482,8 @@ local fonts_reloaded = false
--- limit output when approximate font matching (luaotfload-tool -F)
local fuzzy_limit = 1 --- display closest only
---- bool? -> dbobj
-load_names = function (dry_run)
+--- bool? -> -> bool? -> dbobj option
+load_names = function (dry_run, no_rebuild)
local starttime = osgettimeofday ()
local foundname, data = load_lua_file (config.luaotfload.paths.index_path_lua)
@@ -519,6 +519,11 @@ load_names = function (dry_run)
end
end
else
+ if no_rebuild == true then
+ report ("both", 2, "db",
+ [[Database does not exist, skipping rebuild though.]])
+ return false
+ end
report ("both", 0, "db",
[[Font names database not found, generating new one.]])
report ("both", 0, "db",
@@ -545,8 +550,11 @@ access_font_index = function ()
end
getmetadata = function ()
- if not name_index then name_index = load_names() end
- return tablefastcopy (name_index.meta)
+ if not name_index then
+ name_index = load_names (false, true)
+ if name_index then return tablefastcopy (name_index.meta) end
+ end
+ return false
end
--- unit -> unit
diff --git a/src/luaotfload-init.lua b/src/luaotfload-init.lua
index 4968877..feff4cc 100644
--- a/src/luaotfload-init.lua
+++ b/src/luaotfload-init.lua
@@ -30,30 +30,305 @@
--doc]]--
-config = config or { }
-local config = config
-config.luaotfload = config.luaotfload or { }
+local log --- filled in after loading the log module
+local logreport --- filled in after loading the log module
-config.lualibs = config.lualibs or { }
-config.lualibs.verbose = false
-config.lualibs.prefer_merged = true
-config.lualibs.load_extended = true
+--[[doc--
+
+ \subsection{Preparing the Font Loader}
+ We treat the fontloader as a black box so behavior is consistent
+ between formats.
+ We load the fontloader code directly in the same fashion as the
+ Plain format \identifier{luatex-fonts} that is part of Context.
+ How this is executed depends on the presence on the
+ \emphasis{merged font loader code}.
+ In \identifier{luaotfload} this is contained in the file
+ \fileent{luaotfload-merged.lua}.
+ If this file cannot be found, the original libraries from \CONTEXT
+ of which the merged code was composed are loaded instead.
+ Since these files are not shipped with Luaotfload, an installation
+ of Context is required.
+ (Since we pull the fontloader directly from the Context minimals,
+ the necessary Context version is likely to be more recent than that
+ of other TeX distributions like Texlive.)
+ The imported font loader will call \luafunction{callback.register}
+ once while reading \fileent{font-def.lua}.
+ This is unavoidable unless we modify the imported files, but
+ harmless if we make it call a dummy instead.
+ However, this problem might vanish if we decide to do the merging
+ ourselves, like the \identifier{lualibs} package does.
+ With this step we would obtain the freedom to load our own
+ overrides in the process right where they are needed, at the cost
+ of losing encapsulation.
+ The decision on how to progress is currently on indefinite hold.
-require "lualibs"
+--doc]]--
-if not lualibs then error("this module requires Luaotfload") end
-if not luaotfload then error("this module requires Luaotfload") end
-local load_luaotfload_module = luaotfload.loaders.luaotfload
-local load_fontloader_module = luaotfload.loaders.fontloader
+local init_pre = function ()
---[[doc--
+ local store = { }
+ config = config or { } --- global
+ config.luaotfload = config.luaotfload or { }
+ config.lualibs = config.lualibs or { }
+ config.lualibs.verbose = false
+ config.lualibs.prefer_merged = true
+ config.lualibs.load_extended = true
+
+ require "lualibs"
+
+ if not lualibs then error "this module requires Luaotfload" end
+ if not luaotfload then error "this module requires Luaotfload" end
+
+ --[[doc--
The logger needs to be in place prior to loading the fontloader due
to order of initialization being crucial for the logger functions
that are swapped.
+ --doc]]--
+
+ luaotfload.loaders.luaotfload "log"
+ log = luaotfload.log
+ logreport = log.report
+ log.set_loglevel (default_log_level)
+
+ logreport ("log", 4, "init", "Concealing callback.register().")
+ store.trapped_register = callback.register
+
+ callback.register = function (id)
+ logreport ("log", 4, "init",
+ "Dummy callback.register() invoked on %s.",
+ id)
+ end
+
+ --[[doc--
+
+ By default, the fontloader requires a number of \emphasis{private
+ attributes} for internal use.
+ These must be kept consistent with the attribute handling methods
+ as provided by \identifier{luatexbase}.
+ Our strategy is to override the function that allocates new
+ attributes before we initialize the font loader, making it a
+ wrapper around \luafunction{luatexbase.new_attribute}.\footnote{%
+ Many thanks, again, to Hans Hagen for making this part
+ configurable!
+ }
+ The attribute identifiers are prefixed “\fileent{luaotfload@}” to
+ avoid name clashes.
+
+ --doc]]--
+
+ local new_attribute = luatexbase.new_attribute
+ local the_attributes = luatexbase.attributes
+
+ attributes = attributes or { } --- this writes a global, sorry
+
+ attributes.private = function (name)
+ local attr = "luaotfload@" .. name --- used to be: “otfl@”
+ local number = the_attributes[attr]
+ if not number then number = new_attribute(attr) end
+ return number
+ end
+
+ return store
+end --- [init_pre]
+
+--[[doc--
+
+ These next lines replicate the behavior of
+ \fileent{luatex-fonts.lua}.
+
--doc]]--
-load_luaotfload_module "log"
+local push_namespaces = function ()
+ logreport ("log", 4, "init", "push namespace for font loader")
+ local normalglobal = { }
+ for k, v in next, _G do
+ normalglobal[k] = v
+ end
+ return normalglobal
+end
+
+local pop_namespaces = function (normalglobal,
+ isolate,
+ context_environment)
+ if normalglobal then
+ local _G = _G
+ local mode = "non-destructive"
+ if isolate then mode = "destructive" end
+ logreport ("log", 4, "init", "pop namespace from font loader -- " .. mode)
+ for k, v in next, _G do
+ if not normalglobal[k] then
+ context_environment[k] = v
+ if isolate then
+ _G[k] = nil
+ end
+ end
+ end
+ for k, v in next, normalglobal do
+ _G[k] = v
+ end
+ -- just to be sure:
+ setmetatable(context_environment, _G)
+ else
+ logreport ("both", 0, "init",
+ "irrecoverable error during pop_namespace: no globals to restore")
+ os.exit ()
+ end
+end
+
+local init_adapt = function ()
+
+ luaotfload.context_environment = { }
+ luaotfload.push_namespaces = push_namespaces
+ luaotfload.pop_namespaces = pop_namespaces
+
+ local our_environment = push_namespaces ()
+
+ --[[doc--
+
+ The font loader requires that the attribute with index zero be
+ zero. We happily oblige.
+ (Cf. \fileent{luatex-fonts-nod.lua}.)
+
+ --doc]]--
+
+ tex.attribute[0] = 0
+
+ return our_environment
+
+end --- [init_adapt]
+
+local init_main = function ()
+
+ local load_fontloader_module = luaotfload.loaders.fontloader
+
+ --[[doc--
+
+ Now that things are sorted out we can finally load the
+ fontloader.
+
+ For less current distibutions we ship the code from TL 2014 that
+ should be compatible with Luatex 0.76.
+
+ --doc]]--
+
+ load_fontloader_module (luaotfload.fontloader_package)
+
+ ---load_fontloader_module "font-odv.lua" --- <= Devanagari support from Context
+
+ if not fonts then
+ --- the loading sequence is known to change, so this might have to
+ --- be updated with future updates!
+ --- do not modify it though unless there is a change to the merged
+ --- package!
+ load_fontloader_module "l-lua"
+ load_fontloader_module "l-lpeg"
+ load_fontloader_module "l-function"
+ load_fontloader_module "l-string"
+ load_fontloader_module "l-table"
+ load_fontloader_module "l-io"
+ load_fontloader_module "l-file"
+ load_fontloader_module "l-boolean"
+ load_fontloader_module "l-math"
+ load_fontloader_module "util-str"
+ load_fontloader_module "luatex-basics-gen"
+ load_fontloader_module "data-con"
+ load_fontloader_module "luatex-basics-nod"
+ load_fontloader_module "font-ini"
+ load_fontloader_module "font-con"
+ load_fontloader_module "luatex-fonts-enc"
+ load_fontloader_module "font-cid"
+ load_fontloader_module "font-map"
+ load_fontloader_module "luatex-fonts-syn"
+ load_fontloader_module "luatex-fonts-tfm"
+ load_fontloader_module "font-oti"
+ load_fontloader_module "font-otf"
+ load_fontloader_module "font-otb"
+ load_fontloader_module "luatex-fonts-inj" --> since 2014-01-07, replaces node-inj.lua
+ load_fontloader_module "luatex-fonts-ota"
+ load_fontloader_module "luatex-fonts-otn" --> since 2014-01-07, replaces font-otn.lua
+ load_fontloader_module "font-otp" --> since 2013-04-23
+ load_fontloader_module "luatex-fonts-lua"
+ load_fontloader_module "font-def"
+ load_fontloader_module "luatex-fonts-def"
+ load_fontloader_module "luatex-fonts-ext"
+ load_fontloader_module "luatex-fonts-cbk"
+ end --- non-merge fallback scope
+
+end --- [init_main]
+
+local init_cleanup = function (store)
+ --- reinstate all the stuff we had to move out of the way to
+ --- accomodate the loader
+
+ --[[doc--
+
+ Here we adjust the globals created during font loader
+ initialization. If the second argument to
+ \luafunction{pop_namespaces()} is \verb|true| this will restore the
+ state of \luafunction{_G}, eliminating every global generated since
+ the last call to \luafunction{push_namespaces()}. At the moment we
+ see no reason to do this, and since the font loader is considered
+ an essential part of \identifier{luatex} as well as a very well
+ organized piece of code, we happily concede it the right to add to
+ \luafunction{_G} if needed.
+
+ --doc]]--
+
+ luaotfload.pop_namespaces (store.our_environment,
+ false,
+ luaotfload.context_environment)
+
+ --[[doc--
+
+ \subsection{Callbacks}
+ After the fontloader is ready we can restore the callback trap
+ from \identifier{luatexbase}.
+
+ --doc]]--
+
+ logreport ("log", 4, "init",
+ "Restoring original callback.register().")
+ callback.register = store.trapped_register
+end --- [init_cleanup]
+
+local init_post = function ()
+ --- hook for actions that need to take place after the fontloader is
+ --- installed
+
+ --[[doc--
+
+ we do our own callback handling with the means provided by
+ luatexbase.
+ note: \luafunction{pre_linebreak_filter} and
+ \luafunction{hpack_filter} are coupled in \context in the
+ concept of \emphasis{node processor}.
+
+ --doc]]--
+
+ luatexbase.add_to_callback("pre_linebreak_filter",
+ nodes.simple_font_handler,
+ "luaotfload.node_processor",
+ 1)
+ luatexbase.add_to_callback("hpack_filter",
+ nodes.simple_font_handler,
+ "luaotfload.node_processor",
+ 1)
+end --- [init_post]
+
+return {
+ init = function ()
+ local starttime = os.gettimeofday ()
+ local store = init_pre ()
+ store.our_environment = init_adapt ()
+ init_main ()
+ init_cleanup (store)
+ logreport ("both", 1, "init",
+ "fontloader loaded in %0.3f seconds",
+ os.gettimeofday() - starttime)
+ init_post ()
+ end
+}
diff --git a/src/luaotfload-main.lua b/src/luaotfload-main.lua
index a825dc3..e8f05d6 100644
--- a/src/luaotfload-main.lua
+++ b/src/luaotfload-main.lua
@@ -19,6 +19,10 @@ local luaotfload = luaotfload
luaotfload.log = luaotfload.log or { }
luaotfload.version = "2.6"
luaotfload.loaders = { }
+luaotfload.min_luatex_version = 79 --- i. e. 0.79
+luaotfload.fontloader_package = "fontloader" --- default: from current Context
+----------.fontloader_package = "slim"
+
local authors = "\z
Hans Hagen,\z
@@ -104,16 +108,12 @@ luaotfload.log.tex = {
--doc]]--
-local min_luatex_version = 79 --- i. e. 0.79
---local fontloader_package = "fontloader" --- default: from current Context
-local fontloader_package = "slim"
-
-if tex.luatexversion < min_luatex_version then
+if tex.luatexversion < luaotfload.min_luatex_version then
warning ("LuaTeX v%.2f is old, v%.2f or later is recommended.",
tex.luatexversion / 100,
- min_luatex_version / 100)
+ luaotfload.min_luatex_version / 100)
warning ("using fallback fontloader -- newer functionality not available")
- fontloader_package = "tl2014" --- TODO fallback should be configurable too
+ luaotfload.fontloader_package = "tl2014" --- TODO fallback should be configurable too
--- we install a fallback for older versions as a safety
end
@@ -126,9 +126,25 @@ end
--doc]]--
+local make_loader_name = function (prefix, name)
+ local msg = luaotfload.log and luaotfload.log.report or print
+ if prefix then
+ msg ("log", 7, "load",
+ "Composing fontloader name from constitutents %s, %s",
+ prefix, name)
+ return prefix .. "-" .. name .. ".lua"
+ end
+ msg ("log", 7, "load",
+ "Loading fontloader file %s literally.",
+ name)
+ return name
+end
+
local make_loader = function (prefix)
- return prefix and function (name) require (prefix .. "-" .. name .. ".lua") end
- or function (name) require (name) end
+ return function (name)
+ local modname = make_loader_name (prefix, name)
+ return require (modname)
+ end
end
local load_luaotfload_module = make_loader "luaotfload"
@@ -138,255 +154,12 @@ local load_fontloader_module = make_loader "fontloader"
luaotfload.loaders.luaotfload = load_luaotfload_module
luaotfload.loaders.fontloader = load_fontloader_module
-load_luaotfload_module "init" --- fontloader initialization
+luaotfload.init = load_luaotfload_module "init" --- fontloader initialization
+luaotfload.init.init ()
local log = luaotfload.log
local logreport = log.report
-log.set_loglevel (default_log_level)
-
---[[doc--
-
- \subsection{Preparing the Font Loader}
- We treat the fontloader as a black box so behavior is consistent
- between formats.
- We load the fontloader code directly in the same fashion as the
- Plain format \identifier{luatex-fonts} that is part of Context.
- How this is executed depends on the presence on the
- \emphasis{merged font loader code}.
- In \identifier{luaotfload} this is contained in the file
- \fileent{luaotfload-merged.lua}.
- If this file cannot be found, the original libraries from \CONTEXT
- of which the merged code was composed are loaded instead.
- Since these files are not shipped with Luaotfload, an installation
- of Context is required.
- (Since we pull the fontloader directly from the Context minimals,
- the necessary Context version is likely to be more recent than that
- of other TeX distributions like Texlive.)
- The imported font loader will call \luafunction{callback.register}
- once while reading \fileent{font-def.lua}.
- This is unavoidable unless we modify the imported files, but
- harmless if we make it call a dummy instead.
- However, this problem might vanish if we decide to do the merging
- ourselves, like the \identifier{lualibs} package does.
- With this step we would obtain the freedom to load our own
- overrides in the process right where they are needed, at the cost
- of losing encapsulation.
- The decision on how to progress is currently on indefinite hold.
-
---doc]]--
-
-local starttime = os.gettimeofday ()
-local trapped_register = callback.register
-callback.register = dummy_function
-
---[[doc--
-
- By default, the fontloader requires a number of \emphasis{private
- attributes} for internal use.
- These must be kept consistent with the attribute handling methods
- as provided by \identifier{luatexbase}.
- Our strategy is to override the function that allocates new
- attributes before we initialize the font loader, making it a
- wrapper around \luafunction{luatexbase.new_attribute}.\footnote{%
- Many thanks, again, to Hans Hagen for making this part
- configurable!
- }
- The attribute identifiers are prefixed “\fileent{luaotfload@}” to
- avoid name clashes.
-
---doc]]--
-
-do
- local new_attribute = luatexbase.new_attribute
- local the_attributes = luatexbase.attributes
-
- attributes = attributes or { }
-
- attributes.private = function (name)
- local attr = "luaotfload@" .. name --- used to be: “otfl@”
- local number = the_attributes[attr]
- if not number then
- number = new_attribute(attr)
- end
- return number
- end
-end
-
---[[doc--
-
- These next lines replicate the behavior of
- \fileent{luatex-fonts.lua}.
-
---doc]]--
-
-local context_environment = { }
-
-local push_namespaces = function ()
- logreport ("log", 1, "main", "push namespace for font loader")
- local normalglobal = { }
- for k, v in next, _G do
- normalglobal[k] = v
- end
- return normalglobal
-end
-
-local pop_namespaces = function (normalglobal, isolate)
- if normalglobal then
- local _G = _G
- local mode = "non-destructive"
- if isolate then mode = "destructive" end
- logreport ("log", 1, "main", "pop namespace from font loader -- " .. mode)
- for k, v in next, _G do
- if not normalglobal[k] then
- context_environment[k] = v
- if isolate then
- _G[k] = nil
- end
- end
- end
- for k, v in next, normalglobal do
- _G[k] = v
- end
- -- just to be sure:
- setmetatable(context_environment,_G)
- else
- logreport ("both", 0, "main",
- "irrecoverable error during pop_namespace: no globals to restore")
- os.exit()
- end
-end
-
-luaotfload.context_environment = context_environment
-luaotfload.push_namespaces = push_namespaces
-luaotfload.pop_namespaces = pop_namespaces
-
-local our_environment = push_namespaces()
-
---[[doc--
-
- The font loader requires that the attribute with index zero be
- zero. We happily oblige.
- (Cf. \fileent{luatex-fonts-nod.lua}.)
-
---doc]]--
-
-tex.attribute[0] = 0
-
---[[doc--
-
- Now that things are sorted out we can finally load the fontloader.
-
- For less current distibutions we ship the code from TL 2014 that should be
- compatible with Luatex 0.76.
-
---doc]]--
-
-load_fontloader_module (fontloader_package)
-
----load_fontloader_module "font-odv.lua" --- <= Devanagari support from Context
-
-if fonts then
-
- --- The Initialization is highly idiosyncratic.
-
- if not fonts._merge_loaded_message_done_ then
- logreport ("log", 5, "main", [["I am using the merged fontloader here.]])
- logreport ("log", 5, "main", [[ If you run into problems or experience unexpected]])
- logreport ("log", 5, "main", [[ behaviour, and if you have ConTeXt installed you can try]])
- logreport ("log", 5, "main", [[ to delete the file 'fontloader-fontloader.lua' as I might]])
- logreport ("log", 5, "main", [[ then use the possibly updated libraries. The merged]])
- logreport ("log", 5, "main", [[ version is not supported as it is a frozen instance.]])
- logreport ("log", 5, "main", [[ Problems can be reported to the ConTeXt mailing list."]])
- end
- fonts._merge_loaded_message_done_ = true
-
-else--- the loading sequence is known to change, so this might have to
- --- be updated with future updates!
- --- do not modify it though unless there is a change to the merged
- --- package!
- load_fontloader_module "l-lua"
- load_fontloader_module "l-lpeg"
- load_fontloader_module "l-function"
- load_fontloader_module "l-string"
- load_fontloader_module "l-table"
- load_fontloader_module "l-io"
- load_fontloader_module "l-file"
- load_fontloader_module "l-boolean"
- load_fontloader_module "l-math"
- load_fontloader_module "util-str"
- load_fontloader_module "luatex-basics-gen"
- load_fontloader_module "data-con"
- load_fontloader_module "luatex-basics-nod"
- load_fontloader_module "font-ini"
- load_fontloader_module "font-con"
- load_fontloader_module "luatex-fonts-enc"
- load_fontloader_module "font-cid"
- load_fontloader_module "font-map"
- load_fontloader_module "luatex-fonts-syn"
- load_fontloader_module "luatex-fonts-tfm"
- load_fontloader_module "font-oti"
- load_fontloader_module "font-otf"
- load_fontloader_module "font-otb"
- load_fontloader_module "luatex-fonts-inj" --> since 2014-01-07, replaces node-inj.lua
- load_fontloader_module "luatex-fonts-ota"
- load_fontloader_module "luatex-fonts-otn" --> since 2014-01-07, replaces font-otn.lua
- load_fontloader_module "font-otp" --> since 2013-04-23
- load_fontloader_module "luatex-fonts-lua"
- load_fontloader_module "font-def"
- load_fontloader_module "luatex-fonts-def"
- load_fontloader_module "luatex-fonts-ext"
- load_fontloader_module "luatex-fonts-cbk"
-end --- non-merge fallback scope
-
---[[doc--
-
- Here we adjust the globals created during font loader
- initialization. If the second argument to
- \luafunction{pop_namespaces()} is \verb|true| this will restore the
- state of \luafunction{_G}, eliminating every global generated since
- the last call to \luafunction{push_namespaces()}. At the moment we
- see no reason to do this, and since the font loader is considered
- an essential part of \identifier{luatex} as well as a very well
- organized piece of code, we happily concede it the right to add to
- \luafunction{_G} if needed.
-
---doc]]--
-
-pop_namespaces(our_environment, false)-- true)
-
-logreport ("both", 1, "main",
- "fontloader loaded in %0.3f seconds", os.gettimeofday()-starttime)
-
---[[doc--
-
- \subsection{Callbacks}
- After the fontloader is ready we can restore the callback trap from
- \identifier{luatexbase}.
-
---doc]]--
-
-callback.register = trapped_register
-
---[[doc--
-
- We do our own callback handling with the means provided by
- luatexbase.
- Note: \luafunction{pre_linebreak_filter} and
- \luafunction{hpack_filter} are coupled in \CONTEXT in the concept
- of \emphasis{node processor}.
-
---doc]]--
-
-add_to_callback("pre_linebreak_filter",
- nodes.simple_font_handler,
- "luaotfload.node_processor",
- 1)
-add_to_callback("hpack_filter",
- nodes.simple_font_handler,
- "luaotfload.node_processor",
- 1)
-
load_luaotfload_module "override" --- load glyphlist on demand
--[[doc--
diff --git a/src/luaotfload-parsers.lua b/src/luaotfload-parsers.lua
index 3a4faea..a52b5d4 100644
--- a/src/luaotfload-parsers.lua
+++ b/src/luaotfload-parsers.lua
@@ -17,9 +17,11 @@ if not modules then modules = { } end modules ['luaotfload-parsers'] = {
license = "GNU GPL v2.0"
}
-luaotfload = luaotfload or { }
-luaotfload.parsers = luaotfload.parsers or { }
-local parsers = luaotfload.parsers
+luaotfload = luaotfload or { }
+luaotfload.parsers = luaotfload.parsers or { }
+local parsers = luaotfload.parsers
+parsers.traversal_maxdepth = 42 --- prevent stack overflows
+local traversal_maxdepth = parsers.traversal_maxdepth --- TODO could be an option
local rawset = rawset
@@ -190,6 +192,7 @@ local p_cheapxml = header * root
--doc]]--
--- string -> path list
local fonts_conf_scanner = function (path)
+ logreport("both", 5, "db", "Read fontconfig file %s.", path)
local fh = ioopen(path, "r")
if not fh then
logreport("both", 3, "db", "Cannot open fontconfig file %s.", path)
@@ -197,12 +200,17 @@ local fonts_conf_scanner = function (path)
end
local raw = fh:read"*all"
fh:close()
+ logreport("both", 7, "db",
+ "Reading fontconfig file %s completed (%d bytes).",
+ path, #raw)
+ logreport("both", 5, "db", "Scan fontconfig file %s.", path)
local confdata = lpegmatch(p_cheapxml, raw)
if not confdata then
logreport("both", 3, "db", "Cannot scan fontconfig file %s.", path)
return
end
+ logreport("both", 7, "db", "Scan of fontconfig file %s completed.", path)
return confdata
end
@@ -220,8 +228,9 @@ end
read_fonts_conf_indeed() -- Scan paths included from fontconfig
configuration files recursively. Called with eight arguments.
- The first four are
+ The first five are
+ · the current recursion depth
· the path to the file
· the expanded $HOME
· the expanded $XDG_CONFIG_HOME
@@ -234,12 +243,13 @@ end
--doc]]--
---- string -> string -> string -> string
+--- size_t -> string -> string -> string -> string
--- -> string list -> string list -> string list
--- -> (string -> fun option -> string list)
--- -> tab * tab * tab
local read_fonts_conf_indeed
-read_fonts_conf_indeed = function (start,
+read_fonts_conf_indeed = function (depth,
+ start,
home,
xdg_config_home,
xdg_data_home,
@@ -248,6 +258,18 @@ read_fonts_conf_indeed = function (start,
dirs_done,
find_files)
+ logreport ("both", 4, "db",
+ "Fontconfig scanner processing path %s.",
+ start)
+ if depth >= traversal_maxdepth then
+ --- prevent overflow of Lua call stack
+ logreport ("both", 0, "db",
+ "Fontconfig scanner hit recursion limit (%d); "
+ .. "aborting directory traversal.",
+ traversal_maxdepth)
+ return acc, done, dirs_done
+ end
+
local paths = fonts_conf_scanner(start)
if not paths then --- nothing to do
return acc, done, dirs_done
@@ -273,6 +295,9 @@ read_fonts_conf_indeed = function (start,
--- distributions (e.g. Context minimals) installed
--- separately?
if not (stringfind(path, "texmf") or dirs_done[path]) then
+ logreport ("log", 5, "db",
+ "New fontconfig path at %s.",
+ path)
acc[#acc+1] = path
dirs_done[path] = true
end
@@ -292,34 +317,45 @@ read_fonts_conf_indeed = function (start,
end
if lfsisfile(path)
and kpsereadable_file(path)
- and not done[path]
then
- --- we exclude path with texmf in them, as they should
- --- be found otherwise
- acc = read_fonts_conf_indeed(path,
- home,
- xdg_config_home,
- xdg_data_home,
- acc,
- done,
- dirs_done,
- find_files)
+ if done[path] then
+ logreport("log", 3, "db",
+ "Skipping file at %s, already included.", path)
+ else
+ done[path] = true
+ acc = read_fonts_conf_indeed(depth + 1,
+ path,
+ home,
+ xdg_config_home,
+ xdg_data_home,
+ acc,
+ done,
+ dirs_done,
+ find_files)
+ end
elseif lfsisdir(path) then --- arrow code ahead
local config_files = find_files (path, conf_filter)
for _, filename in next, config_files do
if not done[filename] then
- acc = read_fonts_conf_indeed(filename,
- home,
- xdg_config_home,
- xdg_data_home,
- acc,
- done,
- dirs_done,
- find_files)
+ if done[path] then
+ logreport ("log", 3, "db",
+ "Skipping file at %s, already included.", path)
+ else
+ done[path] = true
+ acc = read_fonts_conf_indeed(depth + 1,
+ filename,
+ home,
+ xdg_config_home,
+ xdg_data_home,
+ acc,
+ done,
+ dirs_done,
+ find_files)
+ end
end
end
end --- match “kind”
- end --- iterate paths
+ end --- iterate paths
end
--inspect(acc)
@@ -350,7 +386,8 @@ local read_fonts_conf = function (path_list, find_files)
local done = { } ---> set: files inspected
local dirs_done = { } ---> set: dirs in list
for i=1, #path_list do --- we keep the state between files
- acc, done, dirs_done = read_fonts_conf_indeed(path_list[i],
+ acc, done, dirs_done = read_fonts_conf_indeed(0,
+ path_list[i],
home,
xdg_config_home,
xdg_data_home,
diff --git a/src/luaotfload-tool.lua b/src/luaotfload-tool.lua
index 36c23bd..e240e4c 100755
--- a/src/luaotfload-tool.lua
+++ b/src/luaotfload-tool.lua
@@ -288,10 +288,14 @@ local version_msg = function ( )
local var = uname_vars[i]
out (" + %8s: %s", var, uname[var])
end
- out ("Index: version=%q created=%q modified=%q",
- config.luaotfload.status.notes.revision,
- meta.created or "ages ago",
- meta.modified or "ages ago")
+ if meta == false then
+ out("No database metadata available.")
+ else
+ out ("Index: version=%q created=%q modified=%q",
+ config.luaotfload.status.notes.revision,
+ meta.created or "ages ago",
+ meta.modified or "ages ago")
+ end
out ""
end