X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=write_fluffy.c;h=5379aee2de6901fc7793ba401a2154669b6cbb31;hb=078d3b15dd160695cf0acfd7cd178c331834c968;hp=1213383bfc46681911eef03bd9e4216314b4e9db;hpb=4aeae1b9325a9ea33361198efd19bae4b834b091;p=cparser diff --git a/write_fluffy.c b/write_fluffy.c index 1213383..5379aee 100644 --- a/write_fluffy.c +++ b/write_fluffy.c @@ -1,57 +1,77 @@ +/* + * This file is part of cparser. + * Copyright (C) 2007-2008 Matthias Braun + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ #include #include #include #include "write_fluffy.h" +#include "symbol_t.h" #include "ast_t.h" #include "type_t.h" #include "type.h" #include "adt/error.h" -static const context_t *global_context; -static FILE *out; +static const scope_t *global_scope; +static FILE *out; static void write_type(const type_t *type); -static const char *get_atomic_type_string(const atomic_type_type_t type) +static const char *get_atomic_type_string(const atomic_type_kind_t type) { switch(type) { - case ATOMIC_TYPE_VOID: return "void"; - case ATOMIC_TYPE_CHAR: return "byte"; - case ATOMIC_TYPE_SCHAR: return "byte"; - case ATOMIC_TYPE_UCHAR: return "unsigned byte"; - case ATOMIC_TYPE_SHORT: return "short"; - case ATOMIC_TYPE_USHORT: return "unsigned short"; - case ATOMIC_TYPE_INT: return "int"; - case ATOMIC_TYPE_UINT: return "unsigned int"; - case ATOMIC_TYPE_LONG: return "int"; - case ATOMIC_TYPE_ULONG: return "unsigned int"; - case ATOMIC_TYPE_LONGLONG: return "long"; - case ATOMIC_TYPE_ULONGLONG: return "unsigned long"; - case ATOMIC_TYPE_FLOAT: return "float"; - case ATOMIC_TYPE_DOUBLE: return "double"; + case ATOMIC_TYPE_VOID: return "void"; + case ATOMIC_TYPE_CHAR: return "byte"; + case ATOMIC_TYPE_SCHAR: return "byte"; + case ATOMIC_TYPE_UCHAR: return "unsigned byte"; + case ATOMIC_TYPE_SHORT: return "short"; + case ATOMIC_TYPE_USHORT: return "unsigned short"; + case ATOMIC_TYPE_INT: return "int"; + case ATOMIC_TYPE_UINT: return "unsigned int"; + case ATOMIC_TYPE_LONG: return "int"; + case ATOMIC_TYPE_ULONG: return "unsigned int"; + case ATOMIC_TYPE_LONGLONG: return "long"; + case ATOMIC_TYPE_ULONGLONG: return "unsigned long"; + case ATOMIC_TYPE_FLOAT: return "float"; + case ATOMIC_TYPE_DOUBLE: return "double"; case ATOMIC_TYPE_LONG_DOUBLE: return "double"; - case ATOMIC_TYPE_BOOL: return "bool"; - default: panic("unsupported atomic type"); + case ATOMIC_TYPE_BOOL: return "bool"; + default: panic("unsupported atomic type"); } } -static void write_atomic_type(const type_t *type) +static void write_atomic_type(const atomic_type_t *type) { - fprintf(out, "%s", get_atomic_type_string(type->v.atomic_type.atype)); + fprintf(out, "%s", get_atomic_type_string(type->akind)); } -static void write_pointer_type(const type_t *type) +static void write_pointer_type(const pointer_type_t *type) { - write_type(type->v.pointer_type.points_to); + write_type(type->points_to); fputc('*', out); } 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; + declaration_t *declaration = global_scope->declarations; while(declaration != NULL) { if(! (declaration->storage_class == STORAGE_CLASS_TYPEDEF)) { declaration = declaration->next; @@ -65,16 +85,16 @@ static declaration_t *find_typedef(const type_t *type) return declaration; } -static void write_compound_type(const type_t *type) +static void write_compound_type(const compound_type_t *type) { - declaration_t *declaration = find_typedef(type); + declaration_t *declaration = find_typedef((const type_t*) type); if(declaration != NULL) { fprintf(out, "%s", declaration->symbol->string); return; } /* does the struct have a name? */ - symbol_t *symbol = type->v.compound_type.declaration->symbol; + symbol_t *symbol = type->declaration->symbol; if(symbol != NULL) { /* TODO: make sure we create a struct for it... */ fprintf(out, "%s", symbol->string); @@ -84,16 +104,16 @@ static void write_compound_type(const type_t *type) fprintf(out, "/* TODO anonymous struct */byte"); } -static void write_enum_type(const type_t *type) +static void write_enum_type(const enum_type_t *type) { - declaration_t *declaration = find_typedef(type); + declaration_t *declaration = find_typedef((const type_t*) type); if(declaration != NULL) { fprintf(out, "%s", declaration->symbol->string); return; } /* does the enum have a name? */ - symbol_t *symbol = type->v.enum_type.declaration->symbol; + symbol_t *symbol = type->declaration->symbol; if(symbol != NULL) { /* TODO: make sure we create an enum for it... */ fprintf(out, "%s", symbol->string); @@ -103,11 +123,11 @@ static void write_enum_type(const type_t *type) fprintf(out, "/* TODO anonymous enum */byte"); } -static void write_function_type(const type_t *type) +static void write_function_type(const function_type_t *type) { fprintf(out, "(func("); - function_parameter_t *parameter = type->v.function_type.parameters; + function_parameter_t *parameter = type->parameters; int first = 1; while(parameter != NULL) { if(!first) { @@ -131,32 +151,34 @@ static void write_function_type(const type_t *type) } fprintf(out, ") : "); - write_type(type->v.function_type.result_type); + write_type(type->return_type); fprintf(out, ")"); } static void write_type(const type_t *type) { - switch(type->type) { + switch(type->kind) { case TYPE_ATOMIC: - write_atomic_type(type); + write_atomic_type(&type->atomic); return; case TYPE_POINTER: - write_pointer_type(type); + write_pointer_type(&type->pointer); return; case TYPE_COMPOUND_UNION: case TYPE_COMPOUND_STRUCT: - write_compound_type(type); + write_compound_type(&type->compound); return; case TYPE_ENUM: - write_enum_type(type); + write_enum_type(&type->enumt); return; case TYPE_FUNCTION: - write_function_type(type); + write_function_type(&type->function); return; case TYPE_INVALID: panic("invalid type found"); break; + case TYPE_COMPLEX: + case TYPE_IMAGINARY: default: fprintf(out, "/* TODO type */"); break; @@ -170,11 +192,11 @@ static void write_struct_entry(const declaration_t *declaration) fprintf(out, "\n"); } -static void write_struct(const symbol_t *symbol, const type_t *type) +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->v.compound_type.declaration->context.declarations; + const declaration_t *declaration = type->declaration->scope.declarations; while(declaration != NULL) { write_struct_entry(declaration); declaration = declaration->next; @@ -183,11 +205,11 @@ static void write_struct(const symbol_t *symbol, const type_t *type) fprintf(out, "\n"); } -static void write_union(const symbol_t *symbol, const type_t *type) +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->v.compound_type.declaration->context.declarations; + const declaration_t *declaration = type->declaration->scope.declarations; while(declaration != NULL) { write_struct_entry(declaration); declaration = declaration->next; @@ -200,33 +222,33 @@ static void write_expression(const expression_t *expression); static void write_unary_expression(const unary_expression_t *expression) { - switch(expression->type) { - case UNEXPR_NEGATE: + switch(expression->base.kind) { + case EXPR_UNARY_NEGATE: fputc('-', out); break; - case UNEXPR_NOT: + case EXPR_UNARY_NOT: fputc('!', out); break; default: - panic("unimplemented unary expression found"); + panic("unimeplemented unary expression found"); } write_expression(expression->value); } static void write_expression(const expression_t *expression) { - const const_t *constant; + const const_expression_t *constant; /* TODO */ - switch(expression->type) { + switch(expression->kind) { case EXPR_CONST: - constant = (const const_t*) expression; - if(is_type_integer(expression->datatype)) { + constant = &expression->conste; + if(is_type_integer(expression->base.type)) { fprintf(out, "%lld", constant->v.int_value); } else { fprintf(out, "%Lf", constant->v.float_value); } break; - case EXPR_UNARY: + EXPR_UNARY_CASES write_unary_expression((const unary_expression_t*) expression); break; default: @@ -234,11 +256,11 @@ static void write_expression(const expression_t *expression) } } -static void write_enum(const symbol_t *symbol, const type_t *type) +static void write_enum(const symbol_t *symbol, const enum_type_t *type) { fprintf(out, "enum %s:\n", symbol->string); - declaration_t *entry = type->v.enum_type.declaration->next; + declaration_t *entry = type->declaration->next; for ( ; entry != NULL && entry->storage_class == STORAGE_CLASS_ENUM_ENTRY; entry = entry->next) { fprintf(out, "\t%s", entry->symbol->string); @@ -270,9 +292,10 @@ static void write_function(const declaration_t *declaration) fprintf(out, "func extern %s(", declaration->symbol->string); - const type_t *function_type = declaration->type; + const function_type_t *function_type + = (const function_type_t*) declaration->type; - declaration_t *parameter = declaration->context.declarations; + declaration_t *parameter = declaration->scope.declarations; int first = 1; for( ; parameter != NULL; parameter = parameter->next) { if(!first) { @@ -287,7 +310,7 @@ static void write_function(const declaration_t *declaration) } write_type(parameter->type); } - if(function_type->v.function_type.variadic) { + if(function_type->variadic) { if(!first) { fprintf(out, ", "); } else { @@ -297,48 +320,42 @@ static void write_function(const declaration_t *declaration) } fprintf(out, ")"); - const type_t *result_type = function_type->v.function_type.result_type; - if(result_type->type != TYPE_ATOMIC || - result_type->v.atomic_type.atype != ATOMIC_TYPE_VOID) { + const type_t *return_type = function_type->return_type; + if(!is_type_atomic(return_type, ATOMIC_TYPE_VOID)) { fprintf(out, " : "); - write_type(result_type); + write_type(return_type); } fputc('\n', out); } -void write_fluffy_decls(const translation_unit_t *unit) +void write_fluffy_decls(FILE *output, const translation_unit_t *unit) { -#if 0 - out = fopen("out.fluffy", "w"); - if(out == NULL) { - fprintf(stderr, "Couldn't open out.fluffy: %s\n", strerror(errno)); - exit(1); - } -#endif - out = stdout; - global_context = &unit->context; + out = output; + global_scope = &unit->scope; + ast_set_output(out); + type_set_output(out); fprintf(out, "/* WARNING: Automatically generated file */\n"); - /* write structs, unions + enums */ - declaration_t *declaration = unit->context.declarations; + /* write structs,unions + enums */ + declaration_t *declaration = unit->scope.declarations; for( ; declaration != NULL; declaration = declaration->next) { //fprintf(out, "// Decl: %s\n", declaration->symbol->string); if(! (declaration->storage_class == STORAGE_CLASS_TYPEDEF)) { continue; } type_t *type = declaration->type; - if(type->type == TYPE_COMPOUND_STRUCT) { - write_struct(declaration->symbol, type); - } else if(type->type == TYPE_COMPOUND_UNION) { - write_union(declaration->symbol, type); - } else if(type->type == TYPE_ENUM) { - write_enum(declaration->symbol, type); + if(type->kind == TYPE_COMPOUND_STRUCT) { + write_struct(declaration->symbol, &type->compound); + } else if(type->kind == TYPE_COMPOUND_UNION) { + write_union(declaration->symbol, &type->compound); + } else if(type->kind == TYPE_ENUM) { + write_enum(declaration->symbol, &type->enumt); } } /* write global variables */ - declaration = unit->context.declarations; + declaration = unit->scope.declarations; for( ; declaration != NULL; declaration = declaration->next) { if(declaration->namespc != NAMESPACE_NORMAL) continue; @@ -347,14 +364,14 @@ void write_fluffy_decls(const translation_unit_t *unit) continue; type_t *type = declaration->type; - if(type->type == TYPE_FUNCTION) + if(type->kind == TYPE_FUNCTION) continue; write_variable(declaration); } /* write functions */ - declaration = unit->context.declarations; + declaration = unit->scope.declarations; for( ; declaration != NULL; declaration = declaration->next) { if(declaration->namespc != NAMESPACE_NORMAL) continue; @@ -363,11 +380,9 @@ void write_fluffy_decls(const translation_unit_t *unit) continue; type_t *type = declaration->type; - if(type->type != TYPE_FUNCTION) + if(type->kind != TYPE_FUNCTION) continue; write_function(declaration); } - - //fclose(out); }