Specifier spec;
for(spec = type.qualifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
}
Specifier spec;
for(spec = exp._classExp.specifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
if(exp._classExp.decl)
OutputTypeName(exp.typeName, f);
f.Puts(")");
break;
+ case typeAlignExp:
+ f.Puts("__alignof__(");
+ OutputTypeName(exp.typeName, f);
+ f.Puts(")");
+ break;
case extensionInitializerExp:
f.Puts("__extension__ (");
if(exp.initializer.typeName)
AsmField field;
f.Puts("__asm__ ");
if(stmt.asmStmt.spec)
- OutputSpecifier(stmt.asmStmt.spec, f);
+ OutputSpecifier(stmt.asmStmt.spec, f, false);
f.Puts("(");
f.Puts(stmt.asmStmt.statements);
f.Puts(" ");
for(spec = ptr.qualifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
}
if(decl.structDecl.attrib)
{
f.Puts(" ");
- f.Puts(decl.structDecl.attrib);
+ OutputAttrib(decl.structDecl.attrib, f);
}
break;
case identifierDeclarator:
f.Puts(")");
break;
case extendedDeclarator:
- f.Puts(decl.extended.extended);
+ if(decl.extended.extended) OutputExtDecl(decl.extended.extended, f);
f.Puts(" ");
OutputDeclarator(decl.declarator, f);
break;
case extendedDeclaratorEnd:
OutputDeclarator(decl.declarator, f);
f.Puts(" ");
- f.Puts(decl.extended.extended);
+ if(decl.extended.extended)
+ OutputExtDecl(decl.extended.extended, f);
break;
case arrayDeclarator:
if(decl.declarator)
}
}
-static void OutputSpecifier(Specifier spec, File f)
+static void OutputAttribute(Attribute attr, File f)
+{
+ if(attr.attr)
+ f.Puts(attr.attr);
+ if(attr.exp)
+ {
+ f.Puts(" ");
+ OutputExpression(attr.exp, f);
+ }
+}
+
+static void OutputAttrib(Attrib attr, File f)
+{
+ switch(attr.type)
+ {
+ case ATTRIB: f.Puts("__attribute__(("); break;
+ case __ATTRIB: f.Puts("__attribute(("); break;
+ case ATTRIB_DEP: f.Puts("__attribute_deprecated__(("); break;
+ }
+
+ if(attr.attribs)
+ {
+ Attribute attrib;
+ for(attrib = attr.attribs->first; attrib; attrib = attrib.next)
+ {
+ if(attrib.prev) f.Puts(" ");
+ OutputAttribute(attrib, f);
+ }
+ }
+ f.Puts("))");
+}
+
+static void OutputExtDecl(ExtDecl extDecl, File f)
+{
+ if(extDecl.type == extDeclString && extDecl.s)
+ f.Puts(extDecl.s);
+ else if(extDecl.type == extDeclAttrib)
+ OutputAttrib(extDecl.attr, f);
+}
+
+static void OutputSpecifier(Specifier spec, File f, bool typeName)
{
switch(spec.type)
{
f.Puts("int");
break;
case UINT:
- f.Puts("unsigned int");
+ f.Puts(typeName ? "uint" : "unsigned int");
break;
case INT64:
//f.Puts("__int64");
//f.Puts("int64");
- f.Puts("long long");
+ f.Puts(typeName ? "int64" : "long long");
break;
case VALIST:
f.Puts("__builtin_va_list");
}
break;
case extendedSpecifier:
+ if(spec.extDecl)
+ OutputExtDecl(spec.extDecl, f);
+ break;
case nameSpecifier:
//case classSpecifier:
if(spec.name && !strcmp(spec.name, "class"))
case unionSpecifier:
{
f.Puts((spec.type == structSpecifier) ? "struct" : "union");
+ if(spec.extDeclStruct)
+ {
+ f.Puts(" ");
+ OutputExtDecl(spec.extDeclStruct, f);
+ }
if(spec.id)
{
f.Puts(" ");
//OutputDeclaration(decl, f);
OutputClassDef(def, f);
}
- f.Puts("}");
+ f.Puts("} __attribute__ ((gcc_struct))");
}
break;
}
break;
case subClassSpecifier:
f.Puts("subclass(");
- OutputSpecifier(spec._class, f);
+ OutputSpecifier(spec._class, f, false);
f.Puts(")");
break;
case templateTypeSpecifier:
if(decl.specifiers)
{
+ bool inTypeDef = false;
for(spec = decl.specifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ if(spec.type == baseSpecifier && spec.specifier == TYPEDEF)
+ inTypeDef = true;
+ OutputSpecifier(spec, f, inTypeDef && !spec.next);
if(spec.next) f.Puts(" ");
}
}
{
for(spec = decl.specifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
}
if(decl.extStorage)
{
f.Puts(" ");
- OutputSpecifier(decl.extStorage, f);
+ OutputSpecifier(decl.extStorage, f, false);
}
break;
}
Specifier spec;
for(spec = func.specifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
f.Puts(" ");
static void OutputInstance(Instantiation inst, File f)
{
if(inst._class)
- OutputSpecifier(inst._class, f);
+ OutputSpecifier(inst._class, f, false);
if(inst.exp)
{
f.Puts(" ");
Specifier spec;
for(spec = func.specifiers->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
if(spec.next) f.Puts(" ");
}
f.Puts(" ");
{
//if(func.class != (void *)-1)
if(func.class)
- OutputSpecifier(func.class, f);
+ OutputSpecifier(func.class, f, false);
f.Puts("::");
}*/
if(func.declarator) OutputDeclarator(func.declarator, f);
static void OutputClass(ClassDefinition _class, File f)
{
f.Puts("class ");
- OutputSpecifier(_class._class, f);
+ OutputSpecifier(_class._class, f, false);
if(_class.baseSpecs)
{
Specifier spec;
f.Puts(" : ");
for(spec = _class.baseSpecs->first; spec; spec = spec.next)
{
- OutputSpecifier(spec, f);
+ OutputSpecifier(spec, f, false);
}
}
if(_class.definitions)
{
External external;
- outputLine = 11;
+ outputLine = 28;
for(external = ast.first; external; external = external.next)
{