From 81095dd1bf20eb5f7e126adbdc8047f940504180 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Mon, 20 Jul 2020 11:09:33 +0200 Subject: 2020-07-20 10:42:00 --- tex/context/base/mkiv/syst-lua.lua | 211 +++++++++---------------------------- 1 file changed, 49 insertions(+), 162 deletions(-) (limited to 'tex/context/base/mkiv/syst-lua.lua') diff --git a/tex/context/base/mkiv/syst-lua.lua b/tex/context/base/mkiv/syst-lua.lua index 7e44b9f08..085f75eca 100644 --- a/tex/context/base/mkiv/syst-lua.lua +++ b/tex/context/base/mkiv/syst-lua.lua @@ -6,13 +6,43 @@ if not modules then modules = { } end modules ['syst-lua'] = { license = "see context related readme files" } +local load, type, tonumber = load, type, tonumber +local concat = table.concat +local utfchar = utf.char local find = string.find local S, C, P, lpegmatch, lpegtsplitat = lpeg.S, lpeg.C, lpeg.P, lpeg.match, lpeg.tsplitat -commands = commands or { } -local commands = commands -local context = context -local implement = interfaces.implement +local xmath = xmath or math +local xcomplex = xcomplex or { } + +local cmd = tokens.commands + +local scan_next = token.scan_next or token.get_next +local scan_cmdchr = token.scan_cmdchr_expanded + +local get_command = token.get_command +local get_mode = token.get_mode +local get_index = token.get_index +local get_csname = token.get_csname +local get_macro = token.get_macro + +local put_next = token.put_next + +local scan_token = token.scan_token or token.get_token + +local getdimen = tex.getdimen +local getglue = tex.getglue +local getcount = tex.getcount +local gettoks = tex.gettoks +local gettex = tex.get + +local context = context +local dimenfactors = number.dimenfactors + +commands = commands or { } +local commands = commands +local context = context +local implement = interfaces.implement local ctx_protected_cs = context.protected.cs -- more efficient local ctx_firstoftwoarguments = context.firstoftwoarguments @@ -162,53 +192,20 @@ implement { -- stick to the next gimmick. It looks inefficient but performance is actually quite -- efficient. -local concat = table.concat -local utfchar = utf.char -local load, type, tonumber = load, type, tonumber - -local xmath = xmath or math -local xcomplex = xcomplex or { } - -local cmd = tokens.commands - -local scan_next = token.scan_next or token.get_next -local scan_cmdchr = token.scan_cmdchr_expanded - -local get_command = token.get_command -local get_mode = token.get_mode -local get_index = token.get_index -local get_csname = token.get_csname -local get_macro = token.get_macro - -local put_next = token.put_next - -local scan_token = token.scan_token - -local getdimen = tex.getdimen -local getglue = tex.getglue -local getcount = tex.getcount -local gettoks = tex.gettoks -local gettex = tex.get - -local context = context -local dimenfactors = number.dimenfactors - -local result = { "return " } -local word = { } -local r = 1 -local w = 0 - -local report = logs.reporter("system","expression") +do -local function unexpected(c) - report("unexpected token %a",c) -end + local result = { "return " } + local word = { } + local r = 1 + local w = 0 -local expression + local report = logs.reporter("system","expression") -if CONTEXTLMTXMODE == 0 then + local function unexpected(c) + report("unexpected token %a",c) + end - expression = function() + local function expression() local w = 0 local r = 1 while true do @@ -292,120 +289,10 @@ if CONTEXTLMTXMODE == 0 then end end -else - - local letter_code = cmd.letter - local other_char_code = cmd.other_char - local spacer_code = cmd.spacer - local other_char_code = cmd.other_char - local relax_code = cmd.relax - local register_int_code = cmd.register_int - local internal_int_code = cmd.internal_int - local register_dimen_code = cmd.register_dimen - local internal_dimen_code = cmd.internal_dimen - local register_glue_code = cmd.register_glue - local internal_glue_code = cmd.internal_glue - local register_toks_code = cmd.register_toks - local internal_toks_code = cmd.internal_toks - local char_given_code = cmd.char_given - local math_given_code = cmd.math_given - local xmath_given_code = cmd.xmath_given - local some_item_code = cmd.some_item - -- local call_code = cmd.call - -- local the_code = cmd.the - -- local convert_code = cmd.convert - -- local lua_expandable_call_code = cmd.lua_expandable_call - - local function unexpected(c) - report("unexpected token %a",c) - end - - expression = function() - local w = 0 - local r = 1 - while true do - local n, i = scan_cmdchr() - if n == letter_code then - w = w + 1 ; word[w] = utfchar(i) - else - if w > 0 then - -- we could use a metatable for all math, complex and factors - local s = concat(word,"",1,w) - local d = dimenfactors[s] - if d then - r = r + 1 ; result[r] = "*" - r = r + 1 ; result[r] = 1/d - else - if xmath[s] then - r = r + 1 ; result[r] = "xmath." - elseif xcomplex[s] then - r = r + 1 ; result[r] = "xcomplex." - end - r = r + 1 ; result[r] = s - end - w = 0 - end - if n == other_char_code then - r = r + 1 ; result[r] = utfchar(i) - elseif n == spacer_code then - -- r = r + 1 ; result[r] = " " - elseif n == relax_code then - break - elseif n == register_int_code or n == internal_int_code then - r = r + 1 ; result[r] = getcount(i) - elseif n == register_dimen_code or n == internal_dimen_code then - r = r + 1 ; result[r] = getdimen(i) - elseif n == register_glue_code or n == n == register_dimen_code_glue_code then - r = r + 1 ; result[r] = getglue(i) - elseif n == register_toks_code or n == n == register_dimen_code_toks_code then - r = r + 1 ; result[r] = gettoks(i) - elseif n == char_given_code or n == math_given_code or n == xmath_given_code then - r = r + 1 ; result[r] = i - elseif n == some_item_code then - local n = get_csname(t) - if n then - local s = gettex(n) - if s then - r = r + 1 ; result[r] = s - else - unexpected(c) - end - else - unexpected(c) - end - -- elseif n == call_code then - -- local n = get_csname(t) - -- if n then - -- local s = get_macro(n) - -- if s then - -- r = r + 1 ; result[r] = s - -- else - -- unexpected(c) - -- end - -- else - -- unexpected(c) - -- end - -- elseif n == the_code or n == convert_code or n == lua_expandable_call_code then - -- put_next(t) - -- scan_token() -- expands - else - unexpected(c) - end - end - end - local code = concat(result,"",1,r) - local func = load(code) - if type(func) == "function" then - context(func()) - else - report("invalid lua %a",code) - end - end + implement { + public = true, + name = "expression", + actions = expression, + } end - -implement { - public = true, - name = "expression", - actions = expression, -} -- cgit v1.2.3