mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-25 03:00:46 +00:00
Lunatic translator: qsprintf.
git-svn-id: https://svn.eduke32.com/eduke32@3507 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
740c8d021b
commit
d1442ac88e
3 changed files with 90 additions and 7 deletions
|
@ -486,6 +486,78 @@ function _qstrcat(qdst, qsrc)
|
||||||
cstr_dst[i] = 0
|
cstr_dst[i] = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local buf = ffi.new("char [?]", MAXQUOTELEN)
|
||||||
|
|
||||||
|
function _qsprintf(qdst, qsrc, ...)
|
||||||
|
local dst = bcheck.quote_idx(qdst)
|
||||||
|
local src = bcheck.quote_idx(qsrc)
|
||||||
|
local vals = {...}
|
||||||
|
|
||||||
|
local i, j, vi = 0, 0, 0
|
||||||
|
|
||||||
|
while (true) do
|
||||||
|
local ch = src[j]
|
||||||
|
local didfmt = false
|
||||||
|
|
||||||
|
if (ch==0) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
if (ch=='%') then
|
||||||
|
local nch = src[j+1]
|
||||||
|
if (nch=='d' or (nch=='l' and src[j+2]=='d')) then
|
||||||
|
-- number
|
||||||
|
didfmt = true
|
||||||
|
|
||||||
|
if (vi == #vals) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
local numstr = tostring(vals[vi])
|
||||||
|
assert(type(numstr)=="string")
|
||||||
|
vi = vi+1
|
||||||
|
|
||||||
|
local ncopied = math.min(#numstr, MAXQUOTELEN-1-i)
|
||||||
|
ffi.copy(buf+i, numstr, ncopied)
|
||||||
|
|
||||||
|
i = i+ncopied
|
||||||
|
j = j+1+(nch=='d' and 1 or 2)
|
||||||
|
elseif (nch=='s') then
|
||||||
|
-- string
|
||||||
|
didfmt = true
|
||||||
|
|
||||||
|
if (vi == #vals) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
|
||||||
|
local k = -1
|
||||||
|
local tmpsrc = bcheck.quote_idx(vals[vi])
|
||||||
|
|
||||||
|
repeat
|
||||||
|
k = k+1
|
||||||
|
buf[i] = tmpsrc[k]
|
||||||
|
i = i+1
|
||||||
|
until (i < MAXQUOTELEN-1 and tmpsrc[k]~=0)
|
||||||
|
|
||||||
|
j = j+2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if (not didfmt) then
|
||||||
|
buf[i] = src[j]
|
||||||
|
i = i+1
|
||||||
|
j = j+1
|
||||||
|
end
|
||||||
|
|
||||||
|
if (i >= MAXQUOTELEN-1) then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
buf[i] = 0
|
||||||
|
strcpy(dst, buf)
|
||||||
|
end
|
||||||
|
|
||||||
function _getkeyname(qdst, gfuncnum, which)
|
function _getkeyname(qdst, gfuncnum, which)
|
||||||
local cstr_dst = bcheck.quote_idx(qdst)
|
local cstr_dst = bcheck.quote_idx(qdst)
|
||||||
|
|
||||||
|
|
|
@ -1351,6 +1351,10 @@ local function GetOrSetPerxvarCmd(Setp, Actorp)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
local function n_s_fmt(n)
|
||||||
|
return string.rep("%s,", n-1).."%s"
|
||||||
|
end
|
||||||
|
|
||||||
-- Various inner command handling functions / string capture strings.
|
-- Various inner command handling functions / string capture strings.
|
||||||
local handle =
|
local handle =
|
||||||
{
|
{
|
||||||
|
@ -1398,6 +1402,11 @@ local handle =
|
||||||
v[1] or 0, v[2] or 0, v[3] or 0, v[4] or 0)
|
v[1] or 0, v[2] or 0, v[3] or 0, v[4] or 0)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
|
qsprintf = function(qdst, qsrc, ...)
|
||||||
|
local codes = {...}
|
||||||
|
return format("_con._qsprintf(%d,%d,%s)", qdst, qsrc, table.concat(codes, ','))
|
||||||
|
end,
|
||||||
|
|
||||||
move = function(mv, ...)
|
move = function(mv, ...)
|
||||||
local flags = {...}
|
local flags = {...}
|
||||||
return format(ACS":set_move(%s,%d)", mv, (flags[1] and bit.bor(...)) or 0)
|
return format(ACS":set_move(%s,%d)", mv, (flags[1] and bit.bor(...)) or 0)
|
||||||
|
@ -1428,10 +1437,6 @@ local handle =
|
||||||
soundonce = "_con._soundonce(_aci,%1)",
|
soundonce = "_con._soundonce(_aci,%1)",
|
||||||
}
|
}
|
||||||
|
|
||||||
local function n_s_fmt(n)
|
|
||||||
return string.rep("%s,", n-1).."%s"
|
|
||||||
end
|
|
||||||
|
|
||||||
local userdef_common_pat = (arraypat + sp1)/{} * lpeg.Cc(0) * lpeg.Ct(singlememberpat) * sp1
|
local userdef_common_pat = (arraypat + sp1)/{} * lpeg.Cc(0) * lpeg.Ct(singlememberpat) * sp1
|
||||||
|
|
||||||
-- NOTE about prefixes: most is handled by all_alt_pattern(), however commands
|
-- NOTE about prefixes: most is handled by all_alt_pattern(), however commands
|
||||||
|
@ -1750,7 +1755,8 @@ local Cinner = {
|
||||||
/ "%3=_con._findnear(_aci,false,'d2',%1,%2)",
|
/ "%3=_con._findnear(_aci,false,'d2',%1,%2)",
|
||||||
|
|
||||||
-- quotes
|
-- quotes
|
||||||
qsprintf = sp1 * tok.rvar * sp1 * tok.rvar * (sp1 * tok.rvar)^-32,
|
qsprintf = sp1 * tok.rvar * sp1 * tok.rvar * (sp1 * tok.rvar)^-32
|
||||||
|
/ handle.qsprintf,
|
||||||
qgetsysstr = cmd(R,R)
|
qgetsysstr = cmd(R,R)
|
||||||
/ handle.NYI,
|
/ handle.NYI,
|
||||||
qstrcat = cmd(R,R)
|
qstrcat = cmd(R,R)
|
||||||
|
|
|
@ -51,7 +51,12 @@ onevent EVENT_ENTERLEVEL
|
||||||
getticks t2
|
getticks t2
|
||||||
subvarvar t2 t
|
subvarvar t2 t
|
||||||
|
|
||||||
redefinequote 114 %d x four 0..MAXSPITES-1 iterations took %d ms in total
|
// qsprintf test
|
||||||
qsprintf 115 114 n t2
|
redefinequote 116 0..MAXSPITES-1
|
||||||
|
redefinequote 117 in total
|
||||||
|
|
||||||
|
redefinequote 114 %d x four %s iterations took %d ms %s
|
||||||
|
qsprintf 115 /*<-*/ 114 /*args:*/ n 116 t2 117
|
||||||
|
|
||||||
echo 115
|
echo 115
|
||||||
endevent
|
endevent
|
||||||
|
|
Loading…
Reference in a new issue