#include "ast_t.h"
#include "type_t.h"
+#include "type.h"
#include "adt/error.h"
static const context_t *global_context;
}
/* 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... */
}
/* 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... */
{
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;
{
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;
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);
}
}
+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);
}
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);
}