X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=code.c;h=caeab883b8ada2edb099e2113b9f4cc2ff02357a;hb=aa08a2da683ae6138e9207328cd41fbf680a7c1e;hp=b3cc0b825bb03ec6369eb528102c817d3a4f37e2;hpb=edcb97605394f5965261d00d6ba0b9d08c76d3aa;p=xonotic%2Fgmqcc.git diff --git a/code.c b/code.c index b3cc0b8..caeab88 100644 --- a/code.c +++ b/code.c @@ -110,9 +110,26 @@ uint32_t code_genstring(const char *str) code_chars_add(*str); ++str; } + code_chars_add(0); return off; } +uint32_t code_cachedstring(const char *str) +{ + size_t s = 0; + /* We could implement knuth-morris-pratt or something + * and also take substrings, but I'm uncomfortable with + * pointing to subparts of strings for the sake of clarity... + */ + while (s < code_chars_elements) { + if (!strcmp(str, code_chars_data + s)) + return s; + while (code_chars_data[s]) ++s; + ++s; + } + return code_genstring(str); +} + void code_test() { prog_section_def d1 = { TYPE_VOID, 28, 1 }; prog_section_def d2 = { TYPE_FUNCTION, 29, 8 }; @@ -199,12 +216,12 @@ bool code_write(const char *filename) { return false; if (1 != fwrite(&code_header, sizeof(prog_header), 1, fp) || - 1 != fwrite(code_statements_data, sizeof(prog_section_statement)*code_statements_elements, 1, fp) || - 1 != fwrite(code_defs_data, sizeof(prog_section_def) *code_defs_elements, 1, fp) || - 1 != fwrite(code_fields_data, sizeof(prog_section_field) *code_fields_elements, 1, fp) || - 1 != fwrite(code_functions_data, sizeof(prog_section_function) *code_functions_elements, 1, fp) || - 1 != fwrite(code_globals_data, sizeof(int32_t) *code_globals_elements, 1, fp) || - 1 != fwrite(code_chars_data, 1 *code_chars_elements, 1, fp)) + code_statements_elements != fwrite(code_statements_data, sizeof(prog_section_statement), code_statements_elements, fp) || + code_defs_elements != fwrite(code_defs_data, sizeof(prog_section_def) , code_defs_elements , fp) || + code_fields_elements != fwrite(code_fields_data, sizeof(prog_section_field) , code_fields_elements , fp) || + code_functions_elements != fwrite(code_functions_data, sizeof(prog_section_function) , code_functions_elements , fp) || + code_globals_elements != fwrite(code_globals_data, sizeof(int32_t) , code_globals_elements , fp) || + code_chars_elements != fwrite(code_chars_data, 1 , code_chars_elements , fp)) { fclose(fp); return false;