diff options
| author | Bdale Garbee <bdale@gag.com> | 2017-12-05 13:23:09 -0700 | 
|---|---|---|
| committer | Bdale Garbee <bdale@gag.com> | 2017-12-05 13:23:09 -0700 | 
| commit | 2f8fce1cf6ce4bd12a836cc8ee15f4edbc95c95e (patch) | |
| tree | 19a1bcb93694eb259f29e9ef9690bb31a9b8fa60 /src/lisp/ao_lisp_make_builtin | |
| parent | d314a5654fafa5eac86d8293f1197a2f2c2eac72 (diff) | |
| parent | 185b11367cd85948885fceafb5d46303b6f1356d (diff) | |
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Diffstat (limited to 'src/lisp/ao_lisp_make_builtin')
| -rw-r--r-- | src/lisp/ao_lisp_make_builtin | 192 | 
1 files changed, 0 insertions, 192 deletions
| diff --git a/src/lisp/ao_lisp_make_builtin b/src/lisp/ao_lisp_make_builtin deleted file mode 100644 index c4ba9d94..00000000 --- a/src/lisp/ao_lisp_make_builtin +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/nickle - -typedef struct { -	string	type; -	string	c_name; -	string[*]	lisp_names; -} builtin_t; - -string[string] type_map = { -	"lambda" => "LAMBDA", -	"nlambda" => "NLAMBDA", -	"lexpr" => "LEXPR", -	"macro" => "MACRO", -	"f_lambda" => "F_LAMBDA", -	"f_lexpr" => "F_LEXPR", -	"atom" => "atom", -}; - -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); -	string[*]	tokens = String::wordsplit(line, " \t"); - -	return (builtin_t) { -		.type = dim(tokens) > 0 ? type_map[tokens[0]] : "#", -		.c_name = dim(tokens) > 1 ? tokens[1] : "#", -		.lisp_names = make_lisp(tokens), -	}; -} - -builtin_t[*] -read_builtins(file f) { -	builtin_t[...] builtins = {}; - -	while (!File::end(f)) { -		builtin_t	b = read_builtin(f); - -		if (b.type[0] != '#') -			builtins[dim(builtins)] = b; -	} -	return builtins; -} - -bool is_atom(builtin_t b) = b.type == "atom"; - -void -dump_ids(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_ID\n"); -	printf("#undef AO_LISP_BUILTIN_ID\n"); -	printf("enum ao_lisp_builtin_id {\n"); -	for (int i = 0; i < dim(builtins); i++) -		if (!is_atom(builtins[i])) -			printf("\tbuiltin_%s,\n", builtins[i].c_name); -	printf("\t_builtin_last\n"); -	printf("};\n"); -	printf("#endif /* AO_LISP_BUILTIN_ID */\n"); -} - -void -dump_casename(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_CASENAME\n"); -	printf("#undef AO_LISP_BUILTIN_CASENAME\n"); -	printf("static char *ao_lisp_builtin_name(enum ao_lisp_builtin_id b) {\n"); -	printf("\tswitch(b) {\n"); -	for (int i = 0; i < dim(builtins); i++) -		if (!is_atom(builtins[i])) -			printf("\tcase builtin_%s: return ao_lisp_poly_atom(_atom(\"%s\"))->name;\n", -			       builtins[i].c_name, builtins[i].lisp_names[0]); -	printf("\tdefault: return \"???\";\n"); -	printf("\t}\n"); -	printf("}\n"); -	printf("#endif /* AO_LISP_BUILTIN_CASENAME */\n"); -} - -void -cify_lisp(string l) { -	for (int j = 0; j < String::length(l); j++) { -		int c= l[j]; -		if (Ctype::isalnum(c) || c == '_') -			printf("%c", c); -		else -			printf("%02x", c); -	} -} - -void -dump_arrayname(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_ARRAYNAME\n"); -	printf("#undef AO_LISP_BUILTIN_ARRAYNAME\n"); -	printf("static const ao_poly builtin_names[] = {\n"); -	for (int i = 0; i < dim(builtins); i++) { -		if (!is_atom(builtins[i])) { -			printf("\t[builtin_%s] = _ao_lisp_atom_", -			       builtins[i].c_name); -			cify_lisp(builtins[i].lisp_names[0]); -			printf(",\n"); -		} -	} -	printf("};\n"); -	printf("#endif /* AO_LISP_BUILTIN_ARRAYNAME */\n"); -} - -void -dump_funcs(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_FUNCS\n"); -	printf("#undef AO_LISP_BUILTIN_FUNCS\n"); -	printf("const ao_lisp_func_t ao_lisp_builtins[] = {\n"); -	for (int i = 0; i < dim(builtins); i++) { -		if (!is_atom(builtins[i])) -			printf("\t[builtin_%s] = ao_lisp_do_%s,\n", -			       builtins[i].c_name, -			       builtins[i].c_name); -	} -	printf("};\n"); -	printf("#endif /* AO_LISP_BUILTIN_FUNCS */\n"); -} - -void -dump_decls(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_DECLS\n"); -	printf("#undef AO_LISP_BUILTIN_DECLS\n"); -	for (int i = 0; i < dim(builtins); i++) { -		if (!is_atom(builtins[i])) { -			printf("ao_poly\n"); -			printf("ao_lisp_do_%s(struct ao_lisp_cons *cons);\n", -			       builtins[i].c_name); -		} -	} -	printf("#endif /* AO_LISP_BUILTIN_DECLS */\n"); -} - -void -dump_consts(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_CONSTS\n"); -	printf("#undef AO_LISP_BUILTIN_CONSTS\n"); -	printf("struct builtin_func funcs[] = {\n"); -	for (int i = 0; i < dim(builtins); i++) { -		if (!is_atom(builtins[i])) { -			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"); -} - -void -dump_atoms(builtin_t[*] builtins) { -	printf("#ifdef AO_LISP_BUILTIN_ATOMS\n"); -	printf("#undef AO_LISP_BUILTIN_ATOMS\n"); -	for (int i = 0; i < dim(builtins); i++) { -		for (int j = 0; j < dim(builtins[i].lisp_names); j++) { -			printf("#define _ao_lisp_atom_"); -			cify_lisp(builtins[i].lisp_names[j]); -			printf(" _atom(\"%s\")\n", builtins[i].lisp_names[j]); -		} -	} -	printf("#endif /* AO_LISP_BUILTIN_ATOMS */\n"); -} - -void main() { -	if (dim(argv) < 2) { -		File::fprintf(stderr, "usage: %s <file>\n", argv[0]); -		exit(1); -	} -	twixt(file f = File::open(argv[1], "r"); File::close(f)) { -		builtin_t[*]	builtins = read_builtins(f); -		dump_ids(builtins); -		dump_casename(builtins); -		dump_arrayname(builtins); -		dump_funcs(builtins); -		dump_decls(builtins); -		dump_consts(builtins); -		dump_atoms(builtins); -	} -} - -main(); | 
