diff options
Diffstat (limited to 'boot/runtime')
| -rw-r--r-- | boot/runtime/runtime.c | 48 |
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; +} |
