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;
}
|