9 string[string] type_map = {
11 "nlambda" => "NLAMBDA",
14 "f_lambda" => "F_LAMBDA",
15 "f_lexpr" => "F_LEXPR",
20 make_lisp(string[*] tokens)
22 string[...] lisp = {};
25 return (string[1]) { tokens[dim(tokens) - 1] };
26 return (string[dim(tokens)-2]) { [i] = tokens[i+2] };
30 read_builtin(file f) {
31 string line = File::fgets(f);
32 string[*] tokens = String::wordsplit(line, " \t");
35 .type = dim(tokens) > 0 ? type_map[tokens[0]] : "#",
36 .c_name = dim(tokens) > 1 ? tokens[1] : "#",
37 .lisp_names = make_lisp(tokens),
42 read_builtins(file f) {
43 builtin_t[...] builtins = {};
45 while (!File::end(f)) {
46 builtin_t b = read_builtin(f);
49 builtins[dim(builtins)] = b;
54 bool is_atom(builtin_t b) = b.type == "atom";
57 dump_ids(builtin_t[*] builtins) {
58 printf("#ifdef AO_LISP_BUILTIN_ID\n");
59 printf("#undef AO_LISP_BUILTIN_ID\n");
60 printf("enum ao_lisp_builtin_id {\n");
61 for (int i = 0; i < dim(builtins); i++)
62 if (!is_atom(builtins[i]))
63 printf("\tbuiltin_%s,\n", builtins[i].c_name);
64 printf("\t_builtin_last\n");
66 printf("#endif /* AO_LISP_BUILTIN_ID */\n");
70 dump_casename(builtin_t[*] builtins) {
71 printf("#ifdef AO_LISP_BUILTIN_CASENAME\n");
72 printf("#undef AO_LISP_BUILTIN_CASENAME\n");
73 printf("static char *ao_lisp_builtin_name(enum ao_lisp_builtin_id b) {\n");
74 printf("\tswitch(b) {\n");
75 for (int i = 0; i < dim(builtins); i++)
76 if (!is_atom(builtins[i]))
77 printf("\tcase builtin_%s: return ao_lisp_poly_atom(_atom(\"%s\"))->name;\n",
78 builtins[i].c_name, builtins[i].lisp_names[0]);
79 printf("\tdefault: return \"???\";\n");
82 printf("#endif /* AO_LISP_BUILTIN_CASENAME */\n");
87 for (int j = 0; j < String::length(l); j++) {
89 if (Ctype::isalnum(c) || c == '_')
97 dump_arrayname(builtin_t[*] builtins) {
98 printf("#ifdef AO_LISP_BUILTIN_ARRAYNAME\n");
99 printf("#undef AO_LISP_BUILTIN_ARRAYNAME\n");
100 printf("static const ao_poly builtin_names[] = {\n");
101 for (int i = 0; i < dim(builtins); i++) {
102 if (!is_atom(builtins[i])) {
103 printf("\t[builtin_%s] = _ao_lisp_atom_",
105 cify_lisp(builtins[i].lisp_names[0]);
110 printf("#endif /* AO_LISP_BUILTIN_ARRAYNAME */\n");
114 dump_funcs(builtin_t[*] builtins) {
115 printf("#ifdef AO_LISP_BUILTIN_FUNCS\n");
116 printf("#undef AO_LISP_BUILTIN_FUNCS\n");
117 printf("const ao_lisp_func_t ao_lisp_builtins[] = {\n");
118 for (int i = 0; i < dim(builtins); i++) {
119 if (!is_atom(builtins[i]))
120 printf("\t[builtin_%s] = ao_lisp_do_%s,\n",
125 printf("#endif /* AO_LISP_BUILTIN_FUNCS */\n");
129 dump_decls(builtin_t[*] builtins) {
130 printf("#ifdef AO_LISP_BUILTIN_DECLS\n");
131 printf("#undef AO_LISP_BUILTIN_DECLS\n");
132 for (int i = 0; i < dim(builtins); i++) {
133 if (!is_atom(builtins[i])) {
135 printf("ao_lisp_do_%s(struct ao_lisp_cons *cons);\n",
139 printf("#endif /* AO_LISP_BUILTIN_DECLS */\n");
143 dump_consts(builtin_t[*] builtins) {
144 printf("#ifdef AO_LISP_BUILTIN_CONSTS\n");
145 printf("#undef AO_LISP_BUILTIN_CONSTS\n");
146 printf("struct builtin_func funcs[] = {\n");
147 for (int i = 0; i < dim(builtins); i++) {
148 if (!is_atom(builtins[i])) {
149 for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
150 printf ("\t{ .name = \"%s\", .args = AO_LISP_FUNC_%s, .func = builtin_%s },\n",
151 builtins[i].lisp_names[j],
158 printf("#endif /* AO_LISP_BUILTIN_CONSTS */\n");
162 dump_atoms(builtin_t[*] builtins) {
163 printf("#ifdef AO_LISP_BUILTIN_ATOMS\n");
164 printf("#undef AO_LISP_BUILTIN_ATOMS\n");
165 for (int i = 0; i < dim(builtins); i++) {
166 for (int j = 0; j < dim(builtins[i].lisp_names); j++) {
167 printf("#define _ao_lisp_atom_");
168 cify_lisp(builtins[i].lisp_names[j]);
169 printf(" _atom(\"%s\")\n", builtins[i].lisp_names[j]);
172 printf("#endif /* AO_LISP_BUILTIN_ATOMS */\n");
177 File::fprintf(stderr, "usage: %s <file>\n", argv[0]);
180 twixt(file f = File::open(argv[1], "r"); File::close(f)) {
181 builtin_t[*] builtins = read_builtins(f);
183 dump_casename(builtins);
184 dump_arrayname(builtins);
185 dump_funcs(builtins);
186 dump_decls(builtins);
187 dump_consts(builtins);
188 dump_atoms(builtins);