505
|
1 require "config"
|
|
2
|
514
|
3 -- use shared helpers to generate cases
|
|
4 package.path = '../common/?.lua;' .. package.path
|
|
5 require"mk-cases"
|
|
6
|
|
7
|
505
|
8 function mkcase(id,sig)
|
514
|
9 local sig = trim(sig)
|
509
|
10 local rtype = string.sub(sig, -1)
|
513
|
11 local i = 1
|
|
12 local args = { rtype }
|
|
13 while i < #sig do
|
|
14 c = string.sub(sig, i, i)
|
|
15 if(c == ')') then
|
|
16 break
|
|
17 end
|
|
18 if(c == '_') then -- filter out prefixes
|
|
19 i = i + 1
|
|
20 else
|
|
21 args[#args+1] = c
|
|
22 end
|
|
23 i = i + 1
|
505
|
24 end
|
513
|
25 return "F" .. (#args-1) .. "(f" .. id .. "," .. table.concat(args,',') .. ")\n"
|
505
|
26 end
|
|
27
|
|
28 function mkall()
|
|
29 -- case macros
|
|
30 local i
|
|
31 for i = minargs, maxargs do
|
|
32 local line = "#define F" .. i .. "(ID,R"
|
|
33 local argdef = ""
|
|
34 local argset = ""
|
|
35 if i > 0 then
|
|
36 line = line .. ","
|
|
37 local j
|
|
38 for j = 0, i-1 do
|
|
39 if j > 0 then
|
|
40 argdef = argdef .. ","
|
|
41 argset = argset .. ","
|
|
42 end
|
|
43 argdef = argdef .. "M" .. j
|
509
|
44 argset = argset .. "K_##M" .. j .. "[" .. j .. "]"
|
505
|
45 end
|
|
46 end
|
513
|
47 line = line .. argdef .. ") void ID(void* addr) { write_V_##R(" .. i .. ", ((" .. api .. " R(*)(" .. argdef .. "))addr)(" .. argset .. "));}\n"
|
505
|
48 io.write(line)
|
|
49 end
|
|
50
|
|
51 -- cases
|
|
52 local lineno = 0
|
|
53 local sigtab = { }
|
|
54 local cases = ''
|
|
55 for line in io.lines() do
|
|
56 local sig = trim(line)
|
|
57 cases = cases..mkcase(lineno,sig)
|
|
58 sigtab[#sigtab+1] = sig
|
|
59 lineno = lineno + 1
|
|
60 end
|
|
61
|
|
62 io.write(cases)
|
513
|
63 io.write(mkfuntab(lineno, 'f', 'funptr', 'G_funtab', false))
|
|
64 io.write(mksigtab(sigtab, ccprefix, 'G_sigtab'))
|
505
|
65 io.write("int G_maxargs = "..maxargs..";\n")
|
|
66 end
|
|
67
|
|
68 mkall()
|
|
69
|