// AK new vm
#include "quakedef.h"
+#include "progsvm.h"
prvm_prog_t *prog;
// set edict pointers
for(i = 0; i < prog->max_edicts; i++)
{
- prog->edicts[i].e = (prvm_edict_private_t *)((qbyte *)prog->edictprivate + i * prog->edictprivate_size);
+ prog->edicts[i].p.e = (prvm_edict_private_t *)((qbyte *)prog->edictprivate + i * prog->edictprivate_size);
prog->edicts[i].v = (void*)((qbyte *)prog->edictsfields + i * prog->edict_size);
}
}
//set e and v pointers
for(i = 0; i < prog->max_edicts; i++)
{
- prog->edicts[i].e = (prvm_edict_private_t *)((qbyte *)prog->edictprivate + i * prog->edictprivate_size);
+ prog->edicts[i].p.e = (prvm_edict_private_t *)((qbyte *)prog->edictprivate + i * prog->edictprivate_size);
prog->edicts[i].v = (void*)((qbyte *)prog->edictsfields + i * prog->edict_size);
}
{
int num;
memset (e->v, 0, prog->progs->entityfields * 4);
- e->e->free = false;
+ e->p.e->free = false;
// LordHavoc: for consistency set these here
num = PRVM_NUM_FOR_EDICT(e) - 1;
e = PRVM_EDICT_NUM(i);
// the first couple seconds of server time can involve a lot of
// freeing and allocating, so relax the replacement policy
- if (e->e->free && ( e->e->freetime < 2 || (*prog->time - e->e->freetime) > 0.5 ) )
+ if (e->p.e->free && ( e->p.e->freetime < 2 || (*prog->time - e->p.e->freetime) > 0.5 ) )
{
PRVM_ED_ClearEdict (e);
return e;
PRVM_GCALL(free_edict)(ed);
- ed->e->free = true;
- ed->e->freetime = *prog->time;
+ ed->p.e->free = true;
+ ed->p.e->freetime = *prog->time;
}
//===========================================================================
switch (type)
{
case ev_string:
- strncpy(line, PRVM_GetString(val->string), sizeof(line));
+ strlcpy (line, PRVM_GetString (val->string), sizeof (line));
break;
case ev_entity:
n = val->edict;
break;
case ev_function:
f = pr_functions + val->function;
- strncpy(line, PRVM_GetString(f->s_name), sizeof(line));
+ strlcpy (line, PRVM_GetString (f->s_name), sizeof (line));
break;
case ev_field:
def = PRVM_ED_FieldAtOfs ( val->_int );
int type;
char tempstring[8192], tempstring2[260]; // temporary string buffers
- if (ed->e->free)
+ if (ed->p.e->free)
{
Con_Printf("%s: FREE\n",PRVM_NAME);
return;
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
name = PRVM_ValueString(d->type, (prvm_eval_t *)v);
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
FS_Print(f, "{\n");
- if (ed->e->free)
+ if (ed->p.e->free)
{
FS_Print(f, "}\n");
return;
for (i=0 ; i<prog->num_edicts ; i++)
{
ent = PRVM_EDICT_NUM(i);
- if (ent->e->free)
+ if (ent->p.e->free)
continue;
active++;
}
init = false;
-// clear it
- if (ent != prog->edicts) // hack
- memset (ent->v, 0, prog->progs->entityfields * 4);
-
// go through all the dictionary pairs
while (1)
{
}
if (!init)
- ent->e->free = true;
+ ent->p.e->free = true;
return data;
}
else
ent = PRVM_ED_Alloc();
+ // clear it
+ if (ent != prog->edicts) // hack
+ memset (ent->v, 0, prog->progs->entityfields * 4);
+
data = PRVM_ED_ParseEdict (data, ent);
parsed++;
}
spawned++;
- if (ent->e->free)
+ if (ent->p.e->free)
died++;
}
for (ednum = 0;ednum < prog->max_edicts;ednum++)
{
ed = PRVM_EDICT_NUM(ednum);
- if (ed->e->free)
+ if (ed->p.e->free)
continue;
for (i = 1;i < prog->progs->numfielddefs;i++)
{
}
if (strlen(name) > 256)
{
- strncpy(tempstring2, name, 256);
+ memcpy (tempstring2, name, 256);
tempstring2[256] = tempstring2[257] = tempstring2[258] = '.';
tempstring2[259] = 0;
name = tempstring2;
PRVM_End;
}
+/*
+===============
+PRVM_Global
+===============
+*/
+void PRVM_Global_f(void)
+{
+ ddef_t *global;
+ if( Cmd_Argc() != 3 ) {
+ Con_Printf( "prvm_global <program name> <global name>\n" );
+ return;
+ }
+
+ PRVM_Begin;
+ if( !PRVM_SetProgFromString( Cmd_Argv(1) ) )
+ return;
+
+ global = PRVM_ED_FindGlobal( Cmd_Argv(2) );
+ 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[ global->ofs ] ) );
+ PRVM_End;
+}
+
/*
===============
PRVM_Init
Cmd_AddCommand ("prvm_profile", PRVM_Profile_f);
Cmd_AddCommand ("prvm_fields", PRVM_Fields_f);
Cmd_AddCommand ("prvm_globals", PRVM_Globals_f);
+ Cmd_AddCommand ("prvm_global", PRVM_Global_f);
Cmd_AddCommand ("prvm_edictset", PRVM_ED_EdictSet_f);
// LordHavoc: optional runtime bounds checking (speed drain, but worth it for security, on by default - breaks most QCCX features (used by CRMod and others))
Cvar_RegisterVariable (&prvm_boundscheck);