about summary refs log tree commit diff
path: root/boot/catboot.c
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-07-23 03:52:50 +0200
committerMel <mel@rnrd.eu>2025-07-23 03:56:24 +0200
commit3a4e9a21361ac930f17fe18687f4a1bce6a5863b (patch)
tree69c5f7319197334daa5e18482a555c4e5d592b4c /boot/catboot.c
parentb0acce3b858715a04fba154a23c6ea5fac083a74 (diff)
downloadcatskill-3a4e9a21361ac930f17fe18687f4a1bce6a5863b.tar.zst
catskill-3a4e9a21361ac930f17fe18687f4a1bce6a5863b.zip
Add rudimentary catskill-to-C transpiler (yay!)
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/catboot.c')
-rw-r--r--boot/catboot.c59
1 files changed, 47 insertions, 12 deletions
diff --git a/boot/catboot.c b/boot/catboot.c
index 155c3c5..9afb710 100644
--- a/boot/catboot.c
+++ b/boot/catboot.c
@@ -105,9 +105,7 @@ debug_parse_pass(struct Source_File source_file)
 
     struct Tree tree;
     int parser_result = parser_do_your_thing(&parser, &tree);
-    if (parser_result != 0) {
-        fprintf(stderr, "parser finished with errors\n");
-    }
+    if (parser_result != 0) fprintf(stderr, "parser finished with errors\n");
 
     tree_printer(&tree);
 
@@ -123,6 +121,7 @@ enum Command_Result
 struct Command_Arguments
 {
     const ascii* input;
+    const ascii* output;
 };
 
 enum Command_Result
@@ -167,18 +166,50 @@ test_parse_command(struct Command_Arguments* arguments)
 enum Command_Result
 default_command(struct Command_Arguments* arguments)
 {
+    enum Command_Result result = COMMAND_OK;
+
     struct String source = read_file(arguments->input);
     struct Source_File source_file = {
         .source = source,
         .path = string_from_static_c_string(arguments->input),
     };
 
-    debug_lex_pass(source);
-    printf("\n");
-    if (debug_parse_pass(source_file)) return COMMAND_FAIL;
-    printf("\n");
+    struct Lexer lexer;
+    lexer_new(&lexer, source);
 
-    return COMMAND_OK;
+    struct Parser parser;
+    parser_new(&parser, &lexer, source_file);
+
+    struct Tree tree;
+    if (parser_do_your_thing(&parser, &tree) != 0) {
+        fprintf(stderr, "parser finished with errors\n");
+        goto end;
+    }
+
+    FILE* output_file = nil;
+    if (arguments->output) {
+        output_file = fopen(arguments->output, "w");
+        if (!output_file) {
+            fprintf(stderr, "could not open output file: %s\n", arguments->output);
+            result = COMMAND_FAIL;
+            goto end;
+        }
+    } else {
+        output_file = stdout;
+    }
+
+    struct Transpiler transpiler;
+    transpiler_new(&transpiler, output_file);
+
+    if (transpiler_catskill_to_c(&transpiler, &tree) != 0) {
+        fprintf(stderr, "transpiler finished with errors\n");
+        result = COMMAND_FAIL;
+    }
+
+    if (output_file != stdout) fclose(output_file);
+
+end:
+    return result;
 }
 
 typedef enum Command_Result (*Command_Function)(struct Command_Arguments*);
@@ -209,7 +240,7 @@ main(const int32 argc, ascii* argv[])
     }
 
     bool have_command = false;
-    ascii *command_name = nil, short_command_name = '\0', *input = nil;
+    ascii *command_name = nil, short_command_name = '\0', *input = nil, *output = nil;
     for (uint a = 1; a < argc; ++a) {
         ascii* arg = argv[a];
 
@@ -224,12 +255,16 @@ main(const int32 argc, ascii* argv[])
             }
             have_command = true;
         } else {
-            check(!input, "multiple inputs given");
-            input = arg;
+            if (!input)
+                input = arg;
+            else if (!output)
+                output = arg;
+            else
+                failure("too many arguments, expected at most 2: input and output");
         }
     }
 
-    struct Command_Arguments arguments = { .input = input };
+    struct Command_Arguments arguments = { .input = input, .output = output };
     for (uint d = 0; d < ARRAY_SIZE(command_definitions); ++d) {
         struct Command_Definition* definition = &command_definitions[d];