}
}
+void fundecl_genc(struct fundecl *decl, FILE *cout)
+{
+ type_genc(decl->rtype, cout);
+ safe_fprintf(cout, "%s (", decl->ident);
+ for (int i = 0; i<decl->nargs; i++) {
+ if (i < decl->natypes)
+ die("function with unmatched type\n");
+ safe_fprintf(cout, "%s", decl->args[i]);
+ if (i < decl->nargs - 1)
+ safe_fprintf(cout, ", ");
+ }
+ safe_fprintf(cout, ") /*");
+ if (decl->rtype != NULL) {
+ safe_fprintf(cout, " :: ");
+ for (int i = 0; i<decl->natypes; i++) {
+ type_print(decl->atypes[i], cout);
+ safe_fprintf(cout, " ");
+ }
+ safe_fprintf(cout, "-> ");
+ type_print(decl->rtype, cout);
+ }
+ safe_fprintf(cout, "*/ {\n");
+ for (int i = 0; i<decl->nbody; i++)
+ stmt_genc(decl->body[i], 1, cout);
+ safe_fprintf(cout, "}\n");
+}
+
void decl_genc(struct decl *decl, FILE *cout)
{
switch (decl->type) {
- case dcomponent:
+ case dcomp:
//TODO generate prototypes?
- for (int i = 0; i<decl->data.dcomponent.ndecls; i++)
- decl_genc(decl->data.dcomponent.decls[i], cout);
+ for (int i = 0; i<decl->data.dcomp.ndecls; i++)
+ fundecl_genc(decl->data.dcomp.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)
- 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, ", ");
- }
- safe_fprintf(cout, ") /*");
- if (decl->data.dfun.rtype != NULL) {
- safe_fprintf(cout, " :: ");
- for (int i = 0; i<decl->data.dfun.natypes; i++) {
- type_print(decl->data.dfun.atypes[i], cout);
- safe_fprintf(cout, " ");
- }
- safe_fprintf(cout, "-> ");
- type_print(decl->data.dfun.rtype, cout);
- }
- safe_fprintf(cout, "*/ {\n");
- for (int i = 0; i<decl->data.dfun.nbody; i++)
- stmt_genc(decl->data.dfun.body[i], 1, cout);
- safe_fprintf(cout, "}\n");
+ fundecl_genc(decl->data.dfun, cout);
break;
case dvardecl:
vardecl_genc(decl->data.dvar, 0, cout);