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)
|
|
8 local h = { "/* ",id,":",sig," */ ",sig:sub(1,1), " f", id,"(",""}
|
|
9 local t = { "fid=",id,";" }
|
|
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)
|
|
16
|
|
17 h[#h+1] = ch
|
|
18 h[#h+1] = " "
|
|
19 h[#h+1] = name
|
|
20 h[#h+1] = ","
|
|
21
|
|
22 t[#t+1] = "V_"
|
|
23 t[#t+1] = ch
|
|
24 t[#t+1] = "["
|
|
25 t[#t+1] = pos
|
|
26 t[#t+1] = "]"
|
|
27 t[#t+1] = "="
|
|
28 t[#t+1] = name
|
|
29 t[#t+1] = ";"
|
|
30 end
|
|
31 h[#h] = "){"
|
|
32 t[#t+1] = "ret_"
|
|
33 t[#t+1] = sig:sub(1,1)
|
|
34 t[#t+1] = "("
|
|
35 t[#t+1] = pos
|
|
36 t[#t+1] = ")"
|
|
37 t[#t+1] = "}\n"
|
|
38 return table.concat(h,"")..table.concat(t,"")
|
|
39 end
|
|
40
|
|
41 function mkfuntab(n)
|
|
42 local s = { "funptr G_funtab[] = {\n"}
|
|
43 for i = 1, n do
|
|
44 s[#s+1] = "\t(funptr)&f"..i..",\n"
|
|
45 end
|
|
46 s[#s+1] = "};\n"
|
|
47 return table.concat(s,"")
|
|
48 end
|
|
49
|
|
50 function mksigtab(sigs)
|
|
51 local s = { "char const * G_sigtab[] = {\n"}
|
|
52 for k,v in pairs(sigs) do
|
|
53 s[#s+1] = '\t"'
|
|
54 s[#s+1] = v
|
|
55 s[#s+1] = '",\n'
|
|
56 end
|
|
57 s[#s+1] = "};\n"
|
|
58 return table.concat(s,"")
|
|
59 end
|
|
60
|
|
61 function mkall()
|
|
62 local lineno = 1
|
|
63 local sigtab = { }
|
|
64 for line in io.lines() do
|
|
65 local sig = trim(line)
|
|
66 io.write(mkcase(lineno,sig))
|
|
67 sigtab[#sigtab+1] = sig
|
|
68 lineno = lineno + 1
|
|
69 end
|
|
70 io.write(mkfuntab(lineno-1))
|
|
71 io.write(mksigtab(sigtab))
|
|
72 io.write("int G_maxargs = "..maxargs..";\n")
|
|
73 end
|
|
74
|
|
75 mkall()
|
|
76 -- print(mkcase(1,"vififififi"))
|
|
77
|