diff options
author | Taco Hoekwater <taco@elvenkind.com> | 2011-06-01 08:54:21 +0000 |
---|---|---|
committer | Taco Hoekwater <taco@elvenkind.com> | 2011-06-01 08:54:21 +0000 |
commit | d7ccb42582f85acf30568913610ccf4d602023fb (patch) | |
tree | 7292e3545a420676878e7451b68892d360c62cb6 /Master/texmf-dist/tex/context/base/mlib-run.lua | |
parent | 2d62a6fe9b80def59c392268022f1f9a2d6e358f (diff) |
commit context 2011.05.18
git-svn-id: svn://tug.org/texlive/trunk@22719 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/context/base/mlib-run.lua')
-rw-r--r-- | Master/texmf-dist/tex/context/base/mlib-run.lua | 313 |
1 files changed, 188 insertions, 125 deletions
diff --git a/Master/texmf-dist/tex/context/base/mlib-run.lua b/Master/texmf-dist/tex/context/base/mlib-run.lua index f352e1db161..72c16775d4f 100644 --- a/Master/texmf-dist/tex/context/base/mlib-run.lua +++ b/Master/texmf-dist/tex/context/base/mlib-run.lua @@ -31,110 +31,77 @@ nears zero.</p> local trace_graphics = false trackers.register("metapost.graphics", function(v) trace_graphics = v end) -local format, gsub, match = string.format, string.gsub, string.match +local report_metapost = logs.reporter("metapost") + +local texerrormessage = logs.texerrormessage + +local format, gsub, match, find = string.format, string.gsub, string.match, string.find local starttiming, stoptiming = statistics.starttiming, statistics.stoptiming -metapost = metapost or { } +local mplib = mplib + +metapost = metapost or { } +local metapost = metapost -metapost.showlog = false -metapost.lastlog = "" +metapost.showlog = false +metapost.lastlog = "" +metapost.texerrors = false +metapost.exectime = metapost.exectime or { } -- hack + +local mplibone = tonumber(mplib.version()) <= 1.50 + +directives.register("mplib.texerrors", function(v) metapost.texerrors = v end) function metapost.resetlastlog() metapost.lastlog = "" end -local function finder(name, mode, ftype) - if mode=="w" then +local function finder(name, mode, ftype) -- we can use the finder to intercept btex/etex + if mode == "w" then return name elseif file.is_qualified_path(name) then return name else - return resolvers.find_file(name,ftype) + return resolvers.findfile(name,ftype) end end -metapost.finder = finder - -metapost.parameters = { - hash_size = 100000, - main_memory = 4000000, - max_in_open = 50, - param_size = 100000, -} - -metapost.exectime = metapost.exectime or { } -- hack - -local preamble = [[ -boolean mplib; string mp_parent_version; -mplib := true; -mp_parent_version := "%s"; -input %s ; dump ; -]] - -function metapost.make(name, target, version) - starttiming(mplib) - target = file.replacesuffix(target or name, "mem") - local mpx = mplib.new ( table.merged ( - metapost.parameters, - { - ini_version = true, - find_file = finder, - job_name = file.removesuffix(target), - } - ) ) - if mpx then - starttiming(metapost.exectime) - local result = mpx:execute(format(preamble,version or "unknown",name)) - stoptiming(metapost.exectime) - mpx:finish() +local function finder(name, mode, ftype) -- we use the finder to intercept btex/etex + if mode ~= "w" then + name = file.is_qualified_path(name) and name or resolvers.findfile(name,ftype) + if not (find(name,"/metapost/context/base/") or find(name,"/metapost/context/") or find(name,"/metapost/base/")) then + local data, found, forced = metapost.checktexts(io.loaddata(name) or "") + if found then + local temp = luatex.registertempfile(name,true) + io.savedata(temp,data) + name = temp + end + end end - stoptiming(mplib) + return name end -function metapost.load(name) - starttiming(mplib) - local mpx = mplib.new ( table.merged ( - metapost.parameters, - { - ini_version = false, - mem_name = file.replacesuffix(name,"mem"), - find_file = finder, - -- job_name = "mplib", - } - ) ) - local result - if not mpx then - result = { status = 99, error = "out of memory"} - end - stoptiming(mplib) - return mpx, result -end +-- -- -- -function metapost.unload(mpx) - starttiming(mplib) - if mpx then - mpx:finish() - end - stoptiming(mplib) -end +metapost.finder = finder function metapost.reporterror(result) if not result then - metapost.report("mp error: no result object returned") + report_metapost("error: no result object returned") elseif result.status > 0 then local t, e, l = result.term, result.error, result.log if t and t ~= "" then - metapost.report("mp terminal: %s",t) + (metapost.texerrors and texerrormessage or report_metapost)("terminal: %s",t) end if e then - metapost.report("mp error: %s",(e=="" and "?") or e) + (metapost.texerrors and texerrormessage or report_metapost)("error: %s",(e=="" and "?") or e) end if not t and not e and l then metapost.lastlog = metapost.lastlog .. "\n" .. l - metapost.report("mp log: %s",l) + report_metapost("log: %s",l) else - metapost.report("mp error: unknown, no error, terminal or log messages") + report_metapost("error: unknown, no error, terminal or log messages") end else return false @@ -142,48 +109,148 @@ function metapost.reporterror(result) return true end -function metapost.checkformat(mpsinput, mpsformat, dirname) - mpsinput = file.addsuffix(mpsinput or "metafun", "mp") - mpsformat = file.removesuffix(file.basename(mpsformat or texconfig.formatname or (tex and tex.formatname) or mpsinput)) - local mpsbase = file.removesuffix(file.basename(mpsinput)) - if mpsbase ~= mpsformat then - mpsformat = mpsformat .. "-" .. mpsbase +if mplibone then + + local preamble = [[ + boolean mplib ; mplib := true ; + string mp_parent_version ; mp_parent_version := "%s" ; + input %s ; dump ; + ]] + + metapost.parameters = { + hash_size = 100000, + main_memory = 4000000, + max_in_open = 50, + param_size = 100000, + } + + function metapost.make(name, target, version) + starttiming(mplib) + target = file.replacesuffix(target or name, "mem") -- redundant + local mpx = mplib.new ( table.merged ( + metapost.parameters, + { + ini_version = true, + find_file = finder, + job_name = file.removesuffix(target), + } + ) ) + if mpx then + starttiming(metapost.exectime) + local result = mpx:execute(format(preamble,version or "unknown",name)) + stoptiming(metapost.exectime) + mpx:finish() + end + stoptiming(mplib) end - mpsformat = file.addsuffix(mpsformat, "mem") - local pth = dirname or file.dirname(texconfig.formatname or "") - if pth ~= "" then - mpsformat = file.join(pth,mpsformat) + + function metapost.load(name) + starttiming(mplib) + local mpx = mplib.new ( table.merged ( + metapost.parameters, + { + ini_version = false, + mem_name = file.replacesuffix(name,"mem"), + find_file = finder, + -- job_name = "mplib", + } + ) ) + local result + if not mpx then + result = { status = 99, error = "out of memory"} + end + stoptiming(mplib) + return mpx, result end - local the_version = environment.version or "unset version" - if lfs.isfile(mpsformat) then - commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat) - local mpx, result = metapost.load(mpsformat) - if mpx then - local result = mpx:execute("show mp_parent_version ;") - if not result.log then - metapost.reporterror(result) - else - local version = match(result.log,">> *(.-)[\n\r]") or "unknown" - version = gsub(version,"[\'\"]","") - if version ~= the_version then - commands.writestatus("mplib","version mismatch: %s <> %s", version or "unknown", the_version) + + function metapost.checkformat(mpsinput) + local mpsversion = environment.version or "unset version" + local mpsinput = file.addsuffix(mpsinput or "metafun", "mp") + local mpsformat = file.removesuffix(file.basename(texconfig.formatname or (tex and tex.formatname) or mpsinput)) + local mpsbase = file.removesuffix(file.basename(mpsinput)) + if mpsbase ~= mpsformat then + mpsformat = mpsformat .. "-" .. mpsbase + end + mpsformat = file.addsuffix(mpsformat, "mem") + local mpsformatfullname = caches.getfirstreadablefile(mpsformat,"formats") or "" + if mpsformatfullname ~= "" then + report_metapost("loading '%s' from '%s'", mpsinput, mpsformatfullname) + local mpx, result = metapost.load(mpsformatfullname) + if mpx then + local result = mpx:execute("show mp_parent_version ;") + if not result.log then + metapost.reporterror(result) else - return mpx + local version = match(result.log,">> *(.-)[\n\r]") or "unknown" + version = gsub(version,"[\'\"]","") + if version ~= mpsversion then + report_metapost("version mismatch: %s <> %s", version or "unknown", mpsversion) + else + return mpx + end end + else + report_metapost("error in loading '%s' from '%s'", mpsinput, mpsformatfullname) + metapost.reporterror(result) end + end + local mpsformatfullname = caches.setfirstwritablefile(mpsformat,"formats") + report_metapost("making '%s' into '%s'", mpsinput, mpsformatfullname) + metapost.make(mpsinput,mpsformatfullname,mpsversion) -- somehow return ... fails here + if lfs.isfile(mpsformatfullname) then + report_metapost("loading '%s' from '%s'", mpsinput, mpsformatfullname) + return metapost.load(mpsformatfullname) + else + report_metapost("problems with '%s' from '%s'", mpsinput, mpsformatfullname) + end + end + +else + + local preamble = [[ + boolean mplib ; mplib := true ; + let dump = endinput ; + input %s ; + ]] + + function metapost.load(name) + starttiming(mplib) + local mpx = mplib.new { + ini_version = true, + find_file = finder, + } + local result + if not mpx then + result = { status = 99, error = "out of memory"} + else + result = mpx:execute(format(preamble, file.replacesuffix(name,"mp"))) + end + stoptiming(mplib) + metapost.reporterror(result) + return mpx, result + end + + function metapost.checkformat(mpsinput) + local mpsversion = environment.version or "unset version" + local mpsinput = file.addsuffix(mpsinput or "metafun", "mp") + report_metapost("loading '%s' (experimental metapost version two)",mpsinput) + local mpx, result = metapost.load(mpsinput) + if mpx then + return mpx else - commands.writestatus("mplib","error in loading '%s' from '%s'", mpsinput, mpsformat) + report_metapost("error in loading '%s'",mpsinput) metapost.reporterror(result) end end - commands.writestatus("mplib","making '%s' into '%s'", mpsinput, mpsformat) - metapost.make(mpsinput,mpsformat,the_version) -- somehow return ... fails here - if lfs.isfile(mpsformat) then - commands.writestatus("mplib","loading '%s' from '%s'", mpsinput, mpsformat) - return metapost.load(mpsformat) - else - commands.writestatus("mplib","problems with '%s' from '%s'", mpsinput, mpsformat) + +end + +function metapost.unload(mpx) + starttiming(mplib) + if mpx then + mpx:finish() end + stoptiming(mplib) end local mpxformats = { } @@ -192,7 +259,7 @@ function metapost.format(instance,name) name = name or instance local mpx = mpxformats[instance] if not mpx then - commands.writestatus("mplib","initializing instance '%s' using format '%s'",instance,name) + report_metapost("initializing instance '%s' using format '%s'",instance,name) mpx = metapost.checkformat(name) mpxformats[instance] = mpx end @@ -256,9 +323,9 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, if not metapost.reporterror(result) then if metapost.showlog then local str = (result.term ~= "" and result.term) or "no terminal output" - if not str:is_empty() then + if not string.is_empty(str) then metapost.lastlog = metapost.lastlog .. "\n" .. str - metapost.report("mp log: %s",str) + report_metapost("log: %s",str) end end if result.fig then @@ -266,7 +333,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, end end else - metapost.report("mp error: invalid graphic component %s",i) + report_metapost("error: invalid graphic component %s",i) end end else @@ -284,13 +351,13 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, end -- todo: error message if not result then - metapost.report("mp error: no result object returned") + report_metapost("error: no result object returned") elseif result.status > 0 then - metapost.report("mp error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error")) + report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error")) else if metapost.showlog then metapost.lastlog = metapost.lastlog .. "\n" .. result.term - metapost.report("mp info: %s",result.term or "no-term") + report_metapost("info: %s",result.term or "no-term") end if result.fig then converted = metapost.convert(result, trialrun, flusher, multipass, askedfig) @@ -308,11 +375,7 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, end function metapost.convert() - metapost.report('mp warning: no converter set') -end - -function metapost.report(...) - logs.report("mplib",...) + report_metapost('warning: no converter set') end -- handy @@ -324,29 +387,29 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata) outputformat = "mps" end if not data then - logs.simple("unknown file '%s'",filename or "?") + report_metapost("unknown file '%s'",filename or "?") else - local mpx = metapost.checkformat(formatname,formatname,caches.setpath("formats")) + local mpx = metapost.checkformat(formatname) if not mpx then - logs.simple("unknown format '%s'",formatname or "?") + report_metapost("unknown format '%s'",formatname or "?") else - logs.simple("processing '%s'",(mpdata and (filename or "data")) or fullname) + report_metapost("processing '%s'",(mpdata and (filename or "data")) or fullname) local result = mpx:execute(data) if not result then - logs.simple("error: no result object returned") + report_metapost("error: no result object returned") elseif result.status > 0 then - logs.simple("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error")) + report_metapost("error: %s",(result.term or "no-term") .. "\n" .. (result.error or "no-error")) else if metapost.showlog then metapost.lastlog = metapost.lastlog .. "\n" .. result.term - logs.simple("info: %s",result.term or "no-term") + report_metapost("info: %s",result.term or "no-term") end local figures = result.fig if figures then local sorted = table.sortedkeys(figures) if astable then local result = { } - logs.simple("storing %s figures in table",#sorted) + report_metapost("storing %s figures in table",#sorted) for k=1,#sorted do local v = sorted[k] if outputformat == "mps" then @@ -367,7 +430,7 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata) output = figures[v]:svg() -- (3) for prologues end local outname = format("%s-%s.%s",basename,v,outputformat) - logs.simple("saving %s bytes in '%s'",#output,outname) + report_metapost("saving %s bytes in '%s'",#output,outname) io.savedata(outname,output) end return #sorted |