Annotation of researchv10no/cmd/cfront/ocfront/cfront.h, revision 1.1

1.1     ! root        1: /*ident        "@(#)ctrans:src/cfront.h        1.2.5.35" */
        !             2: /***********************************************************************
        !             3: 
        !             4:        C++ source for cfront, the C++ compiler front-end
        !             5:        written in the computer science research center of Bell Labs
        !             6: 
        !             7:        Copyright (c) 1984 AT&T, Inc. All rigths Reserved
        !             8:        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
        !             9: 
        !            10:        When reading cfront code please remember that C++ was not available
        !            11:        when it was originally written. Out of necessity cfront is written
        !            12:        in a style that takes advantage of only few of C++'s features.
        !            13: 
        !            14: cfront.h:
        !            15: 
        !            16:        Here is all the class definitions for cfront, and most of the externs
        !            17: 
        !            18: ***********************************************************************/
        !            19: 
        !            20: /*     WARNING:
        !            21:        This program relies on non-initialized class members being ZERO.
        !            22:        This will be true as long as they are allocated using the "new" operator
        !            23:        from alloc.c
        !            24:  */
        !            25: 
        !            26: #include "token.h"
        !            27: #include "typedef.h"
        !            28: 
        !            29: #ifndef GRAM
        !            30: extern char* prog_name;                // compiler name and version
        !            31: extern int inline_restr;       // inline expansion restrictions 
        !            32: #endif
        !            33: 
        !            34: extern Pname name_free;                // free lists
        !            35: extern Pexpr expr_free;
        !            36: extern Pstmt stmt_free;
        !            37: 
        !            38:                /* "spy" counters: */
        !            39: //extern int Nspy;
        !            40: //extern int Nline, Ntoken, Nname, Nfree_store, Nalloc, Nfree;
        !            41: //extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc, Nl;
        !            42: //extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe, NFl;
        !            43: 
        !            44: ///extern TOK  lex();
        !            45: extern TOK     tlex();
        !            46: extern Pname   syn();
        !            47: 
        !            48: extern void    ext(int);
        !            49: 
        !            50: extern char*   make_name(TOK);
        !            51: extern void    make_dummy();
        !            52: extern Pname   dummy_fct;
        !            53: extern Pname    really_dominate(Pname, Pname, bit);
        !            54: extern int      exact1(Pname, Ptype);
        !            55: 
        !            56: extern int friend_check(Pclass start,Pclass stop, Pfct f);
        !            57: 
        !            58: struct loc             // a source file location
        !            59: {
        !            60:        short   file;   // index into file_name[], or zero
        !            61:        short   line;
        !            62: #ifndef GRAM
        !            63:        void    put(FILE*);
        !            64:        void    putline();
        !            65: #endif
        !            66: };
        !            67: 
        !            68: extern Loc curloc;
        !            69: extern int curr_file;
        !            70: extern char* src_file_name;
        !            71: extern loc noloc; // dummy null location
        !            72: extern bit binary_val;
        !            73: extern bit stmtno;
        !            74: 
        !            75: struct ea {    // fudge portable printf-like formatting for error()
        !            76:        union {
        !            77:                void* p;
        !            78:                long i;
        !            79:        };
        !            80: 
        !            81:        ea(const void* pp) { p = pp; }
        !            82:        ea(long ii)   { i = ii; }
        !            83:        ea() {}
        !            84: };
        !            85: 
        !            86: extern ea* ea0;
        !            87: 
        !            88: overload error;
        !            89: int error(const char*);
        !            90: int error(const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            91: int error(int, const char*);
        !            92: int error(int, const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            93: int error(loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            94: int error(int, loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
        !            95: extern char emode;
        !            96: 
        !            97: extern int error_count;
        !            98: extern int vtbl_opt;
        !            99: extern int debug_opt;
        !           100: extern int warning_opt;
        !           101: extern int ansi_opt;
        !           102: extern int strict_opt;
        !           103: extern FILE* out_file;
        !           104: extern FILE* in_file;
        !           105: extern char scan_started;
        !           106: 
        !           107: extern int bl_level;
        !           108: extern Ptable ktbl;            // keywords and typedef names
        !           109: extern Ptable gtbl;            // global names
        !           110: extern Ptable ptbl;            
        !           111: extern Ptable lcl_tbl;
        !           112: extern char* oper_name(TOK);
        !           113: extern Pname def_name;
        !           114: extern Pname pdef_name;
        !           115: extern Pclass ccl;
        !           116: extern Pbase defa_type;
        !           117: extern Pbase moe_type;
        !           118: extern Pbase mptr_type;
        !           119: 
        !           120: #ifndef GRAM
        !           121: extern Pstmt Cstmt;            // current statement, or 0
        !           122: extern Pname Cdcl;             // name currently being declared, or 0
        !           123: 
        !           124: extern Pbase any_type;
        !           125: extern int largest_int;
        !           126: #endif
        !           127: 
        !           128: extern Pbase int_type;
        !           129: extern Pbase char_type;
        !           130: extern Pbase short_type;
        !           131: extern Pbase long_type;
        !           132: extern Pbase uint_type;
        !           133: extern Pbase float_type;
        !           134: extern Pbase double_type;
        !           135: extern Pbase ldouble_type;
        !           136: extern Pbase void_type;
        !           137: 
        !           138: #ifndef GRAM
        !           139: extern Pbase uchar_type;
        !           140: extern Pbase ushort_type;
        !           141: extern Pbase ulong_type;
        !           142: extern Ptype Pchar_type;
        !           143: extern Ptype Pint_type;
        !           144: extern Ptype Pvptr_type;
        !           145: extern Ptype Pfctvec_type;
        !           146: extern Ptype Pvoid_type;
        !           147: extern Pbase zero_type;
        !           148: extern Ptype size_t_type;
        !           149: 
        !           150: extern int byte_offset;
        !           151: extern int bit_offset;
        !           152: extern int max_align;
        !           153: extern int const_save;
        !           154: extern int const_ptr;
        !           155: extern int cm_const_save;
        !           156: extern bit const_problem;
        !           157: #endif
        !           158: 
        !           159: extern Pexpr dummy;    /* the empty expression */
        !           160: extern Pexpr zero;
        !           161: extern Pexpr one;
        !           162: extern Pname sta_name; /* qualifier for unary :: */
        !           163: 
        !           164: #define DEL(p) if (p && (p->permanent==0)) p->del()
        !           165: #define PERM(p) p->permanent=1
        !           166: #define UNPERM(p) p->permanent=0
        !           167: 
        !           168: struct node {
        !           169:        TOK     base;
        !           170:        bit     permanent;
        !           171: #ifdef DBG
        !           172:        bit     displayed;      // avoid invinite recursion in display functions
        !           173:        bit     allocated;      // set when not on free list
        !           174:        long    id;
        !           175: #endif
        !           176: };
        !           177: #ifdef DBG
        !           178: extern long node_id;
        !           179: extern int Adebug;
        !           180: #define DBID() { node::id = ++::node_id; node::allocated=1; displayed=0; \
        !           181:        if(Adebug>=1)fprintf(stderr,"\n*** allocated %d base %d\n",id,base); }
        !           182: #else
        !           183: #define DBID() /**/
        !           184: #endif
        !           185: 
        !           186: struct table : node {
        !           187: /*     a table is a node only to give it a "base" for debugging */
        !           188:        bit     init_stat;      /* ==0 if block(s) of table not simplified,
        !           189:                                   ==1 if simplified but had no initializers,
        !           190:                                   ==2 if simplified and had initializers.
        !           191:                                */
        !           192:        short   size;
        !           193:        short   hashsize;
        !           194:        short   free_slot;      /* next free slot in entries */
        !           195:        Pname*  entries;
        !           196:        short*  hashtbl;
        !           197:        Pstmt   real_block;     /* the last block the user wrote,
        !           198:                                   not one of the ones cfront created
        !           199:                                */
        !           200:        Ptable  next;           /* table for enclosing scope */
        !           201:        Pname   t_name;         /* name of the table */
        !           202: 
        !           203:        table(short, Ptable, Pname);
        !           204: 
        !           205:        Pname   look(char*, TOK);
        !           206:        Pname   insert(Pname, TOK);
        !           207: #ifndef GRAM
        !           208:        void    grow(int);
        !           209:        void    set_name(Pname n)       { t_name = n; };
        !           210:        Pname   get_mem(int);
        !           211:        int     max()                   { return free_slot-1; };
        !           212:        void    dcl_print(TOK,TOK);
        !           213:        void    del();
        !           214: #endif
        !           215: };
        !           216: 
        !           217: #ifndef GRAM
        !           218: extern bit Nold;
        !           219: extern bit vec_const, fct_const;
        !           220: #endif
        !           221: 
        !           222: extern void restore();
        !           223: extern void set_scope(Pname);
        !           224: extern Plist modified_tn;
        !           225: 
        !           226: // local class
        !           227: extern Plist local_tn;
        !           228: extern Plist local_blk;
        !           229: extern Plist local_class;
        !           230: extern void local_hide( Pname ); 
        !           231: extern char *make_local_name(Pclass, int=0);
        !           232: 
        !           233: // nested type
        !           234: extern Plist nested_tn;
        !           235: extern Plist nested_type;
        !           236: extern Pname curr_scope; 
        !           237: extern Pname curr_fct; 
        !           238: extern void nested_hide(Pname); 
        !           239: extern int is_empty(Pclass,bit=0);
        !           240: 
        !           241: extern Pbase start_cl(TOK, Pname, Pbcl);
        !           242: extern void end_cl();
        !           243: extern Pbase end_enum(Pname, Pname);
        !           244: 
        !           245: /************ types : basic types, aggregates, declarators ************/
        !           246: 
        !           247: #ifndef GRAM
        !           248: extern bit new_type;
        !           249: extern Pname cl_obj_vec;
        !           250: extern Pname eobj;
        !           251: #endif
        !           252: 
        !           253: 
        !           254: #define DEFINED 01     /* definition fed through ?::dcl() */
        !           255: #define SIMPLIFIED 02  /* in ?::simpl() */
        !           256: #define DEF_SEEN 04    /* definition seen, but not processed */
        !           257: #define REF_SEEN 010   /* reference seen (classdef) */
        !           258:                        /*   used for class members in norm.c */
        !           259: #define IN_ERROR 010
        !           260: 
        !           261: struct type : node {
        !           262:        bit     defined;        /* flags DEF_SEEN, DEFINED, SIMPLIFIED, IN_ERROR
        !           263:                                        not used systematically yet
        !           264:                                */
        !           265:        bit     lex_level;
        !           266:        Pclass  in_class;       // nested type
        !           267:        Pname   in_fct;         // local type
        !           268:        char    *lcl;
        !           269:        char    *nested_sig;
        !           270:        char    *signature(char*);
        !           271:        Ptype   tlist;
        !           272:        bit     check(Ptype, TOK);
        !           273: #ifndef GRAM
        !           274:        void    print();
        !           275:        void    dcl_print(Pname);
        !           276:        void    base_print();
        !           277:        void    del();
        !           278: 
        !           279:        Pname   is_cl_obj();    /* sets cl_obj_vec */
        !           280:        Pptr    is_ref();
        !           281:        Pptr    is_ptr();
        !           282:        Pptr    is_ptr_or_ref();
        !           283:        bit     is_unsigned();
        !           284:        void    dcl(Ptable);
        !           285:        int     tsizeof(int = 0);
        !           286:        bit     tconst();
        !           287:        TOK     set_const(bit);
        !           288:        int     align();
        !           289:        TOK     kind(TOK,TOK);
        !           290:        TOK     integral(TOK oo)        { return kind(oo,'I'); };
        !           291:        TOK     numeric(TOK oo)         { return kind(oo,'N'); };
        !           292:        TOK     num_ptr(TOK oo)         { return kind(oo,'P'); };
        !           293:        bit     vec_type();
        !           294:        Ptype   deref();
        !           295:        inline Pptr     addrof();
        !           296:        Pfct    memptr();
        !           297: #endif
        !           298: };
        !           299: 
        !           300: struct enumdef : type {        /* ENUM */
        !           301:        bit     e_body;
        !           302:        short   no_of_enumerators;
        !           303:        unsigned char strlen;   // strlen(string)
        !           304:        char*   string;         // name of enum
        !           305:        Pname   mem;
        !           306:        Pbase   e_type;         // type representing the enum
        !           307:                enumdef(Pname n)        { base=ENUM; mem=n; };
        !           308: #ifndef GRAM
        !           309:        void    print();
        !           310:        void    dcl_print(Pname);
        !           311:        void    dcl(Pname, Ptable);
        !           312:        void    simpl();
        !           313: #endif
        !           314: };
        !           315: 
        !           316: struct velem {
        !           317:        Pname   n;
        !           318:        int     offset;
        !           319: };
        !           320: 
        !           321: struct virt {
        !           322:        Pvirt   next;
        !           323:        velem*  virt_init;      // vector of vtbl initializers (zero-terminated)
        !           324:        Pclass  vclass;         // for class vclass
        !           325:        char*   string;
        !           326:        bit     is_vbase;       // vtable for virtual base
        !           327:        bit     printed;
        !           328:        virt(Pclass cl, velem* v, char* s, bit flag) {vclass=cl; virt_init=v; string=s; is_vbase=flag; next=0; }
        !           329: };
        !           330: 
        !           331: enum { C_VPTR=1, C_XREF=2, C_ASS=4, C_VBASE=8 };
        !           332: 
        !           333: struct classdef : type {       /* CLASS */
        !           334:        bit     c_body;         /* print definition only once */
        !           335:        TOK     csu;            /* CLASS, STRUCT, UNION, or ANON */
        !           336:        bit     obj_align;
        !           337:        bit     c_xref;
        !           338:                // 1 set:       has vptr(s) 
        !           339:                // 2 set:       X(X&) exists
        !           340:                // 4 set:       operator=(X&) exists
        !           341:                // 8 set:       has vbaseptr(s)
        !           342:                
        !           343:        bit     virt_count;     // number of virtual functions
        !           344:                                // starting at max base class virt_count in
        !           345:        bit     virt_merge;     // set when no virtual functions, but
        !           346:                                // need to merge virtual base classes
        !           347:        bit     c_abstract;     // abstract class: don't instansiate
        !           348:        bit     has_vvtab;      // set if class has vtable from virtual base
        !           349:        unsigned char strlen;   // strlen(string)
        !           350:        Pbcl    baselist;       // list of base classes
        !           351:        char*   string;         /* name of class */
        !           352:        Pname   mem_list;
        !           353:        Ptable  memtbl;
        !           354:        int     obj_size;
        !           355:        int     real_size;      /* obj_size - alignment waste */
        !           356:        Plist   friend_list;
        !           357:        Pname   pubdef;
        !           358:        Plist   tn_list;        // list of member names hiding type names
        !           359:        Plist   nest_list;      // list of nested types
        !           360:        Ptype   this_type;
        !           361:        Pvirt   virt_list;      // vtbl initializers
        !           362:        Pname   c_ctor;         // constuctor:
        !           363:                                // possibly overloaded, possibly inherited
        !           364:        Pname   c_dtor;         // destructor
        !           365:        Pname   c_itor;         /* constructor X(X&) */
        !           366:        Pname   conv;           /* operator T() chain */
        !           367:        struct toknode *c_funqf, *c_funqr; // token Q for parsing function defs after class def
        !           368: 
        !           369:        classdef(TOK);
        !           370:        TOK     is_simple()     { return (csu==CLASS)?0:csu; };
        !           371: #ifndef GRAM
        !           372:        void    print();
        !           373:        void    dcl_print(Pname);
        !           374:        void    simpl();
        !           375: 
        !           376:        void    print_members();
        !           377:        void    dcl(Pname, Ptable);
        !           378: 
        !           379: //     bit     has_friend(Pname);
        !           380:        bit     has_friend(Pclass);
        !           381:        bit     has_friend(Pfct);
        !           382: 
        !           383:        bit     has_base(Pclass cl);
        !           384:        bit     baseof(Pname);
        !           385:        bit     baseof(Pclass);
        !           386:        Pclass  is_base(char*);
        !           387: 
        !           388:        Pname   has_oper(TOK);
        !           389:        Pname   has_ctor()      { return c_ctor; }
        !           390:        Pname   has_dtor()      { return c_dtor; }
        !           391:        Pname   has_itor()      { return c_itor; }
        !           392:        Pname   has_ictor();
        !           393:        Pname   make_itor(int);
        !           394:        Pexpr   find_name(char*, Pclass);
        !           395:        int     do_virtuals(Pvirt, char*, int, bit);
        !           396:        int     all_virt(Pclass, char*, int, bit);
        !           397:        void    add_vtbl(velem*, char*, bit);
        !           398:        void    print_all_vtbls(Pclass);
        !           399:        void    print_vtbl(Pvirt);
        !           400:        void    really_print(Pvirt);
        !           401:        int     check_dup(Pclass, TOK);
        !           402:        int     has_allocated_base(Pclass);
        !           403:        char    *has_allocated_base(char*);
        !           404:        int     get_offset(char*);
        !           405:        Pbcl    get_base(char*);
        !           406:        Pexpr   get_vptr_exp(char*);
        !           407:        Pexpr   find_in_base(char*, Pclass);
        !           408: #endif
        !           409: };
        !           410: 
        !           411: #ifndef GRAM
        !           412: 
        !           413: class clist {
        !           414:        Pclass cl;
        !           415:        clist* next;
        !           416: public:
        !           417:        clist(Pclass c, clist* n) { cl=c; next=n; }
        !           418:        int onlist(Pclass);
        !           419:        void clear();
        !           420: };
        !           421:        
        !           422: extern clist * vcllist;
        !           423: 
        !           424: struct vl {
        !           425:        struct vl* next;
        !           426:        Pvirt vt;
        !           427:        classdef* cl;
        !           428: 
        !           429:        vl(classdef* c, Pvirt v, struct vl* n)
        !           430:                { cl = c; vt = v; next = n; }
        !           431: };
        !           432: 
        !           433: extern vl* vlist;
        !           434: 
        !           435: extern int nin;
        !           436: extern int Nvis;
        !           437: extern int Noffset;
        !           438: extern TOK Nvirt;
        !           439: extern Pexpr Nptr;
        !           440: extern Pbcl Nvbc_alloc;
        !           441: extern char *Nalloc_base;
        !           442: extern Pexpr rptr(Ptype,Pexpr,int);
        !           443: extern Pexpr vbase_args(Pfct, Pname);
        !           444: extern Pexpr cdvec(Pname,Pexpr,Pclass,Pname,int,Pexpr,Pexpr=0);
        !           445: 
        !           446: extern Pexpr find(char*, Pclass, int);
        !           447: extern Pexpr find_name(Pname, Pclass, Ptable, int, Pname);
        !           448: extern Pname find_virtual(Pclass,Pname);
        !           449: extern Pname vfct(Pclass, char*);
        !           450: extern int Vcheckerror;
        !           451: extern int vhack;
        !           452: extern int ignore_const;       
        !           453: 
        !           454: extern int access_control; 
        !           455: extern int mex;
        !           456: extern Pclass mec;
        !           457: extern Pclass tcl;
        !           458: extern Pname me;
        !           459: extern Pfct mef;
        !           460: #endif
        !           461: 
        !           462: struct basetype : type
        !           463:        /*      ZTYPE CHAR SHORT INT LONG FLOAT DOUBLE
        !           464:                FIELD EOBJ COBJ TYPE ANY
        !           465:        */
        !           466:        /*      used for gathering all the attributes
        !           467:                for a list of declarators
        !           468: 
        !           469:                ZTYPE is the (generic) type of ZERO
        !           470:                ANY is the generic type of an undeclared name
        !           471:        */
        !           472: {
        !           473:        bit     b_unsigned;
        !           474:        bit     b_signed;
        !           475:        bit     b_volatile;
        !           476:        bit     b_const;
        !           477:        bit     b_typedef;
        !           478:        bit     b_inline;
        !           479:        bit     b_virtual;
        !           480:        bit     b_short;
        !           481:        bit     b_long;
        !           482:        bit     b_bits;         /* number of bits in field */
        !           483:        bit     b_offset;       // bit offset of field
        !           484:        TOK     b_sto;          /* AUTO STATIC EXTERN REGISTER 0 */
        !           485:        Pname   b_name;         /* name of non-basic type */
        !           486:        Ptable  b_table;        /* memtbl for b_name, or 0 */
        !           487:        Pname   b_xname;        /* extra name */
        !           488:        union {
        !           489:        Ptype   b_fieldtype;
        !           490:        char*   b_linkage;
        !           491:        };
        !           492: 
        !           493:        basetype(TOK, Pname);
        !           494: 
        !           495:        Pbase   type_adj(TOK);
        !           496:        Pbase   base_adj(Pbase);
        !           497:        Pbase   name_adj(Pname);
        !           498:        Pname   aggr();
        !           499:        Pbase   check(Pname);
        !           500: #ifndef GRAM
        !           501:        void    dcl_print();
        !           502:        Pbase   arit_conv(Pbase);
        !           503: #endif
        !           504: };
        !           505: 
        !           506: enum Linkage { linkage_default, linkage_C, linkage_Cplusplus };
        !           507: extern Linkage linkage;
        !           508: void set_linkage(char*);
        !           509: 
        !           510: struct fct : type              // FCT
        !           511: {
        !           512:        TOK     nargs;
        !           513:        TOK     nargs_known;    // 0 if unknown, 1 if known, or ELLIPSIS
        !           514:        bit     last_stmt;
        !           515:        bit     f_vdef;         // 1 if this is the first virtual definition
        !           516:                                // of this function
        !           517:        bit     f_inline;       // 1 if inline, 2 if being expanded, else 0
        !           518:        bit     f_const;        // one if member function that may be called for
        !           519:                                // a const object, else 0
        !           520:        bit     f_static;       // 1 if static member function, else 0
        !           521:        short   f_virtual;      // index in virtual table, or 0 meaning non-virtual
        !           522:        short   f_imeasure;     // some measure of the size of an inline function
        !           523:        Ptype   returns;
        !           524:        Pname   argtype;
        !           525:        Ptype   s_returns;
        !           526:        Pname   f_this;
        !           527:        Pclass  memof;          // member of class memof
        !           528:        Pblock  body;
        !           529:        Pname   f_init;         // base and member initializers
        !           530: //     Pname   f_baseinit;     // base initializers
        !           531: //                             // null name => single base class init;
        !           532:        Pexpr   f_expr;         // body expanded into an expression
        !           533:        Pexpr   last_expanded;
        !           534:        Pname   f_result;       // extra second argument of type X&
        !           535:        Pname   f_args;         // argument list including args added by cfront
        !           536:        Linkage f_linkage;
        !           537:        char*   f_signature;    // character encoding of function type
        !           538:        Plist local_class;      // list of local classes
        !           539:        fct(Ptype, Pname, TOK);
        !           540:        void    argdcl(Pname,Pname);
        !           541: #ifndef GRAM
        !           542:        Ptype   normalize(Ptype);
        !           543:        void    dcl_print();
        !           544:        void    dcl(Pname);
        !           545:        Pexpr   base_init(Pclass, Pexpr, Ptable, int);
        !           546:        Pexpr   mem_init(Pname, Pexpr, Ptable);
        !           547:        void    init_bases(Pclass, Pexpr);
        !           548:        bit     declared() { return nargs_known; };
        !           549:        void    simpl();
        !           550:        int     ctor_simpl(Pclass, Pexpr);
        !           551:        Pstmt   dtor_simpl(Pclass, Pexpr);
        !           552:        Pexpr   expand(Pname,Ptable,Pexpr);
        !           553:        void    sign();
        !           554: #endif
        !           555: };
        !           556: 
        !           557: 
        !           558: struct name_list {
        !           559:        Pname   f;
        !           560:        Plist   l;
        !           561:        name_list(Pname ff, Plist ll) { f=ff; l=ll; };
        !           562: };
        !           563: 
        !           564: #ifndef GRAM
        !           565: struct gen : type {            // OVERLOAD
        !           566:        Plist   fct_list;
        !           567: 
        !           568:        gen() { base = OVERLOAD; }
        !           569:        Pname   add(Pname);
        !           570:        Pname   find(Pfct, bit);
        !           571:        Pname   match(Pname, Pfct, bit);
        !           572: };
        !           573: #endif
        !           574: 
        !           575: struct pvtyp : type {
        !           576:        Ptype typ;
        !           577: };
        !           578: 
        !           579: struct vec : pvtyp             // VEC
        !           580:                                // typ [ dim ]
        !           581: {
        !           582:        Pexpr   dim;
        !           583:        int     size;   
        !           584: 
        !           585:        vec(Ptype t, Pexpr e) { base=VEC; typ=t; dim=e; DBID(); };
        !           586: #ifndef GRAM
        !           587:        Ptype   normalize(Ptype);
        !           588: #endif
        !           589: };
        !           590: 
        !           591: struct ptr : pvtyp             // PTR, RPTR i.e. reference
        !           592: {
        !           593:        Pclass  memof;          // pointer to member of memof: memof::*
        !           594:        bit     rdo;            // "*const"
        !           595: 
        !           596:        ptr(TOK b, Ptype t) { base=b; typ=t; DBID(); }
        !           597: #ifndef GRAM
        !           598:        Ptype   normalize(Ptype);
        !           599: #endif
        !           600: };
        !           601: 
        !           602: #ifndef GRAM
        !           603: inline Pptr type::addrof() { return new ptr(PTR,this); }
        !           604: 
        !           605: extern bit vrp_equiv;
        !           606: #endif
        !           607: 
        !           608: 
        !           609: /****************************** constants ********************************/
        !           610: 
        !           611:                /* STRING ZERO ICON FCON CCON ID */
        !           612:                /* IVAL FVAL LVAL */
        !           613: 
        !           614: /***************************** expressions ********************************/
        !           615: 
        !           616: #ifndef GRAM
        !           617: extern Pexpr next_elem();
        !           618: extern void new_list(Pexpr);
        !           619: extern void list_check(Pname, Ptype, Pexpr, Ptable=0);
        !           620: extern Pexpr ref_init(Pptr,Pexpr,Ptable);
        !           621: extern Pexpr class_init(Pexpr,Ptype,Pexpr,Ptable);
        !           622: extern Pexpr check_cond(Pexpr, TOK, Ptable);
        !           623: extern Pexpr ptof(Pfct,Pexpr,Ptable);
        !           624: extern void dosimpl(Pexpr, Pname);
        !           625: extern int ref_initializer;
        !           626: extern int ntok;
        !           627: 
        !           628: extern void ptbl_init(int);
        !           629: extern void ptbl_add_pair(char*,char*);
        !           630: extern char *ptbl_lookup(char*);
        !           631: extern char *st_name(char*);
        !           632: #endif
        !           633: 
        !           634: struct expr : node     /* PLUS, MINUS, etc. */
        !           635:        /* IMPORTANT:   all expressions are of sizeof(expr) */
        !           636:        /*      DEREF           =>      *e1 (e2==0) OR e1[e2]
        !           637:                UMINUS          =>      -e2
        !           638:                INCR (e1==0)    =>      ++e2
        !           639:                INCR (e2==0)    =>      e1++
        !           640:                CM              =>      e1 , e2
        !           641:                ILIST           =>      LC e1 RC   (an initializer list)
        !           642:                a Pexpr may denote a name
        !           643:        */
        !           644: {
        !           645:        union {
        !           646:                Ptype   tp;
        !           647:                int     syn_class;
        !           648:                char    *string4;
        !           649:        };
        !           650:        union {
        !           651:                Pexpr   e1;
        !           652:                long    i1;
        !           653:                char*   string;
        !           654:        };
        !           655:        union {
        !           656:                Pexpr   e2;
        !           657:                int     i2;
        !           658:                char*   string2;
        !           659:                Pexpr   n_initializer;
        !           660:                Ptype   tpdef;  // local and nested typedef info
        !           661:        };
        !           662:        union {                 /* used by the derived classes */
        !           663:                Ptype   tp2;
        !           664:                Pname   fct_name;
        !           665:                Pexpr   cond;
        !           666:                Pexpr   mem;
        !           667:                Ptype   as_type;
        !           668:                Ptable  n_table;
        !           669:                Pin     il;
        !           670:                char*   string3;
        !           671:        };
        !           672: 
        !           673:        expr(TOK, Pexpr, Pexpr);
        !           674:        ~expr();
        !           675: #ifndef GRAM
        !           676:        void    del();
        !           677:        void    print();
        !           678:        Pexpr   typ(Ptable);
        !           679:        long    eval();
        !           680:        unsigned long ueval(long,long);
        !           681:        int     lval(TOK);
        !           682:        Ptype   call_fct(Ptable);
        !           683:        Pexpr   address();
        !           684:        Pexpr   contents();
        !           685:        void    simpl();
        !           686:        Pexpr   expand();
        !           687:        bit     not_simple();
        !           688:        Pexpr   try_to_overload(Ptable);
        !           689:        Pexpr   docast(Ptable);
        !           690:        Pexpr   dovalue(Ptable);
        !           691:        Pexpr   donew(Ptable);
        !           692:        void    simpl_new();
        !           693:        void    simpl_delete();
        !           694: #endif
        !           695: };
        !           696: 
        !           697: struct texpr : expr {          // CAST NEW VALUE (also ICALL)
        !           698: #ifdef __cplusplus
        !           699:        texpr(TOK bb, Ptype tt, Pexpr ee) : expr (bb,ee,0) { this=0; tp2=tt; }
        !           700: #else
        !           701:        texpr(TOK bb, Ptype tt, Pexpr ee) : (bb,ee,0) { this=0; tp2=tt; }
        !           702: #endif
        !           703: 
        !           704: };
        !           705: 
        !           706: struct cast : expr {           // CAST
        !           707: #ifdef __cplusplus
        !           708:        cast(Ptype tt, Pexpr ee) : expr (CAST,ee,0) { this=0; tp=tp2=tt; }
        !           709: #else
        !           710:        cast(Ptype tt, Pexpr ee) : (CAST,ee,0) { this=0; tp=tp2=tt; }
        !           711: #endif
        !           712: };
        !           713: 
        !           714: struct ival : expr {           // IVAL
        !           715: #ifdef __cplusplus
        !           716:        ival(long ii) : expr (IVAL,0,0) { this=0; i1 = ii;}
        !           717: #else
        !           718:        ival(long ii) : (IVAL,0,0) { this=0; i1 = ii;}
        !           719: #endif
        !           720: };
        !           721: 
        !           722: struct call : expr {           // CALL
        !           723: #ifdef __cplusplus
        !           724:        call(Pexpr aa, Pexpr bb) : expr (CALL,aa,bb) { this=0; }
        !           725: #else
        !           726:        call(Pexpr aa, Pexpr bb) : (CALL,aa,bb) { this=0; }
        !           727: #endif
        !           728: #ifndef GRAM
        !           729:        void    simpl();
        !           730:        Pexpr   expand(Ptable);
        !           731: #endif
        !           732: };
        !           733: 
        !           734: struct qexpr : expr {          // QUEST        cond ? e1 : e2
        !           735: #ifdef __cplusplus
        !           736:        qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : expr (QUEST,ee1,ee2) { this=0; cond=ee; }
        !           737: #else
        !           738:        qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : (QUEST,ee1,ee2) { this=0; cond=ee; }
        !           739: #endif
        !           740: };
        !           741: 
        !           742: struct ref : expr {            // REF DOT      e1->mem OR e1.mem
        !           743: #ifdef __cplusplus
        !           744:        ref(TOK ba, Pexpr a, Pexpr b) : expr (ba,a,0) { this=0; mem=b; }
        !           745: #else
        !           746:        ref(TOK ba, Pexpr a, Pexpr b) : (ba,a,0) { this=0; mem=b; }
        !           747: #endif
        !           748: };
        !           749: 
        !           750: struct mdot : expr {           // MDOT         a.b
        !           751: #ifdef __cplusplus
        !           752:        mdot(char* a, Pexpr b) : expr (MDOT,0,0) { this=0; string2=a; mem=b; }
        !           753: #else
        !           754:        mdot(char* a, Pexpr b) : (MDOT,0,0) { this=0; string2=a; mem=b; }
        !           755: #endif
        !           756: };
        !           757: 
        !           758: struct text_expr : expr        {       // TEXT (vtbl_name)
        !           759: #ifdef __cplusplus
        !           760:        text_expr(char* a, char* b) : expr (TEXT,0,0)
        !           761: #else
        !           762:        text_expr(char* a, char* b) : (TEXT,0,0)
        !           763: #endif
        !           764:        { this=0; string=a; string2=b; }
        !           765: };
        !           766: char* vtbl_name(char*,char*);
        !           767: /************************* names (are expressions) ****************************/
        !           768: 
        !           769: struct basecl : node { // NAME         => base class
        !           770:                        // VIRTUAL      => virtual base class
        !           771:        TOK     ppp;            // private / public / protected
        !           772:        bit     allocated;      // allocated virtual base
        !           773:         bit     promoted;       // non-explicit, promoted virtual base
        !           774:        Pclass  bclass;
        !           775:        Pexpr   init;           // base class initializers for ctors
        !           776:        int     ptr_offset;     // pointer's relative position in derived class
        !           777:        int     obj_offset;     // object's relative position in derived class
        !           778:        Pname*  virt_init;      // vector of vtbl table initializers
        !           779:        basecl* next;
        !           780: 
        !           781:         basecl(Pclass cl, basecl* n) { bclass=cl; next=n; promoted=0; init=0;}
        !           782: };
        !           783: extern TOK ppbase;
        !           784: 
        !           785: struct name : expr {   // NAME TNAME and the keywords in the ktbl
        !           786:        TOK     n_oper;         // name of operator or 0
        !           787:        TOK     n_sto;          // EXTERN STATIC AUTO REGISTER ENUM 0
        !           788:        TOK     n_stclass;      // STATIC AUTO REGISTER 0
        !           789:        TOK     n_scope;        // EXTERN STATIC FCT ARG PUBLIC 0 
        !           790:        TOK     n_key;  /* for names in table: class */
        !           791:        bit     n_evaluated;    // 0 or n_val holds the value
        !           792:        bit     n_xref;         // argument of type X(X&)
        !           793:        unsigned char   lex_level;
        !           794:        TOK     n_protect;      // PROTECTED (<=>n_scope==0) or 0
        !           795:        bit     n_dcl_printed;  // 1: declaration printed
        !           796:                                // 2: definition printed
        !           797:                                // 0: declaration not printed
        !           798:         char    *n_anon;       // nested anonymous unions
        !           799:        short   n_union;        // 0, or union index
        !           800:        short   n_addr_taken;
        !           801:        short   n_used;
        !           802:        short   n_assigned_to;
        !           803:        Loc     where;
        !           804:        int     n_offset;       // byte offset in frame or struct
        !           805:        Pname   n_list;
        !           806:        Pname   n_tbl_list;
        !           807:        union {
        !           808:                Pname   n_qualifier;    // name of containing class
        !           809:                Ptable  n_realscope;    /* for labels (always entered in
        !           810:                                           function table) the table for the
        !           811:                                           actual scope in which label occurred.
        !           812:                                        */
        !           813:        };
        !           814:        long    n_val;          // the value of n_initializer
        !           815:                                // also used as the argument number
        !           816:                                // for inline arguments
        !           817:        name(char* =0);
        !           818:        ~name();
        !           819: 
        !           820:        Pname   normalize(Pbase, Pblock, bit);
        !           821:        Pname   tdef();
        !           822:        Pname   tname(TOK);
        !           823:        void    hide();
        !           824:        void    unhide()        { n_key=0; n_list=0; };
        !           825: #ifndef GRAM
        !           826:        Pname   dcl(Ptable,TOK);
        !           827:        int     no_of_names();
        !           828:        void    use()           { n_used++; };
        !           829:        void    assign();
        !           830:        void    take_addr();
        !           831:        void    check_oper(Pname);
        !           832:        void    simpl();
        !           833:        void    del();
        !           834:        void    print();
        !           835:        void    dcl_print(TOK);
        !           836:        void    field_align();
        !           837:        Pname   dofct(Ptable,TOK);
        !           838: #endif
        !           839: };
        !           840: 
        !           841: extern int friend_in_class;
        !           842: extern int in_class_dcl;
        !           843: 
        !           844: // from parser
        !           845: extern int in_class_decl;
        !           846: extern int parsing_class_members;
        !           847: extern int in_mem_fct;
        !           848: extern int in_arg_list;
        !           849: extern Ptype in_typedef;
        !           850: extern int     defer_check;     // redefinition typedef check delay
        !           851: extern int     declTag;         // !1: inline, virtual mod permitted
        !           852: extern Pname in_tag;
        !           853: extern Pname statStat;
        !           854: extern int DECL_TYPE;
        !           855: 
        !           856: /******************** statements *********************************/
        !           857: 
        !           858: struct stmt : node {   /* BREAK CONTINUE DEFAULT */
        !           859: /*     IMPORTANT: all statement nodes have sizeof(stmt) */
        !           860:        Pstmt   s;
        !           861:        Pstmt   s_list;
        !           862:        Loc     where;
        !           863:        union {
        !           864:                Pname   d;
        !           865:                Pexpr   e2;
        !           866:                Pstmt   has_default;
        !           867:                int     case_value;
        !           868:                Ptype   ret_tp;
        !           869:        };
        !           870:        union {
        !           871:                Pexpr   e;
        !           872:                bit     own_tbl;
        !           873:                Pstmt   s2;
        !           874:        };
        !           875:        Ptable  memtbl;
        !           876:        union {
        !           877:                Pstmt   for_init;
        !           878:                Pstmt   else_stmt;
        !           879:                Pstmt   case_list;
        !           880:        //      bit     empty;
        !           881:                Loc     where2; // location of } at end of block
        !           882:        };
        !           883: 
        !           884:        stmt(TOK, loc, Pstmt);
        !           885:        ~stmt();
        !           886: #ifndef GRAM
        !           887:        void    del();
        !           888:        void    print();
        !           889:        void    dcl();
        !           890:        void    reached();
        !           891:        Pstmt   simpl();
        !           892:        Pstmt   expand();
        !           893:        Pstmt   copy();
        !           894: #endif
        !           895: };
        !           896: 
        !           897: #ifndef GRAM
        !           898: extern char* Neval;
        !           899: extern Ptable scope;
        !           900: extern Ptable expand_tbl;
        !           901: extern Pname expand_fn;
        !           902: #endif
        !           903: 
        !           904: struct estmt : stmt    /* SM WHILE DO SWITCH RETURN CASE */
        !           905:        /*      SM (e!=0)       =>      e;
        !           906:                in particular assignments and function calls
        !           907:                SM (e==0)       =>      ;       (the null statement)
        !           908:                CASE            =>      case e : s ;
        !           909:        */
        !           910: {
        !           911: #ifdef __cplusplus
        !           912:        estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : stmt (t,ll,ss) { this=0; e=ee; }
        !           913: #else
        !           914:        estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : (t,ll,ss) { this=0; e=ee; }
        !           915: #endif
        !           916: };
        !           917: 
        !           918: struct ifstmt : stmt   /* IF */
        !           919:        // else_stme==0 =>      if (e) s
        !           920:        // else_stmt!=0 =>      if (e) s else else_stmt
        !           921: {
        !           922:        ifstmt(loc ll, Pexpr ee, Pstmt ss1, Pstmt ss2)
        !           923: #ifdef __cplusplus
        !           924:                : stmt (IF,ll,ss1) { this=0; e=ee; else_stmt=ss2; };
        !           925: #else
        !           926:                : (IF,ll,ss1) { this=0; e=ee; else_stmt=ss2; };
        !           927: #endif
        !           928: };
        !           929: 
        !           930: struct lstmt : stmt    /* LABEL GOTO */
        !           931:        /*
        !           932:                d : s
        !           933:                goto d
        !           934:        */
        !           935: {
        !           936: #ifdef __cplusplus
        !           937:        lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : stmt (bb,ll,ss) { this=0; d=nn; }
        !           938: #else
        !           939:        lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : (bb,ll,ss) { this=0; d=nn; }
        !           940: #endif
        !           941: };
        !           942: 
        !           943: struct forstmt : stmt {        // FOR
        !           944:        forstmt(loc ll, Pstmt fss, Pexpr ee1, Pexpr ee2, Pstmt ss)
        !           945: #ifdef __cplusplus
        !           946:                : stmt (FOR,ll,ss) { this=0; for_init=fss; e=ee1; e2=ee2; }
        !           947: #else
        !           948:                : (FOR,ll,ss) { this=0; for_init=fss; e=ee1; e2=ee2; }
        !           949: #endif
        !           950: };
        !           951: 
        !           952: struct block : stmt {  // BLOCK        { d s }
        !           953: #ifdef __cplusplus
        !           954:        block(loc ll, Pname nn, Pstmt ss, loc rr = noloc ) : stmt (BLOCK,ll,ss)
        !           955: #else
        !           956:        block(loc ll, Pname nn, Pstmt ss, loc rr = noloc ) : (BLOCK,ll,ss)
        !           957: #endif
        !           958:                { this=0; d=nn; where2=rr; }
        !           959: #ifndef GRAM
        !           960:        void    dcl(Ptable);
        !           961:        Pstmt   simpl();
        !           962: #endif
        !           963: };
        !           964: 
        !           965: #ifndef GRAM
        !           966: struct pair : public stmt {    // PAIR
        !           967: #ifdef __cplusplus
        !           968:        pair(loc ll, Pstmt a, Pstmt b) : stmt (PAIR,ll,a) { this=0; s2 = b; }
        !           969: #else
        !           970:        pair(loc ll, Pstmt a, Pstmt b) : (PAIR,ll,a) { this=0; s2 = b; }
        !           971: #endif
        !           972: };
        !           973: #endif
        !           974: 
        !           975: struct nlist {
        !           976:        Pname   head;
        !           977:        Pname   tail;
        !           978:                nlist(Pname);
        !           979:        void    add(Pname n)    { tail->n_list = n; tail = n; };
        !           980:        void    add_list(Pname);
        !           981: };
        !           982: 
        !           983: extern Pname name_unlist(nlist*);
        !           984: 
        !           985: struct slist {
        !           986:        Pstmt   head;
        !           987:        Pstmt   tail;
        !           988:                slist(Pstmt s)  { /*Nl++;*/ head = tail = s; };
        !           989:        void    add(Pstmt s)    { tail->s_list = s; tail = s; };
        !           990: };
        !           991: 
        !           992: extern Pstmt stmt_unlist(slist*);
        !           993: 
        !           994: struct elist {
        !           995:        Pexpr   head;
        !           996:        Pexpr   tail;
        !           997:                elist(Pexpr e)  { /*Nl++;*/ head = tail = e; };
        !           998:        void    add(Pexpr e)    { tail->e2 = e; tail = e; };
        !           999: };
        !          1000: 
        !          1001: extern Pexpr expr_unlist(elist*);
        !          1002: 
        !          1003: #ifndef GRAM 
        !          1004: extern class dcl_context * cc;
        !          1005: 
        !          1006: struct dcl_context {
        !          1007:        Pname   c_this; /* current fct's "this" */
        !          1008:        Ptype   tot;    /* type of "this" or 0 */
        !          1009:        Pname   not;    /* name of "this"'s class or 0 */
        !          1010:        Pclass  cot;    /* the definition of "this"'s class */
        !          1011:        Ptable  ftbl;   /* current fct's symbol table */
        !          1012:        Pname   nof;    /* current fct's name */
        !          1013: 
        !          1014:        void    stack()         { cc++; *cc = *(cc-1); };
        !          1015:        void    unstack()       { cc--; };
        !          1016: };
        !          1017: 
        !          1018: #define MAXCONT        20
        !          1019: extern dcl_context ccvec[MAXCONT];
        !          1020: #endif 
        !          1021: 
        !          1022: extern void yyerror(char*);
        !          1023: 
        !          1024: 
        !          1025: #ifndef GRAM
        !          1026: extern char* line_format;
        !          1027: 
        !          1028: extern Plist stat_mem_list;
        !          1029: extern Plist isf_list;
        !          1030: extern Pstmt st_ilist;
        !          1031: extern Pstmt st_dlist;
        !          1032: extern Ptable sti_tbl;
        !          1033: extern Ptable std_tbl;
        !          1034: extern int need_sti( Pexpr e, Ptable tbl = 0, bit is_static_ok = 0 ); 
        !          1035: Pexpr try_to_coerce(Ptype, Pexpr, char*, Ptable);
        !          1036: extern bit can_coerce(Ptype, Ptype);
        !          1037: extern Ptype np_promote(TOK, TOK, TOK, Ptype, Ptype, TOK);
        !          1038: extern bit enum_promote;
        !          1039: extern int suppress_error;
        !          1040: extern void new_key(char*, TOK, TOK);
        !          1041: extern void delete_local();
        !          1042: 
        !          1043: extern int over_call(Pname, Pexpr);
        !          1044: extern Pname overFound;
        !          1045: extern Pname Nover;
        !          1046: extern Pname Ncoerce;
        !          1047: extern Nover_coerce;
        !          1048: struct ia {
        !          1049:        Pname   local;  // local variable for argument
        !          1050:        Pexpr   arg;    // actual arguments for call
        !          1051:        Ptype   tp;     // type of formal argument
        !          1052: };
        !          1053: 
        !          1054: struct iline {
        !          1055:        Pname   fct_name;       /* fct called */
        !          1056:        Pin     i_next;
        !          1057:        Ptable  i_table;
        !          1058:        int     i_slots;        // no of arg slots pointer to by i_args
        !          1059:        ia*     i_args;
        !          1060: };
        !          1061: 
        !          1062: extern Pexpr curr_expr;
        !          1063: extern Pin curr_icall;
        !          1064: #define FUDGE111 11111
        !          1065: #define VTOK 22222
        !          1066: #define ITOR 77
        !          1067: 
        !          1068: extern Pstmt curr_loop;
        !          1069: extern Pblock curr_block;
        !          1070: extern Pstmt curr_switch;
        !          1071: extern loc last_line;  // last #line + number of '\n's output since
        !          1072: extern int last_ll;    // 0 or line of current stmt/dcl being printed
        !          1073: extern FILE* out_file; // output file descriptor
        !          1074: extern bit Cast;
        !          1075: extern loc no_where;
        !          1076: 
        !          1077: extern no_of_undcl;
        !          1078: extern no_of_badcall;
        !          1079: extern Pname undcl, badcall;
        !          1080: 
        !          1081: extern long str_to_long(const char*);
        !          1082: extern int c_strlen(const char* s);
        !          1083: #endif
        !          1084: 
        !          1085: #ifndef GRAM
        !          1086: extern Pname vec_new_fct;
        !          1087: extern Pname new_fct;
        !          1088: extern Pname del_fct;
        !          1089: extern Pname vec_del_fct;
        !          1090: 
        !          1091: extern int Nstd; // standard coercion used (derived* =>base* or int=>long or ...)
        !          1092: 
        !          1093: extern int stcount;    // number of names generated using make_name()
        !          1094: 
        !          1095: Pexpr replace_temp(Pexpr,Pexpr);
        !          1096: void make_res(Pfct);
        !          1097: 
        !          1098: extern int Pchecked;
        !          1099: Pexpr ptr_init(Pptr,Pexpr,Ptable);
        !          1100: Pexpr call_ctor(Ptable, Pexpr p, Pexpr ctor, Pexpr args, int d = REF, Pexpr vb_args = 0);
        !          1101: Pexpr call_dtor(Pexpr p, Pexpr dtor, Pexpr arg = 0, int d = DOT, Pexpr vb_args = 0);
        !          1102: void check_visibility(Pname, Pname, Pclass, Ptable, Pname);
        !          1103: 
        !          1104: int make_assignment(Pname);
        !          1105: 
        !          1106: extern Pname make_tmp(char, Ptype, Ptable);
        !          1107: Pexpr init_tmp(Pname, Pexpr, Ptable);
        !          1108: 
        !          1109: extern int is_unique_base(Pclass, char*, int, int = 0);
        !          1110: extern Pexpr rptr(Ptype, Pexpr, int);
        !          1111: 
        !          1112: extern int read_align(char*);
        !          1113: extern void new_init();
        !          1114: 
        !          1115: extern void Eprint(Pexpr);
        !          1116: extern Pexpr cast_cptr(Pclass ccl, Pexpr ee, Ptable tbl, int real_cast);
        !          1117: extern Pexpr mptr_assign(Pexpr,Pexpr);
        !          1118: extern Pclass Mptr;
        !          1119: 
        !          1120: #endif
        !          1121: 
        !          1122: extern bit fake_sizeof;        // suppress error message for ``int v[];''
        !          1123: 
        !          1124: extern TOK lalex();
        !          1125: 
        !          1126: 
        !          1127: #ifdef DBG
        !          1128: extern void display_expr( Pexpr, char* = 0, int = 0 );
        !          1129: extern void display_stmt( Pstmt, char* = 0, int = 0 );
        !          1130: extern void display_type( Ptype );
        !          1131: extern void display_namelist( Plist, char* = 0, int = 0 );
        !          1132: 
        !          1133: extern fprintf(const FILE*, const char* ...);
        !          1134: extern void process_debug_flags( char* );
        !          1135: #define DB(a) a
        !          1136: extern int Adebug; // allocation (ctor/del) debugging
        !          1137: extern int Ddebug; // dcl debugging
        !          1138: extern int Edebug; // expr debugging
        !          1139: extern int Ldebug; // lex/lalex debugging
        !          1140: extern int Mdebug; // trace function matching
        !          1141: extern int Ndebug; // norm debugging
        !          1142: extern int Pdebug; // print debugging
        !          1143: extern int Rdebug; // run() debugging
        !          1144: extern int Sdebug; // simpl debugging
        !          1145: extern int Tdebug; // typ debugging
        !          1146: #define Ydebug yydebug
        !          1147: extern int Ydebug; // yacc debugging
        !          1148: 
        !          1149: #else
        !          1150: 
        !          1151: #define DB(a) /**/
        !          1152: 
        !          1153: #endif
        !          1154: 
        !          1155: /* end */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.