More work on cparser:
[cparser] / write_fluffy.c
index 1d6aeff..e9db530 100644 (file)
@@ -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;
                }
@@ -216,7 +217,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);
@@ -230,12 +235,12 @@ 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->entries_begin;
+       for ( ; entry != type->entries_end->next; entry = entry->next) {
                fprintf(out, "\t%s", entry->symbol->string);
-               if(entry->value != NULL) {
+               if(entry->initializer != NULL) {
                        fprintf(out, " <- ");
-                       write_expression(entry->value);
+                       write_expression(entry->initializer);
                }
                fputc('\n', out);
        }
@@ -313,10 +318,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;
@@ -327,14 +331,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;
@@ -347,7 +350,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;