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