no more redundant strings. costs ~7ms, though, but HALVING the strofs size

in frikbot seems worth it.
This commit is contained in:
Bill Currie 2001-04-01 06:40:51 +00:00
parent 59e55834ed
commit 02b09f4e5c
5 changed files with 35 additions and 8 deletions

View file

@ -454,5 +454,6 @@ extern int precache_files_block[MAX_SOUNDS];
extern int numfiles; extern int numfiles;
int CopyString (char *str); int CopyString (char *str);
int ReuseString (char *str);

View file

@ -714,7 +714,7 @@ PR_ParseDefs (void)
else else
df->first_statement = f->code; df->first_statement = f->code;
df->s_name = CopyString (f->def->name); df->s_name = ReuseString (f->def->name);
df->s_file = s_file; df->s_file = s_file;
df->numparms = f->def->type->num_parms; df->numparms = f->def->type->num_parms;
df->locals = locals_end - locals_start; df->locals = locals_end - locals_start;
@ -752,7 +752,7 @@ PR_CompileFile (char *string, char *filename)
PR_ClearGrabMacros (); // clear the frame macros PR_ClearGrabMacros (); // clear the frame macros
pr_file_p = string; pr_file_p = string;
s_file = CopyString (filename); s_file = ReuseString (filename);
pr_source_line = 0; pr_source_line = 0;

View file

@ -55,7 +55,7 @@ PR_GetDef (type_t *type, char *name, def_t *scope, qboolean allocate)
char element[MAX_NAME]; char element[MAX_NAME];
if (!defs_by_name) { if (!defs_by_name) {
defs_by_name = Hash_NewTable (1021, defs_get_key, 0, &defs_by_name); defs_by_name = Hash_NewTable (16381, defs_get_key, 0, &defs_by_name);
} }
// see if the name is already in use // see if the name is already in use

View file

@ -67,9 +67,9 @@ PR_ParseImmediate (void)
hashtab_t *tab = 0; hashtab_t *tab = 0;
if (!string_imm_defs) { if (!string_imm_defs) {
string_imm_defs = Hash_NewTable (1021, string_imm_get_key, 0, 0); string_imm_defs = Hash_NewTable (16381, string_imm_get_key, 0, 0);
float_imm_defs = Hash_NewTable (1021, float_imm_get_key, 0, 0); float_imm_defs = Hash_NewTable (16381, float_imm_get_key, 0, 0);
vector_imm_defs = Hash_NewTable (1021, vector_imm_get_key, 0, 0); vector_imm_defs = Hash_NewTable (16381, vector_imm_get_key, 0, 0);
} }
if (pr_immediate_type == &type_string) { if (pr_immediate_type == &type_string) {
cn = (def_t*) Hash_Find (string_imm_defs, pr_immediate_string); cn = (def_t*) Hash_Find (string_imm_defs, pr_immediate_string);

View file

@ -31,6 +31,7 @@
# include "config.h" # include "config.h"
#endif #endif
#include <QF/crc.h> #include <QF/crc.h>
#include <QF/hash.h>
#include <QF/qendian.h> #include <QF/qendian.h>
#include <QF/sys.h> #include <QF/sys.h>
@ -109,17 +110,42 @@ WriteFiles (void)
Return an offset from the string heap Return an offset from the string heap
*/ */
static hashtab_t *strings_tab;
static char *
stings_get_key (void *_str, void *unsued)
{
return (char*)_str;
}
int int
CopyString (char *str) CopyString (char *str)
{ {
int old; int old;
if (!strings_tab) {
strings_tab = Hash_NewTable (16381, stings_get_key, 0, 0);
}
old = strofs; old = strofs;
strcpy (strings + strofs, str); strcpy (strings + strofs, str);
strofs += strlen (str) + 1; strofs += strlen (str) + 1;
Hash_Add (strings_tab, strings + old);
return old; return old;
} }
int
ReuseString (char *str)
{
char *s;
if (!strings_tab)
return CopyString (str);
s = Hash_Find (strings_tab, str);
if (s)
return s - strings;
return CopyString (str);
}
void void
PrintStrings (void) PrintStrings (void)
{ {
@ -215,7 +241,7 @@ WriteData (int crc)
dd = &fields[numfielddefs]; dd = &fields[numfielddefs];
numfielddefs++; numfielddefs++;
dd->type = def->type->aux_type->type; dd->type = def->type->aux_type->type;
dd->s_name = CopyString (def->name); dd->s_name = ReuseString (def->name);
dd->ofs = G_INT (def->ofs); dd->ofs = G_INT (def->ofs);
} }
@ -227,7 +253,7 @@ WriteData (int crc)
&& def->type->type != ev_func && def->type->type != ev_func
&& def->type->type != ev_field && def->scope == NULL) && def->type->type != ev_field && def->scope == NULL)
dd->type |= DEF_SAVEGLOBAL; dd->type |= DEF_SAVEGLOBAL;
dd->s_name = CopyString (def->name); dd->s_name = ReuseString (def->name);
dd->ofs = def->ofs; dd->ofs = def->ofs;
} }