2 #ifndef _CRT_SECURE_NO_WARNINGS
3 #define _CRT_SECURE_NO_WARNINGS
5 #define _CRT_NONSTDC_NO_WARNINGS
25 #define __declspec(mode)
28 typedef enum{false, true} boolean;
29 //#define _inline inline
31 typedef unsigned char qbyte;
43 #pragma warning(disable : 4244)
44 #pragma warning(disable : 4267)
47 //extern progfuncs_t *progfuncs;
49 #define prinst progfuncs->inst
50 #define externs progfuncs->parms
58 int targetflags; //weather we need to mark the progs as a newer version
62 enum {ASSOC_LEFT, ASSOC_RIGHT, ASSOC_RIGHT_RESULT} associative;
63 struct QCC_type_s **type_a, **type_b, **type_c;
65 extern QCC_opcode_t pr_opcodes[]; // sized by initialization
71 #define Q_vsnprintf _vsnprintf
73 #define Q_vsnprintf vsnprintf
77 #define sv_num_edicts (*externs->sv_num_edicts)
78 #define sv_edicts (*externs->sv_edicts)
80 #define printf externs->printf
81 #define Sys_Error externs->Sys_Error
82 #define Abort externs->Abort
84 #define memalloc externs->memalloc
85 #define memfree externs->memfree
87 int PRHunkMark(progfuncs_t *progfuncs);
88 void PRHunkFree(progfuncs_t *progfuncs, int mark);
89 void *PRHunkAlloc(progfuncs_t *progfuncs, int size);
90 void *PRAddressableExtend(progfuncs_t *progfuncs, int ammount);
97 //void *HunkAlloc (int size);
98 char *VARGS qcva (char *text, ...) LIKEPRINTF(1);
99 void QC_InitShares(progfuncs_t *progfuncs);
100 void QC_StartShares(progfuncs_t *progfuncs);
101 void QC_AddSharedVar(progfuncs_t *progfuncs, int num, int type);
102 void QC_AddSharedFieldVar(progfuncs_t *progfuncs, int num, char *stringtable);
103 int QC_RegisterFieldVar(progfuncs_t *progfuncs, unsigned int type, char *name, signed long requestedpos, signed long originalofs);
104 pbool Decompile(progfuncs_t *progfuncs, char *fname);
105 int PR_ToggleBreakpoint(progfuncs_t *progfuncs, char *filename, int linenum, int flag);
106 void StripExtension (char *path);
109 #define edvars(ed) (((edictrun_t*)ed)->fields) //pointer to the field vars, given an edict
112 void SetEndian(void);
113 extern short (*PRBigShort) (short l);
114 extern short (*PRLittleShort) (short l);
115 extern int (*PRBigLong) (int l);
116 extern int (*PRLittleLong) (int l);
117 extern float (*PRBigFloat) (float l);
118 extern float (*PRLittleFloat) (float l);
132 progsnum_t prog; //so it can easily be changed
137 typedef struct edictrun_s
141 float freetime; // realtime when the object was freed
143 pbool readonly; //causes error when QC tries writing to it. (quake's world entity)
146 // other fields from progs come immediately after
150 int Comp_Begin(progfuncs_t *progfuncs, int nump, char **parms);
151 int Comp_Continue(progfuncs_t *progfuncs);
153 char *EvaluateDebugString(progfuncs_t *progfuncs, char *key);
154 char *SaveEnts(progfuncs_t *progfuncs, char *mem, int *size, int mode);
155 int LoadEnts(progfuncs_t *progfuncs, char *file, float killonspawnflags);
156 char *SaveEnt (progfuncs_t *progfuncs, char *buf, int *size, struct edict_s *ed);
157 struct edict_s *RestoreEnt (progfuncs_t *progfuncs, char *buf, int *size, struct edict_s *ed);
158 void PR_StackTrace (progfuncs_t *progfuncs);
160 extern int noextensions;
171 typedef struct progstate_s
174 dfunction_t *functions;
177 ddefXX_t *globaldefs;
178 ddef16_t *globaldefs16;
179 ddef32_t *globaldefs32;
183 ddef16_t *fielddefs16;
184 ddef32_t *fielddefs32;
187 // void *global_struct;
188 float *globals; // same as pr_global_struct
189 int globals_size; // in bytes
193 int edict_size; // in bytes
200 int *linenums; //debug versions only
202 progstructtype_t structtype;
205 struct jitstate *jit;
209 typedef struct extensionbuiltin_s {
212 struct extensionbuiltin_s *prev;
213 } extensionbuiltin_t;
215 //============================================================================
218 #define pr_progs current_progstate->progs
219 #define pr_functions current_progstate->functions
220 #define pr_strings current_progstate->strings
221 #define pr_globaldefs16 ((ddef16_t*)current_progstate->globaldefs)
222 #define pr_globaldefs32 ((ddef32_t*)current_progstate->globaldefs)
223 #define pr_fielddefs16 ((ddef16_t*)current_progstate->fielddefs)
224 #define pr_fielddefs32 ((ddef32_t*)current_progstate->fielddefs)
225 #define pr_statements16 ((dstatement16_t*)current_progstate->statements)
226 #define pr_statements32 ((dstatement32_t*)current_progstate->statements)
227 //#define pr_global_struct current_progstate->global_struct
228 #define pr_globals current_progstate->globals
229 #define pr_linenums current_progstate->linenums
230 #define pr_types current_progstate->types
234 //============================================================================
238 void PR_ExecuteProgram (progfuncs_t *progfuncs, func_t fnum);
239 int PR_LoadProgs(progfuncs_t *progfncs, char *s, int headercrc, builtin_t *builtins, int numbuiltins);
240 int PR_ReallyLoadProgs (progfuncs_t *progfuncs, char *filename, int headercrc, progstate_t *progstate, pbool complain);
242 void *PRHunkAlloc(progfuncs_t *progfuncs, int ammount);
244 void PR_Profile_f (void);
246 struct edict_s *ED_Alloc (progfuncs_t *progfuncs);
247 void ED_Free (progfuncs_t *progfuncs, struct edict_s *ed);
249 char *ED_NewString (progfuncs_t *progfuncs, char *string, int minlength);
250 // returns a copy of the string allocated from the server's string heap
252 void ED_Print (progfuncs_t *progfuncs, struct edict_s *ed);
253 //void ED_Write (FILE *f, edictrun_t *ed);
254 char *ED_ParseEdict (progfuncs_t *progfuncs, char *data, edictrun_t *ent);
256 //void ED_WriteGlobals (FILE *f);
257 void ED_ParseGlobals (char *data);
259 //void ED_LoadFromFile (char *data);
261 //define EDICT_NUM(n) ((edict_t *)(sv.edicts+ (n)*pr_edict_size))
262 //define NUM_FOR_EDICT(e) (((byte *)(e) - sv.edicts)/pr_edict_size)
264 struct edict_s *EDICT_NUM(progfuncs_t *progfuncs, unsigned int n);
265 unsigned int NUM_FOR_EDICT(progfuncs_t *progfuncs, struct edict_s *e);
267 //#define NEXT_EDICT(e) ((edictrun_t *)( (byte *)e + pr_edict_size))
269 #define EDICT_TO_PROG(pf, e) (((edictrun_t*)e)->entnum)
270 #define PROG_TO_EDICT(pf, e) ((struct edictrun_s *)prinst->edicttable[e])
272 //============================================================================
274 #define G_FLOAT(o) (pr_globals[o])
275 #define G_FLOAT2(o) (pr_globals[OFS_PARM0 + o*3])
276 #define G_INT(o) (*(int *)&pr_globals[o])
277 #define G_EDICT(o) ((edict_t *)((qbyte *)sv_edicts+ *(int *)&pr_globals[o]))
278 #define G_EDICTNUM(o) NUM_FOR_EDICT(G_EDICT(o))
279 #define G_VECTOR(o) (&pr_globals[o])
280 #define G_STRING(o) (*(string_t *)&pr_globals[o])
281 #define G_STRING2(o) ((char*)*(string_t *)&pr_globals[o])
282 #define GQ_STRING(o) (*(QCC_string_t *)&pr_globals[o])
283 #define GQ_STRING2(o) ((char*)*(QCC_string_t *)&pr_globals[o])
284 #define G_FUNCTION(o) (*(func_t *)&pr_globals[o])
285 #define G_PROG(o) G_FLOAT(o) //simply so it's nice and easy to change...
287 #define RETURN_EDICT(e) (((int *)pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e))
289 #define E_FLOAT(e,o) (((float*)&e->v)[o])
290 #define E_INT(e,o) (*(int *)&((float*)&e->v)[o])
291 #define E_VECTOR(e,o) (&((float*)&e->v)[o])
292 #define E_STRING(e,o) (*(string_t *)&((float*)(e+1))[o])
294 const extern unsigned int type_size[];
297 extern unsigned short pr_crc;
299 void VARGS PR_RunError (progfuncs_t *progfuncs, char *error, ...) LIKEPRINTF(2);
301 void ED_PrintEdicts (progfuncs_t *progfuncs);
302 void ED_PrintNum (progfuncs_t *progfuncs, int ent);
305 pbool PR_SwitchProgs(progfuncs_t *progfuncs, progsnum_t type);
306 void PR_MoveParms(progfuncs_t *progfuncs, progsnum_t progs1, progsnum_t progs2);
311 eval_t *GetEdictFieldValue(progfuncs_t *progfuncs, struct edict_s *ed, char *name, evalc_t *cache);
320 //this is windows - all files are written with this endian standard
322 //leave undefined if in doubt over os.
343 void PR_SetBuiltins(int type);
345 #define var(type, name) type name
346 #define vars(type, name, size) type name[size]
348 typedef struct prinst_s {
352 int numtempstringsstack;
354 char **allocedstrings;
355 int maxallocedstrings;
356 int numallocedstrings;
358 var(progstate_t *, progstate);
359 #define pr_progstate prinst->progstate
361 var(progsnum_t, pr_typecurrent);
362 #define pr_typecurrent prinst->pr_typecurrent
363 var(unsigned int, maxprogs);
364 #define maxprogs prinst->maxprogs
366 var(progstate_t *,current_progstate);
367 #define current_progstate prinst->current_progstate
369 var(unsigned int, numshares);
370 #define numshares prinst->numshares
371 var(sharedvar_t *,shares); //shared globals, not including parms
372 #define shares prinst->shares
373 var(unsigned int, maxshares);
374 #define maxshares prinst->maxshares
376 var(struct prmemb_s *, memblocks);
377 #define memb prinst->memblocks
379 var(unsigned int, maxfields);
380 #define maxfields prinst->maxfields
381 var(unsigned int, numfields);
382 #define numfields prinst->numfields
383 var(fdef_t*, field); //biggest size
384 #define field prinst->field
386 int reorganisefields;
390 #define MAX_STACK_DEPTH 64
391 vars(prstack_t, pr_stack, MAX_STACK_DEPTH);
392 #define pr_stack prinst->pr_stack
394 #define pr_depth prinst->pr_depth
396 #define pr_spushed prinst->spushed
398 #define LOCALSTACK_SIZE 4096
399 vars(int, localstack, LOCALSTACK_SIZE);
400 #define localstack prinst->localstack
401 var(int, localstack_used);
402 #define localstack_used prinst->localstack_used
404 var(int, continuestatement);
408 #define pr_trace prinst->pr_trace
409 var(dfunction_t *, pr_xfunction);
410 #define pr_xfunction prinst->pr_xfunction
411 var(int, pr_xstatement);
412 #define pr_xstatement prinst->pr_xstatement
415 #define pr_argc prinst->pr_argc
419 var(unsigned int, maxedicts);
420 #define maxedicts prinst->maxedicts
422 var(evalc_t, spawnflagscache);
423 #define spawnflagscache prinst->spawnflagscache
428 var(unsigned int, fields_size); // in bytes
429 #define fields_size prinst->fields_size
430 var(unsigned int, max_fields_size);
431 #define max_fields_size prinst->max_fields_size
436 var(char *, addressablehunk);
437 var(unsigned int, addressableused);
438 var(unsigned int, addressablesize);
441 //var(extensionbuiltin_t *, extensionbuiltin);
442 //#define extensionbuiltin prinst->extensionbuiltin
444 struct edict_s **edicttable;
446 extern vec3_t vec3_origin;
448 eval_t *PR_FindGlobal(progfuncs_t *prfuncs, char *globname, progsnum_t pnum, etype_t *type);
449 ddef16_t *ED_FindTypeGlobalFromProgs16 (progfuncs_t *progfuncs, char *name, progsnum_t prnum, int type);
450 ddef32_t *ED_FindTypeGlobalFromProgs32 (progfuncs_t *progfuncs, char *name, progsnum_t prnum, int type);
451 ddef16_t *ED_FindGlobalFromProgs16 (progfuncs_t *progfuncs, char *name, progsnum_t prnum);
452 ddef32_t *ED_FindGlobalFromProgs32 (progfuncs_t *progfuncs, char *name, progsnum_t prnum);
453 fdef_t *ED_FindField (progfuncs_t *progfuncs, char *name);
454 fdef_t *ED_FieldAtOfs (progfuncs_t *progfuncs, unsigned int ofs);
455 dfunction_t *ED_FindFunction (progfuncs_t *progfuncs, char *name, progsnum_t *pnum, progsnum_t fromprogs);
456 func_t PR_FindFunc(progfuncs_t *progfncs, char *funcname, progsnum_t pnum);
457 void PR_Configure (progfuncs_t *progfncs, int addressable_size, int max_progs);
458 int PR_InitEnts(progfuncs_t *progfncs, int maxents);
459 char *PR_ValueString (progfuncs_t *progfuncs, etype_t type, eval_t *val);
460 void QC_ClearEdict (progfuncs_t *progfuncs, struct edict_s *ed);
461 void PRAddressableFlush(progfuncs_t *progfuncs, int totalammount);
462 void QC_FlushProgsOffsets(progfuncs_t *progfuncs);
464 ddef16_t *ED_GlobalAtOfs16 (progfuncs_t *progfuncs, int ofs);
465 ddef16_t *ED_FindGlobal16 (progfuncs_t *progfuncs, char *name);
466 ddef32_t *ED_FindGlobal32 (progfuncs_t *progfuncs, char *name);
467 ddef32_t *ED_GlobalAtOfs32 (progfuncs_t *progfuncs, unsigned int ofs);
469 string_t PR_StringToProgs (progfuncs_t *inst, char *str);
470 char *ASMCALL PR_StringToNative (progfuncs_t *inst, string_t str);
472 void PR_FreeTemps (progfuncs_t *progfuncs, int depth);
474 char *PR_GlobalString (progfuncs_t *progfuncs, int ofs);
475 char *PR_GlobalStringNoContents (progfuncs_t *progfuncs, int ofs);
477 pbool CompileFile(progfuncs_t *progfuncs, char *filename);
480 struct jitstate *PR_GenerateJit(progfuncs_t *progfuncs);
481 void PR_EnterJIT(progfuncs_t *progfuncs, struct jitstate *jitstate, int statement);
482 void PR_CloseJit(struct jitstate *jit);
484 char *QCC_COM_Parse (char *data);
485 extern char qcc_token[1024];