about summary refs log tree commit diff
path: root/boot/runtime
diff options
context:
space:
mode:
authorMel <mel@rnrd.eu>2025-08-05 22:51:26 +0200
committerMel <mel@rnrd.eu>2025-08-05 22:51:26 +0200
commitcbda0181b9f5480cfce2c08e17fd998babb77d4d (patch)
tree41497eeb154f27ff693e598e3c64b1528fd6ce0f /boot/runtime
parentc2c84f4d15d964fb663f390046b1d17441145c61 (diff)
downloadcatskill-cbda0181b9f5480cfce2c08e17fd998babb77d4d.tar.zst
catskill-cbda0181b9f5480cfce2c08e17fd998babb77d4d.zip
Add runtime library for catskill transpiled artifacts, wrapping main function with correct types
Signed-off-by: Mel <mel@rnrd.eu>
Diffstat (limited to 'boot/runtime')
-rw-r--r--boot/runtime/runtime.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/boot/runtime/runtime.c b/boot/runtime/runtime.c
new file mode 100644
index 0000000..47958a6
--- /dev/null
+++ b/boot/runtime/runtime.c
@@ -0,0 +1,48 @@
+/*
+ * the catskill transpiled-source runtime.
+ * wraps the catskill source entry point in a normal c main function,
+ * and provides some basic runtime startup and exit functionality.
+ *
+ * Copyright (c) 2025, Mel G. <mel@rnrd.eu>
+ *
+ * SPDX-License-Identifier: MPL-2.0
+ */
+
+// catskill programs that use the runtime are expected to
+// provide a `main` which can have the following signatures:
+// * main = fun () {}
+// * main = fun (args [string]) {}
+// the transpiler will define the macro `CATSKILL_MAIN_TAKES_ARGS`
+// to indicate that the main function takes arguments.
+// exit codes are returned with the use of the `exit` function.
+#ifdef CATSKILL_MAIN_TAKES_ARGS
+void catskill_main(Array(struct String) args);
+#else
+void catskill_main(void);
+#endif
+
+// the main function that wraps the catskill main function
+// and provides the runtime startup and exit functionality.
+int
+main(int argc, char* argv[])
+{
+#ifdef CATSKILL_MAIN_TAKES_ARGS
+    Array(struct String) args = array_new(struct String);
+    for (int i = 0; i < argc; i++) {
+        struct String arg = string_from(argv[i]);
+        array_push(&args, &arg);
+    }
+
+    catskill_main(args);
+
+    ARRAY_FREE_ELEMENTS(struct String, args, string_free);
+    array_free(&args);
+#else
+    catskill_main();
+
+    (void)argc;
+    (void)argv;
+#endif
+    // on error catskill_main will call `exit` with a non-zero code.
+    return 0;
+}