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