more work on firm backend
[cparser] / write_fluffy.c
index 651bcff..ce28c55 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;
@@ -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... */
@@ -170,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;
@@ -183,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;
@@ -216,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);
@@ -226,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);
 
-       declaration_t *entry = type->entries_begin;
-       for ( ; entry != type->entries_end->next; 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->initializer != NULL) {
+               if(entry->init.initializer != NULL) {
                        fprintf(out, " <- ");
-                       write_expression(entry->initializer);
+                       write_initializer(entry->init.initializer);
                }
                fputc('\n', out);
        }
@@ -253,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);
        }