diff options
Diffstat (limited to 'src/lisp/ao_lisp_make_builtin')
| -rw-r--r-- | src/lisp/ao_lisp_make_builtin | 22 | 
1 files changed, 17 insertions, 5 deletions
| diff --git a/src/lisp/ao_lisp_make_builtin b/src/lisp/ao_lisp_make_builtin index 5e98516c..b7b17cf4 100644 --- a/src/lisp/ao_lisp_make_builtin +++ b/src/lisp/ao_lisp_make_builtin @@ -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"); | 
