about summary refs log tree commit diff
path: root/boot/runtime/runtime.c
blob: 47958a6374e48d6183ad90d5d0018f1d21f8363b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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;
}