altos/lisp: More schemisms
[fw/altos] / src / lisp / ao_lisp_make_builtin
index 5e98516c7c2b69247c5e4c411580d61c999a54a2..b7b17cf48009c80673bc6ba3d4b5c7c4eec6ecb9 100644 (file)
@@ -3,7 +3,7 @@
 typedef struct {
        string  type;
        string  c_name;
-       string  lisp_name;
+       string[*]       lisp_names;
 } builtin_t;
 
 string[string] type_map = {
@@ -13,6 +13,16 @@ string[string] type_map = {
        "macro" => "MACRO",
 };
 
+string[*]
+make_lisp(string[*] tokens)
+{
+       string[...] lisp = {};
+
+       if (dim(tokens) < 3)
+               return (string[1]) { tokens[dim(tokens) - 1] };
+       return (string[dim(tokens)-2]) { [i] = tokens[i+2] };
+}
+
 builtin_t
 read_builtin(file f) {
        string  line = File::fgets(f);
@@ -21,7 +31,7 @@ read_builtin(file f) {
        return (builtin_t) {
                .type = dim(tokens) > 0 ? type_map[tokens[0]] : "#",
                .c_name = dim(tokens) > 1 ? tokens[1] : "#",
-               .lisp_name = dim(tokens) > 2 ? tokens[2] : tokens[1]
+               .lisp_names = make_lisp(tokens),
        };
 }
 
@@ -84,7 +94,7 @@ dump_arrayname(builtin_t[*] builtins) {
        for (int i = 0; i < dim(builtins); i++) {
                printf("\t[builtin_%s] = _ao_lisp_atom_",
                       builtins[i].c_name);
-               cify_lisp(builtins[i].lisp_name);
+               cify_lisp(builtins[i].lisp_names[0]);
                printf(",\n");
        }
        printf("};\n");
@@ -123,8 +133,10 @@ dump_consts(builtin_t[*] builtins) {
        printf("#undef AO_LISP_BUILTIN_CONSTS\n");
        printf("struct builtin_func funcs[] = {\n");
        for (int i = 0; i < dim(builtins); i++) {
-               printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
-                       builtins[i].lisp_name, builtins[i].type, builtins[i].c_name);
+               for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
+                       printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
+                               builtins[i].lisp_names[j], builtins[i].type, builtins[i].c_name);
+               }
        }
        printf("};\n");
        printf("#endif /* AO_LISP_BUILTIN_CONSTS */\n");