*/
void PRVM_ED_ClearEdict (prvm_edict_t *e)
{
- int num;
memset (e->fields.vp, 0, prog->progs->entityfields * 4);
e->priv.required->free = false;
{
case ev_string:
l = strlen(s) + 1;
- new_p = PRVM_AllocString(l);
- val->string = PRVM_SetQCString(new_p);
+ val->string = PRVM_AllocString(l, &new_p);
for (i = 0;i < l;i++)
{
if (s[i] == '\\' && i < l-1)
ddef_t *infielddefs;
dfunction_t *dfunctions;
+ if( prog->loaded ) {
+ PRVM_ERROR ("PRVM_LoadProgs: there is already a %s program loaded!\n", PRVM_NAME );
+ }
+
prog->progs = (dprograms_t *)FS_LoadFile (filename, prog->progs_mempool, false);
if (prog->progs == NULL)
PRVM_ERROR ("PRVM_LoadProgs: couldn't load %s for %s", filename, PRVM_NAME);
memset(prog, 0, sizeof(prvm_prog_t));
prog->time = &prog->_time;
+ prog->error_cmd = Host_Error;
}
int PRVM_GetProgNr()
return NULL;
}
-void PRVM_ProcessError(void)
-{
- if(prog)
- PRVM_GCALL(error_cmd)();
-}
-
/*
int NUM_FOR_EDICT_ERROR(prvm_edict_t *e)
{
}
}
-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;
return -1 - i;
}
-char *PRVM_AllocString(int bufferlength)
+int PRVM_AllocString(int bufferlength, char **pointer)
{
int i;
if (!bufferlength)
}
prog->numknownstrings++;
}
- return (char *)(prog->knownstrings[i] = PRVM_Alloc(bufferlength));
+ (char *)(prog->knownstrings[i]) = PRVM_Alloc(bufferlength);
+ if (pointer)
+ *pointer = (char *)(prog->knownstrings[i]);
+ return -1 - i;
}
-void PRVM_FreeString(char *s)
+void PRVM_FreeString(int num)
{
- int i;
- if (!s)
+ if (num == 0)
Host_Error("PRVM_FreeString: attempt to free a NULL string\n");
- if (s >= prog->strings && s <= prog->strings + prog->stringssize)
+ else if (num >= 0 && num < prog->stringssize)
Host_Error("PRVM_FreeString: attempt to free a constant string\n");
- for (i = 0;i < prog->numknownstrings;i++)
- if (prog->knownstrings[i] == s)
- break;
- if (i == prog->numknownstrings)
- Host_Error("PRVM_FreeString: attempt to free a non-existent or already freed string\n");
- PRVM_Free((char *)prog->knownstrings[i]);
- prog->knownstrings[i] = NULL;
+ 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_Free((char *)prog->knownstrings[num]);
+ prog->knownstrings[num] = NULL;
+ }
+ else
+ Host_Error("PRVM_FreeString: invalid string offset %i\n", num);
}