]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - misc/source/fteqcc-src/progsint.h
Latest fteqcc and netradiant sources
[voretournament/voretournament.git] / misc / source / fteqcc-src / progsint.h
1 #ifdef _WIN32
2         #define _CRT_SECURE_NO_WARNINGS
3         #define _CRT_NONSTDC_NO_WARNINGS
4         #ifndef AVAIL_ZLIB
5                 #ifdef _MSC_VER
6                         //#define AVAIL_ZLIB
7                 #endif
8         #endif
9
10         #include <windows.h>
11
12         enum{false, true};
13 #else
14         #include <stdarg.h>
15         #include <math.h>
16
17         #include <stdlib.h>
18         #include <setjmp.h>
19         #include <string.h>
20         #include <ctype.h>
21
22         #ifndef __declspec
23                 #define __declspec(mode)
24         #endif
25
26         typedef enum{false, true} boolean;
27 //#define _inline inline
28 #endif
29 typedef unsigned char qbyte;
30 #include <stdio.h>
31
32 #define DLL_PROG
33 #ifndef PROGSUSED
34 #define PROGSUSED
35 #endif
36
37 extern int maxedicts;
38 extern int maxprogs;
39 extern int hunksize;
40
41 #include "progtype.h"
42 #include "progslib.h"
43
44 #ifdef _MSC_VER
45 #pragma warning(disable : 4244)
46 #pragma warning(disable : 4267)
47 #endif
48
49 //extern progfuncs_t *progfuncs;
50
51 #define prinst progfuncs->prinst
52 #define externs progfuncs->parms
53
54 #include "pr_comp.h"
55
56 #include "qcd.h"
57
58 typedef struct
59 {
60         int                     targetflags;    //weather we need to mark the progs as a newer version
61         char            *name;
62         char            *opname;
63         int             priority;
64         enum {ASSOC_LEFT, ASSOC_RIGHT, ASSOC_RIGHT_RESULT}                      associative;
65         struct QCC_type_s               **type_a, **type_b, **type_c;
66 } QCC_opcode_t;
67 extern  QCC_opcode_t    pr_opcodes[];           // sized by initialization
68
69
70
71
72 #ifdef _MSC_VER
73 #define Q_vsnprintf _vsnprintf
74 #else
75 #define Q_vsnprintf vsnprintf
76 #endif
77
78
79 #define sv_num_edicts (*externs->sv_num_edicts)
80 #define sv_edicts (*externs->sv_edicts)
81
82 #define printf externs->printf
83 #define Sys_Error externs->Sys_Error
84 #define Abort externs->Abort
85
86 #define memalloc externs->memalloc
87 #define memfree externs->memfree
88
89 int PRHunkMark(progfuncs_t *progfuncs);
90 void PRHunkFree(progfuncs_t *progfuncs, int mark);
91 void *PRHunkAlloc(progfuncs_t *progfuncs, int size);
92 void *PRAddressableAlloc(progfuncs_t *progfuncs, int ammount);
93
94 #ifdef printf
95 #undef LIKEPRINTF
96 #define LIKEPRINTF(x)
97 #endif
98
99 //void *HunkAlloc (int size);
100 char *VARGS qcva (char *text, ...) LIKEPRINTF(1);
101 void QC_InitShares(progfuncs_t *progfuncs);
102 void QC_StartShares(progfuncs_t *progfuncs);
103 void QC_AddSharedVar(progfuncs_t *progfuncs, int num, int type);
104 void QC_AddSharedFieldVar(progfuncs_t *progfuncs, int num, char *stringtable);
105 int QC_RegisterFieldVar(progfuncs_t *progfuncs, unsigned int type, char *name, signed long requestedpos, signed long originalofs);
106 pbool Decompile(progfuncs_t *progfuncs, char *fname);
107 int PR_ToggleBreakpoint(progfuncs_t *progfuncs, char *filename, int linenum, int flag);
108 void    StripExtension (char *path);
109
110
111 #define edvars(ed) (((edictrun_t*)ed)->fields)  //pointer to the field vars, given an edict
112
113
114 void SetEndian(void);
115 extern short   (*PRBigShort) (short l);
116 extern short   (*PRLittleShort) (short l);
117 extern int     (*PRBigLong) (int l);
118 extern int     (*PRLittleLong) (int l);
119 extern float   (*PRBigFloat) (float l);
120 extern float   (*PRLittleFloat) (float l);
121
122
123
124 /*
125 #ifndef COMPILER
126 typedef union eval_s
127 {
128         string_t                string;
129         float                   _float;
130         float                   vector[3];
131         func_t                  function;
132         int                             _int;
133         int                             edict;
134         progsnum_t              prog;   //so it can easily be changed
135 } eval_t;
136 #endif
137 */
138
139 typedef struct edictrun_s
140 {
141         pbool   isfree;
142
143         float           freetime;                       // realtime when the object was freed
144         unsigned int entnum;
145         pbool   readonly;       //causes error when QC tries writing to it. (quake's world entity)
146         void    *fields;
147
148 // other fields from progs come immediately after
149 } edictrun_t;
150
151
152 int Comp_Begin(progfuncs_t *progfuncs, int nump, char **parms);
153 int Comp_Continue(progfuncs_t *progfuncs);
154
155 char *EvaluateDebugString(progfuncs_t *progfuncs, char *key);
156 char *SaveEnts(progfuncs_t *progfuncs, char *mem, int *size, int mode);
157 int LoadEnts(progfuncs_t *progfuncs, char *file, float killonspawnflags);
158 char *SaveEnt (progfuncs_t *progfuncs, char *buf, int *size, struct edict_s *ed);
159 struct edict_s *RestoreEnt (progfuncs_t *progfuncs, char *buf, int *size, struct edict_s *ed);
160 void PR_StackTrace (progfuncs_t *progfuncs);
161
162 extern int noextensions;
163
164 typedef enum
165 {
166         PST_DEFAULT, //16
167         PST_FTE32, //32
168         PST_KKQWSV, //24
169         PST_QTEST,
170 } progstructtype_t;
171
172 #ifndef COMPILER
173 typedef struct progstate_s
174 {
175         dprograms_t             *progs;
176         dfunction_t             *functions;
177         char                    *strings;
178         union {
179                 ddefXX_t                *globaldefs;
180                 ddef16_t                *globaldefs16;
181                 ddef32_t                *globaldefs32;
182         };
183         union {
184                 ddefXX_t                *fielddefs;
185                 ddef16_t                *fielddefs16;
186                 ddef32_t                *fielddefs32;
187         };
188         void    *statements;
189 //      void                    *global_struct;
190         float                   *globals;                       // same as pr_global_struct
191
192         typeinfo_t      *types;
193
194         int                             edict_size;     // in bytes
195
196         char                    filename[128];
197
198         builtin_t       *builtins;
199         int             numbuiltins;
200
201         int *linenums;  //debug versions only
202
203         progstructtype_t structtype;
204 } progstate_t;
205
206 typedef struct extensionbuiltin_s {
207         char *name;
208         builtin_t func;
209         struct extensionbuiltin_s *prev;
210 } extensionbuiltin_t;
211
212 //============================================================================
213
214
215 #define pr_progs                        current_progstate->progs
216 #define pr_functions            current_progstate->functions
217 #define pr_strings                      current_progstate->strings
218 #define pr_globaldefs16         ((ddef16_t*)current_progstate->globaldefs)
219 #define pr_globaldefs32         ((ddef32_t*)current_progstate->globaldefs)
220 #define pr_fielddefs16          ((ddef16_t*)current_progstate->fielddefs)
221 #define pr_fielddefs32          ((ddef32_t*)current_progstate->fielddefs)
222 #define pr_statements16         ((dstatement16_t*)current_progstate->statements)
223 #define pr_statements32         ((dstatement32_t*)current_progstate->statements)
224 //#define       pr_global_struct        current_progstate->global_struct
225 #define pr_globals                      current_progstate->globals
226 #define pr_linenums                     current_progstate->linenums
227 #define pr_types                        current_progstate->types
228
229
230
231 //============================================================================
232
233 void PR_Init (void);
234
235 void PR_ExecuteProgram (progfuncs_t *progfuncs, func_t fnum);
236 int PR_LoadProgs(progfuncs_t *progfncs, char *s, int headercrc, builtin_t *builtins, int numbuiltins);
237 int PR_ReallyLoadProgs (progfuncs_t *progfuncs, char *filename, int headercrc, progstate_t *progstate, pbool complain);
238
239 void *PRHunkAlloc(progfuncs_t *progfuncs, int ammount);
240
241 void PR_Profile_f (void);
242
243 struct edict_s *ED_Alloc (progfuncs_t *progfuncs);
244 void ED_Free (progfuncs_t *progfuncs, struct edict_s *ed);
245
246 char *ED_NewString (progfuncs_t *progfuncs, char *string, int minlength);
247 // returns a copy of the string allocated from the server's string heap
248
249 void ED_Print (progfuncs_t *progfuncs, struct edict_s *ed);
250 //void ED_Write (FILE *f, edictrun_t *ed);
251 char *ED_ParseEdict (progfuncs_t *progfuncs, char *data, edictrun_t *ent);
252
253 //void ED_WriteGlobals (FILE *f);
254 void ED_ParseGlobals (char *data);
255
256 //void ED_LoadFromFile (char *data);
257
258 //define EDICT_NUM(n) ((edict_t *)(sv.edicts+ (n)*pr_edict_size))
259 //define NUM_FOR_EDICT(e) (((byte *)(e) - sv.edicts)/pr_edict_size)
260
261 struct edict_s *EDICT_NUM(progfuncs_t *progfuncs, unsigned int n);
262 unsigned int NUM_FOR_EDICT(progfuncs_t *progfuncs, struct edict_s *e);
263
264 //#define       NEXT_EDICT(e) ((edictrun_t *)( (byte *)e + pr_edict_size))
265
266 #define EDICT_TO_PROG(pf, e) (((edictrun_t*)e)->entnum)
267 #define PROG_TO_EDICT(pf, e) ((struct edictrun_s *)prinst->edicttable[e])
268
269 //============================================================================
270
271 #define G_FLOAT(o) (pr_globals[o])
272 #define G_FLOAT2(o) (pr_globals[OFS_PARM0 + o*3])
273 #define G_INT(o) (*(int *)&pr_globals[o])
274 #define G_EDICT(o) ((edict_t *)((qbyte *)sv_edicts+ *(int *)&pr_globals[o]))
275 #define G_EDICTNUM(o) NUM_FOR_EDICT(G_EDICT(o))
276 #define G_VECTOR(o) (&pr_globals[o])
277 #define G_STRING(o) (*(string_t *)&pr_globals[o])
278 #define G_STRING2(o) ((char*)*(string_t *)&pr_globals[o])
279 #define GQ_STRING(o) (*(QCC_string_t *)&pr_globals[o])
280 #define GQ_STRING2(o) ((char*)*(QCC_string_t *)&pr_globals[o])
281 #define G_FUNCTION(o) (*(func_t *)&pr_globals[o])
282 #define G_PROG(o) (*(progsnum_t *)&pr_globals[o])       //simply so it's nice and easy to change...
283
284 #define RETURN_EDICT(e) (((int *)pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e))
285
286 #define E_FLOAT(e,o) (((float*)&e->v)[o])
287 #define E_INT(e,o) (*(int *)&((float*)&e->v)[o])
288 #define E_VECTOR(e,o) (&((float*)&e->v)[o])
289 #define E_STRING(e,o) (*(string_t *)&((float*)(e+1))[o])
290
291 const extern    unsigned int            type_size[];
292
293
294 extern  unsigned short          pr_crc;
295
296 void VARGS PR_RunError (progfuncs_t *progfuncs, char *error, ...) LIKEPRINTF(2);
297
298 void ED_PrintEdicts (progfuncs_t *progfuncs);
299 void ED_PrintNum (progfuncs_t *progfuncs, int ent);
300
301
302 pbool PR_SwitchProgs(progfuncs_t *progfuncs, progsnum_t type);
303 void PR_MoveParms(progfuncs_t *progfuncs, progsnum_t progs1, progsnum_t progs2);
304
305
306
307
308 eval_t *GetEdictFieldValue(progfuncs_t *progfuncs, struct edict_s *ed, char *name, evalc_t *cache);
309
310 #endif
311
312
313
314
315 #ifndef COMPILER
316
317 //this is windows - all files are written with this endian standard
318 //optimisation
319 //leave undefined if in doubt over os.
320 #ifdef _WIN32
321 #define NOENDIAN
322 #endif
323
324
325 typedef struct {
326         int varofs;
327         int size;
328 } sharedvar_t;
329 typedef struct
330 {
331         int                             s;
332         dfunction_t             *f;
333         int                             progsnum;
334         int pushed;
335 } prstack_t;
336
337
338
339 //pr_multi.c
340 void PR_SetBuiltins(int type);
341
342 #define var(type, name) type name
343 #define vars(type, name, size) type name[size]
344
345 typedef struct prinst_s {
346 #ifdef QCJIT
347         struct jitstate *jit;
348 #endif
349         char **tempstrings;
350         int maxtempstrings;
351         int numtempstrings;
352         int numtempstringsstack;
353
354         char **allocedstrings;
355         int maxallocedstrings;
356         int numallocedstrings;
357
358 var(progstate_t *, pr_progstate);
359 #define pr_progstate prinst->pr_progstate
360
361 var(progsnum_t, pr_typecurrent);
362 #define pr_typecurrent prinst->pr_typecurrent
363 var(unsigned int, maxprogs);
364 #define maxprogs prinst->maxprogs
365
366 var(progstate_t *,current_progstate);
367 #define current_progstate prinst->current_progstate
368
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
375
376 var(struct prmemb_s     *, memblocks);
377 #define memb prinst->memblocks
378
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
385
386 int reorganisefields;
387
388
389 //pr_exec.c
390 #define MAX_STACK_DEPTH         64
391 vars(prstack_t, pr_stack, MAX_STACK_DEPTH);
392 #define pr_stack prinst->pr_stack
393 var(int, pr_depth);
394 #define pr_depth prinst->pr_depth
395 var(int, spushed);
396 #define pr_spushed prinst->spushed
397
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
403
404 var(int, continuestatement);
405 var(int, exitdepth);
406
407 var(int, pr_trace);
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
413
414 var(int, pr_argc);
415 #define pr_argc prinst->pr_argc
416
417 //pr_edict.c
418
419 var(unsigned int, maxedicts);
420 #define maxedicts prinst->maxedicts
421
422 var(evalc_t, spawnflagscache);
423 #define spawnflagscache prinst->spawnflagscache
424
425
426
427
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
432
433
434 //initlib.c
435 var(char *, addressablehunk);
436 #define addressablehunk prinst->addressablehunk
437 var(unsigned int, addressableused);
438 #define addressableused prinst->addressableused
439 var(unsigned int, addressablesize);
440 #define addressablesize prinst->addressablesize
441
442
443 //var(extensionbuiltin_t *, extensionbuiltin);
444 //#define extensionbuiltin prinst->extensionbuiltin
445
446         struct edict_s **edicttable;
447 } prinst_t;
448 extern vec3_t vec3_origin;
449
450 eval_t *PR_FindGlobal(progfuncs_t *prfuncs, char *globname, progsnum_t pnum, etype_t *type);
451 ddef16_t *ED_FindTypeGlobalFromProgs16 (progfuncs_t *progfuncs, char *name, progsnum_t prnum, int type);
452 ddef32_t *ED_FindTypeGlobalFromProgs32 (progfuncs_t *progfuncs, char *name, progsnum_t prnum, int type);
453 ddef16_t *ED_FindGlobalFromProgs16 (progfuncs_t *progfuncs, char *name, progsnum_t prnum);
454 ddef32_t *ED_FindGlobalFromProgs32 (progfuncs_t *progfuncs, char *name, progsnum_t prnum);
455 fdef_t *ED_FindField (progfuncs_t *progfuncs, char *name);
456 fdef_t *ED_FieldAtOfs (progfuncs_t *progfuncs, unsigned int ofs);
457 dfunction_t *ED_FindFunction (progfuncs_t *progfuncs, char *name, progsnum_t *pnum, progsnum_t fromprogs);
458 func_t PR_FindFunc(progfuncs_t *progfncs, char *funcname, progsnum_t pnum);
459 void PR_Configure (progfuncs_t *progfncs, int addressable_size, int max_progs);
460 int PR_InitEnts(progfuncs_t *progfncs, int maxents);
461 char *PR_ValueString (progfuncs_t *progfuncs, etype_t type, eval_t *val);
462 void QC_ClearEdict (progfuncs_t *progfuncs, struct edict_s *ed);
463 void PRAddressableFlush(progfuncs_t *progfuncs, int totalammount);
464 void QC_FlushProgsOffsets(progfuncs_t *progfuncs);
465
466 ddef16_t *ED_GlobalAtOfs16 (progfuncs_t *progfuncs, int ofs);
467 ddef16_t *ED_FindGlobal16 (progfuncs_t *progfuncs, char *name);
468 ddef32_t *ED_FindGlobal32 (progfuncs_t *progfuncs, char *name);
469 ddef32_t *ED_GlobalAtOfs32 (progfuncs_t *progfuncs, unsigned int ofs);
470
471 string_t PR_StringToProgs                       (progfuncs_t *inst, char *str);
472 char *ASMCALL PR_StringToNative                         (progfuncs_t *inst, string_t str);
473
474 void PR_FreeTemps                       (progfuncs_t *progfuncs, int depth);
475
476 char *PR_GlobalString (progfuncs_t *progfuncs, int ofs);
477 char *PR_GlobalStringNoContents (progfuncs_t *progfuncs, int ofs);
478
479 pbool CompileFile(progfuncs_t *progfuncs, char *filename);
480
481 struct jitstate;
482 struct jitstate *PR_GenerateJit(progfuncs_t *progfuncs);
483 void PR_EnterJIT(progfuncs_t *progfuncs, struct jitstate *jitstate, int statement);
484
485 char *QCC_COM_Parse (char *data);
486 extern char     qcc_token[1024];
487 #endif