505
+ − 1 require "config"
+ − 2
+ − 3 function trim(l) return l:gsub("^%s+",""):gsub("%s+$","") end
+ − 4 function mkcase(id,sig)
509
+ − 5 local nargs = string.len(sig) - 2 -- @@@ wrong, b/c ignores callconv prefixes
+ − 6 local rtype = string.sub(sig, -1)
505
+ − 7 local s = "F" .. nargs .. "(f" .. id .. "," .. rtype
+ − 8 for i = 1, nargs do
+ − 9 local type = string.sub(sig, i, i)
+ − 10 s = s .. "," .. type
+ − 11 end
+ − 12 s = s .. ")\n"
+ − 13 return s
+ − 14 end
+ − 15
+ − 16 function mkfuntab(n)
+ − 17 local s = { "funptr G_funtab[] = {\n"}
+ − 18 for i = 0, n-1 do
+ − 19 s[#s+1] = "\t&f"..i..",\n"
+ − 20 end
+ − 21 s[#s+1] = "};\n"
+ − 22 return table.concat(s,"")
+ − 23 end
+ − 24
+ − 25 function mksigtab(sigs)
+ − 26 local s = { "const char * G_sigtab[] = {\n"}
+ − 27 for k,v in pairs(sigs) do
+ − 28 s[#s+1] = '\t"'..v..'",\n'
+ − 29 end
+ − 30 s[#s+1] = "};\n"
+ − 31 return table.concat(s,"")
+ − 32 end
+ − 33
+ − 34 function mkall()
507
+ − 35 -- force minargs for ordered mode
505
+ − 36 if mode == "ordered" then
+ − 37 minargs = 0
+ − 38 end
+ − 39
+ − 40 -- case macros
+ − 41 local i
+ − 42 for i = minargs, maxargs do
+ − 43 local line = "#define F" .. i .. "(ID,R"
+ − 44 local argdef = ""
+ − 45 local argset = ""
+ − 46 if i > 0 then
+ − 47 line = line .. ","
+ − 48 local j
+ − 49 for j = 0, i-1 do
+ − 50 if j > 0 then
+ − 51 argdef = argdef .. ","
+ − 52 argset = argset .. ","
+ − 53 end
+ − 54 argdef = argdef .. "M" .. j
509
+ − 55 argset = argset .. "K_##M" .. j .. "[" .. j .. "]"
505
+ − 56 end
+ − 57 end
509
+ − 58 line = line .. argdef .. ") void ID(void* addr) { write_V_##R(" .. i .. ", ((CONFIG_API R(*)(" .. argdef .. "))addr)(" .. argset .. "));}\n"
505
+ − 59 io.write(line)
+ − 60 end
+ − 61
+ − 62 -- cases
+ − 63 local lineno = 0
+ − 64 local sigtab = { }
+ − 65 local cases = ''
+ − 66 for line in io.lines() do
+ − 67 local sig = trim(line)
+ − 68 cases = cases..mkcase(lineno,sig)
+ − 69 sigtab[#sigtab+1] = sig
+ − 70 lineno = lineno + 1
+ − 71 end
+ − 72
+ − 73 io.write(cases)
+ − 74 io.write(mkfuntab(lineno))
+ − 75 io.write(mksigtab(sigtab))
+ − 76 io.write("int G_maxargs = "..maxargs..";\n")
+ − 77 end
+ − 78
+ − 79 mkall()
+ − 80