4 //#define COMMONINLINES
5 //#define inline _inline
20 #ifdef __MINGW32_VERSION
24 #define progfuncs qccprogfuncs
25 extern progfuncs_t *qccprogfuncs;
28 #define stricmp strcasecmp
29 #define strnicmp strncasecmp
32 void *qccHunkAlloc(size_t mem);
33 void qccClearHunk(void);
35 extern short (*PRBigShort) (short l);
36 extern short (*PRLittleShort) (short l);
37 extern int (*PRBigLong) (int l);
38 extern int (*PRLittleLong) (int l);
39 extern float (*PRBigFloat) (float l);
40 extern float (*PRLittleFloat) (float l);
45 #define MAX_NAME 256 // chars long
47 extern unsigned int MAX_REGS;
49 extern int MAX_STRINGS;
50 extern int MAX_GLOBALS;
51 extern int MAX_FIELDS;
52 extern int MAX_STATEMENTS;
53 extern int MAX_FUNCTIONS;
55 #define MAX_SOUNDS 1024 //convert to int?
56 #define MAX_TEXTURES 1024 //convert to int?
57 #define MAX_MODELS 1024 //convert to int?
58 #define MAX_FILES 1024 //convert to int?
59 #define MAX_DATA_PATH 64
61 extern int MAX_CONSTANTS;
62 #define MAXCONSTANTNAMELENGTH 64
63 #define MAXCONSTANTPARAMLENGTH 32
64 #define MAXCONSTANTPARAMS 32
66 typedef enum {QCF_STANDARD, QCF_HEXEN2, QCF_DARKPLACES, QCF_FTE, QCF_FTEDEBUG, QCF_KK7, QCF_QTEST} qcc_targetformat_t;
67 extern qcc_targetformat_t qcc_targetformat;
74 "stopped at 10 errors"
76 other pointer types for models and clients?
80 always initialize all variables to something safe
82 the def->type->type arrangement is really silly.
86 parm count type checking
88 immediate overflow checking
90 pass the first two parms in call->b and call->c
98 // comments discard text until the end of line
99 / * * / comments discard all enclosed text (spaced out on this line because this documentation is in a regular C comment block, and typing them in normally causes a parse error)
104 <type> <name> [ = <immediate>] {, <name> [ = <immediate>] };
109 simple types: void, float, vector, string, or entity
115 vector org; // also creates org_x, org_y, and org_z float defs
118 A function type is specified as: simpletype ( type name {,type name} )
119 The names are ignored except when the function is initialized.
122 void(vector destination, float speed, void() callback) SUB_CalcMove;
123 void(...) dprint; // variable argument builtin
125 A field type is specified as: .type
128 .void() think, touch, use;
133 Names are a maximum of 64 characters, must begin with A-Z,a-z, or _, and can continue with those characters or 0-9.
135 There are two levels of scoping: global, and function. The parameter list of a function and any vars declared inside a function with the "local" statement are only visible within that function,
140 Float immediates must begin with 0-9 or minus sign. .5 is illegal.
142 A parsing ambiguity is present with negative constants. "a-5" will be parsed as "a", then "-5", causing an error. Seperate the - from the digits with a space "a - 5" to get the proper behavior.
148 Vector immediates are three float immediates enclosed in single quotes.
152 String immediates are characters enclosed in double quotes. The string cannot contain explicit newlines, but the escape character \n can embed one. The \" escape can be used to include a quote in the string.
157 Code immediates are statements enclosed in {} braces.
159 { <multiple statements> }
161 local <type> <name> [ = <immediate>] {, <name> [ = <immediate>] };
163 if ( <expression> ) <statement> [ else <statement> ];
164 while ( <expression> ) <statement>;
165 do <statement> while ( <expression> );
166 <function name> ( <function parms> );
169 combiations of names and these operators with standard C precedence:
170 "&&", "||", "<=", ">=","==", "!=", "!", "*", "/", "-", "+", "=", ".", "<", ">", "&", "|"
171 Parenthesis can be used to alter order of operation.
172 The & and | operations perform integral bit ops on floats
174 A built in function immediate is a number sign followed by an integer.
181 Source files are processed sequentially without dumping any state, so if a defs file is the first one processed, the definitions will be available to all other files.
183 The language is strongly typed and there are no casts.
185 Anything that is initialized is assumed to be constant, and will have immediates folded into it. If you change the value, your program will malfunction. All uninitialized globals will be saved to savegame files.
187 Functions cannot have more than eight parameters.
189 Error recovery during compilation is minimal. It will skip to the next global definition, so you will never see more than one error at a time in a given function. All compilation aborts after ten error messages.
191 Names can be defined multiple times until they are defined with an initialization, allowing functions to be prototyped before their definition.
193 void() MyFunction; // the prototype
195 void() MyFunction = // the initialization
197 dprint ("we're here\n");
207 Code execution is initiated by C code in quake from two main places: the timed think routines for periodic control, and the touch function when two objects impact each other.
209 There are three global variables that are set before beginning code execution:
210 entity world; // the server's world object, which holds all global
211 // state for the server, like the deathmatch flags
212 // and the body ques.
213 entity self; // the entity the function is executing for
214 entity other; // the other object in an impact, not used for thinks
215 float time; // the current game time. Note that because the
216 // entities in the world are simulated sequentially,
217 // time is NOT strictly increasing. An impact late
218 // in one entity's time slice may set time higher
219 // than the think function of the next entity.
220 // The difference is limited to 0.1 seconds.
221 Execution is also caused by a few uncommon events, like the addition of a new client to an existing server.
223 There is a runnaway counter that stops a program if 100000 statements are executed, assuming it is in an infinite loop.
225 It is acceptable to change the system set global variables. This is usually done to pose as another entity by changing self and calling a function.
227 The interpretation is fairly efficient, but it is still over an order of magnitude slower than compiled C code. All time consuming operations should be made into built in functions.
229 A profile counter is kept for each function, and incremented for each interpreted instruction inside that function. The "profile" console command in Quake will dump out the top 10 functions, then clear all the counters. The "profile all" command will dump sorted stats for every function that has been executed.
232 afunc ( 4, bfunc(1,2,3));
233 will fail because there is a shared parameter marshaling area, which will cause the 1 from bfunc to overwrite the 4 already placed in parm0. When a function is called, it copies the parms from the globals into it's privately scoped variables, so there is no collision when calling another function.
235 total = factorial(3) + factorial(4);
236 Will fail because the return value from functions is held in a single global area. If this really gets on your nerves, tell me and I can work around it at a slight performance and space penalty by allocating a new register for the function call and copying it out.
241 void(string text) dprint;
242 Prints the string to the server console.
244 void(entity client, string text) cprint;
245 Prints a message to a specific client.
247 void(string text) bprint;
248 Broadcast prints a message to all clients on the current server.
251 Returns a totally empty entity. You can manually set everything up, or just set the origin and call one of the existing entity setup functions.
253 entity(entity start, .string field, string match) find;
254 Searches the server entity list beginning at start, looking for an entity that has entity.field = match. To start at the beginning of the list, pass world. World is returned when the end of the list is reached.
256 <FIXME: define all the other functions...>
262 The && and || operators DO NOT EARLY OUT like C!
264 Don't confuse single quoted vectors with double quoted strings
266 The function declaration syntax takes a little getting used to.
268 Don't forget the ; after the trailing brace of a function initialization.
270 Don't forget the "local" before defining local variables.
272 There are no ++ / -- operators, or operate/assign operators.
279 extern hashtable_t compconstantstable;
280 extern hashtable_t globalstable, localstable;
284 extern FILE *asmfile;
286 //=============================================================================
288 // offsets are always multiplied by 4 before using
289 typedef unsigned int gofs_t; // offset in global data block
290 typedef struct QCC_function_s QCC_function_t;
294 typedef struct QCC_type_s
298 struct QCC_type_s *parentclass; //type_entity...
299 struct QCC_type_s *next;
300 // function types are more complex
301 struct QCC_type_s *aux_type; // return type or field type
302 struct QCC_type_s *param;
303 int num_parms; // -1 = variable args
304 // struct QCC_type_s *parm_types[MAX_PARMS]; // only [num_parms] allocated
306 unsigned int ofs; //inside a structure.
308 unsigned int arraysize;
312 int typecmp(QCC_type_t *a, QCC_type_t *b);
314 typedef struct temp_s {
316 struct QCC_def_s *scope;
318 struct QCC_def_s *lastfunc;
324 void QCC_PurgeTemps(void);
327 typedef struct QCC_def_s
331 struct QCC_def_s *next;
332 struct QCC_def_s *nextlocal; //provides a chain of local variables for the opt_locals_marshalling optimisation.
334 struct QCC_def_s *scope; // function the var was defined in, or NULL
335 struct QCC_def_s *deftail; // arrays and structs create multiple globaldef objects providing different types at the different parts of the single object (struct), or alternative names (vectors). this allows us to correctly set the const type based upon how its initialised.
336 int initialized; // 1 when a declaration included "= immediate"
337 int constant; // 1 says we can use the value over and over again
340 int timescalled; //part of the opt_stripfunctions optimisation.
349 pbool subscoped_away:1;
355 //============================================================================
357 // pr_loc.h -- program local defs
360 //=============================================================================
361 extern char QCC_copyright[1024];
362 extern char QCC_Packname[5][128];
363 extern int QCC_packid;
365 typedef union QCC_eval_s
372 union QCC_eval_s *ptr;
375 const extern unsigned int type_size[];
376 //extern QCC_def_t *def_for_type[9];
378 extern QCC_type_t *type_void, *type_string, *type_float, *type_vector, *type_entity, *type_field, *type_function, *type_pointer, *type_floatpointer, *type_intpointer, *type_integer, *type_variant, *type_floatfield;
380 struct QCC_function_s
382 int builtin; // if non 0, call an internal function
383 int code; // first statement
384 char *file; // source file with definition
386 struct QCC_def_s *def;
387 unsigned int parm_ofs[MAX_PARMS]; // always contiguous, right?
392 // output generated by prog parsing
401 QCC_def_t def_head; // unused head of linked list
402 QCC_def_t *def_tail; // add new defs after this and move it
403 QCC_def_t *localvars; // chain of variables which need to be pushed and stuff.
408 extern QCC_pr_info_t pr;
413 char name[MAXCONSTANTNAMELENGTH];
415 char params[MAXCONSTANTPARAMS][MAXCONSTANTPARAMLENGTH];
421 } CompilerConstant_t;
422 extern CompilerConstant_t *CompilerConstant;
424 //============================================================================
426 extern pbool pr_dumpasm;
428 //extern QCC_def_t **pr_global_defs; // to find def for a global variable
431 tt_eof, // end of file reached
432 tt_name, // an alphanumeric name token
433 tt_punct, // code punctuation
434 tt_immediate, // string, float, vector
437 extern char pr_token[8192];
438 extern token_type_t pr_token_type;
439 extern QCC_type_t *pr_immediate_type;
440 extern QCC_eval_t pr_immediate;
442 extern pbool keyword_asm;
443 extern pbool keyword_break;
444 extern pbool keyword_case;
445 extern pbool keyword_class;
446 extern pbool keyword_const;
447 extern pbool keyword_optional;
448 extern pbool keyword_continue;
449 extern pbool keyword_default;
450 extern pbool keyword_do;
451 extern pbool keyword_entity;
452 extern pbool keyword_float;
453 extern pbool keyword_for;
454 extern pbool keyword_goto;
455 extern pbool keyword_int;
456 extern pbool keyword_integer;
457 extern pbool keyword_state;
458 extern pbool keyword_string;
459 extern pbool keyword_struct;
460 extern pbool keyword_switch;
461 extern pbool keyword_thinktime;
462 extern pbool keyword_var;
463 extern pbool keyword_vector;
464 extern pbool keyword_union;
465 extern pbool keyword_enum; //kinda like in c, but typedef not supported.
466 extern pbool keyword_enumflags; //like enum, but doubles instead of adds 1.
467 extern pbool keyword_typedef; //fixme
468 extern pbool keyword_extern; //function is external, don't error or warn if the body was not found
469 extern pbool keyword_shared; //mark global to be copied over when progs changes (part of FTE_MULTIPROGS)
470 extern pbool keyword_noref; //nowhere else references this, don't strip it.
471 extern pbool keyword_nosave; //don't write the def to the output.
472 extern pbool keyword_union; //you surly know what a union is!
475 extern pbool keywords_coexist;
476 extern pbool output_parms;
477 extern pbool autoprototype;
478 extern pbool pr_subscopedlocals;
479 extern pbool flag_ifstring;
480 extern pbool flag_iffloat;
481 extern pbool flag_acc;
482 extern pbool flag_caseinsensative;
483 extern pbool flag_laxcasts;
484 extern pbool flag_hashonly;
485 extern pbool flag_fasttrackarrays;
486 extern pbool flag_assume_integer;
487 extern pbool flag_msvcstyle;
488 extern pbool flag_filetimes;
489 extern pbool flag_typeexplicit;
491 extern pbool opt_overlaptemps;
492 extern pbool opt_shortenifnots;
493 extern pbool opt_noduplicatestrings;
494 extern pbool opt_constantarithmatic;
495 extern pbool opt_nonvec_parms;
496 extern pbool opt_constant_names;
497 extern pbool opt_precache_file;
498 extern pbool opt_filenames;
499 extern pbool opt_assignments;
500 extern pbool opt_unreferenced;
501 extern pbool opt_function_names;
502 extern pbool opt_locals;
503 extern pbool opt_dupconstdefs;
504 extern pbool opt_constant_names_strings;
505 extern pbool opt_return_only;
506 extern pbool opt_compound_jumps;
507 //extern pbool opt_comexprremoval;
508 extern pbool opt_stripfunctions;
509 extern pbool opt_locals_marshalling;
510 extern pbool opt_logicops;
511 extern pbool opt_vectorcalls;
513 extern int optres_shortenifnots;
514 extern int optres_overlaptemps;
515 extern int optres_noduplicatestrings;
516 extern int optres_constantarithmatic;
517 extern int optres_nonvec_parms;
518 extern int optres_constant_names;
519 extern int optres_precache_file;
520 extern int optres_filenames;
521 extern int optres_assignments;
522 extern int optres_unreferenced;
523 extern int optres_function_names;
524 extern int optres_locals;
525 extern int optres_dupconstdefs;
526 extern int optres_constant_names_strings;
527 extern int optres_return_only;
528 extern int optres_compound_jumps;
529 //extern int optres_comexprremoval;
530 extern int optres_stripfunctions;
531 extern int optres_locals_marshalling;
532 extern int optres_logicops;
534 pbool CompileParams(progfuncs_t *progfuncs, int doall, int nump, char **parms);
536 void QCC_PR_PrintStatement (QCC_dstatement_t *s);
538 void QCC_PR_Lex (void);
539 // reads the next token into pr_token and classifies its type
541 QCC_type_t *QCC_PR_NewType (char *name, int basictype, pbool typedefed);
542 QCC_type_t *QCC_PointerTypeTo(QCC_type_t *type);
543 QCC_type_t *QCC_PR_ParseType (int newtype, pbool silentfail);
544 extern pbool type_inlinefunction;
545 QCC_type_t *QCC_TypeForName(char *name);
546 QCC_type_t *QCC_PR_ParseFunctionType (int newtype, QCC_type_t *returntype);
547 QCC_type_t *QCC_PR_ParseFunctionTypeReacc (int newtype, QCC_type_t *returntype);
548 char *QCC_PR_ParseName (void);
549 CompilerConstant_t *QCC_PR_DefineName(char *name);
551 void QCC_RemapOffsets(unsigned int firststatement, unsigned int laststatement, unsigned int min, unsigned int max, unsigned int newmin);
553 int QCC_PR_IntConstExpr(void);
555 #ifndef COMMONINLINES
556 pbool QCC_PR_CheckImmediate (char *string);
557 pbool QCC_PR_CheckToken (char *string);
558 pbool QCC_PR_CheckName (char *string);
559 void QCC_PR_Expect (char *string);
560 pbool QCC_PR_CheckKeyword(int keywordenabled, char *string);
562 void VARGS QCC_PR_ParseError (int errortype, char *error, ...);
563 void VARGS QCC_PR_ParseWarning (int warningtype, char *error, ...);
564 pbool VARGS QCC_PR_Warning (int type, char *file, int line, char *error, ...);
565 void VARGS QCC_PR_Note (int type, char *file, int line, char *error, ...);
566 void QCC_PR_ParsePrintDef (int warningtype, QCC_def_t *def);
567 void VARGS QCC_PR_ParseErrorPrintDef (int errortype, QCC_def_t *def, char *error, ...);
569 int QCC_WarningForName(char *name);
571 //QccMain.c must be changed if this is changed.
576 WARN_NOTREFERENCEDCONST,
577 WARN_CONFLICTINGRETURNS,
580 WARN_UNEXPECTEDPUNCT,
581 WARN_ASSIGNMENTTOCONSTANT,
582 WARN_ASSIGNMENTTOCONSTANTFUNC,
583 WARN_MISSINGRETURNVALUE,
584 WARN_WRONGRETURNTYPE,
585 WARN_CORRECTEDRETURNTYPE,
586 WARN_POINTLESSSTATEMENT,
588 WARN_DUPLICATEDEFINITION,
589 WARN_UNDEFNOTDEFINED,
590 WARN_PRECOMPILERMESSAGE,
591 WARN_TOOMANYPARAMETERSFORFUNC,
598 WARN_SWITCHTYPEMISMATCH,
599 WARN_CONFLICTINGUNIONMEMBER,
600 WARN_KEYWORDDISABLED,
601 WARN_ENUMFLAGS_NOTINTEGER,
602 WARN_ENUMFLAGS_NOTBINARY,
603 WARN_CASEINSENSATIVEFRAMEMACRO,
606 WARN_ASSIGNMENTINCONDITIONAL,
609 WARN_IMPLICITCONVERSION,
610 WARN_FIXEDRETURNVALUECONFLICT,
614 WARN_UNREACHABLECODE,
615 WARN_NOTSTANDARDBEHAVIOUR,
616 WARN_INEFFICIENTPLUSPLUS,
617 WARN_DUPLICATEPRECOMPILER,
618 WARN_IDENTICALPRECOMPILER,
619 WARN_FTE_SPECIFIC, //extension that only FTEQCC will have a clue about.
620 WARN_EXTENSION_USED, //extension that frikqcc also understands
622 WARN_LAXCAST, //some errors become this with a compiler flag
623 WARN_UNDESIRABLECONVENTION,
624 WARN_SAMENAMEASGLOBAL,
625 WARN_CONSTANTCOMPARISON,
626 WARN_UNSAFEFUNCTIONRETURNTYPE,
627 WARN_MISSINGOPTIONAL,
629 ERR_PARSEERRORS, //caused by qcc_pr_parseerror being called.
631 //these are definatly my fault...
635 ERR_TOOMANYSTATEMENTS,
640 ERR_PRECOMPILERCONSTANTTOOLONG,
641 ERR_MACROTOOMANYPARMS,
642 ERR_TOOMANYFRAMEMACROS,
644 //limitations, some are imposed by compiler, some arn't.
648 ERR_TOOMANYCONTINUES,
651 ERR_TOOMANYOPENFILES,
652 ERR_TOOMANYPARAMETERSVARARGS,
653 ERR_TOOMANYTOTALPARAMETERS,
655 //these are probably yours, or qcc being fussy.
657 ERR_BADIMMEDIATETYPE,
660 ERR_FUNCTIONWITHVARGS,
662 ERR_UNKNOWNPUCTUATION,
671 ERR_CONSTANTNOTDEFINED,
674 ERR_TYPEMISMATCHREDEC,
675 ERR_TYPEMISMATCHPARM,
676 ERR_TYPEMISMATCHARRAYSIZE,
677 ERR_UNEXPECTEDPUNCTUATION,
680 ERR_INITIALISEDLOCALFUNCTION,
683 ERR_ARRAYNEEDSBRACES,
684 ERR_TOOMANYINITIALISERS,
685 ERR_TYPEINVALIDINSTRUCT,
690 ERR_SHAREDINITIALISED,
692 ERR_BADARRAYINDEXTYPE,
695 ERR_BADPLUSPLUSOPERATOR,
698 ERR_MULTIPLEDEFAULTS,
699 ERR_CASENOTIMMEDIATE,
703 ERR_THINKTIMETYPEMISMATCH,
704 ERR_STATETYPEMISMATCH,
705 ERR_BADBUILTINIMMEDIATE,
708 ERR_ILLEGALCONTINUES,
718 ERR_TOOMANYPACKFILES,
719 ERR_INVALIDVECTORIMMEDIATE,
720 ERR_INVALIDSTRINGIMMEDIATE,
721 ERR_BADCHARACTERCODE,
728 #define FLAG_KILLSDEBUGGERS 1
729 #define FLAG_ASDEFAULT 2
730 #define FLAG_SETINGUI 4
731 #define FLAG_HIDDENINGUI 8
732 #define FLAG_MIDCOMPILE 16 //option can be changed mid-compile with the special pragma
736 int optimisationlevel;
737 int flags; //1: kills debuggers. 2: applied as default.
742 extern optimisations_t optimisations[];
746 int flags; //2 applied as default
752 extern compiler_flag_t compiler_flag[];
754 extern pbool qccwarningdisabled[WARN_MAX];
756 extern jmp_buf pr_parse_abort; // longjump with this on parse error
757 extern int pr_source_line;
758 extern char *pr_file_p;
760 void *QCC_PR_Malloc (int size);
765 #define OFS_PARM0 4 // leave 3 ofs for each parm to hold vectors
770 #define RESERVED_OFS 28
773 extern QCC_def_t *pr_scope;
774 extern int pr_error_count, pr_warning_count;
776 void QCC_PR_NewLine (pbool incomment);
777 QCC_def_t *QCC_PR_GetDef (QCC_type_t *type, char *name, QCC_def_t *scope, pbool allocate, int arraysize, pbool saved);
779 void QCC_PR_PrintDefs (void);
781 void QCC_PR_SkipToSemicolon (void);
783 #define MAX_EXTRA_PARMS 128
784 #ifdef MAX_EXTRA_PARMS
785 extern char pr_parm_names[MAX_PARMS+MAX_EXTRA_PARMS][MAX_NAME];
786 extern QCC_def_t *extra_parms[MAX_EXTRA_PARMS];
788 extern char pr_parm_names[MAX_PARMS][MAX_NAME];
790 extern pbool pr_trace;
792 #define G_FLOAT(o) (qcc_pr_globals[o])
793 #define G_INT(o) (*(int *)&qcc_pr_globals[o])
794 #define G_VECTOR(o) (&qcc_pr_globals[o])
795 #define G_STRING(o) (strings + *(QCC_string_t *)&qcc_pr_globals[o])
796 #define G_FUNCTION(o) (*(func_t *)&qcc_pr_globals[o])
798 char *QCC_PR_ValueString (etype_t type, void *val);
800 void QCC_PR_ClearGrabMacros (void);
802 pbool QCC_PR_CompileFile (char *string, char *filename);
803 void QCC_PR_ResetErrorScope(void);
805 extern pbool pr_dumpasm;
807 extern QCC_string_t s_file; // filename for function definition
809 extern QCC_def_t def_ret, def_parms[MAX_PARMS];
811 void QCC_PR_EmitArrayGetFunction(QCC_def_t *scope, char *arrayname);
812 void QCC_PR_EmitArraySetFunction(QCC_def_t *scope, char *arrayname);
813 void QCC_PR_EmitClassFromFunction(QCC_def_t *scope, char *tname);
815 void PostCompile(void);
816 pbool PreCompile(void);
818 //=============================================================================
820 extern char pr_immediate_string[8192];
822 extern float *qcc_pr_globals;
823 extern unsigned int numpr_globals;
825 extern char *strings;
828 extern QCC_dstatement_t *statements;
829 extern int numstatements;
830 extern int *statement_linenums;
832 extern QCC_dfunction_t *functions;
833 extern int numfunctions;
835 extern QCC_ddef_t *qcc_globals;
836 extern int numglobaldefs;
838 extern QCC_def_t *activetemps;
840 extern QCC_ddef_t *fields;
841 extern int numfielddefs;
843 extern QCC_type_t *qcc_typeinfo;
844 extern int numtypeinfos;
845 extern int maxtypeinfos;
847 extern int ForcedCRC;
848 extern pbool defaultnoref;
849 extern pbool defaultstatic;
851 extern int *qcc_tempofs;
852 extern int max_temps;
853 //extern int qcc_functioncalled; //unuse temps if this is true - don't want to reuse the same space.
855 extern int tempsstart;
858 typedef char PATHSTRING[MAX_DATA_PATH];
860 extern PATHSTRING *precache_sounds;
861 extern int *precache_sounds_block;
862 extern int *precache_sounds_used;
863 extern int numsounds;
865 extern PATHSTRING *precache_textures;
866 extern int *precache_textures_block;
867 extern int numtextures;
869 extern PATHSTRING *precache_models;
870 extern int *precache_models_block;
871 extern int *precache_models_used;
872 extern int nummodels;
874 extern PATHSTRING *precache_files;
875 extern int *precache_files_block;
878 typedef struct qcc_includechunk_s {
879 struct qcc_includechunk_s *prev;
881 char *currentdatapoint;
882 int currentlinenumber;
883 CompilerConstant_t *cnst;
884 } qcc_includechunk_t;
885 extern qcc_includechunk_t *currentchunk;
887 int QCC_CopyString (char *str);
892 typedef struct qcc_cachedsourcefile_s {
896 enum{FT_CODE, FT_DATA} type; //quakec source file or not.
897 struct qcc_cachedsourcefile_s *next;
898 } qcc_cachedsourcefile_t;
899 extern qcc_cachedsourcefile_t *qcc_sourcefile;
906 static bool inline QCC_PR_CheckToken (char *string)
908 if (pr_token_type != tt_punct)
911 if (STRCMP (string, pr_token))
918 static void inline QCC_PR_Expect (char *string)
920 if (strcmp (string, pr_token))
921 QCC_PR_ParseError ("expected %s, found %s",string, pr_token);
926 void editbadfile(char *fname, int line);
927 char *TypeName(QCC_type_t *type);
928 void QCC_PR_IncludeChunk (char *data, pbool duplicate, char *filename);
929 void QCC_PR_IncludeChunkEx(char *data, pbool duplicate, char *filename, CompilerConstant_t *cnst);
930 pbool QCC_PR_UnInclude(void);
931 extern void *(*pHash_Get)(hashtable_t *table, const char *name);
932 extern void *(*pHash_GetNext)(hashtable_t *table, const char *name, void *old);
933 extern void *(*pHash_Add)(hashtable_t *table, const char *name, void *data, bucket_t *);