avoid using the hunk in the progs engine (except for the override-able load and alloc functions) so tools (qfprogs and qwaq) don't need to create it.
register only the first instance of a progs provided string This is an imperfect revision of history.
This commit is contained in:
parent
ca46503607
commit
33bc7858f7
|
@ -346,7 +346,7 @@ struct progs_s {
|
||||||
struct dstring_mem_s *ds_mem;
|
struct dstring_mem_s *ds_mem;
|
||||||
strref_t *free_string_refs;
|
strref_t *free_string_refs;
|
||||||
strref_t *static_strings;
|
strref_t *static_strings;
|
||||||
strref_t **dynamic_strings;
|
strref_t **string_map;
|
||||||
strref_t *return_strings[PR_RS_SLOTS];
|
strref_t *return_strings[PR_RS_SLOTS];
|
||||||
int rs_slot;
|
int rs_slot;
|
||||||
unsigned dyn_str_size;
|
unsigned dyn_str_size;
|
||||||
|
|
|
@ -146,11 +146,8 @@ PR_Load_Source_File (progs_t *pr, const char *fname)
|
||||||
if (!f)
|
if (!f)
|
||||||
return 0;
|
return 0;
|
||||||
for (dir = source_paths; *dir && !f->text; dir++) {
|
for (dir = source_paths; *dir && !f->text; dir++) {
|
||||||
int len;
|
f->text = pr->load_file (pr, va ("%s%s%s", *dir, **dir ? "/" : "",
|
||||||
len = strlen (*dir) + strlen (fname) + 2;
|
fname));
|
||||||
path = Hunk_TempAlloc (len);
|
|
||||||
sprintf (path, "%s%s%s", *dir, **dir ? "/" : "", fname);
|
|
||||||
f->text = pr->load_file (pr, path);
|
|
||||||
}
|
}
|
||||||
if (!f->text) {
|
if (!f->text) {
|
||||||
pr->file_error (pr, path);
|
pr->file_error (pr, path);
|
||||||
|
@ -192,7 +189,6 @@ PR_LoadDebug (progs_t *pr)
|
||||||
char *sym_path;
|
char *sym_path;
|
||||||
const char *path_end, *sym_file;
|
const char *path_end, *sym_file;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
int start = Hunk_LowMark ();
|
|
||||||
ddef_t *def;
|
ddef_t *def;
|
||||||
pr_type_t *str = 0;
|
pr_type_t *str = 0;
|
||||||
|
|
||||||
|
@ -219,13 +215,13 @@ PR_LoadDebug (progs_t *pr)
|
||||||
pr->debugfile = PR_GetString (pr, str->string_var);
|
pr->debugfile = PR_GetString (pr, str->string_var);
|
||||||
sym_file = QFS_SkipPath (pr->debugfile);
|
sym_file = QFS_SkipPath (pr->debugfile);
|
||||||
path_end = QFS_SkipPath (pr->progs_name);
|
path_end = QFS_SkipPath (pr->progs_name);
|
||||||
sym_path = Hunk_TempAlloc (strlen (sym_file) + (path_end - pr->progs_name)
|
sym_path = malloc (strlen (sym_file) + (path_end - pr->progs_name) + 1);
|
||||||
+ 1);
|
|
||||||
strncpy (sym_path, pr->progs_name, path_end - pr->progs_name);
|
strncpy (sym_path, pr->progs_name, path_end - pr->progs_name);
|
||||||
strcpy (sym_path + (path_end - pr->progs_name), sym_file);
|
strcpy (sym_path + (path_end - pr->progs_name), sym_file);
|
||||||
pr->debug = pr->load_file (pr, sym_path);
|
pr->debug = pr->load_file (pr, sym_path);
|
||||||
if (!pr->debug) {
|
if (!pr->debug) {
|
||||||
Sys_Printf ("can't load %s for debug info\n", sym_path);
|
Sys_Printf ("can't load %s for debug info\n", sym_path);
|
||||||
|
free (sym_path);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
pr->debug->version = LittleLong (pr->debug->version);
|
pr->debug->version = LittleLong (pr->debug->version);
|
||||||
|
@ -235,8 +231,8 @@ PR_LoadDebug (progs_t *pr)
|
||||||
(pr->debug->version >> 24) & 0xff,
|
(pr->debug->version >> 24) & 0xff,
|
||||||
(pr->debug->version >> 12) & 0xfff,
|
(pr->debug->version >> 12) & 0xfff,
|
||||||
pr->debug->version & 0xfff);
|
pr->debug->version & 0xfff);
|
||||||
Hunk_FreeToLowMark (start);
|
|
||||||
pr->debug = 0;
|
pr->debug = 0;
|
||||||
|
free (sym_path);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
pr->debug->crc = LittleShort (pr->debug->crc);
|
pr->debug->crc = LittleShort (pr->debug->crc);
|
||||||
|
@ -247,10 +243,11 @@ PR_LoadDebug (progs_t *pr)
|
||||||
pr->progs_name,
|
pr->progs_name,
|
||||||
pr->debug->crc,
|
pr->debug->crc,
|
||||||
pr->crc);
|
pr->crc);
|
||||||
Hunk_FreeToLowMark (start);
|
|
||||||
pr->debug = 0;
|
pr->debug = 0;
|
||||||
|
free (sym_path);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
free (sym_path);
|
||||||
pr->debug->you_tell_me_and_we_will_both_know = LittleShort
|
pr->debug->you_tell_me_and_we_will_both_know = LittleShort
|
||||||
(pr->debug->you_tell_me_and_we_will_both_know);
|
(pr->debug->you_tell_me_and_we_will_both_know);
|
||||||
pr->debug->auxfunctions = LittleLong (pr->debug->auxfunctions);
|
pr->debug->auxfunctions = LittleLong (pr->debug->auxfunctions);
|
||||||
|
@ -355,7 +352,6 @@ PR_Get_Source_File (progs_t *pr, pr_lineno_t *lineno)
|
||||||
const char *
|
const char *
|
||||||
PR_Get_Source_Line (progs_t *pr, unsigned int addr)
|
PR_Get_Source_Line (progs_t *pr, unsigned int addr)
|
||||||
{
|
{
|
||||||
char *str;
|
|
||||||
const char *fname;
|
const char *fname;
|
||||||
unsigned int line;
|
unsigned int line;
|
||||||
file_t *file;
|
file_t *file;
|
||||||
|
@ -374,16 +370,11 @@ PR_Get_Source_Line (progs_t *pr, unsigned int addr)
|
||||||
|
|
||||||
file = PR_Load_Source_File (pr, fname);
|
file = PR_Load_Source_File (pr, fname);
|
||||||
|
|
||||||
str = Hunk_TempAlloc (strlen (fname) + 12);
|
|
||||||
sprintf (str, "%s:%d", fname, line);
|
|
||||||
|
|
||||||
if (!file || line > file->num_lines)
|
if (!file || line > file->num_lines)
|
||||||
return str;
|
return va ("%s:%d", fname, line);
|
||||||
|
|
||||||
str = Hunk_TempAlloc (strlen (str) + file->lines[line - 1].len + 2);
|
return va ("%s:%d:%.*s", fname, line, (int)file->lines[line - 1].len,
|
||||||
sprintf (str, "%s:%d:%.*s", fname, line,
|
file->lines[line - 1].text);
|
||||||
(int)file->lines[line - 1].len, file->lines[line - 1].text);
|
|
||||||
return str;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ddef_t *
|
ddef_t *
|
||||||
|
|
|
@ -306,16 +306,11 @@ PR_ExecuteProgram (progs_t * pr, func_t fnum)
|
||||||
QuatAdd (OPA.quat_var, OPB.quat_var, OPC.quat_var);
|
QuatAdd (OPA.quat_var, OPB.quat_var, OPC.quat_var);
|
||||||
break;
|
break;
|
||||||
case OP_ADD_S:
|
case OP_ADD_S:
|
||||||
{
|
OPC.string_var = PR_CatStrings (pr,
|
||||||
const char *a = PR_GetString (pr, OPA.string_var);
|
PR_GetString (pr,
|
||||||
const char *b = PR_GetString (pr, OPB.string_var);
|
OPA.string_var),
|
||||||
int lena = strlen (a);
|
PR_GetString (pr,
|
||||||
int size = lena + strlen (b) + 1;
|
OPB.string_var));
|
||||||
char *c = Hunk_TempAlloc (size);
|
|
||||||
strcpy (c, a);
|
|
||||||
strcpy (c + lena, b);
|
|
||||||
OPC.string_var = PR_SetTempString (pr, c);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case OP_SUB_F:
|
case OP_SUB_F:
|
||||||
OPC.float_var = OPA.float_var - OPB.float_var;
|
OPC.float_var = OPA.float_var - OPB.float_var;
|
||||||
|
|
|
@ -194,7 +194,7 @@ ED_NewString (progs_t *pr, const char *string)
|
||||||
int i, l;
|
int i, l;
|
||||||
|
|
||||||
l = strlen (string) + 1;
|
l = strlen (string) + 1;
|
||||||
new = Hunk_TempAlloc (l);
|
new = alloca (l);
|
||||||
new_p = new;
|
new_p = new;
|
||||||
|
|
||||||
for (i = 0; i < l; i++) {
|
for (i = 0; i < l; i++) {
|
||||||
|
|
|
@ -107,12 +107,12 @@ new_string_ref (progs_t *pr)
|
||||||
|
|
||||||
pr->dyn_str_size++;
|
pr->dyn_str_size++;
|
||||||
size = pr->dyn_str_size * sizeof (strref_t *);
|
size = pr->dyn_str_size * sizeof (strref_t *);
|
||||||
pr->dynamic_strings = realloc (pr->dynamic_strings, size);
|
pr->string_map = realloc (pr->string_map, size);
|
||||||
if (!pr->dynamic_strings)
|
if (!pr->string_map)
|
||||||
PR_Error (pr, "out of memory");
|
PR_Error (pr, "out of memory");
|
||||||
if (!(pr->free_string_refs = calloc (1024, sizeof (strref_t))))
|
if (!(pr->free_string_refs = calloc (1024, sizeof (strref_t))))
|
||||||
PR_Error (pr, "out of memory");
|
PR_Error (pr, "out of memory");
|
||||||
pr->dynamic_strings[pr->dyn_str_size - 1] = pr->free_string_refs;
|
pr->string_map[pr->dyn_str_size - 1] = pr->free_string_refs;
|
||||||
for (i = 0, sr = pr->free_string_refs; i < 1023; i++, sr++)
|
for (i = 0, sr = pr->free_string_refs; i < 1023; i++, sr++)
|
||||||
sr->next = sr + 1;
|
sr->next = sr + 1;
|
||||||
sr->next = 0;
|
sr->next = 0;
|
||||||
|
@ -196,7 +196,7 @@ PR_LoadStrings (progs_t *pr)
|
||||||
} else {
|
} else {
|
||||||
pr->strref_hash = Hash_NewTable (1021, strref_get_key, strref_free,
|
pr->strref_hash = Hash_NewTable (1021, strref_get_key, strref_free,
|
||||||
pr);
|
pr);
|
||||||
pr->dynamic_strings = 0;
|
pr->string_map = 0;
|
||||||
pr->free_string_refs = 0;
|
pr->free_string_refs = 0;
|
||||||
pr->dyn_str_size = 0;
|
pr->dyn_str_size = 0;
|
||||||
}
|
}
|
||||||
|
@ -207,11 +207,16 @@ PR_LoadStrings (progs_t *pr)
|
||||||
count = 0;
|
count = 0;
|
||||||
str = pr->pr_strings;
|
str = pr->pr_strings;
|
||||||
while (str < end) {
|
while (str < end) {
|
||||||
pr->static_strings[count].string = str;
|
if (!Hash_Find (pr->strref_hash, str)) {
|
||||||
str += strlen (str) + 1;
|
pr->static_strings[count].type = str_static;
|
||||||
|
pr->static_strings[count].s.string = str;
|
||||||
Hash_Add (pr->strref_hash, &pr->static_strings[count]);
|
Hash_Add (pr->strref_hash, &pr->static_strings[count]);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
str += strlen (str) + 1;
|
||||||
|
}
|
||||||
|
pr->static_strings = realloc (pr->static_strings,
|
||||||
|
count * sizeof (strref_t));
|
||||||
pr->num_strings = count;
|
pr->num_strings = count;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +231,7 @@ get_strref (progs_t *pr, int num)
|
||||||
|
|
||||||
if (row >= pr->dyn_str_size)
|
if (row >= pr->dyn_str_size)
|
||||||
return 0;
|
return 0;
|
||||||
return &pr->dynamic_strings[row][num];
|
return &pr->string_map[row][num];
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -278,6 +283,18 @@ PR_GetDString (progs_t *pr, int num)
|
||||||
PR_RunError (pr, "Invalid string offset: %d", num);
|
PR_RunError (pr, "Invalid string offset: %d", num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
pr_stralloc (progs_t *pr, int len)
|
||||||
|
{
|
||||||
|
return PR_Zone_Malloc (pr, len + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
pr_strfree (progs_t *pr, char *s)
|
||||||
|
{
|
||||||
|
PR_Zone_Free (pr, s);
|
||||||
|
}
|
||||||
|
|
||||||
static inline char *
|
static inline char *
|
||||||
pr_strdup (progs_t *pr, const char *s)
|
pr_strdup (progs_t *pr, const char *s)
|
||||||
{
|
{
|
||||||
|
@ -290,7 +307,11 @@ pr_strdup (progs_t *pr, const char *s)
|
||||||
int
|
int
|
||||||
PR_SetString (progs_t *pr, const char *s)
|
PR_SetString (progs_t *pr, const char *s)
|
||||||
{
|
{
|
||||||
strref_t *sr = Hash_Find (pr->strref_hash, s);
|
strref_t *sr;
|
||||||
|
|
||||||
|
if (!s)
|
||||||
|
s = "";
|
||||||
|
sr = Hash_Find (pr->strref_hash, s);
|
||||||
|
|
||||||
if (!sr) {
|
if (!sr) {
|
||||||
sr = new_string_ref (pr);
|
sr = new_string_ref (pr);
|
||||||
|
@ -338,6 +359,35 @@ PR_SetReturnString (progs_t *pr, const char *s)
|
||||||
return string_index (pr, sr);
|
return string_index (pr, sr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
pr_settempstring (progs_t *pr, char *s)
|
||||||
|
{
|
||||||
|
strref_t *sr;
|
||||||
|
|
||||||
|
sr = new_string_ref (pr);
|
||||||
|
sr->type = str_temp;
|
||||||
|
sr->s.string = s;
|
||||||
|
sr->next = pr->pr_xtstr;
|
||||||
|
pr->pr_xtstr = sr;
|
||||||
|
return string_index (pr, sr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
PR_CatStrings (progs_t *pr, const char *a, const char *b)
|
||||||
|
{
|
||||||
|
int lena;
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
lena = strlen (a);
|
||||||
|
|
||||||
|
c = pr_stralloc (pr, lena + strlen (b));
|
||||||
|
|
||||||
|
strcpy (c, a);
|
||||||
|
strcpy (c + lena, b);
|
||||||
|
|
||||||
|
return pr_settempstring (pr, c);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
PR_SetTempString (progs_t *pr, const char *s)
|
PR_SetTempString (progs_t *pr, const char *s)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue