diff options
-rw-r--r-- | luaotfload-database.lua | 91 |
1 files changed, 57 insertions, 34 deletions
diff --git a/luaotfload-database.lua b/luaotfload-database.lua index bd35fbb..3a0d61e 100644 --- a/luaotfload-database.lua +++ b/luaotfload-database.lua @@ -134,13 +134,14 @@ This is a sketch of the luaotfload db: mappings : fontentry list; status : filestatus; version : float; - // additions of v2.3; these supersede the basenames / barenames + // new in v2.3; these supersede the basenames / barenames // hashes from v2.2 - filenames : { - base : (string, int) hash; // basename -> idx - bare : (string, int) hash; // barename -> idx - full : (int, string) hash; // idx -> full path - } + filenames : filemap; + } + and filemap = { + base : (string, int) hash; // basename -> idx + bare : (string, int) hash; // barename -> idx + full : (int, string) hash; // idx -> full path } and fontentry = { familyname : string; @@ -333,32 +334,47 @@ end local type1_formats = { "tfm", "ofm", } ---- string -> string +local dummy_findfile = resolvers.findfile -- from basics-gen + +--- filemap -> string -> string -> (string | bool) +local verbose_lookup = function (data, kind, filename) + local found = data[kind][filename] + if found ~= nil then + found = data.full[found] + if found == nil then --> texmf + report("info", 0, "db", + "crude file lookup: req=%s; hit=%s => kpse", + filename, kind) + found = dummy_findfile(filename) + else + report("info", 0, "db", + "crude file lookup: req=%s; hit=%s; ret=%s", + filename, kind, found) + end + return found + end + return false +end + +--- string -> (string | string * string) crude_file_lookup_verbose = function (filename) if not names.data then names.data = load_names() end local data = names.data local mappings = data.mappings + local filenames = data.filenames local found --- look up in db first ... - found = data.barenames[filename] - if found and mappings[found] then - found = mappings[found].filename[1] - report("info", 0, "db", - "crude file lookup: req=%s; hit=bare; ret=%s", - filename, found) + found = verbose_lookup(filenames, "bare", filename) + if found then return found end - found = data.basenames[filename] - if found and mappings[found] then - found = mappings[found].filename[1] - report("info", 0, "db", - "crude file lookup: req=%s; hit=base; ret=%s", - filename, found) + found = verbose_lookup(filenames, "base", filename) + if found then return found end - --- ofm and tfm + --- ofm and tfm, returns pair for i=1, #type1_formats do local format = type1_formats[i] if resolvers.findfile(filename, format) then @@ -368,22 +384,25 @@ crude_file_lookup_verbose = function (filename) return filename, nil end -local dummy_findfile = resolvers.findfile -- from basics-gen - ---- string -> string +--- string -> (string | string * string) crude_file_lookup = function (filename) - local found = dummy_findfile(filename) - if found then - return found - end if not names.data then names.data = load_names() end local data = names.data local mappings = data.mappings - found = data.barenames[filename] - or data.basenames[filename] + local filenames = data.filenames + + local found + + found = filenames.base[filename] + or filenames.bare[filename] + if found then - found = data.mappings[found] - if found then return found.filename[1] end + found = filenames.full[found] + if found == nil then + return dummy_findfile(filename) + else + return found + end end for i=1, #type1_formats do local format = type1_formats[i] @@ -1437,7 +1456,7 @@ end flush_lookup_cache = function () if not names.lookups then names.lookups = load_lookups() end names.lookups = { } - collectgarbage"collect" + collectgarbage "collect" return true, names.lookups end @@ -1473,10 +1492,12 @@ local gen_fast_lookups = function (fontnames) local addmap = function (lst) --- this will overwrite existing entries for i=1, #lst do - local idx, base, bare, texmf, full = unpack(lst[i]) + local idx, base, bare, intexmf, full = unpack(lst[i]) filenames.bare[bare] = idx filenames.base[base] = idx - if texmf ~= true then + if intexmf == true then + filenames.full[idx] = nil + else filenames.full[idx] = full end end @@ -1492,6 +1513,8 @@ local gen_fast_lookups = function (fontnames) end fontnames.filenames = filenames + texmf, sys = nil, nil + collectgarbage "collect" return fontnames end |