prog->edictprivate_size = max(prog->edictprivate_size,(int)sizeof(prvm_edict_private_t));
// alloc edicts
- prog->edicts = Mem_Alloc(prog->progs_mempool,prog->limit_edicts * sizeof(prvm_edict_t));
+ prog->edicts = (prvm_edict_t *)Mem_Alloc(prog->progs_mempool,prog->limit_edicts * sizeof(prvm_edict_t));
// alloc edict private space
prog->edictprivate = Mem_Alloc(prog->progs_mempool, prog->max_edicts * prog->edictprivate_size);
mfunction_t *f;
int n;
- type &= ~DEF_SAVEGLOBAL;
+ type = (etype_t)((int) type & ~DEF_SAVEGLOBAL);
switch (type)
{
ddef_t *def;
mfunction_t *f;
- type &= ~DEF_SAVEGLOBAL;
+ type = (etype_t)((int)type & ~DEF_SAVEGLOBAL);
switch (type)
{
char *PRVM_GlobalString (int ofs)
{
char *s;
- int i;
+ size_t i;
ddef_t *def;
void *val;
static char line[128];
sprintf (line,"%i(?)", ofs);
else
{
- s = PRVM_ValueString (def->type, val);
+ s = PRVM_ValueString ((etype_t)def->type, (prvm_eval_t *)val);
sprintf (line,"%i(%s)%s", ofs, PRVM_GetString(def->s_name), s);
}
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;
strcat(tempstring, " ");
strcat(tempstring, " ");
- name = PRVM_ValueString(d->type, (prvm_eval_t *)v);
+ name = PRVM_ValueString((etype_t)d->type, (prvm_eval_t *)v);
if (strlen(name) > 256)
{
memcpy (tempstring2, name, 256);
continue;
FS_Printf(f,"\"%s\" ",name);
- FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(d->type, (prvm_eval_t *)v));
+ FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString((etype_t)d->type, (prvm_eval_t *)v));
}
FS_Print(f, "}\n");
name = PRVM_GetString(def->s_name);
FS_Printf(f,"\"%s\" ", name);
- FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString(type, (prvm_eval_t *)&prog->globals.generic[def->ofs]));
+ FS_Printf(f,"\"%s\"\n", PRVM_UglyValueString((etype_t)type, (prvm_eval_t *)&prog->globals.generic[def->ofs]));
}
FS_Print(f,"}\n");
}
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;
init = true;
+ // ignore attempts to set key "" (this problem occurs in nehahra neh1m8.bsp)
+ if (!keyname[0])
+ continue;
+
// keynames with a leading underscore are used for utility comments,
// and are immediately discarded by quake
if (keyname[0] == '_')
*/
void PRVM_LoadLNO( const char *progname ) {
qbyte *lno;
- unsigned long *header;
+ unsigned int *header;
char filename[512];
FS_StripExtension( progname, filename, sizeof( filename ) );
<Spike> SafeWrite (h, &numstatements, sizeof(int));
<Spike> SafeWrite (h, statement_linenums, numstatements*sizeof(int));
*/
- if( (unsigned) fs_filesize < (6 + prog->progs->numstatements) * sizeof( long ) ) {
+ if( (unsigned) fs_filesize < (6 + prog->progs->numstatements) * sizeof( int ) ) {
return;
}
- header = (unsigned long *) lno;
- if( header[ 0 ] == *(unsigned long *) "LNOF" &&
+ header = (unsigned int *) lno;
+ if( header[ 0 ] == *(unsigned int *) "LNOF" &&
LittleLong( header[ 1 ] ) == 1 &&
- LittleLong( header[ 2 ] ) == prog->progs->numglobaldefs &&
- LittleLong( header[ 3 ] ) == prog->progs->numglobals &&
- LittleLong( header[ 4 ] ) == prog->progs->numfielddefs &&
- LittleLong( header[ 5 ] ) == prog->progs->numstatements )
+ (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( long ) );
- memcpy( prog->statement_linenums, (long *) lno + 6, prog->progs->numstatements * sizeof( long ) );
+ prog->statement_linenums = (int *)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 );
}
}
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);
// so allocate a new place for it
infielddefs = (ddef_t *)((qbyte *)prog->progs + prog->progs->ofs_fielddefs);
// ( + DPFIELDS )
- prog->fielddefs = Mem_Alloc(prog->progs_mempool, (prog->progs->numfielddefs + numrequiredfields) * sizeof(ddef_t));
+ prog->fielddefs = (ddef_t *)Mem_Alloc(prog->progs_mempool, (prog->progs->numfielddefs + numrequiredfields) * sizeof(ddef_t));
prog->statements = (dstatement_t *)((qbyte *)prog->progs + prog->progs->ofs_statements);
prog->statements[i].c = LittleShort(prog->statements[i].c);
}
- prog->functions = Mem_Alloc(prog->progs_mempool, sizeof(mfunction_t) * prog->progs->numfunctions);
+ prog->functions = (mfunction_t *)Mem_Alloc(prog->progs_mempool, sizeof(mfunction_t) * prog->progs->numfunctions);
for (i = 0;i < prog->progs->numfunctions;i++)
{
prog->functions[i].first_statement = LittleLong (dfunctions[i].first_statement);
}
}
- PRVM_LoadLNO( filename );
+ PRVM_LoadLNO(filename);
PRVM_Init_Exec();
if(!PRVM_SetProgFromString(Cmd_Argv(1)))
return;
- counts = Mem_Alloc(tempmempool, prog->progs->numfielddefs * sizeof(int));
+ counts = (int *)Mem_Alloc(tempmempool, prog->progs->numfielddefs * sizeof(int));
for (ednum = 0;ednum < prog->max_edicts;ednum++)
{
ed = PRVM_EDICT_NUM(ednum);
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);
if( !global )
Con_Printf( "No global '%s' in %s!\n", Cmd_Argv(2), Cmd_Argv(1) );
else
- Con_Printf( "%s: %s\n", Cmd_Argv(2), PRVM_ValueString( global->type, (prvm_eval_t *) &prog->globals.generic[ global->ofs ] ) );
+ Con_Printf( "%s: %s\n", Cmd_Argv(2), PRVM_ValueString( (etype_t)global->type, (prvm_eval_t *) &prog->globals.generic[ global->ofs ] ) );
PRVM_End;
}
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 = (const char **)PRVM_Alloc(prog->maxknownstrings * sizeof(char *));
+ prog->knownstrings_freeable = (qbyte *)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++;
}
return -1 - i;
}
-int PRVM_AllocString(int bufferlength, char **pointer)
+int PRVM_AllocString(size_t bufferlength, char **pointer)
{
int i;
if (!bufferlength)
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 = (const char **)PRVM_Alloc(prog->maxknownstrings * sizeof(char *));
+ prog->knownstrings_freeable = (qbyte *)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] = PRVM_Alloc(bufferlength);
+ prog->knownstrings[i] = (char *)PRVM_Alloc(bufferlength);
+ prog->knownstrings_freeable[i] = true;
if (pointer)
*pointer = (char *)(prog->knownstrings[i]);
return -1 - i;
num = -1 - num;
if (!prog->knownstrings[num])
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