X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=code.c;h=43a34c9de78aec26749824fc03d436b502538c5c;hp=1edaa47e88c9f2d4ba5ca4fa36270446170ff012;hb=36c5722273f1ea87603621c6ee20b7178a7a641b;hpb=d3568627e9ccea06b6158e2aa1418f2f3d955e98 diff --git a/code.c b/code.c index 1edaa47..43a34c9 100644 --- a/code.c +++ b/code.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Dale Weiler * Wolfgang Bumiller * @@ -53,13 +53,14 @@ void code_pop_statement() } void code_init() { - prog_section_function empty_function = {0,0,0,0,0,0,0,{0}}; + prog_section_function empty_function = {0,0,0,0,0,0,0,{0,0,0,0,0,0,0,0}}; prog_section_statement empty_statement = {0,{0},{0},{0}}; prog_section_def empty_def = {0, 0, 0}; int i = 0; code_entfields = 0; - code_string_cache = util_htnew(1024); + + code_string_cache = util_htnew(OPTS_OPTIMIZATION(OPTIM_OVERLAP_STRINGS) ? 0x100 : 1024); /* * The way progs.dat is suppose to work is odd, there needs to be @@ -75,6 +76,7 @@ void code_init() { vec_push(code_fields, empty_def); } +void *code_util_str_htgeth(hash_table_t *ht, const char *key, size_t bin); uint32_t code_genstring(const char *str) { uint32_t off; @@ -92,8 +94,14 @@ uint32_t code_genstring(const char *str) return code_string_cached_empty; } - hash = util_hthash(code_string_cache, str); - existing = util_htgeth(code_string_cache, str, hash); + if (OPTS_OPTIMIZATION(OPTIM_OVERLAP_STRINGS)) { + hash = ((unsigned char*)str)[strlen(str)-1]; + existing = code_util_str_htgeth(code_string_cache, str, hash); + } else { + hash = util_hthash(code_string_cache, str); + existing = util_htgeth(code_string_cache, str, hash); + } + if (existing) return HASH_ENTRY_TO_QCINT(existing); @@ -101,7 +109,6 @@ uint32_t code_genstring(const char *str) vec_upload(code_chars, str, strlen(str)+1); util_htseth(code_string_cache, str, hash, QCINT_TO_HASH_ENTRY(off)); - existing = util_htgeth(code_string_cache, str, hash); return off; } @@ -130,8 +137,8 @@ bool code_write(const char *filename, const char *lnofile) { code_header.strings.offset = code_header.globals.offset + (sizeof(int32_t) * vec_size(code_globals)); code_header.strings.length = vec_size(code_chars); code_header.version = 6; - if (opts.forcecrc) - code_header.crc16 = opts.forced_crc; + if (OPTS_OPTION_BOOL(OPTION_FORCECRC)) + code_header.crc16 = OPTS_OPTION_U16(OPTION_FORCED_CRC); else code_header.crc16 = code_crc; code_header.entfield = code_entfields; @@ -162,7 +169,6 @@ bool code_write(const char *filename, const char *lnofile) { util_endianswap(code_globals, vec_size(code_globals), sizeof(int32_t)); if (lnofile) { - uint32_t lnotype = *(unsigned int*)"LNOF"; uint32_t version = 1; fp = file_open(lnofile, "wb"); @@ -173,7 +179,7 @@ bool code_write(const char *filename, const char *lnofile) { util_endianswap(code_linenums, vec_size(code_linenums), sizeof(code_linenums[0])); - if (file_write(&lnotype, sizeof(lnotype), 1, fp) != 1 || + if (file_write("LNOF", 4, 1, fp) != 1 || file_write(&version, sizeof(version), 1, fp) != 1 || file_write(&code_header.defs.length, sizeof(code_header.defs.length), 1, fp) != 1 || file_write(&code_header.globals.length, sizeof(code_header.globals.length), 1, fp) != 1 || @@ -265,6 +271,8 @@ bool code_write(const char *filename, const char *lnofile) { vec_free(code_functions); vec_free(code_globals); vec_free(code_chars); + util_htdel(code_string_cache); + file_close(fp); return true; }