From: Wolfgang Bumiller Date: Fri, 4 May 2012 22:28:30 +0000 (+0200) Subject: code_cachedstring X-Git-Tag: 0.1-rc1~485^2~18 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1fd7e30de6e058c108f0befb21fcce3c1b5cc4c2;p=xonotic%2Fgmqcc.git code_cachedstring --- diff --git a/code.c b/code.c index b3cc0b8..438f1dc 100644 --- a/code.c +++ b/code.c @@ -113,6 +113,22 @@ uint32_t code_genstring(const char *str) 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 }; diff --git a/gmqcc.h b/gmqcc.h index 7178c8f..7290cb6 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -533,9 +533,10 @@ VECTOR_PROT(char, code_chars ); * code_write -- writes out the compiled file * code_init -- prepares the code file */ -bool code_write (const char *filename); -void code_init (); -uint32_t code_genstring (const char *string); +bool code_write (const char *filename); +void code_init (); +uint32_t code_genstring (const char *string); +uint32_t code_cachedstring(const char *string); /*===================================================================*/ /*========================= assembler.c =============================*/