add scc and update other code
[ccc.git] / ast.c
diff --git a/ast.c b/ast.c
index 2bfcf43..e9ebb56 100644 (file)
--- a/ast.c
+++ b/ast.c
@@ -289,7 +289,7 @@ void ast_print(struct ast *ast, FILE *out)
        if (ast == NULL)
                return;
        for (int i = 0; i<ast->ndecls; i++)
-               decl_print(ast->decls[i], 0, out);
+               decl_print(ast->decls[i], out);
 }
 
 void vardecl_print(struct vardecl *decl, int indent, FILE *out)
@@ -304,13 +304,12 @@ void vardecl_print(struct vardecl *decl, int indent, FILE *out)
        safe_fprintf(out, ";\n");
 }
 
-void decl_print(struct decl *decl, int indent, FILE *out)
+void decl_print(struct decl *decl, FILE *out)
 {
        if (decl == NULL)
                return;
        switch(decl->type) {
        case dfundecl:
-               pindent(indent, out);
                safe_fprintf(out, "%s (", decl->data.dfun.ident);
                for (int i = 0; i<decl->data.dfun.nargs; i++) {
                        safe_fprintf(out, "%s", decl->data.dfun.args[i]);
@@ -329,12 +328,15 @@ void decl_print(struct decl *decl, int indent, FILE *out)
                }
                safe_fprintf(out, " {\n");
                for (int i = 0; i<decl->data.dfun.nbody; i++)
-                       stmt_print(decl->data.dfun.body[i], indent+1, out);
-               pindent(indent, out);
+                       stmt_print(decl->data.dfun.body[i], 1, out);
                safe_fprintf(out, "}\n");
                break;
        case dvardecl:
-               vardecl_print(decl->data.dvar, indent, out);
+               vardecl_print(decl->data.dvar, 0, out);
+               break;
+       case dcomponent:
+               for (int i = 0; i<decl->data.dcomponent.ndecls; i++)
+                       decl_print(decl, out);
                break;
        default:
                die("Unsupported decl node\n");
@@ -517,6 +519,11 @@ void decl_free(struct decl *decl)
        if (decl == NULL)
                return;
        switch(decl->type) {
+       case dcomponent:
+               for (int i = 0; i<decl->data.dcomponent.ndecls; i++)
+                       decl_free(decl->data.dcomponent.decls[i]);
+               free(decl->data.dcomponent.decls);
+               break;
        case dfundecl:
                free(decl->data.dfun.ident);
                for (int i = 0; i<decl->data.dfun.nargs; i++)