defs.h - enscript - GNU Enscript
(HTM) git clone git://thinkerwim.org/enscript.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
defs.h (8389B)
---
1 /*
2 * Internal definitions for states.
3 * Copyright (c) 1997-1998 Markku Rossi.
4 *
5 * Author: Markku Rossi <mtr@iki.fi>
6 */
7
8 /*
9 * This file is part of GNU Enscript.
10 *
11 * Enscript is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * Enscript is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with Enscript. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 #ifndef DEFS_H
26 #define DEFS_H
27
28 /*
29 * Config stuffs.
30 */
31
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
35
36 #include <stdio.h>
37 #include <ctype.h>
38
39 #ifndef ___P
40 #if PROTOTYPES
41 #define ___P(protos) protos
42 #else /* no PROTOTYPES */
43 #define ___P(protos) ()
44 #endif /* no PROTOTYPES */
45 #endif
46
47 #if STDC_HEADERS
48
49 #include <stdlib.h>
50 #include <string.h>
51
52 #else /* no STDC_HEADERS */
53
54 #if HAVE_STDLIB_H
55 #include <stdlib.h>
56 #endif
57
58 #if HAVE_STRING_H
59 #include <string.h>
60 #endif
61
62 #ifndef HAVE_STRCHR
63 #define strchr index
64 #define strrchr rindex
65 #endif
66 char *strchr ();
67 char *strrchr ();
68
69 #ifndef HAVE_STRERROR
70 extern char *strerror ___P ((int));
71 #endif
72
73 #ifndef HAVE_MEMMOVE
74 extern void *memmove ___P ((void *, void *, size_t));
75 #endif
76
77 #ifndef HAVE_MEMCPY
78 extern void *memcpy ___P ((void *, void *, size_t));
79 #endif
80
81 #endif /* no STDC_HEADERS */
82
83 #if HAVE_UNISTD_H
84 #include <unistd.h>
85 #endif
86
87 #include <errno.h>
88
89 #if HAVE_SYS_TYPES_H
90 #include <sys/types.h>
91 #endif
92
93 #if HAVE_SYS_STAT_H
94 #include <sys/stat.h>
95 #endif
96
97 #include "gettext.h"
98 #define _(String) gettext (String)
99
100 #if HAVE_LC_MESSAGES
101 #include <locale.h>
102 #endif
103
104 #include "regex.h"
105 #include "xalloc.h"
106 #include "strhash.h"
107
108 /*
109 * Types and definitions.
110 */
111
112 #define RULE_BEGIN ((void *) 0)
113 #define RULE_END ((void *) 1)
114
115 #define INBUFSIZE (20 * 1024)
116
117 #define IS_TRUE(n) ((n)->type != nINTEGER || (n)->u.integer != 0)
118
119 #define REGEXP(regexp) \
120 ((regexp)->u.re.compiled.fastmap_accurate \
121 ? (&(regexp)->u.re.compiled) \
122 : (compile_regexp (regexp), &(regexp)->u.re.compiled))
123
124 /* Flags for regular expressions. */
125 #define fRE_CASE_INSENSITIVE 1
126
127 /* Generic linked list. */
128
129 struct list_item_st
130 {
131 struct list_item_st *next;
132 void *data;
133 };
134
135 typedef struct list_item_st ListItem;
136
137 struct list_st
138 {
139 ListItem *head;
140 ListItem *tail;
141 };
142
143 typedef struct list_st List;
144
145 /* State. */
146
147 struct state_st
148 {
149 char *name;
150 char *super_name;
151 struct state_st *super;
152 List *rules;
153 };
154
155 typedef struct state_st State;
156
157
158 /* Node. */
159
160 typedef enum
161 {
162 nVOID,
163 nSTRING,
164 nREGEXP,
165 nINTEGER,
166 nREAL,
167 nSYMBOL,
168 nARRAY
169 } NodeType;
170
171 struct node_st
172 {
173 NodeType type;
174 unsigned int refcount;
175 unsigned int linenum;
176 char *filename;
177
178 union
179 {
180 struct
181 {
182 char *data;
183 unsigned int len;
184 } str;
185 struct
186 {
187 char *data;
188 unsigned int len;
189 unsigned int flags;
190 regex_t compiled;
191 struct re_registers matches;
192 } re;
193 int integer;
194 double real;
195 char *sym;
196 struct
197 {
198 struct node_st **array;
199 unsigned int len;
200 unsigned int allocated;
201 } array;
202 } u;
203 };
204
205 typedef struct node_st Node;
206
207 /* Cons cell. */
208 struct cons_st
209 {
210 void *car;
211 void *cdr;
212 };
213
214 typedef struct cons_st Cons;
215
216 /* Grammar types. */
217
218 typedef enum
219 {
220 eSTRING,
221 eREGEXP,
222 eINTEGER,
223 eREAL,
224 eSYMBOL,
225 eNOT,
226 eAND,
227 eOR,
228 eFCALL,
229 eASSIGN,
230 eADDASSIGN,
231 eSUBASSIGN,
232 eMULASSIGN,
233 eDIVASSIGN,
234 ePOSTFIXADD,
235 ePOSTFIXSUB,
236 ePREFIXADD,
237 ePREFIXSUB,
238 eARRAYASSIGN,
239 eARRAYREF,
240 eQUESTCOLON,
241 eMULT,
242 eDIV,
243 ePLUS,
244 eMINUS,
245 eLT,
246 eGT,
247 eEQ,
248 eNE,
249 eGE,
250 eLE
251 } ExprType;
252
253 struct expr_st
254 {
255 ExprType type;
256 unsigned int linenum;
257 char *filename;
258
259 union
260 {
261 Node *node;
262 struct expr_st *not;
263 struct
264 {
265 Node *name;
266 List *args;
267 } fcall;
268 struct
269 {
270 Node *sym;
271 struct expr_st *expr;
272 } assign;
273 struct
274 {
275 struct expr_st *expr1;
276 struct expr_st *expr2;
277 struct expr_st *expr3;
278 } arrayassign;
279 struct
280 {
281 struct expr_st *expr1;
282 struct expr_st *expr2;
283 } arrayref;
284 struct
285 {
286 struct expr_st *cond;
287 struct expr_st *expr1;
288 struct expr_st *expr2;
289 } questcolon;
290 struct
291 {
292 struct expr_st *left;
293 struct expr_st *right;
294 } op;
295 } u;
296 };
297
298 typedef struct expr_st Expr;
299
300 typedef enum
301 {
302 sRETURN,
303 sDEFSUB,
304 sBLOCK,
305 sIF,
306 sEXPR,
307 sWHILE,
308 sFOR
309 } StmtType;
310
311 struct stmt_st
312 {
313 StmtType type;
314 unsigned int linenum;
315 char *filename;
316
317 union
318 {
319 Expr *expr;
320 struct
321 {
322 Node *name;
323 Cons *closure;
324 } defsub;
325 struct
326 {
327 Expr *expr;
328 struct stmt_st *then_stmt;
329 struct stmt_st *else_stmt;
330 } stmt_if;
331 struct
332 {
333 Expr *expr;
334 struct stmt_st *body;
335 } stmt_while;
336 struct
337 {
338 Expr *init;
339 Expr *cond;
340 Expr *incr;
341 struct stmt_st *body;
342 } stmt_for;
343 List *block;
344 } u;
345 };
346
347 typedef struct stmt_st Stmt;
348
349 struct environment_st
350 {
351 struct environment_st *next;
352 char *name;
353 Node *val;
354 };
355
356 typedef struct environment_st Environment;
357
358 /* Primitive procedure. */
359 typedef Node *(*Primitive) ___P ((char *prim_name, List *args,
360 Environment *env, char *filename,
361 unsigned int linenum));
362
363 /* Variable definition chain. */
364 struct variable_definition_st
365 {
366 struct variable_definition_st *next;
367 char *sym;
368 char *val;
369 };
370
371 typedef struct variable_definition_st VariableDef;
372
373 /* Grammar and execution warning levels. */
374 typedef enum
375 {
376 WARN_LIGHT = 10,
377 WARN_ALL = 100
378 } WarningLevel;
379
380
381 /*
382 * Global variables.
383 */
384
385 extern char *program;
386
387 extern FILE *yyin;
388 extern FILE *ofp;
389 extern char *defs_file;
390 extern unsigned int linenum;
391 extern char *yyin_name;
392 extern WarningLevel warning_level;
393 extern char *path;
394 extern unsigned int verbose;
395
396 /* Namespaces. */
397 extern StringHashPtr ns_prims;
398 extern StringHashPtr ns_vars;
399 extern StringHashPtr ns_subs;
400 extern StringHashPtr ns_states;
401
402 extern List *global_stmts;
403 extern List *start_stmts;
404 extern List *startrules;
405 extern List *namerules;
406
407 /* Void node value. There is only nvoid instance. */
408 extern Node *nvoid;
409
410 extern FILE *ifp;
411 extern char *inbuf;
412 extern unsigned int data_in_buffer;
413 extern unsigned int bufpos;
414 extern int eof_seen;
415 extern char *current_fname;
416 extern unsigned int current_linenum;
417
418 extern struct re_registers *current_match;
419 extern char *current_match_buf;
420
421 /* Options. */
422
423 extern char *start_state_arg;
424 extern char *start_state;
425
426
427 /*
428 * Prototypes for global functions.
429 */
430
431 void init_primitives ();
432
433 /* Parser & lexer. */
434 int yyparse ();
435 int yylex ();
436 void yyerror ___P ((char *msg));
437
438 /* Generic linked list. */
439
440 /* Create a new linked list. */
441 List *list ();
442
443 /* Add a new element <data> to the beginning of list <list>. */
444 void list_prepend ___P ((List *list, void *data));
445
446 /* Add a new element <data> to the end of list <list>. */
447 void list_append ___P ((List *list, void *data));
448
449
450 /* Node manipulators. */
451
452 Node *node_alloc ___P ((NodeType type));
453
454 Node *node_copy ___P ((Node *node));
455
456 void node_reference ___P ((Node *node));
457
458 void node_free ___P ((Node *node));
459
460 void enter_system_variable ___P ((char *name, char *value));
461
462 void compile_regexp ___P ((Node *regexp));
463
464
465 /* Grammar constructors. */
466
467 Stmt *mk_stmt ___P ((StmtType type, void *arg1, void *arg2, void *arg3,
468 void *arg4));
469
470 Expr *mk_expr ___P ((ExprType type, void *arg1, void *arg2, void *arg3));
471
472 Cons *cons ___P ((void *car, void *cdr));
473
474 void define_state ___P ((Node *sym, Node *super, List *rules));
475
476 /* Execution. */
477
478 Node *eval_expr ___P ((Expr *expr, Environment *env));
479
480 Node *eval_statement ___P ((Stmt *stmt, Environment *env, int *return_seen));
481
482 Node *eval_statement_list ___P ((List *lst, Environment *env,
483 int *return_seen));
484
485 void process_file ___P ((char *fname));
486
487 Node *execute_state ___P ((char *name));
488
489 void load_states_file ___P ((char *name));
490
491 /*
492 * Lookup state <name> and return its handle. If the state is
493 * undefined, the function tries to autoload it.
494 */
495 State *lookup_state ___P ((char *name));
496
497 #endif /* not DEFS_H */