char *PRVM_GlobalString (int ofs)
{
char *s;
- int i;
+ size_t i;
ddef_t *def;
void *val;
static char line[128];
char *PRVM_GlobalStringNoContents (int ofs)
{
- int i;
+ size_t i;
ddef_t *def;
static char line[128];
// LordHavoc: changed to print out every 4096 characters (incase there are a lot of fields to print)
void PRVM_ED_Print(prvm_edict_t *ed)
{
- int l;
+ size_t l;
ddef_t *d;
int *v;
int i, j;
switch (key->type & ~DEF_SAVEGLOBAL)
{
case ev_string:
- l = strlen(s) + 1;
+ l = (int)strlen(s) + 1;
val->string = PRVM_AllocString(l, &new_p);
for (i = 0;i < l;i++)
{
while (*s && *s <= ' ')
s++;
i = atoi(s);
- if (i < 0 || i >= prog->limit_edicts)
- Con_Printf("PRVM_ED_ParseEpair: ev_entity reference too large (edict %i >= MAX_EDICTS %i) on %s\n", i, MAX_EDICTS, PRVM_NAME);
+ if (i >= prog->limit_edicts)
+ Con_Printf("PRVM_ED_ParseEpair: ev_entity reference too large (edict %u >= MAX_EDICTS %u) on %s\n", (unsigned int)i, (unsigned int)MAX_EDICTS, PRVM_NAME);
while (i >= prog->max_edicts)
PRVM_MEM_IncreaseEdicts();
//SV_IncreaseEdicts();
// if SV_IncreaseEdicts was called the base pointer needs to be updated
if (ent)
val = (prvm_eval_t *)((int *)ent->fields.vp + key->ofs);
- val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM(i));
+ val->edict = PRVM_EDICT_TO_PROG(PRVM_EDICT_NUM((int)i));
break;
case ev_field:
qboolean anglehack;
qboolean init;
char keyname[256];
- int n;
+ size_t n;
init = false;
memset(prog,0,sizeof(prvm_prog_t));
}
+/*
+===============
+PRVM_LoadLNO
+===============
+*/
+void PRVM_LoadLNO( const char *progname ) {
+ qbyte *lno;
+ unsigned int *header;
+ char filename[512];
+
+ FS_StripExtension( progname, filename, sizeof( filename ) );
+ strlcat( filename, ".lno", sizeof( filename ) );
+
+ lno = FS_LoadFile( filename, tempmempool, false );
+ if( !lno ) {
+ return;
+ }
+
+/*
+<Spike> SafeWrite (h, &lnotype, sizeof(int));
+<Spike> SafeWrite (h, &version, sizeof(int));
+<Spike> SafeWrite (h, &numglobaldefs, sizeof(int));
+<Spike> SafeWrite (h, &numpr_globals, sizeof(int));
+<Spike> SafeWrite (h, &numfielddefs, sizeof(int));
+<Spike> SafeWrite (h, &numstatements, sizeof(int));
+<Spike> SafeWrite (h, statement_linenums, numstatements*sizeof(int));
+*/
+ if( (unsigned) fs_filesize < (6 + prog->progs->numstatements) * sizeof( int ) ) {
+ return;
+ }
+
+ header = (unsigned int *) lno;
+ if( header[ 0 ] == *(unsigned int *) "LNOF" &&
+ LittleLong( header[ 1 ] ) == 1 &&
+ (unsigned int)LittleLong( header[ 2 ] ) == (unsigned int)prog->progs->numglobaldefs &&
+ (unsigned int)LittleLong( header[ 3 ] ) == (unsigned int)prog->progs->numglobals &&
+ (unsigned int)LittleLong( header[ 4 ] ) == (unsigned int)prog->progs->numfielddefs &&
+ (unsigned int)LittleLong( header[ 5 ] ) == (unsigned int)prog->progs->numstatements )
+ {
+ prog->statement_linenums = Mem_Alloc(prog->progs_mempool, prog->progs->numstatements * sizeof( int ) );
+ memcpy( prog->statement_linenums, (int *) lno + 6, prog->progs->numstatements * sizeof( int ) );
+ }
+ Mem_Free( lno );
+}
+
/*
===============
PRVM_LoadProgs
}
prog->progs = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false);
- if (prog->progs == NULL)
+ if (prog->progs == NULL || fs_filesize < (fs_offset_t)sizeof(dprograms_t))
PRVM_ERROR ("PRVM_LoadProgs: couldn't load %s for %s", filename, PRVM_NAME);
Con_DPrintf("%s programs occupy %iK.\n", PRVM_NAME, fs_filesize/1024);
prog->stringssize = 0;
for (i = 0;i < prog->progs->numstrings;i++)
{
- if (prog->progs->ofs_strings + prog->stringssize >= fs_filesize)
+ if (prog->progs->ofs_strings + prog->stringssize >= (int)fs_filesize)
PRVM_ERROR ("%s: %s strings go past end of file\n", PRVM_NAME, filename);
- prog->stringssize += strlen (prog->strings + prog->stringssize) + 1;
+ prog->stringssize += (int)strlen (prog->strings + prog->stringssize) + 1;
}
prog->numknownstrings = 0;
prog->maxknownstrings = 0;
prog->knownstrings = NULL;
+ prog->knownstrings_freeable = NULL;
prog->globaldefs = (ddef_t *)((qbyte *)prog->progs + prog->progs->ofs_globaldefs);
}
}
+ PRVM_LoadLNO(filename);
+
PRVM_Init_Exec();
prog->loaded = TRUE;
name = tempstring2;
}
strcat(tempstring, name);
- for (j = strlen(name);j < 25;j++)
+ for (j = (int)strlen(name);j < 25;j++)
strcat(tempstring, " ");
sprintf(tempstring2, "%5d", counts[i]);
strcat(tempstring, tempstring2);
/*
int NUM_FOR_EDICT_ERROR(prvm_edict_t *e)
{
- Host_Error ("PRVM_NUM_FOR_EDICT: bad pointer %p (world is %p, entity number would be %i)", e, prog->edicts, e - prog->edicts);
+ PRVM_ERROR ("PRVM_NUM_FOR_EDICT: bad pointer %p (world is %p, entity number would be %i)", e, prog->edicts, e - prog->edicts);
return 0;
}
{
num = -1 - num;
if (!prog->knownstrings[num])
- Host_Error("PRVM_GetString: attempt to get string that is already freed\n");
+ PRVM_ERROR("PRVM_GetString: attempt to get string that is already freed\n");
return prog->knownstrings[num];
}
else
{
- Host_Error("PRVM_GetString: invalid string offset %i\n", num);
+ PRVM_ERROR("PRVM_GetString: invalid string offset %i\n", num);
return "";
}
}
-int PRVM_SetQCString(const char *s)
-{
- int i;
- if (!s)
- return 0;
- if (s >= prog->strings && s <= prog->strings + prog->stringssize)
- return s - prog->strings;
- for (i = 0;i < prog->numknownstrings;i++)
- if (prog->knownstrings[i] == s)
- return -1 - i;
- Host_Error("PRVM_SetQCString: unknown string\n");
- return -1 - i;
-}
-
int PRVM_SetEngineString(const char *s)
{
int i;
if (!s)
return 0;
if (s >= prog->strings && s <= prog->strings + prog->stringssize)
- Host_Error("PRVM_SetEngineString: s in prog->strings area\n");
+ PRVM_ERROR("PRVM_SetEngineString: s in prog->strings area\n");
for (i = 0;i < prog->numknownstrings;i++)
if (prog->knownstrings[i] == s)
return -1 - i;
// new unknown engine string
if (developer.integer >= 3)
Con_Printf("new engine string %p\n", s);
- for (i = 0;i < prog->numknownstrings;i++)
+ for (i = prog->firstfreeknownstring;i < prog->numknownstrings;i++)
if (!prog->knownstrings[i])
break;
if (i >= prog->numknownstrings)
if (i >= prog->maxknownstrings)
{
const char **oldstrings = prog->knownstrings;
+ const qbyte *oldstrings_freeable = prog->knownstrings_freeable;
prog->maxknownstrings += 128;
prog->knownstrings = PRVM_Alloc(prog->maxknownstrings * sizeof(char *));
+ prog->knownstrings_freeable = PRVM_Alloc(prog->maxknownstrings * sizeof(qbyte));
if (prog->numknownstrings)
+ {
memcpy((char **)prog->knownstrings, oldstrings, prog->numknownstrings * sizeof(char *));
+ memcpy((char **)prog->knownstrings_freeable, oldstrings_freeable, prog->numknownstrings * sizeof(qbyte));
+ }
}
prog->numknownstrings++;
}
+ prog->firstfreeknownstring = i + 1;
prog->knownstrings[i] = s;
return -1 - i;
}
-int PRVM_AllocString(int bufferlength, char **pointer)
+int PRVM_AllocString(size_t bufferlength, char **pointer)
{
int i;
if (!bufferlength)
return 0;
- for (i = 0;i < prog->numknownstrings;i++)
+ for (i = prog->firstfreeknownstring;i < prog->numknownstrings;i++)
if (!prog->knownstrings[i])
break;
if (i >= prog->numknownstrings)
if (i >= prog->maxknownstrings)
{
const char **oldstrings = prog->knownstrings;
+ const qbyte *oldstrings_freeable = prog->knownstrings_freeable;
prog->maxknownstrings += 128;
prog->knownstrings = PRVM_Alloc(prog->maxknownstrings * sizeof(char *));
+ prog->knownstrings_freeable = PRVM_Alloc(prog->maxknownstrings * sizeof(qbyte));
if (prog->numknownstrings)
+ {
memcpy((char **)prog->knownstrings, oldstrings, prog->numknownstrings * sizeof(char *));
+ memcpy((char **)prog->knownstrings_freeable, oldstrings_freeable, prog->numknownstrings * sizeof(qbyte));
+ }
}
prog->numknownstrings++;
}
- (char *)(prog->knownstrings[i]) = PRVM_Alloc(bufferlength);
+ prog->firstfreeknownstring = i + 1;
+ prog->knownstrings[i] = PRVM_Alloc(bufferlength);
+ prog->knownstrings_freeable[i] = true;
if (pointer)
*pointer = (char *)(prog->knownstrings[i]);
return -1 - i;
void PRVM_FreeString(int num)
{
if (num == 0)
- Host_Error("PRVM_FreeString: attempt to free a NULL string\n");
+ PRVM_ERROR("PRVM_FreeString: attempt to free a NULL string\n");
else if (num >= 0 && num < prog->stringssize)
- Host_Error("PRVM_FreeString: attempt to free a constant string\n");
+ PRVM_ERROR("PRVM_FreeString: attempt to free a constant string\n");
else if (num < 0 && num >= -prog->numknownstrings)
{
num = -1 - num;
if (!prog->knownstrings[num])
- Host_Error("PRVM_FreeString: attempt to free a non-existent or already freed string\n");
+ PRVM_ERROR("PRVM_FreeString: attempt to free a non-existent or already freed string\n");
+ if (!prog->knownstrings[num])
+ PRVM_ERROR("PRVM_FreeString: attempt to free a string owned by the engine\n");
PRVM_Free((char *)prog->knownstrings[num]);
prog->knownstrings[num] = NULL;
+ prog->knownstrings_freeable[num] = false;
+ prog->firstfreeknownstring = min(prog->firstfreeknownstring, num);
}
else
- Host_Error("PRVM_FreeString: invalid string offset %i\n", num);
+ PRVM_ERROR("PRVM_FreeString: invalid string offset %i\n", num);
}