diff options
| -rw-r--r-- | compile.c | 33 | ||||
| -rw-r--r-- | compile.h | 6 | ||||
| -rw-r--r-- | nextlang.c | 12 |
3 files changed, 30 insertions, 21 deletions
@@ -685,7 +685,7 @@ CORD compile_type_info(env_t *env, type_t *t) } } -CORD compile_file(ast_t *ast) +module_code_t compile_file(ast_t *ast) { env_t *env = new_compilation_unit(); CORD_appendf(&env->code->imports, "#include \"nextlang.h\"\n"); @@ -697,20 +697,23 @@ CORD compile_file(ast_t *ast) bind_statement(env, stmt->ast); } - return CORD_all( - // CORD_asprintf("#line 0 %r\n", Str__quoted(f->filename, false)), - "// Generated code:\n", - env->code->imports, "\n", - env->code->typedefs, "\n", - env->code->typecode, "\n", - env->code->staticdefs, "\n", - env->code->funcs, "\n", - env->code->typeinfos, "\n", - "\n" - "static void $load(void) {\n", - env->code->main, - "}\n" - ); + return (module_code_t){ + .header=CORD_all( + // CORD_asprintf("#line 0 %r\n", Str__quoted(ast->file->filename, false)), + env->code->imports, "\n", + env->code->typedefs, "\n", + env->code->typecode, "\n"), + .c_file=CORD_all( + // CORD_asprintf("#line 0 %r\n", Str__quoted(ast->file->filename, false)), + env->code->staticdefs, "\n", + env->code->funcs, "\n", + env->code->typeinfos, "\n", + "\n" + "static void $load(void) {\n", + env->code->main, + "}\n" + ), + }; } // vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0 @@ -7,7 +7,11 @@ #include "util.h" #include "environment.h" -CORD compile_file(ast_t *ast); +typedef struct { + CORD header, c_file; +} module_code_t; + +module_code_t compile_file(ast_t *ast); CORD compile_type_ast(env_t *env, type_ast_t *t); CORD compile(env_t *env, ast_t *ast); CORD compile_statement(env_t *env, ast_t *ast); @@ -44,13 +44,15 @@ int main(int argc, char *argv[]) fclose(out); } - CORD module = compile_file(ast); + module_code_t module = compile_file(ast); CORD program = CORD_all( - // CORD_asprintf("#line 0 %r\n", Str__quoted(f->filename, false)), - "// Generated code:\n", - module, - "\n" + "// File: ", f->filename, ".h\n", + module.header, + "\n", + "// File: ", f->filename, ".c\n", + module.c_file, + "\n", "int main(int argc, const char *argv[]) {\n" "(void)argc;\n" "(void)argv;\n" |
