X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=progsvm.h;h=8270615d4fd830aa5256302a42364b9a99e63997;hb=cb642c507a7bc68ddf0f021347372d7dbb1d76d5;hp=b8ebe8008bc62110e075218c59fc6fdac7bd08c4;hpb=56561de0acdb9cf29d155992440ac3e0d32909dd;p=xonotic%2Fdarkplaces.git diff --git a/progsvm.h b/progsvm.h index b8ebe800..8270615d 100644 --- a/progsvm.h +++ b/progsvm.h @@ -31,6 +31,7 @@ The code uses void pointers instead. #include "pr_comp.h" // defs shared with qcc #include "progdefs.h" // generated by program cdefs +#include "clprogdefs.h" // generated by program cdefs /* typedef union vm_eval_s @@ -152,7 +153,7 @@ typedef union prvm_eval_s int edict; } prvm_eval_t; -typedef struct prvm_required_field_s +typedef struct prvm_required_field_s { int type; const char *name; @@ -200,14 +201,16 @@ typedef struct prvm_edict_s // However, the first one should be preferred. } priv; // QuakeC fields (stored in dynamically resized array) - union + union { void *vp; - entvars_t *server; + entvars_t *server; + cl_entvars_t *client; } fields; } prvm_edict_t; -#define PRVM_GETEDICTFIELDVALUE(ed, fieldoffset) (fieldoffset ? (prvm_eval_t *)((qbyte *)ed->fields.vp + fieldoffset) : NULL) +#define PRVM_GETEDICTFIELDVALUE(ed, fieldoffset) (fieldoffset ? (prvm_eval_t *)((unsigned char *)ed->fields.vp + fieldoffset) : NULL) +#define PRVM_GETGLOBALFIELDVALUE(fieldoffset) (fieldoffset ? (prvm_eval_t *)((unsigned char *)prog->globals.generic + fieldoffset) : NULL) /*// this struct is the basic requirement for a qc prog typedef struct prvm_pr_globalvars_s @@ -261,14 +264,24 @@ typedef struct prvm_prog_s int edict_size; // in bytes int edictareasize; // LordHavoc: in bytes (for bound checking) + int *statement_linenums; // NULL if not available + + double *statement_profile; // only incremented if prvm_statementprofiling is on + union { float *generic; globalvars_t *server; + cl_globalvars_t *client; } globals; int maxknownstrings; int numknownstrings; + // this is updated whenever a string is removed or added + // (simple optimization of the free string search) + int firstfreeknownstring; const char **knownstrings; + unsigned char *knownstrings_freeable; + const char ***stringshash; // all memory allocations related to this vm_prog (code, edicts, strings) mempool_t *progs_mempool; // [INIT] @@ -321,6 +334,10 @@ typedef struct prvm_prog_s float *time; float _time; + // allow writing to world entity fields, this is set by server init and + // cleared before first server frame + qboolean allowworldwrites; + // name of the prog, e.g. "Server", "Client" or "Menu" (used for text output) char *name; // [INIT] @@ -413,12 +430,14 @@ void _PRVM_Free (void *buffer, const char *filename, int fileline); void _PRVM_FreeAll (const char *filename, int fileline); void PRVM_Profile_f (void); +void PRVM_PrintFunction_f (void); void PRVM_PrintState(void); void PRVM_CrashAll (void); void PRVM_Crash (void); int PRVM_ED_FindFieldOffset(const char *field); +int PRVM_ED_FindGlobalOffset(const char *global); ddef_t *PRVM_ED_FindField (const char *name); mfunction_t *PRVM_ED_FindFunction (const char *name); @@ -428,6 +447,7 @@ prvm_edict_t *PRVM_ED_Alloc (void); void PRVM_ED_Free (prvm_edict_t *ed); void PRVM_ED_ClearEdict (prvm_edict_t *e); +void PRVM_PrintFunctionStatements (const char *name); void PRVM_ED_Print(prvm_edict_t *ed); void PRVM_ED_Write (qfile_t *f, prvm_edict_t *ed); const char *PRVM_ED_ParseEdict (const char *data, prvm_edict_t *ent); @@ -477,10 +497,9 @@ void PRVM_ED_PrintEdicts_f (void); void PRVM_ED_PrintNum (int ent); const char *PRVM_GetString(int num); -int PRVM_SetQCString(const char *s); int PRVM_SetEngineString(const char *s); -char *PRVM_AllocString(int bufferlength); -void PRVM_FreeString(char *s); +int PRVM_AllocString(size_t bufferlength, char **pointer); +void PRVM_FreeString(int num); //============================================================================ @@ -498,9 +517,9 @@ void PRVM_FreeString(char *s); //#define PRVM_SAFENAME #ifndef PRVM_SAFENAME - #define PRVM_NAME (prog->name) +# define PRVM_NAME (prog->name) #else - #define PRVM_NAME (prog->name ? prog->name : "Unknown prog name") +# define PRVM_NAME (prog->name ? prog->name : "Unknown prog name") #endif // helper macro to make function pointer calls easier