9 string[string] type_map = {
10 "lambda" => "F_LAMBDA",
11 "nlambda" => "NLAMBDA",
17 make_lisp(string[*] tokens)
19 string[...] lisp = {};
22 return (string[1]) { tokens[dim(tokens) - 1] };
23 return (string[dim(tokens)-2]) { [i] = tokens[i+2] };
27 read_builtin(file f) {
28 string line = File::fgets(f);
29 string[*] tokens = String::wordsplit(line, " \t");
32 .type = dim(tokens) > 0 ? type_map[tokens[0]] : "#",
33 .c_name = dim(tokens) > 1 ? tokens[1] : "#",
34 .lisp_names = make_lisp(tokens),
39 read_builtins(file f) {
40 builtin_t[...] builtins = {};
42 while (!File::end(f)) {
43 builtin_t b = read_builtin(f);
46 builtins[dim(builtins)] = b;
52 dump_ids(builtin_t[*] builtins) {
53 printf("#ifdef AO_LISP_BUILTIN_ID\n");
54 printf("#undef AO_LISP_BUILTIN_ID\n");
55 printf("enum ao_lisp_builtin_id {\n");
56 for (int i = 0; i < dim(builtins); i++)
57 printf("\tbuiltin_%s,\n", builtins[i].c_name);
58 printf("\t_builtin_last\n");
60 printf("#endif /* AO_LISP_BUILTIN_ID */\n");
64 dump_casename(builtin_t[*] builtins) {
65 printf("#ifdef AO_LISP_BUILTIN_CASENAME\n");
66 printf("#undef AO_LISP_BUILTIN_CASENAME\n");
67 printf("static char *ao_lisp_builtin_name(enum ao_lisp_builtin_id b) {\n");
68 printf("\tswitch(b) {\n");
69 for (int i = 0; i < dim(builtins); i++)
70 printf("\tcase builtin_%s: return ao_lisp_poly_atom(_atom(%s))->name;\n",
71 builtins[i].c_name, builtins[i].c_name);
72 printf("\tdefault: return \"???\";\n");
75 printf("#endif /* AO_LISP_BUILTIN_CASENAME */\n");
80 for (int j = 0; j < String::length(l); j++) {
82 if (Ctype::isalnum(c) || c == '_')
90 dump_arrayname(builtin_t[*] builtins) {
91 printf("#ifdef AO_LISP_BUILTIN_ARRAYNAME\n");
92 printf("#undef AO_LISP_BUILTIN_ARRAYNAME\n");
93 printf("static const ao_poly builtin_names[] = {\n");
94 for (int i = 0; i < dim(builtins); i++) {
95 printf("\t[builtin_%s] = _ao_lisp_atom_",
97 cify_lisp(builtins[i].lisp_names[0]);
101 printf("#endif /* AO_LISP_BUILTIN_ARRAYNAME */\n");
105 dump_funcs(builtin_t[*] builtins) {
106 printf("#ifdef AO_LISP_BUILTIN_FUNCS\n");
107 printf("#undef AO_LISP_BUILTIN_FUNCS\n");
108 printf("const ao_lisp_func_t ao_lisp_builtins[] = {\n");
109 for (int i = 0; i < dim(builtins); i++) {
110 printf("\t[builtin_%s] = ao_lisp_do_%s,\n",
115 printf("#endif /* AO_LISP_BUILTIN_FUNCS */\n");
119 dump_decls(builtin_t[*] builtins) {
120 printf("#ifdef AO_LISP_BUILTIN_DECLS\n");
121 printf("#undef AO_LISP_BUILTIN_DECLS\n");
122 for (int i = 0; i < dim(builtins); i++) {
124 printf("ao_lisp_do_%s(struct ao_lisp_cons *cons);\n",
127 printf("#endif /* AO_LISP_BUILTIN_DECLS */\n");
131 dump_consts(builtin_t[*] builtins) {
132 printf("#ifdef AO_LISP_BUILTIN_CONSTS\n");
133 printf("#undef AO_LISP_BUILTIN_CONSTS\n");
134 printf("struct builtin_func funcs[] = {\n");
135 for (int i = 0; i < dim(builtins); i++) {
136 for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
137 printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
138 builtins[i].lisp_names[j], builtins[i].type, builtins[i].c_name);
142 printf("#endif /* AO_LISP_BUILTIN_CONSTS */\n");
147 File::fprintf(stderr, "usage: %s <file>\n", argv[0]);
150 twixt(file f = File::open(argv[1], "r"); File::close(f)) {
151 builtin_t[*] builtins = read_builtins(f);
153 dump_casename(builtins);
154 dump_arrayname(builtins);
155 dump_funcs(builtins);
156 dump_decls(builtins);
157 dump_consts(builtins);