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