summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/mlib-scn.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/mlib-scn.lmt')
-rw-r--r--tex/context/base/mkxl/mlib-scn.lmt86
1 files changed, 79 insertions, 7 deletions
diff --git a/tex/context/base/mkxl/mlib-scn.lmt b/tex/context/base/mkxl/mlib-scn.lmt
index 2fb4e7428..1d6514a0b 100644
--- a/tex/context/base/mkxl/mlib-scn.lmt
+++ b/tex/context/base/mkxl/mlib-scn.lmt
@@ -795,15 +795,83 @@ registerdirect("newrecord", function()
return n
end)
+local function merge(old,new)
+ for knew, vnew in next, new do
+ local vold = old[knew]
+ if vold then
+ if type(vnew) == "table" then
+ if type(vold) == "table" then
+ merge(vold,vnew)
+ else
+ old[knew] = vnew
+ end
+ else
+ old[knew] = vnew
+ end
+ else
+ old[knew] = vnew
+ end
+ end
+end
+
+registerdirect("setrecord", function()
+ scantoken() -- semicolon
+ local p = get_parameters()
+ local n = 0
+ if interim > 0 then
+ local r = records[interim]
+ if r then
+ merge(r,p)
+ else
+ records[interim] = p
+ end
+ local top = stack[interim]
+ if top then
+ top = stack[interim][#top]
+ if top then
+ setmetatableindex(p,top)
+ end
+ end
+ n = interim
+ interim = 0
+ else
+ nofrecords = nofrecords + 1
+ records[nofrecords] = p
+ n = nofrecords
+ end
+ return n
+end)
+
+
registerdirect("getrecord", function()
local n = scaninteger()
local v = records[n]
while true do
local t = scansymbol(true)
- if t == ";" or t == ")" then
+ if t == ";" or t == ")" or t == ":" then
return v
elseif t == "." then
scansymbol()
+ elseif t == "#" or t == "##" then -- from tex's we get a double
+ scansymbol()
+ t = scansymbol()
+ v = v[t]
+ return type(v) == "table" and #v or 0
+ elseif t == "[" then
+ scansymbol()
+ t = scansymbol(true)
+ if t == "]" then
+ scansymbol()
+ return #v
+ else
+ t = scaninteger()
+ v = v[t]
+ if scansymbol(true) == "]" then
+ scansymbol()
+ else
+ report("] expected")
+ end
+ end
else
t = scansymbol()
v = v[t]
@@ -811,12 +879,16 @@ registerdirect("getrecord", function()
end
end)
-function metapost.runinternal(n,m)
- if m == 0 then
- insert(stack[n],records[n])
- interim = n
- elseif m == 1 then
- records[n] = remove(stack[n]) or records[n]
+function metapost.runinternal(action,index,kind)
+ if action == 0 then
+ -- allocate
+ elseif action == 1 then
+ -- save
+ insert(stack[index],records[index])
+ interim = index
+ elseif action == 2 then
+ -- restore
+ records[index] = remove(stack[index]) or records[index]
end
end