Added package with the documentation and the examples
[lwc.git] / global.h
blob8b1251196377066e576da74a41a7f720f435dfdd
1 /*
3 * Copyright (C) 2003, Stelios Xanthakis
5 */
6 #include "config.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <sys/mman.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <fcntl.h>
14 #include <unistd.h>
15 #include <sys/wait.h>
16 #include <signal.h>
17 #ifdef SYS_HAS_MMAP
18 #include <sys/mman.h>
19 #endif
20 #include <stdarg.h>
21 #include <setjmp.h>
22 #include <time.h>
25 #define COLS "\033[01;37m"
26 #define COLE "\033[0m"
27 #define XSTR COLS"%s"COLE
29 //*****************************************************************************
30 // compiler.h
31 //*****************************************************************************
33 #ifdef __GNUC__ // ------- gcc near 3.2 ------
34 #define COMPILER "gcc"
35 #define INTERN_memcpy RESERVED___builtin_memcpy
36 #define INTERN_alloca RESERVED___builtin_alloca
37 #define INTERN_strncmp RESERVED___builtin_strncmp
38 #define INTERN_strncasecmp RESERVED_strncasecmp
39 #define CASE_RANGERS
40 #define HAVE_GNUC_LOCAL_LABELS
41 #define HAVE_GNUC_ATTR_NORETURN
42 #if __GNUC__ >= 4
43 #define BROKEN_ALIASES
44 #endif
45 #ifdef alloca
46 #undef alloca
47 #endif
48 #define alloca __builtin_alloca
49 #else // ------ generic ------
50 #include <alloca.h>
51 #define COMPILER "generic"
52 #define INTERN_memcpy RESERVED_memcpy
53 #define INTERN_alloca RESERVED_alloca
54 #define INTERN_strncmp RESERVED_strncmp
55 #define INTERN_strncasecmp RESERVED_strncasecmp
56 #undef HAVE_GNUC_LOCAL_LABELS
57 #undef HAVE_GNUC_ATTR_NORETURN
58 #endif
60 //*****************************************************************************
61 // ld.h
62 //*****************************************************************************
64 #define SECTION_LINKONCE_DATA ".gnu.linkonce.d."
65 #define SECTION_LINKONCE_TEXT ".gnu.linkonce.t."
66 #define SECTION_LINKONCE_RODATA ".gnu.linkonce.r."
67 #define HAVE_LINKONCE
68 #define HAVE_BUILTIN_MEMCPY
69 #define SIZEOF_UCONTEXT "512" // should suffice for the near future
71 //*****************************************************************************
72 // version.h
73 //*****************************************************************************
75 #define VERSION_MAJ 2
76 #define VERSION_MIN 0
77 #define LWC_VERSION "2.0"
79 #include "norm.h"
81 extern int zinit [];
83 //*****************************************************************************
84 // global.h
85 //*****************************************************************************
87 typedef int NormPtr, Token, recID, typeID, enumID;
88 typedef int bool;
90 #define true 1
91 #define false 0
93 #define ncase break; case
94 #define ndefault break; default
96 #define allocaint(x) (int*) alloca ((x) * sizeof (int))
97 #define mallocint(x) (int*) malloc ((x) * sizeof (int))
98 #define reallocint(x, y) (int*) realloc (x, (y) * sizeof (int))
99 static inline int* frealloc (int **a, int x) { free (*a); return *a = mallocint (x); }
101 //*****************************************************************************
102 // debug.h
103 //*****************************************************************************
105 #define DEBUG
107 #ifdef DEBUG
108 extern struct debugflag_s {
109 bool
110 GENERAL,
111 PROGRESS,
112 PEXPR,
113 PEXPR_EXTREME,
114 SHOWPROG,
115 FUNCPROGRESS,
116 OUTPUT_INDENTED,
117 PARSE_ERRORS_SEGFAULT,
118 EXPR_ERRORS_FATAL,
119 DCL_TRACE,
120 TDEF_TRACE,
121 VIRTUALTABLES,
122 VIRTUALBASE,
123 VIRTUALCOMBINE,
124 AUTOF,
125 NOSTDOUT,
126 SHOWCPP,
127 CPP,
128 REGEXP_DEBUG;
129 } debugflag;
131 #define PREPROCOUT "preproc.i"
133 extern void enable_debugs ();
134 extern FILE *logstream;
135 #define PRINTF(...) fprintf (logstream, __VA_ARGS__)
136 #define CPRINTF(...) fprintf (logstream, COLS __VA_ARGS__ COLE)
137 #define INTPRINT(x) fintprint (logstream, x)
138 #define INTPRINTN(x) { INTPRINT(x); PRINTF("\n"); }
139 #define INTPRINTF(x,y) { PRINTF(x); INTPRINT(y); PRINTF("\n"); }
140 #endif
142 //*****************************************************************************
143 // config.h
144 //*****************************************************************************
146 #define MAGIC_DIGIT ""
147 #define GLOBINITF "GLoBaL_ConStRuCtOr"
148 #define DERRIVE_UNION "un"
149 #define PREPROCFILE ".preprocfile"
150 #define COMMENT_OUTPUT
152 #ifdef COLOR_IN_COMMENTS
153 #define REM_COLS COLS
154 #define REM_COLE COLE
155 #else
156 #define REM_COLS ""
157 #define REM_COLE ""
158 #endif
160 #define COMMENT_SECTION_FUNCTIONS \
161 "\n/*"REM_COLS"******** Program function definitions ********"REM_COLE"*/\n"
163 #define COMMENT_SECTION_AUTOFUNCTIONS \
164 "\n/*"REM_COLS"******** auto-function instantiations ********"REM_COLE"*/\n"
166 #define COMMENT_SECTION_OBJCTOR \
167 "\n/*"REM_COLS"*********** Module _Init Function ***********"REM_COLE"*/\n"
169 #define COMMENT_SECTION_PROTOTYPES \
170 "\n/*"REM_COLS"************ Function Prototypes ***********"REM_COLE"*/\n"
172 #define COMMENT_SECTION_INNERCODE \
173 "\n/*"REM_COLS"************ Internal Functions ************"REM_COLE"*/\n"
175 #define COMMENT_SECTION_VIRTUALTABLES \
176 "\n/*"REM_COLS"*************** Virtual tables ***************"REM_COLE"*/\n"
178 #define COMMENT_SECTION_VTDEF \
179 "\n/*"REM_COLS"************* Virtua Table declarations *************"REM_COLE"*/\n"
181 #define COMMENT_SECTION_STRUCTS \
182 "\n/*"REM_COLS"************* Structures *************"REM_COLE"*/\n"
184 #define COMMENT_SECTION_GVARS \
185 "\n/*"REM_COLS"************* Global variables *************"REM_COLE"*/\n"
187 #define COMMENT_SECTION_INCLUDE \
188 "\n/*"REM_COLS"************* system headers *************"REM_COLE"*/\n"
190 #define COMMENT_SECTION_GLOBAL \
191 "\n/*"REM_COLS"************* global scope *************"REM_COLE"*/\n"
193 #define COMMENT_SECTION_REGEXP \
194 "\n/*"REM_COLS"************* regular expressions *************"REM_COLE"*/\n"
196 //*****************************************************************************
197 // preproc.h
198 //*****************************************************************************
200 extern void preproc (int, char**);
201 extern char *current_file, *main_file;
203 //*****************************************************************************
204 // lwc_config.h
205 //*****************************************************************************
207 extern NormPtr lwc_config (NormPtr);
208 extern NormPtr __C__ (NormPtr);
210 //*****************************************************************************
211 // main.h
212 //*****************************************************************************
214 extern bool MainModule, HadErrors, Reentrant, ExpandAllAutos;
215 extern bool StructByRef, InlineAllVt, ConstVtables, VIDeclarations;
216 extern bool Streams_Closed, ExceptionsUsed, GlobInitUsed, vtptrConst;
217 extern bool NoLinkonce, OneBigFile, HaveAliases, StdcallMembers, ExportVtbl;
218 extern bool EHUnwind;
219 extern bool GoodOldC;
221 extern int max_symbol_len;
223 //*****************************************************************************
224 // output.h
225 //*****************************************************************************
227 #define EOST -1
228 #define STRNEXT -2
229 #define NSTRNEXT -3
230 #define BLANKT -4
231 #define NONULL -5
232 #define BACKSPACE -6
234 #define ISTR(x) STRNEXT, x
235 #define R(x) RESERVED_ ## x
237 typedef struct outstream *OUTSTREAM;
239 extern OUTSTREAM GLOBAL, GLOBAL_INIT_FUNC, FUNCDEFCODE, INTERNAL_CODE, FPROTOS, AUTOFUNCTIONS;
240 extern OUTSTREAM VTABLE_DECLARATIONS, VIRTUALTABLES, STRUCTS, GVARS, INCLUDE, REGEXP_CODE;
242 extern OUTSTREAM new_stream ();
244 extern void free_stream (OUTSTREAM);
245 extern int ntokens (OUTSTREAM);
246 extern inline void output_itoken (OUTSTREAM, int);
247 extern void outprintf (OUTSTREAM, Token, ...);
248 extern void backspace_token (OUTSTREAM);
249 extern int *combine_output (OUTSTREAM);
250 extern OUTSTREAM concate_streams (OUTSTREAM, OUTSTREAM);
251 extern int get_stream_pos (OUTSTREAM);
252 extern void wipeout_unwind (OUTSTREAM, int);
253 extern void nowipeout_unwind(OUTSTREAM, int);
254 extern void export_output (OUTSTREAM);
256 //*****************************************************************************
257 // cpp.h
258 //*****************************************************************************
260 extern bool sys_cpp;
261 extern void setup_cpp (int, char**);
262 extern void cleanup_cpp ();
263 extern void cpp_directive ();
265 #define VARBOOST 1000
266 #define VOIDARG 999
267 extern int is_macro (Token);
268 extern Token* expand_macro (Token);
270 //*****************************************************************************
271 // lex.h
272 //*****************************************************************************
274 extern Token RESERVED_attr_stdcall;
276 extern void fatal (char*);
277 extern int *CODE, c_ntok;
278 extern int c_nsym, c_nval;
280 extern char *Cpp;
281 extern int Ci, Clen;
282 extern int line;
283 extern char *tfile;
285 extern Token enter_symbol (char*);
287 extern int c_line_of (NormPtr);
288 extern char *c_file_of (NormPtr);
290 extern void adjust_lines (NormPtr, int);
292 extern void initlex ();
293 extern int enter_value (char*);
294 extern int yydo (char*);
295 extern int yydo_file (char*);
296 extern void yydo_mem (char*, int);
297 extern char *expand (Token);
298 inline
299 static char *EXPC (NormPtr p) { return expand (CODE [p]); }
300 extern Token new_symbol (char*);
301 extern Token new_value_int (int);
302 extern Token new_value_string (char*);
303 extern Token stringify (Token);
304 extern Token token_addchar (Token, int);
306 extern void add_extra_values (char**, int);
308 extern Token Lookup_Symbol (char*);
310 extern typeID type_of_const (Token);
311 extern bool is_literal (Token);
313 extern int eval_int (Token);
314 extern long long int eval_intll (Token);
316 extern Token binshift [];
318 #define tokcmp(tok, str) strcmp (expand (tok), str)
320 //*****************************************************************************
321 // templates.h
322 //*****************************************************************************
324 extern void do_templates ();
326 //*****************************************************************************
327 // util.h
328 //*****************************************************************************
330 extern NormPtr skip_parenthesis (NormPtr);
331 extern NormPtr skip_brackets (NormPtr);
332 extern NormPtr skip_braces (NormPtr);
333 extern NormPtr skip_declaration (NormPtr);
334 extern NormPtr skip_buffer_parenthesis (Token*, NormPtr);
335 extern NormPtr skip_buffer_brackets (Token*, NormPtr);
336 extern NormPtr skip_buffer_braces (Token*, NormPtr);
338 extern bool intchr (int*, int);
339 extern void intsubst (int*, int, int);
340 extern void intsubst1 (int*, int, int);
341 extern Token *intcpy (int*, int*);
342 extern void intcat (int*, int*);
343 extern void intncat (int*, int*, int);
344 extern void intcatc (int*, int);
345 extern void intextract (int*, int*, int);
346 extern int intlen (int*);
347 extern int *intdup (int*);
348 extern int *intdup1 (int*);
349 extern int *argtdup (typeID*);
350 extern int *intndup (int*, int);
351 extern int intcmp (int*, int*);
352 extern void fintprint (FILE*, Token*);
353 extern Token *sintprintf (Token*, Token, ...);
355 extern char* escape_q_string (char*, int);
356 extern char* loadtext (char*);
358 struct load_file {
359 int fd;
360 char *data;
361 int len;
362 int success;
364 extern void ctor_load_file_ (struct load_file *const, char*);
365 extern void dtor_load_file_ (struct load_file *const);
367 typedef struct intnode_t {
368 struct intnode_t *less, *more;
369 int key;
370 union ival {
371 void *p;
372 int i;
373 } v;
374 } intnode;
376 extern intnode *intfind (intnode*, int);
377 extern void intadd (intnode**, int, union ival);
378 extern void intremove (intnode**, intnode*);
380 extern void debug_pr_type (typeID);
382 //*****************************************************************************
383 // misc.h
384 //*****************************************************************************
386 #define VERIFY_symbol 0
387 #define VERIFY_string 1
389 extern bool syntax_pattern (NormPtr, Token, ...);
391 extern void set_catch (jmp_buf*, NormPtr, Token*, int);
392 extern void raise_skip_function ();
393 extern void expr_error (char*);
394 extern void expr_errort (char*, Token);
395 extern void expr_errortt (char*, Token, Token);
396 extern void expr_error_undef (Token, int);
397 extern void expr_warn (char*);
398 extern void expr_warnt (char*, Token);
399 extern void expr_warntt (char*, Token, Token);
400 extern void clear_catch ();
402 extern NormPtr last_location;
403 extern Token in_function;
404 extern bool may_throw;
406 #define SET_MAYTHROW(X) may_throw |= !(X.flagz&FUNCP_NOTHROW)
408 extern void parse_error (NormPtr, char*);
409 extern void parse_error_tok (Token, char*);
410 extern void parse_error_cpp (char*);
411 extern void parse_error_toktok (Token, Token, char*);
412 extern void parse_error_pt (NormPtr, Token, char*);
413 extern void parse_error_ll (char*);
415 extern void warning_tok (char*, Token);
417 extern void name_of_simple_type (Token*, typeID);
419 extern typeID bt_promotion (typeID);
420 extern typeID ptrup (typeID);
421 extern typeID ptrdown (typeID);
422 extern typeID funcreturn (typeID);
423 extern typeID dereference (typeID);
424 extern typeID makemember (typeID, recID);
426 extern Token* build_type (typeID, Token, Token[]);
427 extern typeID typeof_designator (typeID, Token[]);
429 extern Token isunary_overloadable (Token);
430 extern Token isunary_postfix_overloadable (Token);
431 extern Token isbinary_overloadable (Token);
433 extern void remove_struct_from_this (Token*, recID);
434 extern void add_struct_to_this (Token*);
436 extern Token include_sys_header_s (char*);
437 extern Token include_sys_header (Token);
439 extern Token alias_func (recID, Token);
440 extern Token linkonce_data (Token);
441 extern Token linkonce_data_f (Token);
442 extern Token linkonce_text (Token);
443 extern Token linkonce_rodata (Token);
444 extern Token cleanup_func (Token);
445 extern Token section_vtblz (Token);
447 extern typeID typeof_expression (NormPtr, int);
449 extern bool is_expression (NormPtr);
451 extern void bogus1 ();
453 //*****************************************************************************
454 // fspace.h
455 //*****************************************************************************
457 typedef struct funcp_t {
458 struct funcp_t *next;
459 Token name;
460 typeID type;
461 Token *prototype;
462 typeID *ovarglist;
463 Token **dflt_args;
464 Token *xargs;
465 Token section;
466 int flagz;
467 bool used;
468 } funcp;
470 #define FUNCP_LINKONCE 1
471 #define FUNCP_AUTO 2
472 #define FUNCP_MODULAR 4
473 #define FUNCP_CTHIS 8
474 #define FUNCP_VIRTUAL 16
475 #define FUNCP_PURE 32
476 #define FUNCP_FINAL 64
477 #define FUNCP_STATIC 128
478 #define FUNCP_INLINE 256
479 #define FUNCP_UNDEF 512
480 #define FUNCP_NOTHROW 1024
481 #define FUNCP_USED 2048
483 typedef intnode *fspace;
485 extern fspace Global;
487 extern typeID* promoted_arglist (typeID*);
488 extern typeID* promoted_arglist_t (typeID);
489 extern char* nametype (char *ret, typeID);
490 extern char* type_string (char*, typeID);
491 extern bool arglist_compare (typeID*, typeID*);
492 extern funcp* xdeclare_function (fspace*, Token, Token, typeID, Token*, Token*,
493 int, Token**, Token);
494 extern Token declare_function_member (recID, Token, typeID, Token*, Token*, int, Token**, Token);
495 extern funcp* xlookup_function_dcl (fspace, Token, typeID[]);
497 typedef struct {
498 Token oname;
499 typeID t;
500 Token **dflt_args;
501 Token *prototype, *xargs;
502 int flagz;
503 } flookup;
505 extern bool have_function (fspace, Token);
506 extern int xlookup_function (fspace, Token, typeID[], flookup*);
507 extern Token xlookup_function_uname (fspace, Token);
508 extern typeID lookup_function_symbol (Token);
509 extern void xmark_section_linkonce (fspace, Token, Token);
510 extern void xmark_nothrow (fspace, Token, Token);
511 extern int xmark_function_USED (fspace, Token);
512 extern void export_fspace (fspace);
513 extern void export_fspace_lwc (fspace);
515 extern OUTSTREAM printproto (OUTSTREAM, Token[], Token, bool);
516 extern OUTSTREAM printproto_si (OUTSTREAM, Token[], Token, bool);
518 //*****************************************************************************
519 // cdb.h
520 //*****************************************************************************
522 extern void enter_enumconst (Token, enumID);
523 extern int is_enumconst (Token);
524 extern enumID id_of_enumconst (Token);
526 extern enumID enter_enum (Token);
527 extern enumID lookup_enum (Token);
528 extern void enter_enum_syms (enumID, Token[], int);
529 extern Token* enum_syms (enumID);
530 inline
531 static bool is_enum (Token t) { return lookup_enum (t) != -1; }
533 extern bool enter_typedef (Token, typeID);
534 extern typeID lookup_typedef (Token);
536 extern Token new_wrap, delete_wrap;
537 extern void enter_newdel_overload (Token, recID, Token);
538 extern Token lookup_newdel_operator (Token, recID);
540 extern typeID enter_type (int*);
541 extern int *open_typeID (typeID);
542 extern bool isfunction (typeID);
543 extern bool typeID_elliptic (typeID);
544 extern typeID elliptic_type (typeID);
545 extern int is_typename (Token);
546 extern bool is_dcl_start (Token);
547 extern recID lookup_object (Token);
549 extern void enter_abstract (Token, Token*, Token*, NormPtr);
550 extern bool have_abstract (Token);
551 extern int real_abstract_parents (Token, Token[]);
552 extern bool abstract_has_special (Token, recID);
553 extern NormPtr dcl_of_abstract (Token);
554 extern Token* parents_of_abstract (Token);
556 extern bool is_template_function (NormPtr*, NormPtr);
557 extern bool is_extern_templ_func (NormPtr*);
558 extern void enter_abstract_derrived (Token, recID);
559 extern bool specialize_abstracts ();
561 extern void enter_global_object (Token, typeID);
562 extern typeID lookup_global_object (Token);
564 extern void open_local_scope ();
565 extern Token recent_obj ();
566 extern void globalized_recent_obj (Token);
567 extern void add_catchpoint (int);
568 extern void enter_local_obj (Token, typeID);
569 extern void undo_local_obj (Token);
570 extern void add_auto_destruction (Token, recID, bool);
571 extern bool scope_has_dtors ();
572 extern bool break_has_dtors (int);
573 extern bool func_has_dtors ();
574 #define REFERENCE_BOOST 10000
575 extern typeID lookup_local_obj (Token, Token*);
576 extern void gen_auto_destruction (OUTSTREAM, bool);
577 extern Token gen_break_destructors (OUTSTREAM, int, int);
578 extern void gen_all_destructors (OUTSTREAM);
579 extern int close_local_scope ();
580 extern void rmv_catchpoint (Token*, Token*);
582 extern void* reopen_local_scope (void*);
583 extern void restore_local_scope (void*);
585 extern void* active_scope ();
586 extern void restore_scope (void*);
588 static inline int base_of (typeID t)
589 { return open_typeID (t)[0]; }
591 enum {
592 B_SCHAR = -32, B_UCHAR, B_SSINT, B_USINT, B_SINT, B_UINT,
593 B_SLONG, B_ULONG, B_SLLONG, B_ULLONG, B_FLOAT, B_DOUBLE, B_LDOUBLE,
594 B_VOID, B_ELLIPSIS, B_PELLIPSIS, B_PURE, INTERNAL_ARGEND /* -15 */
597 #define REFERENCE_BASE (REFERENCE_BOOST + B_SCHAR)
599 static inline int dbase_of (typeID t)
600 { recID r = base_of (t); return r >= REFERENCE_BASE ? r - REFERENCE_BOOST : r; }
602 extern typeID typeID_NOTYPE, typeID_int, typeID_float, typeID_charP;
603 extern typeID typeID_voidP ,typeID_void, typeID_uint, typeID_ebn_f, typeID_intP;
605 //*****************************************************************************
606 // hier.h
607 //*****************************************************************************
609 // - build db
611 #define VIRTUALPAR_BOOST 10000
612 extern recID enter_struct (Token, Token, bool, bool, bool, bool);
613 extern void set_depend (recID, recID);
614 extern void set_declaration (recID, Token*);
615 extern void set_parents (recID, recID[]);
616 extern void output_parents (OUTSTREAM, recID);
617 extern void add_variable_member (recID, Token, typeID, Token, bool, bool);
618 extern Token add_anonymous_union (recID, recID);
619 extern Token add_local_typedef (recID, Token);
620 extern Token have_local_typedef (recID, Token);
621 extern bool PARENT_AUTOFUNCS;
622 extern void add_auto_f (Token, Token, recID, typeID, bool, bool, NormPtr,
623 Token*, Token*);
624 extern void add_pure_dm (recID, Token, NormPtr);
625 extern void set_dfunc (recID, Token, bool, bool);
626 extern Token dtor_name (recID);
627 extern void set_dtor_nothrow (recID);
628 extern void enter_class_const (recID, Token, Token);
629 extern Token add_function_member (recID, Token);
630 extern void possible_keyfunc (recID, Token);
631 extern void keyfunc_candidate (recID, Token);
632 extern int Here_virtualtable (OUTSTREAM, recID, bool, bool, bool);
633 extern void add_virtual_varmemb (recID, Token, Token, typeID, Token*, Token*,
634 bool, OUTSTREAM);
635 extern void rename_hier (Token, Token);
636 extern int virtual_inheritance_decl (OUTSTREAM, recID, Token);
637 typedef struct {
638 recID r;
639 Token fname;
640 typeID ftype;
641 Token fmemb;
642 Token *prototype, *argv;
643 int flagz;
644 OUTSTREAM scopeout;
645 } vf_args;
646 extern void Make_virtual_table (OUTSTREAM, recID, Token, typeID);
647 extern void Enter_virtual_function (vf_args*);
648 extern recID complete_structure (OUTSTREAM, recID);
649 extern recID is_aliasclass (recID);
650 extern recID aliasclass (recID);
651 #define iRESERVED_struct(r) (is_aliasclass (r) ? BLANKT : RESERVED_struct)
653 extern void mk_typeid (recID);
655 // - use db
657 extern recID lookup_struct (Token);
658 extern int is_struct (Token);
659 extern Token name_of_struct (recID);
660 static
661 inline char* SNM (recID r) { return expand (name_of_struct (r)); }
662 extern typeID pthis_of_struct (recID);
663 extern fspace FSP (recID);
664 extern bool has_const_members (recID);
666 extern int inherited_flagz (recID, Token, typeID);
667 extern int exported_flagz (recID, Token, typeID);
668 extern typeID lookup_variable_member (recID, Token, Token*, bool, Token*);
669 extern typeID lookup_virtual_varmemb (recID, Token, Token*, bool, Token**);
670 extern Token get_class_vptr (recID);
671 extern Token lookup_class_const (recID, Token);
672 extern int lookup_function_member (recID, Token, typeID[], flookup*, bool);
673 extern Token lookup_function_member_uname (recID*, Token);
674 extern int lookup_virtual_function_member (recID, Token, typeID[], Token*, flookup*);
675 extern bool Is_implied_virtual_variable (recID, Token);
676 extern bool Is_pure_virtual (recID, Token, typeID[], flookup*);
677 typedef struct {
678 typeID t;
679 Token rec, *memb, *expr;
680 } vtvar;
681 extern vtvar access_virtual_variable (recID, Token);
683 extern bool isunion (recID);
684 extern bool has_void_ctor (recID);
685 extern bool has_copy_ctor (recID);
686 extern bool has_dtor (recID);
687 extern bool always_unwind (recID);
688 extern Token idtor (recID);
689 extern Token vdtor (recID);
690 extern bool has_ctors (recID);
691 extern bool has_oper_fcall (recID);
692 extern Token have_fmemb_dcl (recID, Token);
694 extern OUTSTREAM dispatch_vdtor (recID, OUTSTREAM);
696 extern void make_intern_dtor (recID);
698 extern bool zero_offset (recID, recID);
699 extern bool isancestor (recID, recID);
700 extern int is_ancestor (recID, recID, Token**, bool);
701 extern int is_ancestor_runtime (recID, recID, Token**);
702 extern Token* upcast1_this (recID, recID);
704 extern recID ancest_named (recID, Token);
705 extern void downcast_rtti (recID, recID, recID, Token[]);
707 extern void purify_vfunc (Token);
709 extern void export_virtual_table_instances ();
710 extern void export_virtual_definitions ();
711 extern void export_virtual_static_definitions ();
712 extern void export_structs ();
714 extern bool Can_instantiate (recID);
715 extern bool need_construction (recID);
716 extern bool need_vbase_alloc (recID);
718 extern void gen_vt_init (OUTSTREAM, recID, Token, Token);
719 extern void produce_dtorables (OUTSTREAM, recID);
720 extern void gen_construction_code (OUTSTREAM, recID, Token);
722 extern Token lookup_local_typedef (recID, Token);
723 extern int borrow_auto_decls (recID, NormPtr[]);
724 extern void gen_pure_dm (recID, OUTSTREAM);
725 extern void repl__CLASS_ (Token**, recID);
727 //*****************************************************************************
728 // inames.h
729 //*****************************************************************************
731 extern Token arrdtor;
732 extern Token name_anonymous_struct ();
733 extern Token name_anonymous_union ();
734 extern Token name_anonymous_enum ();
735 extern Token name_anon_union (int, Token);
736 extern Token name_overload_fun (Token, char*);
737 extern Token name_member_function (recID, Token);
738 extern Token name_member_function_virtual (Token, Token);
739 extern Token name_local_typedef (Token, Token);
740 extern Token name_internal_object ();
741 extern Token name_uniq_var (int);
742 extern Token internal_identifier1 ();
743 extern Token internal_identifier2 ();
744 extern Token internal_identifier3 ();
745 extern Token internal_identifiern (int);
746 extern Token name_define_new (Token, Token);
747 extern Token name_inherited (Token);
748 extern Token name_storage_inherit (recID);
749 extern Token name_typeid_var (Token);
750 extern Token name_unwind_var (Token);
751 extern Token name_glob_static_local (Token);
752 extern Token name_arrdto_var (Token);
753 extern Token name_downcast (Token, Token);
754 extern Token name_downcast_safe (Token, Token);
755 extern Token name_upcast_safe (Token, Token);
756 extern Token name_virtual_slot (recID, Token, typeID);
757 extern Token name_virtual_variable (recID, Token);
758 extern Token name_instance (recID, recID);
759 extern Token name_arrdtor (recID);
760 extern Token name_virtual_table (recID);
761 extern Token name_virtual_inner (recID, recID, Token, typeID);
762 extern Token name_name_enumerate (Token, int);
763 extern Token name_rtti_slot (recID, recID);
764 extern Token name_intern_ctor (recID);
765 extern Token name_intern_dtor (recID);
766 extern Token name_intern_vdtor (recID);
767 extern Token name_derrive_memb (recID);
768 extern Token name_anon_regexp ();
769 extern Token name_derrive_union;
770 extern Token tokstrcat (Token, char*);
771 extern Token toktokcat (Token, Token);
772 extern Token name_global_ctor (int);
773 extern Token name_ebn_func (Token);
774 extern Token name_longbreak ();
775 extern Token name_longcontinue ();
777 //*****************************************************************************
778 // icode.h
779 //*****************************************************************************
781 extern Token i_call_initialization (recID);
782 extern Token i_downcast_function (recID, recID);
783 extern Token i_downcast_null_safe (recID, recID);
784 extern Token i_upcast_null_safe (recID, recID, Token*, bool);
785 extern Token i_member_virtual (recID, Token, typeID*, flookup*);
786 extern Token i_trampoline_func (flookup*, bool[]);
787 extern Token i_enum_by_name (Token);
788 extern Token i_typeid_var (Token);
789 extern Token i_arrdtor_func (recID);
791 extern void alloc_and_init (OUTSTREAM, recID, Token, Token, Token);
792 extern void alloc_and_init_dcl (OUTSTREAM, recID, Token, bool);
794 //*****************************************************************************
795 // breakexpr.h
796 //*****************************************************************************
798 typedef enum {
799 NOAMBIG,
800 PARENTH_CAST, PARENTH_SYNTAX, PARENTH_FCALL, PARENTH_POSTFIX,
801 SIZEOF_TYPE, SIZEOF_EXPRESSION,
802 } exambg;
804 typedef struct {
805 Token *expr;
806 exambg et;
807 NormPtr operators [128];
808 int nop;
809 bool esc_op;
811 Token **branch;
812 } bexpr;
814 extern void break_expr (bexpr*);
816 enum { CONST_EXPR, INIT_EXPR, NORMAL_EXPR };
818 extern NormPtr skip_expression (Token*, NormPtr, int);
820 //*****************************************************************************
821 // rexpr.h
822 //*****************************************************************************
824 extern struct obflag {
825 bool yes;
826 recID class;
827 bool have_this;
828 typeID classP;
829 Token func, efunc;
830 bool polymorph, recording;
831 bool isdtor;
832 } objective;
834 typedef struct {
835 Token *newExpr;
836 bool isconstant, ok;
837 typeID type;
838 } exprret;
840 extern void parse_expression_string (Token*, exprret*);
841 extern NormPtr parse_expression (NormPtr, exprret*, int);
842 extern NormPtr parse_expression_retconv (NormPtr, exprret*, typeID, int);
843 extern NormPtr parse_const_expression (NormPtr, exprret*);
845 extern void rewrite_designator (typeID, Token[]);
846 extern Token *rewrite_ctor_expr (Token*);
848 extern inline bool ispointer (typeID);
849 extern inline bool isstructure (typeID);
850 extern inline bool isstructptr (typeID);
851 extern inline bool isreference (typeID);
853 extern bool is_object_in_scope (Token);
855 //*****************************************************************************
856 // statement.h
857 //*****************************************************************************
859 extern NormPtr compound_statement (OUTSTREAM, NormPtr);
860 extern NormPtr statement (OUTSTREAM, NormPtr);
861 extern Token* rewrite_compound_statement (Token*);
863 //*****************************************************************************
864 // dcl.h
865 //*****************************************************************************
867 extern Token local_name;
868 extern typeID local_type;
869 extern recID class_scope;
871 extern bool is_array_of_ctorable_objects (typeID);
873 extern NormPtr gen_array_ctors (OUTSTREAM, NormPtr, typeID, Token, int*, bool);
874 extern NormPtr struct_declaration (recID, OUTSTREAM, NormPtr);
875 extern NormPtr local_declaration (OUTSTREAM, NormPtr);
876 extern void reparse_template_func (Token, recID, NormPtr);
877 extern typeID eval_cast (Token**);
878 extern void translation_unit ();
879 extern Token bt_macro, bt_replace;
881 extern recID current_scope[];
882 extern int top_scope;
884 //*****************************************************************************
885 // fdb.h
886 //*****************************************************************************
888 extern Token *func_prologue;
890 typedef enum { DT_NORM, DT_AUTO, DT_ABSTRACT } deftype;
892 extern typeID return_typeID;
893 extern void store_definition
894 (Token, Token*, Token*, typeID*, NormPtr, recID, typeID, Token, bool, deftype, bool);
895 extern void store_definition_alias
896 (Token, Token*, Token*, typeID*, NormPtr, recID, typeID, Token, bool, deftype, bool);
897 extern void store_define_dtor (Token, recID);
898 extern void commit_auto_define (Token, recID, Token, Token, bool, Token*, Token*, typeID);
899 extern void define_auto_functions ();
900 extern void commit_abstract_define (Token, Token, recID, bool);
901 extern void rename_fdb (Token, Token);
902 extern void remove_struct_from_def (Token);
903 extern void do_functions ();
905 // -- usage
907 extern void usage_tconst (Token);
908 extern void usage_upcast (recID);
909 extern void usage_fcall (Token);
910 extern void usage_memb (Token);
911 extern void usage_vvar (Token*);
912 extern void usage_typeID (typeID);
913 extern void usage_notok ();
914 extern void usage_call_pure ();
915 extern void usage_set_pure ();
917 //*****************************************************************************
918 // except.h
919 //*****************************************************************************
921 #define LEAVE_ESCOPE -1
922 extern bool did_unwind;
923 extern void push_unwind (OUTSTREAM, recID, Token);
924 extern void pop_unwind (OUTSTREAM);
925 extern void leave_escope (OUTSTREAM);
926 extern void remove_unwind_stuff (Token*);
927 extern NormPtr throw_statement (OUTSTREAM, NormPtr);
928 extern NormPtr try_statement (OUTSTREAM, NormPtr);
929 extern NormPtr on_throw_statement (OUTSTREAM, NormPtr);
930 extern void init_except ();
931 extern void decl_except_data ();
933 //*****************************************************************************
934 // regexp.h
935 //*****************************************************************************
937 extern Token perlop_regexp (Token);
938 extern NormPtr parse_RegExp (NormPtr, int);
940 //*****************************************************************************
941 // textp.h
942 //*****************************************************************************
944 extern char *escape_c_string (char*, int);
945 extern char *interpolate_string (char*, int);
946 extern void init_processors ();
947 typedef char *(*text_processor) (char*, int);
949 extern int processor;
950 extern text_processor TP [128];
952 //*****************************************************************************
953 // test.h
954 //*****************************************************************************
956 #define SAVE_VAR(x, y) __typeof__(x) _tmp_ ## x = x; x = y
957 #define RESTOR_VAR(x) x = _tmp_ ## x
959 #define SAVE_VARC(x, y, tmp) __typeof__(x) tmp = x; x = y
960 #define RESTOR_VARC(x, tmp) x = tmp;
962 #define SAVE_CODE(x) SAVE_VAR (CODE, x); SAVE_VAR (last_location, 0);
963 #define RESTOR_CODE RESTOR_VAR (CODE); RESTOR_VAR (last_location);
965 #define CLEAR_MAYTHROW bool mthback = may_throw; may_throw = 0;
966 #define TEST_MAYTHROW ({int rez = !may_throw; may_throw |= mthback; rez;})
968 static inline int max (int i, int j) { return i > j ? i : j; }
969 static inline int min (int i, int j) { return i < j ? i : j; }
970 static inline int in2 (int a, int b, int c) { return a == b || a == c; }
971 static inline int in3 (int a, int b, int c, int d) { return in2 (a, b, c) || a == d; }
972 static inline int in4 (int a, int b, int c, int d, int e)
973 { return in2 (a, b, c) || in2 (a, d, e); }
974 static inline int xor (int a, int b) { return a ? !b : !!b; }
975 static inline int nz (int a) { return a != 0; }
977 static inline bool is_reference (typeID t)
978 { return open_typeID (t)[0] >= REFERENCE_BASE; }