add scc and update other code
[ccc.git] / genc.c
diff --git a/genc.c b/genc.c
index 10f3d4f..617bcf6 100644 (file)
--- a/genc.c
+++ b/genc.c
@@ -2,9 +2,7 @@
 
 #include "ast.h"
 
-#define gdie(msg) { fprintf(stderr, "%s", msg); return 1; }
-
-int expr_genc(struct expr *expr, FILE *cout);
+void expr_genc(struct expr *expr, FILE *cout);
 
 void binop_genc(char *fun, struct expr *l, struct expr *r, FILE *cout)
 {
@@ -15,12 +13,11 @@ void binop_genc(char *fun, struct expr *l, struct expr *r, FILE *cout)
        safe_fprintf(cout, ")");
 }
 
-int expr_genc(struct expr *expr, FILE *cout)
+void expr_genc(struct expr *expr, FILE *cout)
 {
-       int r = 0;
        char buf[] = "\\x55";
        if (expr == NULL)
-               return 0;
+               return;
        switch(expr->type) {
        case ebinop:
                if (expr->type == ebinop && expr->data.ebinop.op == cons) {
@@ -87,45 +84,39 @@ int expr_genc(struct expr *expr, FILE *cout)
        default:
                die("Unknown expression node\n");
        }
-       return r;
 }
 
-int type_genc(struct type *type, FILE *cout)
+void type_genc(struct type *type, FILE *cout)
 {
-       if (type == NULL) {
+       if (type == NULL)
+               die("unresolved var type\n");
+       switch(type->type) {
+       case tbasic:
                fprintf(cout, "WORD ");
-       } else {
-               switch(type->type) {
-               case tbasic:
-                       fprintf(cout, "WORD ");
-                       break;
-               case tlist:
-                       fprintf(cout, "struct splc_list *");
-                       break;
-               case ttuple:
-                       fprintf(cout, "struct splc_tuple *");
-                       break;
-               case tvar:
-                       fprintf(cout, "WORD ");
-                       break;
-               default:
-                       die("Unsupported type node\n");
-               }
+               break;
+       case tlist:
+               fprintf(cout, "struct splc_list *");
+               break;
+       case ttuple:
+               fprintf(cout, "struct splc_tuple *");
+               break;
+       case tvar:
+               fprintf(cout, "WORD ");
+               break;
+       default:
+               die("Unsupported type node\n");
        }
-       return 0;
 }
 
-int vardecl_genc(struct vardecl *vardecl, int indent, FILE *cout)
+void vardecl_genc(struct vardecl *vardecl, int indent, FILE *cout)
 {
-       int r = 0;
        if (vardecl == NULL)
-               return 0;
+               return;
        pindent(indent, cout);
        type_genc(vardecl->type, cout);
        fprintf(cout, "%s = ", vardecl->ident);
-       r = expr_genc(vardecl->expr, cout);
+       expr_genc(vardecl->expr, cout);
        fprintf(cout, ";\n");
-       return r;
 }
 
 void stmt_genc(struct stmt *stmt, int indent, FILE *cout)
@@ -185,15 +176,20 @@ void stmt_genc(struct stmt *stmt, int indent, FILE *cout)
        }
 }
 
-int decl_genc(struct decl *decl, FILE *cout)
+void decl_genc(struct decl *decl, FILE *cout)
 {
        switch (decl->type) {
+       case dcomponent:
+               //TODO generate prototypes?
+               for (int i = 0; i<decl->data.dcomponent.ndecls; i++)
+                       decl_genc(decl->data.dcomponent.decls[i], cout);
+               break;
        case dfundecl:
                type_genc(decl->data.dfun.rtype, cout);
                safe_fprintf(cout, "%s (", decl->data.dfun.ident);
                for (int i = 0; i<decl->data.dfun.nargs; i++) {
                        if (i < decl->data.dfun.natypes)
-                               type_genc(decl->data.dfun.atypes[i], cout);
+                               die("function with unmatched type\n");
                        safe_fprintf(cout, "%s", decl->data.dfun.args[i]);
                        if (i < decl->data.dfun.nargs - 1)
                                safe_fprintf(cout, ", ");
@@ -214,12 +210,12 @@ int decl_genc(struct decl *decl, FILE *cout)
                safe_fprintf(cout, "}\n");
                break;
        case dvardecl:
-               return vardecl_genc(decl->data.dvar, 0, cout);
+               vardecl_genc(decl->data.dvar, 0, cout);
+               break;
        }
-       return 0;
 }
 
-int genc(struct ast *ast, FILE *cout)
+void genc(struct ast *ast, FILE *cout)
 {
        fprintf(cout,
                "#include <stdint.h>\n"
@@ -246,10 +242,8 @@ int genc(struct ast *ast, FILE *cout)
                "\treturn res;\n"
                "}\n"
                );
-       int r = 0;
-       for (int i = 0; i<ast->ndecls && r == 0; i++) {
+       for (int i = 0; i<ast->ndecls; i++) {
                fprintf(cout, "\n");
-               r = decl_genc(ast->decls[i], cout);
+               decl_genc(ast->decls[i], cout);
        }
-       return r;
 }