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

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

unix.superglobalmegacorp.com

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