7 public class StructureGenerator {
11 TypeDescriptor[] tdarray;
13 StructureGenerator(State state, RepairGenerator rg) {
17 cr=new StandardCodeWriter(new java.io.PrintWriter(new FileOutputStream("size.cc"),true));
18 crhead=new StandardCodeWriter(new java.io.PrintWriter(new FileOutputStream("size.h"),true));
19 } catch (Exception e) {
25 int max=TypeDescriptor.counter;
26 tdarray=new TypeDescriptor[max];
27 for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
28 TypeDescriptor ttd=(TypeDescriptor)it.next();
29 tdarray[ttd.getId()]=ttd;
31 cr.outputline("#include \"size.h\"");
33 generategetnumfields();
38 generatecomputesize();
42 private void generatecalls() {
43 int max=TypeDescriptor.counter;
44 cr.outputline("int arsize["+max+"];");
46 for(int i=0;i<max;i++) {
47 TypeDescriptor ttd=tdarray[i];
48 if (ttd instanceof StructureTypeDescriptor) {
49 StructureTypeDescriptor std=(StructureTypeDescriptor) ttd;
50 String str="int arnumelement"+std.getId()+"["+std.fieldlist.size()+"]={";
51 for(int j=0;j<std.fieldlist.size();j++) {
53 if (((j+1)!=std.fieldlist.size()))
59 cr.outputline("int arnumelement"+ttd.getId()+"[0];");
61 String str="int* arnumelements["+String.valueOf(max)+"]={";
62 for(int i=0;i<max;i++) {
63 str+="arnumelement"+i;
71 cr.outputline("int typeobject::size(int type) {");
72 cr.outputline("return arsize[type];");
75 cr.outputline("int typeobject::numElements(int type, int fieldindex) {");
76 cr.outputline("return arnumelements[type][fieldindex];");
78 cr.outputline("typeobject::typeobject() {}");
81 private void generatecomputesize() {
82 int max=TypeDescriptor.counter;
83 cr.outputline("void typeobject::computesizes("+rg.name+"_state * obj) {");
84 cr.outputline("obj->computesizes(arsize,arnumelements);");
88 private void generateheader() {
89 crhead.outputline("#include \""+rg.headername + "\"");
90 crhead.outputline("class typeobject {");
91 crhead.outputline("public:");
92 crhead.outputline("typeobject();");
93 crhead.outputline("int getfield(int type, int fieldindex);");
94 crhead.outputline("int isArray(int type, int fieldindex);");
95 crhead.outputline("int isPtr(int type, int fieldindex);");
96 crhead.outputline("int numElements(int type, int fieldindex);");
97 crhead.outputline("int size(int type);");
98 crhead.outputline("int getnumfields(int type);");
99 crhead.outputline("bool issubtype(int subtype, int type);");
100 crhead.outputline("void computesizes("+rg.name+"_state *);");
101 crhead.outputline("};");
105 private void generategetfield() {
106 for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
107 TypeDescriptor ttd=(TypeDescriptor)it.next();
110 if (ttd instanceof StructureTypeDescriptor) {
111 StructureTypeDescriptor std=(StructureTypeDescriptor) ttd;
112 str="int argetfield"+std.getId()+"["+std.fieldlist.size()+"]={";
113 for(int i=0;i<std.fieldlist.size();i++) {
114 FieldDescriptor fd = (FieldDescriptor)std.fieldlist.elementAt(i);
115 TypeDescriptor td = fd.getType();
116 str+=String.valueOf(td.getId());
117 if ((i+1)!=std.fieldlist.size())
123 cr.outputline("int argetfield"+ttd.getId()+"[0];");
125 int max=TypeDescriptor.counter;
126 String str="int* argetfield["+String.valueOf(max)+"]={";
127 for(int i=0;i<max;i++) {
135 cr.outputline("int typeobject::getfield(int type, int fieldindex) {");
136 cr.outputline("return argetfield[type][fieldindex];");
140 private void generategetnumfields() {
141 int max=TypeDescriptor.counter;
142 String str="int argetnumfield["+String.valueOf(max)+"]={";
143 for(int i=0;i<max;i++) {
144 TypeDescriptor ttd=tdarray[i];
145 if (ttd instanceof StructureTypeDescriptor) {
146 StructureTypeDescriptor std=(StructureTypeDescriptor) ttd;
147 str+=String.valueOf(std.fieldlist.size());
156 cr.outputline("int typeobject::getnumfields(int type) {");
157 cr.outputline("return argetnumfield[type];");
160 private void generateisArray() {
161 for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
162 TypeDescriptor ttd=(TypeDescriptor)it.next();
165 if (ttd instanceof StructureTypeDescriptor) {
166 StructureTypeDescriptor std=(StructureTypeDescriptor) ttd;
167 str="int arisArray"+std.getId()+"["+std.fieldlist.size()+"]={";
168 for(int i=0;i<std.fieldlist.size();i++) {
169 FieldDescriptor fd = (FieldDescriptor)std.fieldlist.elementAt(i);
170 TypeDescriptor td = fd.getType();
171 if (fd instanceof ArrayDescriptor)
175 if ((i+1)!=std.fieldlist.size())
181 cr.outputline("int arisArray"+ttd.getId()+"[0];");
183 int max=TypeDescriptor.counter;
184 String str="int* arisArray["+String.valueOf(max)+"]={";
185 for(int i=0;i<max;i++) {
193 cr.outputline("int typeobject::isArray(int type, int fieldindex) {");
194 cr.outputline("return arisArray[type][fieldindex];");
197 private void generateisPtr() {
198 for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
199 TypeDescriptor ttd=(TypeDescriptor)it.next();
202 if (ttd instanceof StructureTypeDescriptor) {
203 StructureTypeDescriptor std=(StructureTypeDescriptor) ttd;
204 str="int arisPtr"+std.getId()+"["+std.fieldlist.size()+"]={";
205 for(int i=0;i<std.fieldlist.size();i++) {
206 FieldDescriptor fd = (FieldDescriptor)std.fieldlist.elementAt(i);
211 if ((i+1)!=std.fieldlist.size())
217 cr.outputline("int arisPtr"+ttd.getId()+"[0];");
219 int max=TypeDescriptor.counter;
220 String str="int* arisPtr["+String.valueOf(max)+"]={";
221 for(int i=0;i<max;i++) {
229 cr.outputline("int typeobject::isPtr(int type, int fieldindex) {");
230 cr.outputline("return arisPtr[type][fieldindex];");
234 void generateissubtype() {
235 int max=TypeDescriptor.counter;
236 String str="bool arissubtype["+max+"]["+max+"]={";
237 for(int i=0;i<max;i++) {
239 for(int j=0;j<max;j++) {
240 TypeDescriptor tdi=tdarray[i];
241 TypeDescriptor tdj=tdarray[j];
242 if (tdi.isSubtypeOf(tdj))
255 cr.outputline("bool typeobject::issubtype(int subtype, int type) {");
256 cr.outputline("return arissubtype[subtype][type];");