aboutsummaryrefslogtreecommitdiffhomepage
path: root/main.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-23 17:41:23 +0900
committernsfisis <nsfisis@gmail.com>2025-08-23 17:41:23 +0900
commit8646e6f693fd935c6cb81e776a6c92a3fd093a33 (patch)
tree450b60115282243bf0567b495e9e85f0d56abba1 /main.c
parentd83647f390d2910547ada2854eee6189e8552cb8 (diff)
downloadducc-8646e6f693fd935c6cb81e776a6c92a3fd093a33.tar.gz
ducc-8646e6f693fd935c6cb81e776a6c92a3fd093a33.tar.zst
ducc-8646e6f693fd935c6cb81e776a6c92a3fd093a33.zip
feat: output executable using gcc
Diffstat (limited to 'main.c')
-rw-r--r--main.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/main.c b/main.c
index f34baf1..434f304 100644
--- a/main.c
+++ b/main.c
@@ -9,15 +9,35 @@
#include "src/ast.c"
#include "src/parse.c"
#include "src/codegen.c"
+#include "src/cli.c"
// clang-format on
int main(int argc, char** argv) {
- if (argc == 1) {
- fatal_error("usage: ducc <FILE>");
- }
- InFile* source = infile_open(argv[1]);
+ CliArgs* cli_args = parse_cli_args(argc, argv);
+ InFile* source = infile_open(cli_args->input_filename);
TokenArray* pp_tokens = preprocess(source);
TokenArray* tokens = tokenize(pp_tokens);
Program* prog = parse(tokens);
- codegen(prog);
+
+ const char* assembly_filename;
+ if (cli_args->output_executable) {
+ char* temp_filename = calloc(19, sizeof(char));
+ temp_filename = strdup("/tmp/ducc-XXXXXX.s");
+ mkstemps(temp_filename, strlen(".s"));
+ assembly_filename = temp_filename;
+ } else {
+ assembly_filename = cli_args->output_filename;
+ }
+ FILE* assembly_file = assembly_filename ? fopen(assembly_filename, "wb") : stdout;
+ codegen(prog, assembly_file);
+ fclose(assembly_file);
+
+ if (cli_args->output_executable) {
+ char cmd_buf[256];
+ sprintf(cmd_buf, "gcc -s -o '%s' '%s'", cli_args->output_filename, assembly_filename);
+ int result = system(cmd_buf);
+ if (result != 0) {
+ fatal_error("gcc failed: %d", result);
+ }
+ }
}