X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=write_fluffy.c;h=ce28c55a991ff3371326dce4dec6848a9990d483;hb=2f487005db774b00459937cc8e2aec5d381557cd;hp=ee1793bcb3c4cdcc03d5a9731c231183432335e4;hpb=e66a2691d3291916ed2ec07ed1cdead2a95e1a9a;p=cparser diff --git a/write_fluffy.c b/write_fluffy.c index ee1793b..ce28c55 100644 --- a/write_fluffy.c +++ b/write_fluffy.c @@ -5,6 +5,7 @@ #include "ast_t.h" #include "type_t.h" +#include "type.h" #include "adt/error.h" static const context_t *global_context; @@ -51,7 +52,7 @@ static declaration_t *find_typedef(const type_t *type) /* first: search for a matching typedef in the global type... */ declaration_t *declaration = global_context->declarations; while(declaration != NULL) { - if(! (declaration->storage_class & STORAGE_CLASS_TYPEDEF)) { + if(! (declaration->storage_class == STORAGE_CLASS_TYPEDEF)) { declaration = declaration->next; continue; } @@ -72,9 +73,10 @@ static void write_compound_type(const compound_type_t *type) } /* does the struct have a name? */ - if(type->symbol != NULL) { + symbol_t *symbol = type->declaration->symbol; + if(symbol != NULL) { /* TODO: make sure we create a struct for it... */ - fprintf(out, "%s", type->symbol->string); + fprintf(out, "%s", symbol->string); return; } /* TODO: create a struct and use its name here... */ @@ -90,9 +92,10 @@ static void write_enum_type(const enum_type_t *type) } /* does the enum have a name? */ - if(type->symbol != NULL) { + symbol_t *symbol = type->declaration->symbol; + if(symbol != NULL) { /* TODO: make sure we create an enum for it... */ - fprintf(out, "%s", type->symbol->string); + fprintf(out, "%s", symbol->string); return; } /* TODO: create a struct and use its name here... */ @@ -103,8 +106,8 @@ static void write_method_type(const method_type_t *type) { fprintf(out, "(func("); - declaration_t *parameter = type->parameters; - int first = 1; + method_parameter_t *parameter = type->parameters; + int first = 1; while(parameter != NULL) { if(!first) { fprintf(out, ", "); @@ -112,12 +115,15 @@ static void write_method_type(const method_type_t *type) first = 0; } +#if 0 if(parameter->symbol != NULL) { fprintf(out, "%s : ", parameter->symbol->string); } else { /* TODO make up some unused names (or allow _ in fluffy?) */ fprintf(out, "_ : "); } +#endif + fputs("_ : ", out); write_type(parameter->type); parameter = parameter->next; @@ -167,7 +173,7 @@ static void write_struct(const symbol_t *symbol, const compound_type_t *type) { fprintf(out, "struct %s:\n", symbol->string); - const declaration_t *declaration = type->context.declarations; + const declaration_t *declaration = type->declaration->context.declarations; while(declaration != NULL) { write_struct_entry(declaration); declaration = declaration->next; @@ -180,7 +186,7 @@ static void write_union(const symbol_t *symbol, const compound_type_t *type) { fprintf(out, "union %s:\n", symbol->string); - const declaration_t *declaration = type->context.declarations; + const declaration_t *declaration = type->declaration->context.declarations; while(declaration != NULL) { write_struct_entry(declaration); declaration = declaration->next; @@ -213,7 +219,11 @@ static void write_expression(const expression_t *expression) switch(expression->type) { case EXPR_CONST: constant = (const const_t*) expression; - fprintf(out, "%d", constant->value); + if(is_type_integer(expression->datatype)) { + fprintf(out, "%d", constant->v.int_value); + } else { + fprintf(out, "%Lf", constant->v.float_value); + } break; case EXPR_UNARY: write_unary_expression((const unary_expression_t*) expression); @@ -223,16 +233,26 @@ static void write_expression(const expression_t *expression) } } +static void write_initializer(const initializer_t *initializer) +{ + if(initializer->type != INITIALIZER_VALUE) { + panic("list initializers not supported yet"); + } + + write_expression(initializer->v.value); +} + static void write_enum(const symbol_t *symbol, const enum_type_t *type) { fprintf(out, "enum %s:\n", symbol->string); - const enum_entry_t *entry = type->entries; - for ( ; entry != NULL; entry = entry->next) { + declaration_t *entry = type->declaration->context_next; + for ( ; entry != NULL && entry->storage_class == STORAGE_CLASS_ENUM_ENTRY; + entry = entry->next) { fprintf(out, "\t%s", entry->symbol->string); - if(entry->value != NULL) { + if(entry->init.initializer != NULL) { fprintf(out, " <- "); - write_expression(entry->value); + write_initializer(entry->init.initializer); } fputc('\n', out); } @@ -250,7 +270,7 @@ static void write_variable(const declaration_t *declaration) static void write_function(const declaration_t *declaration) { - if(declaration->statement != NULL) { + if(declaration->init.statement != NULL) { fprintf(stderr, "Warning: can't convert function bodies (at %s)\n", declaration->symbol->string); } @@ -260,7 +280,7 @@ static void write_function(const declaration_t *declaration) const method_type_t *method_type = (const method_type_t*) declaration->type; - declaration_t *parameter = method_type->parameters; + declaration_t *parameter = declaration->context.declarations; int first = 1; for( ; parameter != NULL; parameter = parameter->next) { if(!first) { @@ -310,10 +330,9 @@ void write_fluffy_decls(const translation_unit_t *unit) /* write structs,unions + enums */ declaration_t *declaration = unit->context.declarations; - while(declaration != NULL) { + for( ; declaration != NULL; declaration = declaration->next) { //fprintf(out, "// Decl: %s\n", declaration->symbol->string); - if(! (declaration->storage_class & STORAGE_CLASS_TYPEDEF)) { - declaration = declaration->next; + if(! (declaration->storage_class == STORAGE_CLASS_TYPEDEF)) { continue; } type_t *type = declaration->type; @@ -324,14 +343,13 @@ void write_fluffy_decls(const translation_unit_t *unit) } else if(type->type == TYPE_ENUM) { write_enum(declaration->symbol, (enum_type_t*) type); } - - declaration = declaration->next; } /* write global variables */ declaration = unit->context.declarations; for( ; declaration != NULL; declaration = declaration->next) { - if(declaration->storage_class & STORAGE_CLASS_TYPEDEF) + if(declaration->storage_class == STORAGE_CLASS_TYPEDEF + || declaration->storage_class == STORAGE_CLASS_ENUM_ENTRY) continue; type_t *type = declaration->type; @@ -344,7 +362,8 @@ void write_fluffy_decls(const translation_unit_t *unit) /* write functions */ declaration = unit->context.declarations; for( ; declaration != NULL; declaration = declaration->next) { - if(declaration->storage_class & STORAGE_CLASS_TYPEDEF) + if(declaration->storage_class == STORAGE_CLASS_TYPEDEF + || declaration->storage_class == STORAGE_CLASS_ENUM_ENTRY) continue; type_t *type = declaration->type;