3 * Copyright (C) 2003, Stelios Xanthakis
11 #include <sys/types.h>
25 #define COLS "\033[01;37m"
26 #define COLE "\033[0m"
27 #define XSTR COLS"%s"COLE
29 //*****************************************************************************
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
40 #define HAVE_GNUC_LOCAL_LABELS
41 #define HAVE_GNUC_ATTR_NORETURN
43 #define BROKEN_ALIASES
48 #define alloca __builtin_alloca
49 #else // ------ generic ------
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
60 //*****************************************************************************
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."
68 #define HAVE_BUILTIN_MEMCPY
69 #define SIZEOF_UCONTEXT "512" // should suffice for the near future
71 //*****************************************************************************
73 //*****************************************************************************
77 #define LWC_VERSION "2.0"
83 //*****************************************************************************
85 //*****************************************************************************
87 typedef int NormPtr
, Token
, recID
, typeID
, enumID
;
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 //*****************************************************************************
103 //*****************************************************************************
108 extern struct debugflag_s
{
117 PARSE_ERRORS_SEGFAULT
,
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"); }
142 //*****************************************************************************
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
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 //*****************************************************************************
198 //*****************************************************************************
200 extern void preproc (int, char**);
201 extern char *current_file
, *main_file
;
203 //*****************************************************************************
205 //*****************************************************************************
207 extern NormPtr
lwc_config (NormPtr
);
208 extern NormPtr
__C__ (NormPtr
);
210 //*****************************************************************************
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 //*****************************************************************************
225 //*****************************************************************************
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 //*****************************************************************************
258 //*****************************************************************************
261 extern void setup_cpp (int, char**);
262 extern void cleanup_cpp ();
263 extern void cpp_directive ();
265 #define VARBOOST 1000
267 extern int is_macro (Token
);
268 extern Token
* expand_macro (Token
);
270 //*****************************************************************************
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
;
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
);
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 //*****************************************************************************
322 //*****************************************************************************
324 extern void do_templates ();
326 //*****************************************************************************
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*);
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
;
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 //*****************************************************************************
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 //*****************************************************************************
455 //*****************************************************************************
457 typedef struct funcp_t
{
458 struct funcp_t
*next
;
470 #define FUNCP_LINKONCE 1
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
[]);
501 Token
*prototype
, *xargs
;
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 //*****************************************************************************
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
);
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]; }
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 //*****************************************************************************
607 //*****************************************************************************
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
,
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
*,
635 extern void rename_hier (Token
, Token
);
636 extern int virtual_inheritance_decl (OUTSTREAM
, recID
, Token
);
642 Token
*prototype
, *argv
;
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
);
657 extern recID
lookup_struct (Token
);
658 extern int is_struct (Token
);
659 extern Token
name_of_struct (recID
);
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
*);
679 Token rec
, *memb
, *expr
;
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 //*****************************************************************************
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 //*****************************************************************************
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 //*****************************************************************************
796 //*****************************************************************************
800 PARENTH_CAST
, PARENTH_SYNTAX
, PARENTH_FCALL
, PARENTH_POSTFIX
,
801 SIZEOF_TYPE
, SIZEOF_EXPRESSION
,
807 NormPtr operators
[128];
814 extern void break_expr (bexpr
*);
816 enum { CONST_EXPR
, INIT_EXPR
, NORMAL_EXPR
};
818 extern NormPtr
skip_expression (Token
*, NormPtr
, int);
820 //*****************************************************************************
822 //*****************************************************************************
824 extern struct obflag
{
830 bool polymorph
, recording
;
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 //*****************************************************************************
857 //*****************************************************************************
859 extern NormPtr
compound_statement (OUTSTREAM
, NormPtr
);
860 extern NormPtr
statement (OUTSTREAM
, NormPtr
);
861 extern Token
* rewrite_compound_statement (Token
*);
863 //*****************************************************************************
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 //*****************************************************************************
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 ();
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 //*****************************************************************************
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 //*****************************************************************************
935 //*****************************************************************************
937 extern Token
perlop_regexp (Token
);
938 extern NormPtr
parse_RegExp (NormPtr
, int);
940 //*****************************************************************************
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 //*****************************************************************************
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
; }