diff --git a/4ed_metagen.cpp b/4ed_metagen.cpp index 436d8ad6..c2a7b250 100644 --- a/4ed_metagen.cpp +++ b/4ed_metagen.cpp @@ -379,10 +379,6 @@ typedef struct Item_Node{ Item_Node *next_sibling; } Item_Node; -typedef struct Function_Set{ - Item_Node *funcs; -} Function_Set; - typedef struct Item_Set{ Item_Node *items; } Item_Set; @@ -970,9 +966,9 @@ print_struct_html(FILE *file, Item_Node *member){ } static void -print_function_html(FILE *file, Function_Set function_set, int32_t i, String name, +print_function_html(FILE *file, Item_Node item, String name, char *function_call_head){ - String ret = function_set.funcs[i].ret; + String ret = item.ret; fprintf(file, "%.*s %s%.*s(\n" "
", @@ -980,10 +976,10 @@ print_function_html(FILE *file, Function_Set function_set, int32_t i, String nam function_call_head, name.size, name.str); - Argument_Breakdown *breakdown = &function_set.funcs[i].breakdown; - int32_t arg_count = breakdown->count; + Argument_Breakdown breakdown = item.breakdown; + int32_t arg_count = breakdown.count; for (int32_t j = 0; j < arg_count; ++j){ - String param_string = breakdown->args[j].param_string; + String param_string = breakdown.args[j].param_string; if (j < arg_count - 1){ fprintf(file, "%.*s,
", param_string.size, param_string.str); } @@ -996,16 +992,16 @@ print_function_html(FILE *file, Function_Set function_set, int32_t i, String nam } static void -print_macro_html(FILE *file, Function_Set function_set, int32_t i, String name){ - Argument_Breakdown *breakdown = &function_set.funcs[i].breakdown; - int32_t arg_count = breakdown->count; +print_macro_html(FILE *file, Item_Node item, String name){ + Argument_Breakdown breakdown = item.breakdown; + int32_t arg_count = breakdown.count; if (arg_count == 0){ fprintf(file, "#define %.*s()", name.size, name.str); } else if (arg_count == 1){ - String param_string = breakdown->args[0].param_string; + String param_string = breakdown.args[0].param_string; fprintf(file, "#define %.*s(%.*s)", name.size, name.str, @@ -1018,7 +1014,7 @@ print_macro_html(FILE *file, Function_Set function_set, int32_t i, String name){ name.size, name.str); for (int32_t j = 0; j < arg_count; ++j){ - String param_string = breakdown->args[j].param_string; + String param_string = breakdown.args[j].param_string; if (j < arg_count - 1){ fprintf(file, "%.*s,
", param_string.size, param_string.str); } @@ -1275,13 +1271,15 @@ parse_enum(Partition *part, char *data, return(result); } -static Function_Set -allocate_function_set(int32_t count){ - Function_Set function_set = {0}; - int32_t memory_size = sizeof(Item_Node)*count; - function_set.funcs = (Item_Node*)malloc(memory_size); - memset(function_set.funcs, 0, memory_size); - return(function_set); +static Item_Set +allocate_item_set(Partition *part, int32_t count){ + Item_Set item_set = {0}; + if (count > 0){ + int32_t memory_size = sizeof(Item_Node)*count; + item_set.items = push_array(part, Item_Node, count); + memset(item_set.items, 0, memory_size); + } + return(item_set); } static Argument_Breakdown @@ -1443,7 +1441,7 @@ do_parse_cpp_name(int32_t *i_ptr, Cpp_Token **token_ptr, int32_t count, char *da static int32_t do_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, Cpp_Token *ret_start_token, - char *data, Function_Set function_set, int32_t sig_count, String cpp_name){ + char *data, Item_Set function_set, int32_t sig_count, String cpp_name){ int32_t result = false; int32_t i = *index; @@ -1451,12 +1449,12 @@ do_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, Cpp_Toke Cpp_Token *args_start_token = token+1; - function_set.funcs[sig_count].name = make_string(data + token->start, token->size); + function_set.items[sig_count].name = make_string(data + token->start, token->size); int32_t size = token->start - ret_start_token->start; String ret = make_string(data + ret_start_token->start, size); ret = chop_whitespace(ret); - function_set.funcs[sig_count].ret = ret; + function_set.items[sig_count].ret = ret; for (; i < count; ++i, ++token){ if (token->type == CPP_TOKEN_PARENTHESE_CLOSE){ @@ -1466,15 +1464,15 @@ do_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, Cpp_Toke if (i < count){ int32_t size = token->start + token->size - args_start_token->start;; - function_set.funcs[sig_count].args = + function_set.items[sig_count].args = make_string(data + args_start_token->start, size); - function_set.funcs[sig_count].t = Item_Function; + function_set.items[sig_count].t = Item_Function; result = true; - Argument_Breakdown *breakdown = &function_set.funcs[sig_count].breakdown; + Argument_Breakdown *breakdown = &function_set.items[sig_count].breakdown; *breakdown = do_parameter_parse(data, args_start_token, token); - function_set.funcs[sig_count].cpp_name = cpp_name; + function_set.items[sig_count].cpp_name = cpp_name; } *index = i; @@ -1485,14 +1483,14 @@ do_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, Cpp_Toke static int32_t do_full_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, char *data, - Function_Set function_set, int32_t sig_count, String cpp_name){ + Item_Set function_set, int32_t sig_count, String cpp_name){ int32_t result = false; int32_t i = *index; Cpp_Token *token = *token_ptr; { - function_set.funcs[sig_count].marker = make_string(data + token->start, token->size); + function_set.items[sig_count].marker = make_string(data + token->start, token->size); int32_t j = i; Cpp_Token *jtoken = token; @@ -1501,7 +1499,7 @@ do_full_function_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, cha if (token->type == CPP_TOKEN_IDENTIFIER){ String doc_string = {0}; if (do_function_get_doc(&j, &jtoken, count, data, &doc_string)){ - function_set.funcs[sig_count].doc_string = doc_string; + function_set.items[sig_count].doc_string = doc_string; } } } @@ -1553,7 +1551,7 @@ do_macro_parse_check(int32_t *index, Cpp_Token **token_ptr, int32_t count){ static int32_t do_macro_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, - char *data, Function_Set macro_set, int32_t sig_count){ + char *data, Item_Set macro_set, int32_t sig_count){ int32_t result = false; int32_t i = *index; @@ -1565,7 +1563,7 @@ do_macro_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, String doc_string = make_string(data + doc_token->start, doc_token->size); if (check_and_fix_docs(&doc_string)){ - macro_set.funcs[sig_count].doc_string = doc_string; + macro_set.items[sig_count].doc_string = doc_string; for (; i < count; ++i, ++token){ if (token->type == CPP_TOKEN_IDENTIFIER){ @@ -1574,7 +1572,7 @@ do_macro_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, } if (i < count && (token->flags & CPP_TFLAG_PP_BODY)){ - macro_set.funcs[sig_count].name = make_string(data + token->start, token->size); + macro_set.items[sig_count].name = make_string(data + token->start, token->size); ++i, ++token; if (i < count){ @@ -1588,9 +1586,9 @@ do_macro_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, if (i < count){ int32_t start = args_start_token->start; int32_t end = token->start + token->size; - macro_set.funcs[sig_count].args = make_string(data + start, end - start); + macro_set.items[sig_count].args = make_string(data + start, end - start); - Argument_Breakdown *breakdown = ¯o_set.funcs[sig_count].breakdown; + Argument_Breakdown *breakdown = ¯o_set.items[sig_count].breakdown; *breakdown = do_parameter_parse(data, args_start_token, token); ++i, ++token; @@ -1610,11 +1608,11 @@ do_macro_parse(int32_t *index, Cpp_Token **token_ptr, int32_t count, start = body_start->start; end = body_end->start + body_end->size; - macro_set.funcs[sig_count].body = make_string(data + start, end - start); + macro_set.items[sig_count].body = make_string(data + start, end - start); } } - macro_set.funcs[sig_count].t = Item_Macro; + macro_set.items[sig_count].t = Item_Macro; result = true; } } @@ -1843,7 +1841,7 @@ generate_custom_headers(){ } } - Function_Set string_function_set = allocate_function_set(string_function_count); + Item_Set string_function_set = allocate_item_set(part, string_function_count); int32_t string_sig_count = 0; { @@ -1929,7 +1927,7 @@ generate_custom_headers(){ } } - Function_Set function_set = allocate_function_set(line_count); + Item_Set function_set = allocate_item_set(part, line_count); App_API func_4ed_names = allocate_app_api(line_count); int32_t sig_count = 0; int32_t sig_count_per_file[2]; @@ -1951,8 +1949,8 @@ generate_custom_headers(){ if (match_ss(lexeme, make_lit_string("API_EXPORT"))){ do_full_function_parse(&i, &token, count, data, function_set, sig_count, string_zero()); - if (function_set.funcs[sig_count].t == Item_Null){ - function_set.funcs[sig_count] = null_item_node; + if (function_set.items[sig_count].t == Item_Null){ + function_set.items[sig_count] = null_item_node; // TODO(allen): get warning file name and line numbers fprintf(stderr, "generator warning : invalid function signature\n"); } @@ -1965,7 +1963,7 @@ generate_custom_headers(){ } for (int32_t i = 0; i < sig_count; ++i){ - String name_string = function_set.funcs[i].name; + String name_string = function_set.items[i].name; String *macro = &func_4ed_names.names[i].macro; String *public_name = &func_4ed_names.names[i].public_name; @@ -1991,8 +1989,8 @@ generate_custom_headers(){ int32_t main_api_count = sig_count_per_file[0]; for (int32_t i = main_api_count; i < sig_count; ++i){ - String ret_string = function_set.funcs[i].ret; - String args_string = function_set.funcs[i].args; + String ret_string = function_set.items[i].ret; + String args_string = function_set.items[i].args; String macro_string = func_4ed_names.names[i].macro; fprintf(file, "#define %.*s(n) %.*s n%.*s\n", @@ -2002,7 +2000,7 @@ generate_custom_headers(){ } for (int32_t i = main_api_count; i < sig_count; ++i){ - String name_string = function_set.funcs[i].name; + String name_string = function_set.items[i].name; String macro_string = func_4ed_names.names[i].macro; fprintf(file, "typedef %.*s(%.*s_Function);\n", @@ -2015,8 +2013,8 @@ generate_custom_headers(){ file = fopen(API_H, "wb"); for (int32_t i = 0; i < sig_count; ++i){ - String ret_string = function_set.funcs[i].ret; - String args_string = function_set.funcs[i].args; + String ret_string = function_set.items[i].ret; + String args_string = function_set.items[i].args; String macro_string = func_4ed_names.names[i].macro; fprintf(file, "#define %.*s(n) %.*s n%.*s\n", @@ -2026,7 +2024,7 @@ generate_custom_headers(){ } for (int32_t i = 0; i < sig_count; ++i){ - String name_string = function_set.funcs[i].name; + String name_string = function_set.items[i].name; String macro_string = func_4ed_names.names[i].macro; fprintf(file, "typedef %.*s(%.*s_Function);\n", @@ -2040,7 +2038,7 @@ generate_custom_headers(){ " int32_t memory_size;\n" ); for (int32_t i = 0; i < sig_count; ++i){ - String name_string = function_set.funcs[i].name; + String name_string = function_set.items[i].name; String public_string = func_4ed_names.names[i].public_name; fprintf(file, " %.*s_Function *%.*s;\n", @@ -2057,7 +2055,7 @@ generate_custom_headers(){ fprintf(file, "#define FillAppLinksAPI(app_links) do{"); for (int32_t i = 0; i < sig_count; ++i){ - String name = function_set.funcs[i].name; + String name = function_set.items[i].name; String public_string = func_4ed_names.names[i].public_name; fprintf(file, @@ -2131,19 +2129,19 @@ generate_custom_headers(){ } if (typedef_count > 0){ - typedef_set.items = push_array(part, Item_Node, typedef_count); + typedef_set = allocate_item_set(part, typedef_count); } if (struct_count > 0){ - struct_set.items = push_array(part, Item_Node, struct_count); + struct_set = allocate_item_set(part, struct_count); } if (enum_count > 0){ - enum_set.items = push_array(part, Item_Node, enum_count); + enum_set = allocate_item_set(part, enum_count); } if (flag_count > 0){ - flag_set.items = push_array(part, Item_Node, flag_count); + flag_set = allocate_item_set(part, flag_count); } int32_t typedef_index = 0; @@ -2274,11 +2272,11 @@ generate_custom_headers(){ char line_space[2048]; String line = make_fixed_width_string(line_space); - if (string_function_set.funcs[j].t != Item_Macro){ - String marker = string_function_set.funcs[j].marker; - String ret = string_function_set.funcs[j].ret; - String name = string_function_set.funcs[j].name; - String args = string_function_set.funcs[j].args; + if (string_function_set.items[j].t != Item_Macro){ + String marker = string_function_set.items[j].marker; + String ret = string_function_set.items[j].ret; + String name = string_function_set.items[j].name; + String args = string_function_set.items[j].args; append_ss(&line, marker); append_padding(&line, ' ', RETURN_PADDING); @@ -2291,9 +2289,9 @@ generate_custom_headers(){ fprintf(file, "%s;\n", line.str); } else{ - String name = string_function_set.funcs[j].name; - String args = string_function_set.funcs[j].args; - String body = string_function_set.funcs[j].body; + String name = string_function_set.items[j].name; + String args = string_function_set.items[j].args; + String body = string_function_set.items[j].body; append_ss(&line, make_lit_string("#ifndef ")); append_padding(&line, ' ', 10); @@ -2328,11 +2326,11 @@ generate_custom_headers(){ char line_space[2048]; String line = make_fixed_width_string(line_space); - if (string_function_set.funcs[j].t != Item_Macro){ - String cpp_name = string_function_set.funcs[j].cpp_name; + if (string_function_set.items[j].t != Item_Macro){ + String cpp_name = string_function_set.items[j].cpp_name; if (cpp_name.str != 0){ - String ret = string_function_set.funcs[j].ret; - String args = string_function_set.funcs[j].args; + String ret = string_function_set.items[j].ret; + String args = string_function_set.items[j].args; append_ss(&line, make_lit_string("FSTRING_INLINE")); append_padding(&line, ' ', RETURN_PADDING); @@ -2359,13 +2357,13 @@ generate_custom_headers(){ char line_space[2048]; String line = make_fixed_width_string(line_space); - if (string_function_set.funcs[j].t != Item_Macro){ - String cpp_name = string_function_set.funcs[j].cpp_name; + if (string_function_set.items[j].t != Item_Macro){ + String cpp_name = string_function_set.items[j].cpp_name; if (cpp_name.str != 0){ - String name = string_function_set.funcs[j].name; - String ret = string_function_set.funcs[j].ret; - String args = string_function_set.funcs[j].args; - Argument_Breakdown breakdown = string_function_set.funcs[j].breakdown; + String name = string_function_set.items[j].name; + String ret = string_function_set.items[j].ret; + String args = string_function_set.items[j].args; + Argument_Breakdown breakdown = string_function_set.items[j].breakdown; append_ss(&line, make_lit_string("FSTRING_INLINE")); append_s_char(&line, ' '); @@ -2715,10 +2713,10 @@ generate_custom_headers(){ name.size, name.str, i+1, name.size, name.str ); - print_function_html(file, function_set, i, name, "app->"); + print_function_html(file, function_set.items[i], name, "app->"); fprintf(file, "
\n"); - String doc_string = function_set.funcs[i].doc_string; + String doc_string = function_set.items[i].doc_string; print_function_docs(file, part, name, doc_string); fprintf(file, "
\n"); @@ -2982,7 +2980,7 @@ generate_custom_headers(){ } for (int32_t i = 0; i < string_sig_count; ++i){ - String name = string_function_set.funcs[i].name; + String name = string_function_set.items[i].name; int32_t index = 0; if (!string_set_match(used_strings, used_string_count, name, &index)){ fprintf(file, @@ -3007,7 +3005,7 @@ generate_custom_headers(){ "