@ -23,7 +23,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
dprograms_t * progs ;
dfunction_t * pr_functions ;
char * pr_strings ;
static char * pr_strings ;
static int pr_stringssize ;
static char * * pr_knownstrings ;
static int pr_maxknownstrings ;
static int pr_numknownstrings ;
ddef_t * pr_fielddefs ;
ddef_t * pr_globaldefs ;
dstatement_t * pr_statements ;
@ -191,7 +197,7 @@ ddef_t *ED_FindField (char *name)
for ( i = 0 ; i < progs - > numfielddefs ; i + + )
{
def = & pr_fielddefs [ i ] ;
if ( ! strcmp ( pr_strings + def - > s_name , name ) )
if ( ! strcmp ( PR_GetString ( def - > s_name ) , name ) )
return def ;
}
return NULL ;
@ -211,7 +217,7 @@ ddef_t *ED_FindGlobal (char *name)
for ( i = 0 ; i < progs - > numglobaldefs ; i + + )
{
def = & pr_globaldefs [ i ] ;
if ( ! strcmp ( pr_strings + def - > s_name , name ) )
if ( ! strcmp ( PR_GetString ( def - > s_name ) , name ) )
return def ;
}
return NULL ;
@ -231,7 +237,7 @@ dfunction_t *ED_FindFunction (char *name)
for ( i = 0 ; i < progs - > numfunctions ; i + + )
{
func = & pr_functions [ i ] ;
if ( ! strcmp ( pr_strings + func - > s_name , name ) )
if ( ! strcmp ( PR_GetString ( func - > s_name ) , name ) )
return func ;
}
return NULL ;
@ -288,18 +294,18 @@ char *PR_ValueString (etype_t type, eval_t *val)
switch ( type )
{
case ev_string :
sprintf ( line , " %s " , pr_strings + val - > string ) ;
sprintf ( line , " %s " , PR_GetString ( val - > string ) ) ;
break ;
case ev_entity :
sprintf ( line , " entity %i " , NUM_FOR_EDICT ( PROG_TO_EDICT ( val - > edict ) ) ) ;
break ;
case ev_function :
f = pr_functions + val - > function ;
sprintf ( line , " %s() " , pr_strings + f - > s_name ) ;
sprintf ( line , " %s() " , PR_GetString ( f - > s_name ) ) ;
break ;
case ev_field :
def = ED_FieldAtOfs ( val - > _int ) ;
sprintf ( line , " .%s " , pr_strings + def - > s_name ) ;
sprintf ( line , " .%s " , PR_GetString ( def - > s_name ) ) ;
break ;
case ev_void :
sprintf ( line , " void " ) ;
@ -340,18 +346,18 @@ char *PR_UglyValueString (etype_t type, eval_t *val)
switch ( type )
{
case ev_string :
sprintf ( line , " %s " , pr_strings + val - > string ) ;
sprintf ( line , " %s " , PR_GetString ( val - > string ) ) ;
break ;
case ev_entity :
sprintf ( line , " %i " , NUM_FOR_EDICT ( PROG_TO_EDICT ( val - > edict ) ) ) ;
break ;
case ev_function :
f = pr_functions + val - > function ;
sprintf ( line , " %s " , pr_strings + f - > s_name ) ;
sprintf ( line , " %s " , PR_GetString ( f - > s_name ) ) ;
break ;
case ev_field :
def = ED_FieldAtOfs ( val - > _int ) ;
sprintf ( line , " %s " , pr_strings + def - > s_name ) ;
sprintf ( line , " %s " , PR_GetString ( def - > s_name ) ) ;
break ;
case ev_void :
sprintf ( line , " void " ) ;
@ -393,7 +399,7 @@ char *PR_GlobalString (int ofs)
else
{
s = PR_ValueString ( def - > type , val ) ;
sprintf ( line , " %i(%s)%s " , ofs , pr_strings + def - > s_name , s ) ;
sprintf ( line , " %i(%s)%s " , ofs , PR_GetString ( def - > s_name ) , s ) ;
}
i = strlen ( line ) ;
@ -414,7 +420,7 @@ char *PR_GlobalStringNoContents (int ofs)
if ( ! def )
sprintf ( line , " %i(???) " , ofs ) ;
else
sprintf ( line , " %i(%s) " , ofs , pr_strings + def - > s_name ) ;
sprintf ( line , " %i(%s) " , ofs , PR_GetString ( def - > s_name ) ) ;
i = strlen ( line ) ;
for ( ; i < 20 ; i + + )
@ -451,7 +457,7 @@ void ED_Print (edict_t *ed)
for ( i = 1 ; i < progs - > numfielddefs ; i + + )
{
d = & pr_fielddefs [ i ] ;
name = pr_strings + d - > s_name ;
name = PR_GetString ( d - > s_name ) ;
if ( name [ strlen ( name ) - 2 ] = = ' _ ' )
continue ; / / skip _x , _y , _z vars
@ -501,7 +507,7 @@ void ED_Write (FILE *f, edict_t *ed)
for ( i = 1 ; i < progs - > numfielddefs ; i + + )
{
d = & pr_fielddefs [ i ] ;
name = pr_strings + d - > s_name ;
name = PR_GetString ( d - > s_name ) ;
if ( name [ strlen ( name ) - 2 ] = = ' _ ' )
continue ; / / skip _x , _y , _z vars
@ -634,7 +640,7 @@ void ED_WriteGlobals (FILE *f)
& & type ! = ev_entity )
continue ;
name = pr_strings + def - > s_name ;
name = PR_GetString ( def - > s_name ) ;
fprintf ( f , " \" %s \" " , name ) ;
fprintf ( f , " \" %s \" \n " , PR_UglyValueString ( type , ( eval_t * ) & pr_globals [ def - > ofs ] ) ) ;
}
@ -690,14 +696,14 @@ void ED_ParseGlobals (char *data)
ED_NewString
= = = = = = = = = = = = =
*/
char * ED_NewString ( char * string )
string_t ED_NewString ( char * string )
{
char * new , * new _p;
char * new_p ;
int i , l ;
string_t num ;
l = strlen ( string ) + 1 ;
new = Hunk_Alloc ( l ) ;
new_p = new ;
num = PR_AllocString ( l , & new_p ) ;
for ( i = 0 ; i < l ; i + + )
{
@ -713,7 +719,7 @@ char *ED_NewString (char *string)
* new_p + + = string [ i ] ;
}
return new ;
return num ;
}
@ -739,7 +745,7 @@ qboolean ED_ParseEpair (void *base, ddef_t *key, char *s)
switch ( key - > type & ~ DEF_SAVEGLOBAL )
{
case ev_string :
* ( string_t * ) d = ED_NewString ( s ) - pr_strings ;
* ( string_t * ) d = ED_NewString ( s ) ;
break ;
case ev_float :
@ -965,7 +971,7 @@ void ED_LoadFromFile (char *data)
}
/ / look for the spawn function
func = ED_FindFunction ( pr_strings + ent - > v . classname ) ;
func = ED_FindFunction ( PR_GetString ( ent - > v . classname ) ) ;
if ( ! func )
{
@ -1017,6 +1023,15 @@ void PR_LoadProgs (void)
pr_functions = ( dfunction_t * ) ( ( byte * ) progs + progs - > ofs_functions ) ;
pr_strings = ( char * ) progs + progs - > ofs_strings ;
/ / initialize the strings
pr_numknownstrings = 0 ;
pr_maxknownstrings = 0 ;
pr_stringssize = progs - > numstrings ;
if ( pr_knownstrings ) Z_Free ( ( void * ) pr_knownstrings ) ;
pr_knownstrings = NULL ;
PR_SetEngineString ( " " ) ;
pr_globaldefs = ( ddef_t * ) ( ( byte * ) progs + progs - > ofs_globaldefs ) ;
pr_fielddefs = ( ddef_t * ) ( ( byte * ) progs + progs - > ofs_fielddefs ) ;
pr_statements = ( dstatement_t * ) ( ( byte * ) progs + progs - > ofs_statements ) ;
@ -1025,6 +1040,11 @@ void PR_LoadProgs (void)
pr_globals = ( float * ) pr_global_struct ;
pr_edict_size = progs - > entityfields * 4 + sizeof ( edict_t ) - sizeof ( entvars_t ) ;
/ / Round off to next highest whole word address
/ / this ensures that pointers in the engine data area are always properly aligned
pr_edict_size + = sizeof ( void * ) - 1 ;
pr_edict_size & = ~ ( sizeof ( void * ) - 1 ) ;
/ / byte swap the lumps
for ( i = 0 ; i < progs - > numstatements ; i + + )
@ -1110,3 +1130,88 @@ int NUM_FOR_EDICT(edict_t *e)
Sys_Error ( " NUM_FOR_EDICT: bad pointer " ) ;
return b ;
}
/ / = = = = = = = = = = = = = = =
/ / String handling
/ / = = = = = = = = = = = = = = =
# define PR_STRING_ALLOCSLOTS 256
static void PR_AllocStringSlots ( void )
{
pr_maxknownstrings + = PR_STRING_ALLOCSLOTS ;
Con_DPrintf ( " PR_AllocStringSlots: realloc'ing for %d slots \n " , pr_maxknownstrings ) ;
pr_knownstrings = ( char * * ) Z_Realloc ( ( void * ) pr_knownstrings , pr_maxknownstrings * sizeof ( char * ) ) ;
}
char * PR_GetString ( int num )
{
if ( num > = 0 & & num < pr_stringssize )
return pr_strings + num ;
else if ( num < 0 & & num > = - pr_numknownstrings )
{
if ( ! pr_knownstrings [ - 1 - num ] )
{
Host_Error ( " PR_GetString: attempt to get a non-existent string %d \n " , num ) ;
return " " ;
}
return pr_knownstrings [ - 1 - num ] ;
}
else
{
Host_Error ( " PR_GetString: invalid string offset %d \n " , num ) ;
return " " ;
}
}
int PR_SetEngineString ( char * s )
{
int i ;
if ( ! s )
return 0 ;
if ( s > = pr_strings & & s < = pr_strings + pr_stringssize - 2 )
return ( int ) ( s - pr_strings ) ;
for ( i = 0 ; i < pr_numknownstrings ; i + + )
{
if ( pr_knownstrings [ i ] = = s )
return - 1 - i ;
}
if ( i > = pr_maxknownstrings )
PR_AllocStringSlots ( ) ;
pr_numknownstrings + + ;
pr_knownstrings [ i ] = s ;
return - 1 - i ;
}
int PR_AllocString ( int size , char * * ptr )
{
int i ;
if ( ! size )
return 0 ;
for ( i = 0 ; i < pr_numknownstrings ; i + + )
{
if ( ! pr_knownstrings [ i ] )
break ;
}
if ( i > = pr_maxknownstrings )
PR_AllocStringSlots ( ) ;
pr_numknownstrings + + ;
pr_knownstrings [ i ] = ( char * ) Hunk_AllocName ( size , " string " ) ;
if ( ptr )
* ptr = ( char * ) pr_knownstrings [ i ] ;
return - 1 - i ;
}