+ crhead.outputline("void computesizes(int *,int **);");
+ crhead.outputline("void recomputesizes();");
+ }
+
+ private void generate_computesizes() {
+ int max=TypeDescriptor.counter;
+ TypeDescriptor[] tdarray=new TypeDescriptor[max];
+ for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
+ TypeDescriptor ttd=(TypeDescriptor)it.next();
+ tdarray[ttd.getId()]=ttd;
+ }
+ final SymbolTable st = state.stGlobals;
+ CodeWriter cr = new StandardCodeWriter(outputaux) {
+ public SymbolTable getSymbolTable() { return st; }
+ };
+
+ cr.outputline("void "+name+"_state::computesizes(int *sizearray,int **numele) {");
+ cr.outputline("int maybe=0;");
+ for(int i=0;i<max;i++) {
+ TypeDescriptor td=tdarray[i];
+ Expr size=td.getSizeExpr();
+ VarDescriptor vd=VarDescriptor.makeNew("size");
+ size.generate(cr,vd);
+ cr.outputline("sizearray["+i+"]="+vd.getSafeSymbol()+";");
+ }
+ for(int i=0;i<max;i++) {
+ TypeDescriptor td=tdarray[i];
+ if (td instanceof StructureTypeDescriptor) {
+ StructureTypeDescriptor std=(StructureTypeDescriptor) td;
+ for(int j=0;j<std.fieldlist.size();j++) {
+ FieldDescriptor fd=(FieldDescriptor)std.fieldlist.get(j);
+ if (fd instanceof ArrayDescriptor) {
+ ArrayDescriptor ad=(ArrayDescriptor)fd;
+ Expr index=ad.getIndexBound();
+ VarDescriptor vd=VarDescriptor.makeNew("index");
+ index.generate(cr,vd);
+ cr.outputline("numele["+i+"]["+j+"]="+vd.getSafeSymbol()+";");
+ }
+ }
+ }
+ }
+ cr.outputline("if (maybe) printf(\"BAD ERROR\");");
+ cr.outputline("}");
+ }
+
+ private void generate_recomputesizes() {
+ int max=TypeDescriptor.counter;
+ TypeDescriptor[] tdarray=new TypeDescriptor[max];
+ for(Iterator it=state.stTypes.descriptors();it.hasNext();) {
+ TypeDescriptor ttd=(TypeDescriptor)it.next();
+ tdarray[ttd.getId()]=ttd;
+ }
+ final SymbolTable st = state.stGlobals;
+ CodeWriter cr = new StandardCodeWriter(outputaux) {
+ public SymbolTable getSymbolTable() { return st; }
+ };
+ cr.outputline("void "+name+"_state::recomputesizes() {");
+ cr.outputline("int maybe=0;");
+ for(int i=0;i<max;i++) {
+ TypeDescriptor td=tdarray[i];
+ Expr size=td.getSizeExpr();
+ VarDescriptor vd=VarDescriptor.makeNew("size");
+ size.generate(cr,vd);
+ }
+ for(int i=0;i<max;i++) {
+ TypeDescriptor td=tdarray[i];
+ if (td instanceof StructureTypeDescriptor) {
+ StructureTypeDescriptor std=(StructureTypeDescriptor) td;
+ for(int j=0;j<std.fieldlist.size();j++) {
+ FieldDescriptor fd=(FieldDescriptor)std.fieldlist.get(j);
+ if (fd instanceof ArrayDescriptor) {
+ ArrayDescriptor ad=(ArrayDescriptor)fd;
+ Expr index=ad.getIndexBound();
+ VarDescriptor vd=VarDescriptor.makeNew("index");
+ index.generate(cr,vd);
+ }
+ }
+ }
+ }
+ cr.outputline("if (maybe) printf(\"BAD ERROR\");");
+ cr.outputline("}");