/******************************************************************************* * Gen.cc Default output * T.Barnaby, BEAM Ltd, 12/9/03 ******************************************************************************* */ #define DEBUG 1 #include #include #include #include #include FileIndent::FileIndent(){ oindent = 0; } void FileIndent::indentMore(){ oindent++; } void FileIndent::indentLess(){ if(--oindent < 0) oindent = 0; } int FileIndent::writeLine(BString line){ BString s; int i = oindent; while(i--) s = s + "\t"; s = s + line; return writeString(s); } Gen::Gen(){ ouseBObjects = 0; } Gen::~Gen(){ } int Gen::setUseBObjects(int on){ int ret = ouseBObjects; ouseBObjects = on; return ret; } int Gen::getUseBObjects(){ return ouseBObjects; } BString Gen::getTypeName(Node* n, int data){ BString typeName; if(ouseBObjects){ if(n->nodeType() == Node::TTYPELIST){ return BString("BObjListVar<") + getTypeName(n->node(0), data) + ">"; } else { typeName = n->name(); if(typeName == "Int32"){ if(data) return "BObjInt"; else return "Int32"; } else if(typeName == "Bool"){ if(data) return "BObjInt"; else return "Int32"; } else if(typeName == "String"){ if(data) return "BObjString"; else return "BString"; } else if(typeName == "Error") return "BError"; else if(typeName == "Date") return "BObjDate"; else if(typeName == "DateTime") return "BObjDateTime"; else if(typeName == "Id") return "BObjId"; else if(typeName == "ObjData") return "BObjData"; else return typeName; } } else { if(n->nodeType() == Node::TTYPELIST){ return BString("BList<") + getTypeName(n->node(0), data) + ">"; } else if(n->nodeType() == Node::TTYPEARRAY){ return BString("BArray<") + getTypeName(n->node(0), data) + ">"; } else { typeName = n->name(); if(typeName == "Int32"){ return "Int32"; } else if(typeName == "Bool"){ return "Int32"; } else if(typeName == "String"){ return "BString"; } else if(typeName == "Error") return "BError"; else if(typeName == "Date") return "BObjDate"; else if(typeName == "DateTime") return "BObjDateTime"; else if(typeName == "Id") return "BObjId"; else if(typeName == "ObjData") return "BObjData"; else return typeName; } } } int Gen::isRawType(Node* n){ BString typeName; Type* t; BIter i; typeName = n->name(); // printf("isRawType: %d %s\n", n->nodeType(), typeName.retStr()); if(n->nodeType() == Node::TTYPEARRAY){ return 0; } else if(n->nodeType() == Node::TTYPE){ if(typeName == "Int8") return 1; else if(typeName == "UInt8") return 1; else if(typeName == "Int16") return 1; else if(typeName == "UInt16") return 1; else if(typeName == "Int32") return 1; else if(typeName == "UInt32") return 1; else if(typeName == "Bool") return 1; else if(typeName == "String") return 0; else if(typeName == "Error") return 0; else if(typeName == "Date") return 0; else if(typeName == "DateTime") return 0; else if(typeName == "Id") return 0; else if(typeName == "ObjData") return 0; else { if((t = gtypelist.search(typeName)) && (t->node())){ return isRawType(t->node()); } else{ return 0; } } } else if(n->nodes().number()){ for(n->nodes().start(i); !n->nodes().isEnd(i); n->nodes().next(i)){ if(!isRawType(n->nodes()[i])) return 0; } return 1; } else { return 1; } } int Gen::useCopyType(Node* n){ BString typeName; if(n->nodeType() == Node::TTYPE){ typeName = n->name(); if((typeName == "String") || (typeName == "Error")) return 1; } return isRawType(n); }