pr_comp.h, pr_edict.c, progs.h, pr_cmds.c, pr_exec.c: made some of the

variables and functions private and did some whitespace tidy-ups.

git-svn-id: svn+ssh://svn.code.sf.net/p/quakespasm/code/trunk@504 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
sezero 2011-12-12 08:56:25 +00:00
parent dd15b1a5bf
commit 5291960d56
5 changed files with 598 additions and 579 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,5 @@
/* /*
Copyright (C) 1996-2001 Id Software, Inc. Copyright (C) 1996-2001 Id Software, Inc.
Copyright (C) 2002-2009 John Fitzgibbons and others
This program is free software; you can redistribute it and/or This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License modify it under the terms of the GNU General Public License
@ -27,12 +26,22 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
typedef int func_t; typedef int func_t;
typedef int string_t; typedef int string_t;
typedef enum {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_field, ev_function, ev_pointer} etype_t; typedef enum
{
ev_bad = -1,
ev_void = 0,
ev_string,
ev_float,
ev_vector,
ev_entity,
ev_field,
ev_function,
ev_pointer
} etype_t;
#define OFS_NULL 0 #define OFS_NULL 0
#define OFS_RETURN 1 #define OFS_RETURN 1
#define OFS_PARM0 4 // leave 3 ofs for each parm to hold vectors #define OFS_PARM0 4 // leave 3 ofs for each parm to hold vectors
#define OFS_PARM1 7 #define OFS_PARM1 7
#define OFS_PARM2 10 #define OFS_PARM2 10
#define OFS_PARM3 13 #define OFS_PARM3 13
@ -43,7 +52,8 @@ typedef enum {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_field, ev_f
#define RESERVED_OFS 28 #define RESERVED_OFS 28
enum { enum
{
OP_DONE, OP_DONE,
OP_MUL_F, OP_MUL_F,
OP_MUL_V, OP_MUL_V,
@ -121,20 +131,20 @@ enum {
OP_BITOR OP_BITOR
}; };
typedef struct statement_s typedef struct statement_s
{ {
unsigned short op; unsigned short op;
short a,b,c; short a, b, c;
} dstatement_t; } dstatement_t;
typedef struct typedef struct
{ {
unsigned short type; // if DEF_SAVEGLOBAL bit is set unsigned short type; // if DEF_SAVEGLOBAL bit is set
// the variable needs to be saved in savegames // the variable needs to be saved in savegames
unsigned short ofs; unsigned short ofs;
int s_name; int s_name;
} ddef_t; } ddef_t;
#define DEF_SAVEGLOBAL (1<<15) #define DEF_SAVEGLOBAL (1<<15)
#define MAX_PARMS 8 #define MAX_PARMS 8
@ -143,7 +153,7 @@ typedef struct
{ {
int first_statement; // negative numbers are builtins int first_statement; // negative numbers are builtins
int parm_start; int parm_start;
int locals; // total ints of parms + locals int locals; // total ints of parms + locals
int profile; // runtime int profile; // runtime
@ -159,7 +169,7 @@ typedef struct
typedef struct typedef struct
{ {
int version; int version;
int crc; // check of header file int crc; // check of header file
int ofs_statements; int ofs_statements;
int numstatements; // statement 0 is an error int numstatements; // statement 0 is an error
@ -174,7 +184,7 @@ typedef struct
int numfunctions; // function 0 is an empty int numfunctions; // function 0 is an empty
int ofs_strings; int ofs_strings;
int numstrings; // first string is a null string int numstrings; // first string is a null string
int ofs_globals; int ofs_globals;
int numglobals; int numglobals;

View file

@ -22,24 +22,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.h" #include "quakedef.h"
qboolean pr_alpha_supported; //johnfitz
dprograms_t *progs; dprograms_t *progs;
dfunction_t *pr_functions; dfunction_t *pr_functions;
static char *pr_strings;
static int pr_stringssize;
static const char **pr_knownstrings;
static int pr_maxknownstrings;
static int pr_numknownstrings;
static ddef_t *pr_fielddefs;
static ddef_t *pr_globaldefs;
qboolean pr_alpha_supported; //johnfitz
dstatement_t *pr_statements; dstatement_t *pr_statements;
globalvars_t *pr_global_struct; globalvars_t *pr_global_struct;
float *pr_globals; // same as pr_global_struct float *pr_globals; // same as pr_global_struct
int pr_edict_size; // in bytes int pr_edict_size; // in bytes
static char *pr_strings; unsigned short pr_crc;
static int pr_stringssize;
static const char **pr_knownstrings;
static int pr_maxknownstrings;
static int pr_numknownstrings;
static ddef_t *pr_fielddefs;
static ddef_t *pr_globaldefs;
unsigned short pr_crc;
int type_size[8] = { int type_size[8] = {
1, // ev_void 1, // ev_void
@ -52,8 +53,22 @@ int type_size[8] = {
1 // sizeof(void *) / 4 // ev_pointer 1 // sizeof(void *) / 4 // ev_pointer
}; };
ddef_t *ED_FieldAtOfs (int ofs); static ddef_t *ED_FieldAtOfs (int ofs);
qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s); static qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s);
#define MAX_FIELD_LEN 64
#define GEFV_CACHESIZE 2
typedef struct {
ddef_t *pcache;
char field[MAX_FIELD_LEN];
} gefv_cache;
static gefv_cache gefvCache[GEFV_CACHESIZE] =
{
{ NULL, "" },
{ NULL, "" }
};
cvar_t nomonsters = {"nomonsters", "0"}; cvar_t nomonsters = {"nomonsters", "0"};
cvar_t gamecfg = {"gamecfg", "0"}; cvar_t gamecfg = {"gamecfg", "0"};
@ -67,16 +82,6 @@ cvar_t saved2 = {"saved2", "0", true};
cvar_t saved3 = {"saved3", "0", true}; cvar_t saved3 = {"saved3", "0", true};
cvar_t saved4 = {"saved4", "0", true}; cvar_t saved4 = {"saved4", "0", true};
#define MAX_FIELD_LEN 64
#define GEFV_CACHESIZE 2
typedef struct {
ddef_t *pcache;
char field[MAX_FIELD_LEN];
} gefv_cache;
static gefv_cache gefvCache[GEFV_CACHESIZE] = {{NULL, ""}, {NULL, ""}};
/* /*
================= =================
ED_ClearEdict ED_ClearEdict
@ -106,7 +111,7 @@ edict_t *ED_Alloc (void)
int i; int i;
edict_t *e; edict_t *e;
for ( i=svs.maxclients+1 ; i<sv.num_edicts ; i++) for (i = svs.maxclients + 1; i < sv.num_edicts; i++)
{ {
e = EDICT_NUM(i); e = EDICT_NUM(i);
// the first couple seconds of server time can involve a lot of // the first couple seconds of server time can involve a lot of
@ -163,12 +168,12 @@ void ED_Free (edict_t *ed)
ED_GlobalAtOfs ED_GlobalAtOfs
============ ============
*/ */
ddef_t *ED_GlobalAtOfs (int ofs) static ddef_t *ED_GlobalAtOfs (int ofs)
{ {
ddef_t *def; ddef_t *def;
int i; int i;
for (i=0 ; i<progs->numglobaldefs ; i++) for (i = 0; i < progs->numglobaldefs; i++)
{ {
def = &pr_globaldefs[i]; def = &pr_globaldefs[i];
if (def->ofs == ofs) if (def->ofs == ofs)
@ -182,12 +187,12 @@ ddef_t *ED_GlobalAtOfs (int ofs)
ED_FieldAtOfs ED_FieldAtOfs
============ ============
*/ */
ddef_t *ED_FieldAtOfs (int ofs) static ddef_t *ED_FieldAtOfs (int ofs)
{ {
ddef_t *def; ddef_t *def;
int i; int i;
for (i=0 ; i<progs->numfielddefs ; i++) for (i = 0; i < progs->numfielddefs; i++)
{ {
def = &pr_fielddefs[i]; def = &pr_fielddefs[i];
if (def->ofs == ofs) if (def->ofs == ofs)
@ -201,15 +206,15 @@ ddef_t *ED_FieldAtOfs (int ofs)
ED_FindField ED_FindField
============ ============
*/ */
ddef_t *ED_FindField (const char *name) static ddef_t *ED_FindField (const char *name)
{ {
ddef_t *def; ddef_t *def;
int i; int i;
for (i=0 ; i<progs->numfielddefs ; i++) for (i = 0; i < progs->numfielddefs; i++)
{ {
def = &pr_fielddefs[i]; def = &pr_fielddefs[i];
if (!strcmp(PR_GetString(def->s_name),name)) if ( !strcmp(PR_GetString(def->s_name), name) )
return def; return def;
} }
return NULL; return NULL;
@ -221,15 +226,15 @@ ddef_t *ED_FindField (const char *name)
ED_FindGlobal ED_FindGlobal
============ ============
*/ */
ddef_t *ED_FindGlobal (const char *name) static ddef_t *ED_FindGlobal (const char *name)
{ {
ddef_t *def; ddef_t *def;
int i; int i;
for (i=0 ; i<progs->numglobaldefs ; i++) for (i = 0; i < progs->numglobaldefs; i++)
{ {
def = &pr_globaldefs[i]; def = &pr_globaldefs[i];
if (!strcmp(PR_GetString(def->s_name),name)) if ( !strcmp(PR_GetString(def->s_name), name) )
return def; return def;
} }
return NULL; return NULL;
@ -241,15 +246,15 @@ ddef_t *ED_FindGlobal (const char *name)
ED_FindFunction ED_FindFunction
============ ============
*/ */
dfunction_t *ED_FindFunction (const char *name) static dfunction_t *ED_FindFunction (const char *fn_name)
{ {
dfunction_t *func; dfunction_t *func;
int i; int i;
for (i=0 ; i<progs->numfunctions ; i++) for (i = 0; i < progs->numfunctions; i++)
{ {
func = &pr_functions[i]; func = &pr_functions[i];
if (!strcmp(PR_GetString(func->s_name),name)) if ( !strcmp(PR_GetString(func->s_name), fn_name) )
return func; return func;
} }
return NULL; return NULL;
@ -266,7 +271,7 @@ eval_t *GetEdictFieldValue(edict_t *ed, const char *field)
int i; int i;
static int rep = 0; static int rep = 0;
for (i=0 ; i<GEFV_CACHESIZE ; i++) for (i = 0; i < GEFV_CACHESIZE; i++)
{ {
if (!strcmp(field, gefvCache[i].field)) if (!strcmp(field, gefvCache[i].field))
{ {
@ -300,7 +305,7 @@ PR_ValueString
Returns a string describing *data in a type specific manner Returns a string describing *data in a type specific manner
============= =============
*/ */
const char *PR_ValueString (int type, eval_t *val) static const char *PR_ValueString (int type, eval_t *val)
{ {
static char line[256]; static char line[256];
ddef_t *def; ddef_t *def;
@ -353,7 +358,7 @@ Returns a string describing *data in a type specific manner
Easier to parse than PR_ValueString Easier to parse than PR_ValueString
============= =============
*/ */
const char *PR_UglyValueString (int type, eval_t *val) static const char *PR_UglyValueString (int type, eval_t *val)
{ {
static char line[256]; static char line[256];
ddef_t *def; ddef_t *def;
@ -406,14 +411,14 @@ const char *PR_GlobalString (int ofs)
{ {
const char *s; const char *s;
int i; int i;
ddef_t *def; ddef_t *def;
void *val; void *val;
static char line[128]; static char line[128];
val = (void *)&pr_globals[ofs]; val = (void *)&pr_globals[ofs];
def = ED_GlobalAtOfs(ofs); def = ED_GlobalAtOfs(ofs);
if (!def) if (!def)
sprintf (line,"%i(???)", ofs); sprintf (line,"%i(?)", ofs);
else else
{ {
s = PR_ValueString (def->type, (eval_t *)val); s = PR_ValueString (def->type, (eval_t *)val);
@ -421,9 +426,9 @@ const char *PR_GlobalString (int ofs)
} }
i = strlen(line); i = strlen(line);
for ( ; i<20 ; i++) for ( ; i < 20; i++)
strcat (line," "); strcat (line, " ");
strcat (line," "); strcat (line, " ");
return line; return line;
} }
@ -431,19 +436,19 @@ const char *PR_GlobalString (int ofs)
const char *PR_GlobalStringNoContents (int ofs) const char *PR_GlobalStringNoContents (int ofs)
{ {
int i; int i;
ddef_t *def; ddef_t *def;
static char line[128]; static char line[128];
def = ED_GlobalAtOfs(ofs); def = ED_GlobalAtOfs(ofs);
if (!def) if (!def)
sprintf (line,"%i(???)", ofs); sprintf (line,"%i(?)", ofs);
else else
sprintf (line,"%i(%s)", ofs, PR_GetString(def->s_name)); sprintf (line,"%i(%s)", ofs, PR_GetString(def->s_name));
i = strlen(line); i = strlen(line);
for ( ; i<20 ; i++) for ( ; i < 20; i++)
strcat (line," "); strcat (line, " ");
strcat (line," "); strcat (line, " ");
return line; return line;
} }
@ -471,11 +476,11 @@ void ED_Print (edict_t *ed)
} }
Con_SafePrintf("\nEDICT %i:\n", NUM_FOR_EDICT(ed)); //johnfitz -- was Con_Printf Con_SafePrintf("\nEDICT %i:\n", NUM_FOR_EDICT(ed)); //johnfitz -- was Con_Printf
for (i=1 ; i<progs->numfielddefs ; i++) for (i = 1; i < progs->numfielddefs; i++)
{ {
d = &pr_fielddefs[i]; d = &pr_fielddefs[i];
name = PR_GetString(d->s_name); name = PR_GetString(d->s_name);
l = strlen(name); l = strlen (name);
if (l > 1 && name[l - 2] == '_') if (l > 1 && name[l - 2] == '_')
continue; // skip _x, _y, _z vars continue; // skip _x, _y, _z vars
@ -484,13 +489,15 @@ void ED_Print (edict_t *ed)
// if the value is still all 0, skip the field // if the value is still all 0, skip the field
type = d->type & ~DEF_SAVEGLOBAL; type = d->type & ~DEF_SAVEGLOBAL;
for (j=0 ; j<type_size[type] ; j++) for (j = 0; j < type_size[type]; j++)
{
if (v[j]) if (v[j])
break; break;
}
if (j == type_size[type]) if (j == type_size[type])
continue; continue;
Con_SafePrintf ("%s",name); //johnfitz -- was Con_Printf Con_SafePrintf ("%s", name); //johnfitz -- was Con_Printf
while (l++ < 15) while (l++ < 15)
Con_SafePrintf (" "); //johnfitz -- was Con_Printf Con_SafePrintf (" "); //johnfitz -- was Con_Printf
@ -521,11 +528,11 @@ void ED_Write (FILE *f, edict_t *ed)
return; return;
} }
for (i=1 ; i<progs->numfielddefs ; i++) for (i = 1; i < progs->numfielddefs; i++)
{ {
d = &pr_fielddefs[i]; d = &pr_fielddefs[i];
name = PR_GetString(d->s_name); name = PR_GetString(d->s_name);
j = strlen(name); j = strlen (name);
if (j > 1 && name[j - 2] == '_') if (j > 1 && name[j - 2] == '_')
continue; // skip _x, _y, _z vars continue; // skip _x, _y, _z vars
@ -533,19 +540,21 @@ void ED_Write (FILE *f, edict_t *ed)
// if the value is still all 0, skip the field // if the value is still all 0, skip the field
type = d->type & ~DEF_SAVEGLOBAL; type = d->type & ~DEF_SAVEGLOBAL;
for (j=0 ; j<type_size[type] ; j++) for (j = 0; j < type_size[type]; j++)
{
if (v[j]) if (v[j])
break; break;
}
if (j == type_size[type]) if (j == type_size[type])
continue; continue;
fprintf (f,"\"%s\" ",name); fprintf (f, "\"%s\" ", name);
fprintf (f,"\"%s\"\n", PR_UglyValueString(d->type, (eval_t *)v)); fprintf (f, "\"%s\"\n", PR_UglyValueString(d->type, (eval_t *)v));
} }
//johnfitz -- save entity alpha manually when progs.dat doesn't know about alpha //johnfitz -- save entity alpha manually when progs.dat doesn't know about alpha
if (!pr_alpha_supported && ed->alpha != ENTALPHA_DEFAULT) if (!pr_alpha_supported && ed->alpha != ENTALPHA_DEFAULT)
fprintf (f,"\"alpha\" \"%f\"\n", ENTALPHA_TOSAVE(ed->alpha)); fprintf (f, "\"alpha\" \"%f\"\n", ENTALPHA_TOSAVE(ed->alpha));
//johnfitz //johnfitz
fprintf (f, "}\n"); fprintf (f, "}\n");
@ -568,7 +577,7 @@ void ED_PrintEdicts (void)
int i; int i;
Con_Printf ("%i entities\n", sv.num_edicts); Con_Printf ("%i entities\n", sv.num_edicts);
for (i=0 ; i<sv.num_edicts ; i++) for (i = 0; i < sv.num_edicts; i++)
ED_PrintNum (i); ED_PrintNum (i);
} }
@ -579,7 +588,7 @@ ED_PrintEdict_f
For debugging, prints a single edicy For debugging, prints a single edicy
============= =============
*/ */
void ED_PrintEdict_f (void) static void ED_PrintEdict_f (void)
{ {
int i; int i;
@ -599,14 +608,14 @@ ED_Count
For debugging For debugging
============= =============
*/ */
void ED_Count (void) static void ED_Count (void)
{ {
int i; int i;
edict_t *ent; edict_t *ent;
int active, models, solid, step; int active, models, solid, step;
active = models = solid = step = 0; active = models = solid = step = 0;
for (i=0 ; i<sv.num_edicts ; i++) for (i = 0; i < sv.num_edicts; i++)
{ {
ent = EDICT_NUM(i); ent = EDICT_NUM(i);
if (ent->free) if (ent->free)
@ -625,13 +634,13 @@ void ED_Count (void)
Con_Printf ("view :%3i\n", models); Con_Printf ("view :%3i\n", models);
Con_Printf ("touch :%3i\n", solid); Con_Printf ("touch :%3i\n", solid);
Con_Printf ("step :%3i\n", step); Con_Printf ("step :%3i\n", step);
} }
/* /*
============================================================================== ==============================================================================
ARCHIVING GLOBALS ARCHIVING GLOBALS
FIXME: need to tag constants, doesn't really work FIXME: need to tag constants, doesn't really work
============================================================================== ==============================================================================
@ -649,8 +658,8 @@ void ED_WriteGlobals (FILE *f)
const char *name; const char *name;
int type; int type;
fprintf (f,"{\n"); fprintf (f, "{\n");
for (i=0 ; i<progs->numglobaldefs ; i++) for (i = 0; i < progs->numglobaldefs; i++)
{ {
def = &pr_globaldefs[i]; def = &pr_globaldefs[i];
type = def->type; type = def->type;
@ -662,10 +671,10 @@ void ED_WriteGlobals (FILE *f)
continue; continue;
name = PR_GetString(def->s_name); name = PR_GetString(def->s_name);
fprintf (f,"\"%s\" ", name); fprintf (f, "\"%s\" ", name);
fprintf (f,"\"%s\"\n", PR_UglyValueString(type, (eval_t *)&pr_globals[def->ofs])); fprintf (f, "\"%s\"\n", PR_UglyValueString(type, (eval_t *)&pr_globals[def->ofs]));
} }
fprintf (f,"}\n"); fprintf (f, "}\n");
} }
/* /*
@ -726,7 +735,7 @@ static string_t ED_NewString (const char *string)
l = strlen(string) + 1; l = strlen(string) + 1;
num = PR_AllocString (l, &new_p); num = PR_AllocString (l, &new_p);
for (i=0 ; i< l ; i++) for (i = 0; i < l; i++)
{ {
if (string[i] == '\\' && i < l-1) if (string[i] == '\\' && i < l-1)
{ {
@ -752,7 +761,7 @@ Can parse either fields or globals
returns false if error returns false if error
============= =============
*/ */
qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s) static qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s)
{ {
int i; int i;
char string[128]; char string[128];
@ -766,7 +775,7 @@ qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s)
switch (key->type & ~DEF_SAVEGLOBAL) switch (key->type & ~DEF_SAVEGLOBAL)
{ {
case ev_string: case ev_string:
*(string_t *)d = ED_NewString (s); *(string_t *)d = ED_NewString(s);
break; break;
case ev_float: case ev_float:
@ -777,7 +786,7 @@ qboolean ED_ParseEpair (void *base, ddef_t *key, const char *s)
strcpy (string, s); strcpy (string, s);
v = string; v = string;
w = string; w = string;
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
{ {
while (*v && *v != ' ') while (*v && *v != ' ')
v++; v++;
@ -838,14 +847,14 @@ const char *ED_ParseEdict (const char *data, edict_t *ent)
init = false; init = false;
// clear it // clear it
if (ent != sv.edicts) // hack if (ent != sv.edicts) // hack
memset (&ent->v, 0, progs->entityfields * 4); memset (&ent->v, 0, progs->entityfields * 4);
// go through all the dictionary pairs // go through all the dictionary pairs
while (1) while (1)
{ {
// parse key // parse key
data = COM_Parse (data); data = COM_Parse (data);
if (com_token[0] == '}') if (com_token[0] == '}')
break; break;
@ -940,16 +949,16 @@ to call ED_CallSpawnFunctions () to let the objects initialize themselves.
*/ */
void ED_LoadFromFile (const char *data) void ED_LoadFromFile (const char *data)
{ {
dfunction_t *func;
edict_t *ent = NULL; edict_t *ent = NULL;
int inhibit = 0; int inhibit = 0;
dfunction_t *func;
pr_global_struct->time = sv.time; pr_global_struct->time = sv.time;
// parse ents // parse ents
while (1) while (1)
{ {
// parse the opening brace // parse the opening brace
data = COM_Parse (data); data = COM_Parse (data);
if (!data) if (!data)
break; break;
@ -962,7 +971,7 @@ void ED_LoadFromFile (const char *data)
ent = ED_Alloc (); ent = ED_Alloc ();
data = ED_ParseEdict (data, ent); data = ED_ParseEdict (data, ent);
// remove things from different skill levels or deathmatch // remove things from different skill levels or deathmatch
if (deathmatch.value) if (deathmatch.value)
{ {
if (((int)ent->v.spawnflags & SPAWNFLAG_NOT_DEATHMATCH)) if (((int)ent->v.spawnflags & SPAWNFLAG_NOT_DEATHMATCH))
@ -993,7 +1002,7 @@ void ED_LoadFromFile (const char *data)
} }
// look for the spawn function // look for the spawn function
func = ED_FindFunction (PR_GetString(ent->v.classname)); func = ED_FindFunction ( PR_GetString(ent->v.classname) );
if (!func) if (!func)
{ {
@ -1018,10 +1027,10 @@ PR_LoadProgs
*/ */
void PR_LoadProgs (void) void PR_LoadProgs (void)
{ {
int i; int i;
// flush the non-C variable lookup cache // flush the non-C variable lookup cache
for (i=0 ; i<GEFV_CACHESIZE ; i++) for (i = 0; i < GEFV_CACHESIZE; i++)
gefvCache[i].field[0] = 0; gefvCache[i].field[0] = 0;
CRC_Init (&pr_crc); CRC_Init (&pr_crc);
@ -1031,11 +1040,11 @@ void PR_LoadProgs (void)
Sys_Error ("PR_LoadProgs: couldn't load progs.dat"); Sys_Error ("PR_LoadProgs: couldn't load progs.dat");
Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024); Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024);
for (i=0 ; i<com_filesize ; i++) for (i = 0; i < com_filesize; i++)
CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]); CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]);
// byte swap the header // byte swap the header
for (i=0 ; i<sizeof(*progs)/4 ; i++) for (i = 0; i < (int) sizeof(*progs) / 4; i++)
((int *)progs)[i] = LittleLong ( ((int *)progs)[i] ); ((int *)progs)[i] = LittleLong ( ((int *)progs)[i] );
if (progs->version != PROG_VERSION) if (progs->version != PROG_VERSION)
@ -1047,13 +1056,16 @@ void PR_LoadProgs (void)
pr_strings = (char *)progs + progs->ofs_strings; pr_strings = (char *)progs + progs->ofs_strings;
if (progs->ofs_strings + progs->numstrings >= com_filesize) if (progs->ofs_strings + progs->numstrings >= com_filesize)
Host_Error ("progs.dat strings go past end of file\n"); Host_Error ("progs.dat strings go past end of file\n");
// initialize the strings
pr_numknownstrings = 0; pr_numknownstrings = 0;
pr_maxknownstrings = 0; pr_maxknownstrings = 0;
pr_stringssize = progs->numstrings; pr_stringssize = progs->numstrings;
if (pr_knownstrings) if (pr_knownstrings)
Z_Free ((void *)pr_knownstrings); Z_Free ((void *)pr_knownstrings);
pr_knownstrings = NULL; pr_knownstrings = NULL;
PR_SetEngineString(""); // initialize the strings PR_SetEngineString("");
pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs); pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs);
pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs); pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs);
pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements); pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements);
@ -1061,8 +1073,8 @@ void PR_LoadProgs (void)
pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals); pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals);
pr_globals = (float *)pr_global_struct; pr_globals = (float *)pr_global_struct;
// byte swap the lumps // byte swap the lumps
for (i=0 ; i<progs->numstatements ; i++) for (i = 0; i < progs->numstatements; i++)
{ {
pr_statements[i].op = LittleShort(pr_statements[i].op); pr_statements[i].op = LittleShort(pr_statements[i].op);
pr_statements[i].a = LittleShort(pr_statements[i].a); pr_statements[i].a = LittleShort(pr_statements[i].a);
@ -1070,17 +1082,17 @@ void PR_LoadProgs (void)
pr_statements[i].c = LittleShort(pr_statements[i].c); pr_statements[i].c = LittleShort(pr_statements[i].c);
} }
for (i=0 ; i<progs->numfunctions; i++) for (i = 0; i < progs->numfunctions; i++)
{ {
pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement); pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement);
pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start); pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start);
pr_functions[i].s_name = LittleLong (pr_functions[i].s_name); pr_functions[i].s_name = LittleLong (pr_functions[i].s_name);
pr_functions[i].s_file = LittleLong (pr_functions[i].s_file); pr_functions[i].s_file = LittleLong (pr_functions[i].s_file);
pr_functions[i].numparms = LittleLong (pr_functions[i].numparms); pr_functions[i].numparms = LittleLong (pr_functions[i].numparms);
pr_functions[i].locals = LittleLong (pr_functions[i].locals); pr_functions[i].locals = LittleLong (pr_functions[i].locals);
} }
for (i=0 ; i<progs->numglobaldefs ; i++) for (i = 0; i < progs->numglobaldefs; i++)
{ {
pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type); pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type);
pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs); pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs);
@ -1089,7 +1101,7 @@ void PR_LoadProgs (void)
pr_alpha_supported = false; //johnfitz pr_alpha_supported = false; //johnfitz
for (i=0 ; i<progs->numfielddefs ; i++) for (i = 0; i < progs->numfielddefs; i++)
{ {
pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type); pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type);
if (pr_fielddefs[i].type & DEF_SAVEGLOBAL) if (pr_fielddefs[i].type & DEF_SAVEGLOBAL)
@ -1103,7 +1115,7 @@ void PR_LoadProgs (void)
//johnfitz //johnfitz
} }
for (i=0 ; i<progs->numglobals ; i++) for (i = 0; i < progs->numglobals; i++)
((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]); ((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]);
pr_edict_size = progs->entityfields * 4 + sizeof(edict_t) - sizeof(entvars_t); pr_edict_size = progs->entityfields * 4 + sizeof(edict_t) - sizeof(entvars_t);
@ -1140,12 +1152,11 @@ void PR_Init (void)
} }
edict_t *EDICT_NUM(int n) edict_t *EDICT_NUM(int n)
{ {
if (n < 0 || n >= sv.max_edicts) if (n < 0 || n >= sv.max_edicts)
Sys_Error ("EDICT_NUM: bad number %i", n); Sys_Error ("EDICT_NUM: bad number %i", n);
return (edict_t *)((byte *)sv.edicts+ (n)*pr_edict_size); return (edict_t *)((byte *)sv.edicts + (n)*pr_edict_size);
} }
int NUM_FOR_EDICT(edict_t *e) int NUM_FOR_EDICT(edict_t *e)
@ -1162,6 +1173,7 @@ int NUM_FOR_EDICT(edict_t *e)
//=========================================================================== //===========================================================================
#define PR_STRING_ALLOCSLOTS 256 #define PR_STRING_ALLOCSLOTS 256
static void PR_AllocStringSlots (void) static void PR_AllocStringSlots (void)

View file

@ -1,6 +1,5 @@
/* /*
Copyright (C) 1996-2001 Id Software, Inc. Copyright (C) 1996-2001 Id Software, Inc.
Copyright (C) 2002-2009 John Fitzgibbons and others
This program is free software; you can redistribute it and/or This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License modify it under the terms of the GNU General Public License
@ -21,120 +20,112 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.h" #include "quakedef.h"
/*
*/
typedef struct typedef struct
{ {
int s; int s;
dfunction_t *f; dfunction_t *f;
} prstack_t; } prstack_t;
#define MAX_STACK_DEPTH 32 #define MAX_STACK_DEPTH 32
prstack_t pr_stack[MAX_STACK_DEPTH]; static prstack_t pr_stack[MAX_STACK_DEPTH];
int pr_depth; static int pr_depth;
#define LOCALSTACK_SIZE 2048 #define LOCALSTACK_SIZE 2048
int localstack[LOCALSTACK_SIZE]; static int localstack[LOCALSTACK_SIZE];
int localstack_used; static int localstack_used;
qboolean pr_trace; qboolean pr_trace;
dfunction_t *pr_xfunction; dfunction_t *pr_xfunction;
int pr_xstatement; int pr_xstatement;
int pr_argc; int pr_argc;
const char *pr_opnames[] = static const char *pr_opnames[] =
{ {
"DONE", "DONE",
"MUL_F", "MUL_F",
"MUL_V", "MUL_V",
"MUL_FV", "MUL_FV",
"MUL_VF", "MUL_VF",
"DIV", "DIV",
"ADD_F", "ADD_F",
"ADD_V", "ADD_V",
"SUB_F", "SUB_F",
"SUB_V", "SUB_V",
"EQ_F", "EQ_F",
"EQ_V", "EQ_V",
"EQ_S", "EQ_S",
"EQ_E", "EQ_E",
"EQ_FNC", "EQ_FNC",
"NE_F", "NE_F",
"NE_V", "NE_V",
"NE_S", "NE_S",
"NE_E", "NE_E",
"NE_FNC", "NE_FNC",
"LE", "LE",
"GE", "GE",
"LT", "LT",
"GT", "GT",
"INDIRECT", "INDIRECT",
"INDIRECT", "INDIRECT",
"INDIRECT", "INDIRECT",
"INDIRECT", "INDIRECT",
"INDIRECT", "INDIRECT",
"INDIRECT", "INDIRECT",
"ADDRESS", "ADDRESS",
"STORE_F", "STORE_F",
"STORE_V", "STORE_V",
"STORE_S", "STORE_S",
"STORE_ENT", "STORE_ENT",
"STORE_FLD", "STORE_FLD",
"STORE_FNC", "STORE_FNC",
"STOREP_F", "STOREP_F",
"STOREP_V", "STOREP_V",
"STOREP_S", "STOREP_S",
"STOREP_ENT", "STOREP_ENT",
"STOREP_FLD", "STOREP_FLD",
"STOREP_FNC", "STOREP_FNC",
"RETURN", "RETURN",
"NOT_F", "NOT_F",
"NOT_V", "NOT_V",
"NOT_S", "NOT_S",
"NOT_ENT", "NOT_ENT",
"NOT_FNC", "NOT_FNC",
"IF", "IF",
"IFNOT", "IFNOT",
"CALL0", "CALL0",
"CALL1", "CALL1",
"CALL2", "CALL2",
"CALL3", "CALL3",
"CALL4", "CALL4",
"CALL5", "CALL5",
"CALL6", "CALL6",
"CALL7", "CALL7",
"CALL8", "CALL8",
"STATE", "STATE",
"GOTO", "GOTO",
"AND", "AND",
"OR", "OR",
"BITAND", "BITAND",
"BITOR" "BITOR"
}; };
const char *PR_GlobalString (int ofs); const char *PR_GlobalString (int ofs);
@ -148,39 +139,39 @@ const char *PR_GlobalStringNoContents (int ofs);
PR_PrintStatement PR_PrintStatement
================= =================
*/ */
void PR_PrintStatement (dstatement_t *s) static void PR_PrintStatement (dstatement_t *s)
{ {
int i; int i;
if ( (unsigned)s->op < sizeof(pr_opnames)/sizeof(pr_opnames[0])) if ((unsigned int)s->op < sizeof(pr_opnames)/sizeof(pr_opnames[0]))
{ {
Con_Printf ("%s ", pr_opnames[s->op]); Con_Printf("%s ", pr_opnames[s->op]);
i = strlen(pr_opnames[s->op]); i = strlen(pr_opnames[s->op]);
for ( ; i<10 ; i++) for ( ; i < 10; i++)
Con_Printf (" "); Con_Printf(" ");
} }
if (s->op == OP_IF || s->op == OP_IFNOT) if (s->op == OP_IF || s->op == OP_IFNOT)
Con_Printf ("%sbranch %i",PR_GlobalString(s->a),s->b); Con_Printf("%sbranch %i", PR_GlobalString(s->a), s->b);
else if (s->op == OP_GOTO) else if (s->op == OP_GOTO)
{ {
Con_Printf ("branch %i",s->a); Con_Printf("branch %i", s->a);
} }
else if ( (unsigned)(s->op - OP_STORE_F) < 6) else if ((unsigned int)(s->op-OP_STORE_F) < 6)
{ {
Con_Printf ("%s",PR_GlobalString(s->a)); Con_Printf("%s", PR_GlobalString(s->a));
Con_Printf ("%s", PR_GlobalStringNoContents(s->b)); Con_Printf("%s", PR_GlobalStringNoContents(s->b));
} }
else else
{ {
if (s->a) if (s->a)
Con_Printf ("%s",PR_GlobalString(s->a)); Con_Printf("%s", PR_GlobalString(s->a));
if (s->b) if (s->b)
Con_Printf ("%s",PR_GlobalString(s->b)); Con_Printf("%s", PR_GlobalString(s->b));
if (s->c) if (s->c)
Con_Printf ("%s", PR_GlobalStringNoContents(s->c)); Con_Printf("%s", PR_GlobalStringNoContents(s->c));
} }
Con_Printf ("\n"); Con_Printf("\n");
} }
/* /*
@ -188,28 +179,29 @@ void PR_PrintStatement (dstatement_t *s)
PR_StackTrace PR_StackTrace
============ ============
*/ */
void PR_StackTrace (void) static void PR_StackTrace (void)
{ {
int i;
dfunction_t *f; dfunction_t *f;
int i;
if (pr_depth == 0) if (pr_depth == 0)
{ {
Con_Printf ("<NO STACK>\n"); Con_Printf("<NO STACK>\n");
return; return;
} }
pr_stack[pr_depth].f = pr_xfunction; pr_stack[pr_depth].f = pr_xfunction;
for (i=pr_depth ; i>=0 ; i--) for (i = pr_depth; i >= 0; i--)
{ {
f = pr_stack[i].f; f = pr_stack[i].f;
if (!f) if (!f)
{ {
Con_Printf ("<NO FUNCTION>\n"); Con_Printf("<NO FUNCTION>\n");
} }
else else
Con_Printf ("%12s : %s\n", PR_GetString(f->s_file), PR_GetString(f->s_name)); {
Con_Printf("%12s : %s\n", PR_GetString(f->s_file), PR_GetString(f->s_name));
}
} }
} }
@ -222,10 +214,9 @@ PR_Profile_f
*/ */
void PR_Profile_f (void) void PR_Profile_f (void)
{ {
int i, num;
int pmax;
dfunction_t *f, *best; dfunction_t *f, *best;
int pmax;
int num;
int i;
if (!sv.active) if (!sv.active)
return; return;
@ -235,7 +226,7 @@ void PR_Profile_f (void)
{ {
pmax = 0; pmax = 0;
best = NULL; best = NULL;
for (i=0 ; i<progs->numfunctions ; i++) for (i = 0; i < progs->numfunctions; i++)
{ {
f = &pr_functions[i]; f = &pr_functions[i];
if (f->profile > pmax) if (f->profile > pmax)
@ -247,7 +238,7 @@ void PR_Profile_f (void)
if (best) if (best)
{ {
if (num < 10) if (num < 10)
Con_Printf ("%7i %s\n", best->profile, PR_GetString(best->s_name)); Con_Printf("%7i %s\n", best->profile, PR_GetString(best->s_name));
num++; num++;
best->profile = 0; best->profile = 0;
} }
@ -264,30 +255,23 @@ Aborts the currently executing function
*/ */
void PR_RunError (const char *error, ...) void PR_RunError (const char *error, ...)
{ {
va_list argptr; va_list argptr;
char string[1024]; char string[1024];
va_start (argptr,error); va_start (argptr, error);
q_vsnprintf (string, sizeof(string), error, argptr); q_vsnprintf (string, sizeof(string), error, argptr);
va_end (argptr); va_end (argptr);
PR_PrintStatement (pr_statements + pr_xstatement); PR_PrintStatement(pr_statements + pr_xstatement);
PR_StackTrace (); PR_StackTrace();
Con_Printf ("%s\n", string);
pr_depth = 0; // dump the stack so host_error can shutdown functions Con_Printf("%s\n", string);
Host_Error ("Program error"); pr_depth = 0; // dump the stack so host_error can shutdown functions
Host_Error("Program error");
} }
/*
============================================================================
PR_ExecuteProgram
The interpretation main loop
============================================================================
*/
/* /*
==================== ====================
PR_EnterFunction PR_EnterFunction
@ -295,32 +279,32 @@ PR_EnterFunction
Returns the new program statement counter Returns the new program statement counter
==================== ====================
*/ */
int PR_EnterFunction (dfunction_t *f) static int PR_EnterFunction (dfunction_t *f)
{ {
int i, j, c, o; int i, j, c, o;
pr_stack[pr_depth].s = pr_xstatement; pr_stack[pr_depth].s = pr_xstatement;
pr_stack[pr_depth].f = pr_xfunction; pr_stack[pr_depth].f = pr_xfunction;
pr_depth++; pr_depth++;
if (pr_depth >= MAX_STACK_DEPTH) if (pr_depth >= MAX_STACK_DEPTH)
PR_RunError ("stack overflow"); PR_RunError("stack overflow");
// save off any locals that the new function steps on // save off any locals that the new function steps on
c = f->locals; c = f->locals;
if (localstack_used + c > LOCALSTACK_SIZE) if (localstack_used + c > LOCALSTACK_SIZE)
PR_RunError ("PR_ExecuteProgram: locals stack overflow\n"); PR_RunError("PR_ExecuteProgram: locals stack overflow\n");
for (i=0 ; i < c ; i++) for (i = 0; i < c ; i++)
localstack[localstack_used+i] = ((int *)pr_globals)[f->parm_start + i]; localstack[localstack_used + i] = ((int *)pr_globals)[f->parm_start + i];
localstack_used += c; localstack_used += c;
// copy parameters // copy parameters
o = f->parm_start; o = f->parm_start;
for (i=0 ; i<f->numparms ; i++) for (i = 0; i < f->numparms; i++)
{ {
for (j=0 ; j<f->parm_size[i] ; j++) for (j = 0; j < f->parm_size[i]; j++)
{ {
((int *)pr_globals)[o] = ((int *)pr_globals)[OFS_PARM0+i*3+j]; ((int *)pr_globals)[o] = ((int *)pr_globals)[OFS_PARM0 + i*3 + j];
o++; o++;
} }
} }
@ -334,23 +318,23 @@ int PR_EnterFunction (dfunction_t *f)
PR_LeaveFunction PR_LeaveFunction
==================== ====================
*/ */
int PR_LeaveFunction (void) static int PR_LeaveFunction (void)
{ {
int i, c; int i, c;
if (pr_depth <= 0) if (pr_depth <= 0)
Sys_Error ("prog stack underflow"); Sys_Error("prog stack underflow");
// restore locals from the stack // Restore locals from the stack
c = pr_xfunction->locals; c = pr_xfunction->locals;
localstack_used -= c; localstack_used -= c;
if (localstack_used < 0) if (localstack_used < 0)
PR_RunError ("PR_ExecuteProgram: locals stack underflow\n"); PR_RunError("PR_ExecuteProgram: locals stack underflow");
for (i=0 ; i < c ; i++) for (i = 0; i < c; i++)
((int *)pr_globals)[pr_xfunction->parm_start + i] = localstack[localstack_used+i]; ((int *)pr_globals)[pr_xfunction->parm_start + i] = localstack[localstack_used + i];
// up stack // up stack
pr_depth--; pr_depth--;
pr_xfunction = pr_stack[pr_depth].f; pr_xfunction = pr_stack[pr_depth].f;
return pr_stack[pr_depth].s; return pr_stack[pr_depth].s;
@ -360,19 +344,21 @@ int PR_LeaveFunction (void)
/* /*
==================== ====================
PR_ExecuteProgram PR_ExecuteProgram
The interpretation main loop
==================== ====================
*/ */
void PR_ExecuteProgram (func_t fnum) void PR_ExecuteProgram (func_t fnum)
{ {
eval_t *a, *b, *c; eval_t *a, *b, *c;
int s; eval_t *ptr;
int s;
dstatement_t *st; dstatement_t *st;
dfunction_t *f, *newf; dfunction_t *f, *newf;
int runaway; int runaway;
int i; int i;
edict_t *ed; edict_t *ed;
int exitdepth; int exitdepth;
eval_t *ptr;
if (!fnum || fnum >= progs->numfunctions) if (!fnum || fnum >= progs->numfunctions)
{ {
@ -389,10 +375,10 @@ void PR_ExecuteProgram (func_t fnum)
// make a stack frame // make a stack frame
exitdepth = pr_depth; exitdepth = pr_depth;
s = PR_EnterFunction (f); s = PR_EnterFunction(f);
while (1) while (1)
{ {
s++; // next statement s++; // next statement
st = &pr_statements[s]; st = &pr_statements[s];
@ -401,13 +387,13 @@ while (1)
c = (eval_t *)&pr_globals[st->c]; c = (eval_t *)&pr_globals[st->c];
if (!--runaway) if (!--runaway)
PR_RunError ("runaway loop error"); PR_RunError("runaway loop error");
pr_xfunction->profile++; pr_xfunction->profile++;
pr_xstatement = s; pr_xstatement = s;
if (pr_trace) if (pr_trace)
PR_PrintStatement (st); PR_PrintStatement(st);
switch (st->op) switch (st->op)
{ {
@ -433,9 +419,9 @@ while (1)
c->_float = a->_float * b->_float; c->_float = a->_float * b->_float;
break; break;
case OP_MUL_V: case OP_MUL_V:
c->_float = a->vector[0]*b->vector[0] c->_float = a->vector[0]*b->vector[0] +
+ a->vector[1]*b->vector[1] a->vector[1]*b->vector[1] +
+ a->vector[2]*b->vector[2]; a->vector[2]*b->vector[2];
break; break;
case OP_MUL_FV: case OP_MUL_FV:
c->vector[0] = a->_float * b->vector[0]; c->vector[0] = a->_float * b->vector[0];
@ -460,7 +446,6 @@ while (1)
c->_float = (int)a->_float | (int)b->_float; c->_float = (int)a->_float | (int)b->_float;
break; break;
case OP_GE: case OP_GE:
c->_float = a->_float >= b->_float; c->_float = a->_float >= b->_float;
break; break;
@ -501,11 +486,11 @@ while (1)
break; break;
case OP_EQ_V: case OP_EQ_V:
c->_float = (a->vector[0] == b->vector[0]) && c->_float = (a->vector[0] == b->vector[0]) &&
(a->vector[1] == b->vector[1]) && (a->vector[1] == b->vector[1]) &&
(a->vector[2] == b->vector[2]); (a->vector[2] == b->vector[2]);
break; break;
case OP_EQ_S: case OP_EQ_S:
c->_float = !strcmp(PR_GetString(a->string),PR_GetString(b->string)); c->_float = !strcmp(PR_GetString(a->string), PR_GetString(b->string));
break; break;
case OP_EQ_E: case OP_EQ_E:
c->_float = a->_int == b->_int; c->_float = a->_int == b->_int;
@ -514,14 +499,13 @@ while (1)
c->_float = a->function == b->function; c->_float = a->function == b->function;
break; break;
case OP_NE_F: case OP_NE_F:
c->_float = a->_float != b->_float; c->_float = a->_float != b->_float;
break; break;
case OP_NE_V: case OP_NE_V:
c->_float = (a->vector[0] != b->vector[0]) || c->_float = (a->vector[0] != b->vector[0]) ||
(a->vector[1] != b->vector[1]) || (a->vector[1] != b->vector[1]) ||
(a->vector[2] != b->vector[2]); (a->vector[2] != b->vector[2]);
break; break;
case OP_NE_S: case OP_NE_S:
c->_float = strcmp(PR_GetString(a->string),PR_GetString(b->string)); c->_float = strcmp(PR_GetString(a->string),PR_GetString(b->string));
@ -533,12 +517,11 @@ while (1)
c->_float = a->function != b->function; c->_float = a->function != b->function;
break; break;
//==================
case OP_STORE_F: case OP_STORE_F:
case OP_STORE_ENT: case OP_STORE_ENT:
case OP_STORE_FLD: // integers case OP_STORE_FLD: // integers
case OP_STORE_S: case OP_STORE_S:
case OP_STORE_FNC: // pointers case OP_STORE_FNC: // pointers
b->_int = a->_int; b->_int = a->_int;
break; break;
case OP_STORE_V: case OP_STORE_V:
@ -549,9 +532,9 @@ while (1)
case OP_STOREP_F: case OP_STOREP_F:
case OP_STOREP_ENT: case OP_STOREP_ENT:
case OP_STOREP_FLD: // integers case OP_STOREP_FLD: // integers
case OP_STOREP_S: case OP_STOREP_S:
case OP_STOREP_FNC: // pointers case OP_STOREP_FNC: // pointers
ptr = (eval_t *)((byte *)sv.edicts + b->_int); ptr = (eval_t *)((byte *)sv.edicts + b->_int);
ptr->_int = a->_int; ptr->_int = a->_int;
break; break;
@ -565,10 +548,10 @@ while (1)
case OP_ADDRESS: case OP_ADDRESS:
ed = PROG_TO_EDICT(a->edict); ed = PROG_TO_EDICT(a->edict);
#ifdef PARANOID #ifdef PARANOID
NUM_FOR_EDICT(ed); // make sure it's in range NUM_FOR_EDICT(ed); // Make sure it's in range
#endif #endif
if (ed == (edict_t *)sv.edicts && sv.state == ss_active) if (ed == (edict_t *)sv.edicts && sv.state == ss_active)
PR_RunError ("assignment to world entity"); PR_RunError("assignment to world entity");
c->_int = (byte *)((int *)&ed->v + b->_int) - (byte *)sv.edicts; c->_int = (byte *)((int *)&ed->v + b->_int) - (byte *)sv.edicts;
break; break;
@ -579,7 +562,7 @@ while (1)
case OP_LOAD_FNC: case OP_LOAD_FNC:
ed = PROG_TO_EDICT(a->edict); ed = PROG_TO_EDICT(a->edict);
#ifdef PARANOID #ifdef PARANOID
NUM_FOR_EDICT(ed); // make sure it's in range NUM_FOR_EDICT(ed); // Make sure it's in range
#endif #endif
a = (eval_t *)((int *)&ed->v + b->_int); a = (eval_t *)((int *)&ed->v + b->_int);
c->_int = a->_int; c->_int = a->_int;
@ -588,7 +571,7 @@ while (1)
case OP_LOAD_V: case OP_LOAD_V:
ed = PROG_TO_EDICT(a->edict); ed = PROG_TO_EDICT(a->edict);
#ifdef PARANOID #ifdef PARANOID
NUM_FOR_EDICT(ed); // make sure it's in range NUM_FOR_EDICT(ed); // Make sure it's in range
#endif #endif
a = (eval_t *)((int *)&ed->v + b->_int); a = (eval_t *)((int *)&ed->v + b->_int);
c->vector[0] = a->vector[0]; c->vector[0] = a->vector[0];
@ -609,7 +592,7 @@ while (1)
break; break;
case OP_GOTO: case OP_GOTO:
s += st->a - 1; // offset the s++ s += st->a - 1; // offset the s++
break; break;
case OP_CALL0: case OP_CALL0:
@ -623,31 +606,30 @@ while (1)
case OP_CALL8: case OP_CALL8:
pr_argc = st->op - OP_CALL0; pr_argc = st->op - OP_CALL0;
if (!a->function) if (!a->function)
PR_RunError ("NULL function"); PR_RunError("NULL function");
newf = &pr_functions[a->function]; newf = &pr_functions[a->function];
if (newf->first_statement < 0) if (newf->first_statement < 0)
{ // negative statements are built in functions { // Built-in function
i = -newf->first_statement; i = -newf->first_statement;
if (i >= pr_numbuiltins) if (i >= pr_numbuiltins)
PR_RunError ("Bad builtin call number"); PR_RunError("Bad builtin call number %d", i);
pr_builtins[i] (); pr_builtins[i]();
break; break;
} }
// Normal function
s = PR_EnterFunction (newf); s = PR_EnterFunction(newf);
break; break;
case OP_DONE: case OP_DONE:
case OP_RETURN: case OP_RETURN:
pr_globals[OFS_RETURN] = pr_globals[st->a]; pr_globals[OFS_RETURN] = pr_globals[st->a];
pr_globals[OFS_RETURN+1] = pr_globals[st->a+1]; pr_globals[OFS_RETURN + 1] = pr_globals[st->a + 1];
pr_globals[OFS_RETURN+2] = pr_globals[st->a+2]; pr_globals[OFS_RETURN + 2] = pr_globals[st->a + 2];
s = PR_LeaveFunction();
s = PR_LeaveFunction ();
if (pr_depth == exitdepth) if (pr_depth == exitdepth)
return; // all done { // Done
return;
}
break; break;
case OP_STATE: case OP_STATE:
@ -661,8 +643,8 @@ while (1)
break; break;
default: default:
PR_RunError ("Bad opcode %i", st->op); PR_RunError("Bad opcode %i", st->op);
} }
} /* end of while(1) loop */
} }
}

View file

@ -22,58 +22,62 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef _QUAKE_PROGS_H #ifndef _QUAKE_PROGS_H
#define _QUAKE_PROGS_H #define _QUAKE_PROGS_H
#include "pr_comp.h" // defs shared with qcc #include "pr_comp.h" /* defs shared with qcc */
#include "progdefs.h" // generated by program cdefs #include "progdefs.h" /* generated by program cdefs */
typedef union eval_s typedef union eval_s
{ {
string_t string; string_t string;
float _float; float _float;
float vector[3]; float vector[3];
func_t function; func_t function;
int _int; int _int;
int edict; int edict;
} eval_t; } eval_t;
#define MAX_ENT_LEAFS 16 #define MAX_ENT_LEAFS 16
typedef struct edict_s typedef struct edict_s
{ {
qboolean free; qboolean free;
link_t area; // linked to a division node or leaf link_t area; /* linked to a division node or leaf */
int num_leafs;
short leafnums[MAX_ENT_LEAFS]; int num_leafs;
short leafnums[MAX_ENT_LEAFS];
entity_state_t baseline; entity_state_t baseline;
unsigned char alpha; // johnfitz -- hack to support alpha since it's not part of entvars_t unsigned char alpha; /* johnfitz -- hack to support alpha since it's not part of entvars_t */
qboolean sendinterval; // johnfitz -- send time until nextthink to client for better lerp timing qboolean sendinterval; /* johnfitz -- send time until nextthink to client for better lerp timing */
float freetime; // sv.time when the object was freed
entvars_t v; // C exported fields from progs float freetime; /* sv.time when the object was freed */
// other fields from progs come immediately after entvars_t v; /* C exported fields from progs */
/* other fields from progs come immediately after */
} edict_t; } edict_t;
#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area)
#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,edict_t,area)
//============================================================================ //============================================================================
extern dprograms_t *progs; extern dprograms_t *progs;
extern dfunction_t *pr_functions; extern dfunction_t *pr_functions;
extern dstatement_t *pr_statements; extern dstatement_t *pr_statements;
extern globalvars_t *pr_global_struct; extern globalvars_t *pr_global_struct;
extern float *pr_globals; // same as pr_global_struct extern float *pr_globals; /* same as pr_global_struct */
extern int pr_edict_size; // in bytes extern int pr_edict_size; /* in bytes */
//============================================================================
void PR_Init (void); void PR_Init (void);
void PR_ExecuteProgram (func_t fnum); void PR_ExecuteProgram (func_t fnum);
void PR_LoadProgs (void); void PR_LoadProgs (void);
void PR_Profile_f (void);
const char *PR_GetString (int num); const char *PR_GetString (int num);
int PR_SetEngineString (const char *s); int PR_SetEngineString (const char *s);
int PR_AllocString (int bufferlength, char **ptr); int PR_AllocString (int bufferlength, char **ptr);
void PR_Profile_f (void);
edict_t *ED_Alloc (void); edict_t *ED_Alloc (void);
void ED_Free (edict_t *ed); void ED_Free (edict_t *ed);
@ -86,45 +90,44 @@ void ED_ParseGlobals (const char *data);
void ED_LoadFromFile (const char *data); void ED_LoadFromFile (const char *data);
//define EDICT_NUM(n) ((edict_t *)(sv.edicts+ (n)*pr_edict_size)) /*
//define NUM_FOR_EDICT(e) (((byte *)(e) - sv.edicts)/pr_edict_size) #define EDICT_NUM(n) ((edict_t *)(sv.edicts+ (n)*pr_edict_size))
#define NUM_FOR_EDICT(e) (((byte *)(e) - sv.edicts) / pr_edict_size)
*/
edict_t *EDICT_NUM(int n); edict_t *EDICT_NUM(int n);
int NUM_FOR_EDICT(edict_t *e); int NUM_FOR_EDICT(edict_t *e);
#define NEXT_EDICT(e) ((edict_t *)( (byte *)e + pr_edict_size)) #define NEXT_EDICT(e) ((edict_t *)( (byte *)e + pr_edict_size))
#define EDICT_TO_PROG(e) ((byte *)e - (byte *)sv.edicts) #define EDICT_TO_PROG(e) ((byte *)e - (byte *)sv.edicts)
#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e)) #define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e))
//============================================================================ #define G_FLOAT(o) (pr_globals[o])
#define G_INT(o) (*(int *)&pr_globals[o])
#define G_EDICT(o) ((edict_t *)((byte *)sv.edicts+ *(int *)&pr_globals[o]))
#define G_EDICTNUM(o) NUM_FOR_EDICT(G_EDICT(o))
#define G_VECTOR(o) (&pr_globals[o])
#define G_STRING(o) (PR_GetString(*(string_t *)&pr_globals[o]))
#define G_FUNCTION(o) (*(func_t *)&pr_globals[o])
#define G_FLOAT(o) (pr_globals[o]) #define E_FLOAT(e,o) (((float*)&e->v)[o])
#define G_INT(o) (*(int *)&pr_globals[o]) #define E_INT(e,o) (*(int *)&((float*)&e->v)[o])
#define G_EDICT(o) ((edict_t *)((byte *)sv.edicts+ *(int *)&pr_globals[o])) #define E_VECTOR(e,o) (&((float*)&e->v)[o])
#define G_EDICTNUM(o) NUM_FOR_EDICT(G_EDICT(o)) #define E_STRING(e,o) (PR_GetString(*(string_t *)&((float*)&e->v)[o]))
#define G_VECTOR(o) (&pr_globals[o])
#define G_STRING(o) (PR_GetString(*(string_t *)&pr_globals[o]))
#define G_FUNCTION(o) (*(func_t *)&pr_globals[o])
#define E_FLOAT(e,o) (((float*)&e->v)[o])
#define E_INT(e,o) (*(int *)&((float*)&e->v)[o])
#define E_VECTOR(e,o) (&((float*)&e->v)[o])
#define E_STRING(e,o) (PR_GetString(*(string_t *)&((float*)&e->v)[o]))
extern int type_size[8]; extern int type_size[8];
typedef void (*builtin_t) (void); typedef void (*builtin_t) (void);
extern builtin_t *pr_builtins; extern builtin_t *pr_builtins;
extern int pr_numbuiltins; extern int pr_numbuiltins;
extern int pr_argc; extern int pr_argc;
extern qboolean pr_trace; extern qboolean pr_trace;
extern dfunction_t *pr_xfunction; extern dfunction_t *pr_xfunction;
extern int pr_xstatement; extern int pr_xstatement;
extern unsigned short pr_crc; extern unsigned short pr_crc;
void PR_RunError (const char *error, ...) __attribute__((__format__(__printf__,1,2), __noreturn__)); void PR_RunError (const char *error, ...) __attribute__((__format__(__printf__,1,2), __noreturn__));