generate header file, too
[swftools.git] / lib / as3 / mkabc.py
1 #!/usr/bin/python
2
3 import re
4
5 fi = open("code.c", "rb")
6 foc = open("opcodes.c", "wb")
7 foh = open("opcodes.h", "wb")
8
9 foh.write("#ifndef __opcodes_h__\n")
10 foh.write("#define __opcodes_h__\n")
11 foh.write("#include \"abc.h\"\n")
12 foh.write("#include \"pool.h\"\n")
13 foh.write("#include \"code.h\"\n")
14
15 foc.write("#include \"opcodes.h\"\n")
16
17 R = re.compile('{(0x..),\s*"([^"]*)"\s*,\s*"([^"]*)"[^}]*}\s*')
18
19 for line in fi.readlines():
20     line = line.strip()
21     m = R.match(line)
22     if m:
23         op,name,params = m.group(1),m.group(2),m.group(3)
24         params = params.strip()
25         paramstr = ""
26         seen = {}
27         names = []
28
29         for c in params:
30             paramstr += ", "
31             if c == "2":
32                 type,pname="char*","name"
33             elif c == "s":
34                 type,pname="char*","s"
35             elif c in "nubs":
36                 type,pname="int","v"
37             elif c == "m":
38                 type,pname="abc_method_body_t*","m"
39             elif c == "i":
40                 type,pname="abc_method_t*","m"
41             elif c == "c":
42                 type,pname="abc_class_t*","m"
43             elif c == "j":
44                 type,pname="abc_code_t*","label"
45             elif c == "S":
46                 type,pname="void*","labels"
47             elif c == "D":
48                 type,pname="void*","debuginfo"
49             elif c == "r":
50                 type,pname="int","reg"
51             else:
52                 raise "Unknown type "+c
53             paramstr += type
54             paramstr += " "
55             if pname in seen:
56                 seen[pname]+=1
57                 pname += str(seen[pname])
58             else:
59                 seen[pname]=1
60             paramstr += pname
61             names += [pname]
62
63         foh.write("abc_code_t* abc_%s(abc_code_t*prev%s);\n" % (name, paramstr))
64
65         foc.write("abc_code_t* abc_%s(abc_code_t*prev%s)\n" % (name, paramstr))
66         foc.write("{\n")
67         foc.write("    abc_code_t*self = add_opcode(prev, %s);\n" % op)
68         i = 0
69         for pname,c in zip(names,params):
70             if(c == "2"):
71                 foc.write("    self->params[%d] = %s;\n" % (i,pname));
72             elif(c in "nur"):
73                 foc.write("    self->params[%d] = (void*)(ptroff_t)%s;\n" % (i,pname))
74             elif(c == "b"):
75                 foc.write("    self->params[%d] = (void*)(ptroff_t)%s;\n" % (i,pname))
76             elif(c == "s"):
77                 foc.write("    self->params[%d] = strdup(%s);\n" % (i,pname))
78             elif(c == "m"):
79                 foc.write("    self->params[%d] = %s;\n" % (i,pname))
80             elif(c == "c"):
81                 foc.write("    self->params[%d] = %s;\n" % (i,pname))
82             elif(c == "i"):
83                 foc.write("    self->params[%d] = %s;\n" % (i,pname))
84             elif(c == "j"):
85                 foc.write("    self->params[%d] = %s;\n" % (i,pname))
86             elif(c == "S"):
87                 foc.write("    /* FIXME: write labels %s */\n" % pname)
88             elif(c == "D"):
89                 foc.write("    /* FIXME: write debuginfo %s */\n" % pname)
90             else:
91                 raise "Unknown type "+c
92             i = i+1
93         foc.write("    return self;\n")
94         foc.write("}\n")
95
96         foh.write("#define "+name+"(")
97         foh.write(",".join(["method"]+names))
98         foh.write(") {method->code = abc_"+name+"(")
99         foh.write(",".join(["method->code"]+names))
100         foh.write(");}\n")
101
102 foh.write("#endif\n")
103
104 foh.close()
105 foc.close()
106 fi.close()
107 #{0x75, "convert_d", ""},
108