memset(prog,0,sizeof(prvm_prog_t));
}
+/*
+===============
+PRVM_LoadLNO
+===============
+*/
+void PRVM_LoadLNO( const char *progname ) {
+ qbyte *lno;
+ unsigned long *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( long ) ) {
+ return;
+ }
+
+ header = (unsigned long *) lno;
+ if( header[ 0 ] == *(unsigned long *) "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 )
+ {
+ 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 ) );
+ }
+ Mem_Free( lno );
+}
+
/*
===============
PRVM_LoadProgs
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;
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++;
}
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] = 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