1 /* 2 * hcc.h 3 * $Id: hcc.h,v 1.10 2010-01-11 18:48:20 sezero Exp $ 4 * 5 * Copyright (C) 1996-1997 Id Software, Inc. 6 * Copyright (C) 1997-1998 Raven Software Corp. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or (at 11 * your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 * 17 * See the GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License along 20 * with this program; if not, write to the Free Software Foundation, Inc., 21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 24 #ifndef __HCC_H__ 25 #define __HCC_H__ 26 27 // HEADER FILES ------------------------------------------------------------ 28 29 #include "pr_comp.h" 30 #include <setjmp.h> 31 32 // MACROS ------------------------------------------------------------------ 33 34 /* 35 #define MAX_STRINGS 500000 36 #define MAX_GLOBALS 16384 37 #define MAX_FIELDS 1024 38 #define MAX_STATEMENTS 65536*2 39 */ 40 #define MAX_STRINGS 1048576 41 #define MAX_GLOBALS 524288 42 #define MAX_FIELDS 2048 43 #define MAX_STATEMENTS 524288 44 #define MAX_FUNCTIONS 8192 45 /* 46 #define MAX_SOUNDS 1024 47 #define MAX_MODELS 1024 48 #define MAX_FILES 1024 49 */ 50 #define MAX_SOUNDS 2048 51 #define MAX_MODELS 2048 52 #define MAX_FILES 2048 53 #define MAX_DATA_PATH 64 54 #define MAX_ERRORS 10 55 #define MAX_NAME 64 56 /* 57 #define MAX_REGS 65536 58 */ 59 #define MAX_REGS 262144 60 61 #define TK_CHECK(t) (pr_tokenclass==t?(LX_Fetch(),true):(false)) 62 #define TK_TEST(t) (pr_tokenclass==t) 63 #define G_FLOAT(o) (pr_globals[o]) 64 #define G_INT(o) (*(int *)&pr_globals[o]) 65 #define G_VECTOR(o) (&pr_globals[o]) 66 #define G_STRING(o) (strings + *(string_t *)&pr_globals[o]) 67 #define G_FUNCTION(o) (*(func_t *)&pr_globals[o]) 68 69 #define TOP_PRIORITY 6 70 #define NOT_PRIORITY 4 71 72 // TYPES ------------------------------------------------------------------- 73 74 typedef int gofs_t; 75 76 typedef struct type_s 77 { 78 etype_t type; 79 struct def_s *def; // a def that points to this type 80 struct type_s *next; 81 82 struct type_s *aux_type; // Return type or field type 83 int num_parms; // -1 = variable args 84 struct type_s *parm_types[MAX_PARMS]; // only [num_parms] allocated 85 } type_t; 86 87 typedef struct def_s 88 { 89 type_t *type; 90 const char *name; 91 struct def_s *next; 92 gofs_t ofs; 93 struct def_s *scope; // function the var was defined in, or NULL 94 int initialized; // 1 when a declaration included "= immediate" 95 int referenceCount; 96 struct def_s *parentVector; 97 } def_t; 98 99 typedef union eval_s 100 { 101 string_t string; 102 float _float; 103 float vector[3]; 104 func_t function; 105 int _int; 106 union eval_s *ptr; 107 } eval_t; 108 109 typedef struct 110 { 111 type_t *types; 112 def_t def_head; 113 def_t *def_tail; 114 int size_fields; 115 } pr_info_t; 116 117 typedef struct 118 { 119 int builtin; // if non 0, call an internal function 120 int code; // first statement 121 // char *file; // source file with definition 122 // int file_line; 123 struct def_s *def; 124 int parm_ofs[MAX_PARMS]; 125 } function_t; 126 127 typedef struct 128 { 129 const char *name; 130 const char *opname; 131 int priority; 132 qboolean right_associative; 133 def_t *type_a, *type_b, *type_c; 134 int tag; 135 } opcode_t; 136 137 typedef enum 138 { 139 tt_eof, 140 tt_name, 141 tt_punct, 142 tt_immediate 143 } token_type_t; 144 145 enum 146 { 147 TK_NONE, 148 TK_SEMICOLON, 149 TK_LPAREN, 150 TK_RPAREN, 151 TK_COMMA, 152 TK_PLUS, 153 TK_ASTERISK, 154 TK_SLASH, 155 TK_LBRACE, 156 TK_RBRACE, 157 TK_LBRACKET, 158 TK_RBRACKET, 159 TK_NUMBERSIGN, 160 TK_EQ, 161 TK_NE, 162 TK_LT, 163 TK_GT, 164 TK_LE, 165 TK_GE, 166 TK_ASSIGN, 167 TK_AND, 168 TK_BITAND, 169 TK_OR, 170 TK_BITOR, 171 TK_NOT, 172 TK_PERIOD, 173 TK_ELLIPSIS, 174 TK_MINUS, 175 TK_INC, 176 TK_DEC, 177 TK_MULASSIGN, 178 TK_DIVASSIGN, 179 TK_ADDASSIGN, 180 TK_SUBASSIGN, 181 TK_COLON, 182 TK_RANGE, 183 TK_BITSET, 184 TK_BITCLR 185 }; 186 187 // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- 188 189 // hcc.c 190 int CopyString (const char *str); 191 192 FUNC_NORETURN 193 void PR_ParseError(const char *error, ...) FUNC_PRINTF(1,2); 194 void PR_ParseWarning(const char *error, ...) FUNC_PRINTF(1,2); 195 #ifdef __WATCOMC__ 196 #pragma aux PR_ParseError aborts; 197 #endif 198 199 // lexi.c 200 void LX_Init (void); 201 void LX_NewSourceFile (const char *fileText); 202 void LX_Fetch (void); 203 qboolean LX_Check (const char *string); 204 qboolean LX_CheckFetch (const char *string); 205 void LX_Require (const char *string); 206 void LX_NewLine (void); 207 void LX_ErrorRecovery (void); 208 209 type_t *PR_FindType (type_t *type); 210 type_t *PR_ParseType (void); 211 const char *PR_ParseName (void); 212 213 // comp.c 214 void CO_Init (void); 215 qboolean CO_CompileFile (const char *fileText, const char *fileName); 216 def_t *CO_GenCode (opcode_t *op, def_t *var_a, def_t *var_b); 217 void CO_GenCodeDirect (opcode_t *op, def_t *var_a, def_t *var_b, def_t *var_c); 218 def_t *CO_ParseImmediate (void); 219 void CO_ParseDefs (void); 220 def_t *PR_GetDef (type_t *type, const char *name, def_t *scope, qboolean allocate); 221 222 // expr.c 223 void EX_Init (void); 224 def_t *EX_Expression (int priority); 225 226 // stmt.c 227 void ST_ParseStatement (void); 228 229 230 // PUBLIC DATA DECLARATIONS ------------------------------------------------ 231 232 extern int hcc_OptimizeImmediates; 233 extern int hcc_OptimizeNameTable; 234 extern int hcc_OptimizeStringHeap; 235 extern int hcc_Compat_precache_file; 236 extern int hcc_Compat_STR_SAVEGLOBL; 237 extern qboolean hcc_WarningsActive; 238 extern qboolean hcc_ShowUnrefFuncs; 239 240 extern int type_size[8]; 241 extern def_t *def_for_type[8]; 242 243 extern type_t type_void, type_string, type_float, type_vector, type_entity, 244 type_field, type_function, type_pointer, type_floatfield, 245 type_union; 246 247 extern def_t def_void, def_string, def_float, def_vector, def_entity, 248 def_field, def_function, def_pointer; 249 250 extern pr_info_t pr; 251 252 extern opcode_t pr_opcodes[128]; // sized by initialization 253 254 extern def_t *pr_global_defs[MAX_REGS]; // to find def for a global variable 255 256 extern int pr_tokenclass; 257 extern char pr_token[2048]; 258 extern token_type_t pr_token_type; 259 extern type_t *pr_immediate_type; 260 extern eval_t pr_immediate; 261 262 extern int locals_end; // for tracking local variables vs temps 263 264 extern jmp_buf pr_parse_abort; // longjump with this on parse error 265 266 extern int lx_SourceLine; 267 268 extern def_t *pr_scope; 269 extern int pr_error_count; 270 271 extern char pr_parm_names[MAX_PARMS][MAX_NAME]; 272 273 extern string_t s_file; // filename for function definition 274 275 extern def_t def_ret, def_parms[MAX_PARMS]; 276 277 extern char strings[MAX_STRINGS]; 278 extern int strofs; 279 280 extern dstatement_t statements[MAX_STATEMENTS]; 281 extern int numstatements; 282 extern int statement_linenums[MAX_STATEMENTS]; 283 284 extern dfunction_t functions[MAX_FUNCTIONS]; 285 extern int numfunctions; 286 287 extern float *pr_globals; /* [MAX_REGS] */ 288 extern int numpr_globals; 289 290 extern char pr_immediate_string[2048]; 291 292 extern char precache_sounds[MAX_SOUNDS][MAX_DATA_PATH]; 293 extern int precache_sounds_block[MAX_SOUNDS]; 294 extern int numsounds; 295 296 extern char precache_models[MAX_MODELS][MAX_DATA_PATH]; 297 extern int precache_models_block[MAX_SOUNDS]; 298 extern int nummodels; 299 300 extern char precache_files[MAX_FILES][MAX_DATA_PATH]; 301 extern int precache_files_block[MAX_SOUNDS]; 302 extern int numfiles; 303 304 extern int ex_FunctionCallCount; 305 306 extern type_t *st_ReturnType; 307 extern qboolean st_ReturnParsed; 308 309 #endif /* __HCC_H__ */ 310 311