aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-02-18 02:22:31 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-02-18 02:22:31 -0500
commit6d54150755a3addd248f329851d463745cbdb847 (patch)
tree4f4a3156b59ee5101cf7527854435b84f94de6ba
parent0d3022b34a79e3b2cecd6136e3c90f69881f1016 (diff)
Split module code into header/c file
-rw-r--r--compile.c33
-rw-r--r--compile.h6
-rw-r--r--nextlang.c12
3 files changed, 30 insertions, 21 deletions
diff --git a/compile.c b/compile.c
index bf365c3c..ecca712d 100644
--- a/compile.c
+++ b/compile.c
@@ -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
diff --git a/compile.h b/compile.h
index b42de66e..ac465d7a 100644
--- a/compile.h
+++ b/compile.h
@@ -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);
diff --git a/nextlang.c b/nextlang.c
index cf38f63e..62a3feec 100644
--- a/nextlang.c
+++ b/nextlang.c
@@ -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"