0
|
1 require"math"
|
|
2 local max = math.max
|
|
3 local maxargs = 0
|
|
4
|
|
5 function trim(l) return l:gsub("^%s+",""):gsub("%s+$","") end
|
|
6 function mkcase(id,sig)
|
|
7 local sig = trim(sig)
|
430
|
8 local h = { "/* ",id,":",sig," */ ",sig:sub(1,1), " f", id,"(","" }
|
|
9 local t = { "" }
|
0
|
10 local pos = 0
|
|
11 maxargs = max(maxargs, #sig-1)
|
|
12 for i = 2, #sig do
|
|
13 pos = tostring(i-1)
|
|
14 local name = "a"..pos
|
|
15 local ch = sig:sub(i,i)
|
430
|
16 h[#h+1] = ch.." "..name
|
0
|
17 h[#h+1] = ","
|
430
|
18 t[#t+1] = "V_"..ch.."["..pos.."]="..name..";"
|
0
|
19 end
|
|
20 h[#h] = "){"
|
430
|
21 t[#t+1] = "ret_"..sig:sub(1,1).."("..pos..")}\n"
|
0
|
22 return table.concat(h,"")..table.concat(t,"")
|
|
23 end
|
|
24
|
|
25 function mkfuntab(n)
|
|
26 local s = { "funptr G_funtab[] = {\n"}
|
430
|
27 for i = 0, n-1 do
|
0
|
28 s[#s+1] = "\t(funptr)&f"..i..",\n"
|
|
29 end
|
|
30 s[#s+1] = "};\n"
|
|
31 return table.concat(s,"")
|
|
32 end
|
|
33
|
|
34 function mksigtab(sigs)
|
|
35 local s = { "char const * G_sigtab[] = {\n"}
|
|
36 for k,v in pairs(sigs) do
|
430
|
37 s[#s+1] = '\t"'..v..'",\n'
|
0
|
38 end
|
|
39 s[#s+1] = "};\n"
|
|
40 return table.concat(s,"")
|
|
41 end
|
|
42
|
|
43 function mkall()
|
430
|
44 local lineno = 0
|
0
|
45 local sigtab = { }
|
|
46 for line in io.lines() do
|
|
47 local sig = trim(line)
|
|
48 io.write(mkcase(lineno,sig))
|
|
49 sigtab[#sigtab+1] = sig
|
|
50 lineno = lineno + 1
|
|
51 end
|
430
|
52 io.write(mkfuntab(lineno))
|
0
|
53 io.write(mksigtab(sigtab))
|
|
54 io.write("int G_maxargs = "..maxargs..";\n")
|
|
55 end
|
|
56
|
|
57 mkall()
|
|
58
|