Annotation of coherent/d/bin/cc/c/h/cc0.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * This header file contains the definitions used by
                      3:  * all parts of the C compiler parser (cc0)
                      4:  * and the C compiler preprocessor (cpp).
                      5:  * It includes the definitions of the reserved words,
                      6:  * the built-in types, and so forth.
                      7:  */
                      8: #define        CC0_H   CC0_H
                      9: 
                     10: #include <stdio.h>
                     11: #include <setjmp.h>
                     12: #ifdef   vax
                     13: #include "INC$LIB:mch.h"
                     14: #include "INC$LIB:host.h"
                     15: #include "INC$LIB:ops.h"
                     16: #include "INC$LIB:var.h"
                     17: #include "INC$LIB:varmch.h"
                     18: #include "INC$LIB:cc0mch.h"
                     19: #include "INC$LIB:stream.h"
                     20: #include "INC$LIB:cppmch.h"
                     21: #else
                     22: #include "mch.h"
                     23: #include "host.h"
                     24: #include "ops.h"
                     25: #include "var.h"
                     26: #include "varmch.h"
                     27: #include "cc0mch.h"
                     28: #include "stream.h"
                     29: #include "cppmch.h"
                     30: #endif
                     31: 
                     32: /*
                     33:  * These defines adjust the sizes of the tables in the parser.
                     34:  * They can be changed to just about anything, 
                     35:  */
                     36: #define NHASH   67             /* Hash buckets */
                     37: #define        NDIRS   32              /* Number of include directories */
                     38: #define        NLEV    32              /* Nesting level of cpp constructs */
                     39: #define NDLEV  128             /* DSTACK size */
                     40: #define        NDBUF   1024            /* Size of the define buffer */
                     41: #define ARG0   0200            /* Base of formals in define bodies */
                     42: #define SET0   (ARG0+NARGS)    /* Base of hide set indices in text */
                     43: /* High parity characters are accepted in strings, but otherwise forbidden */
                     44: /* because they conflict with this scheme for packing macro formals and hide */
                     45: /* sets into the least space and overhead I can manage */
                     46: 
                     47: /*
                     48:  * cpp keywords and macro classes.
                     49:  * these hide at a distinct level
                     50:  * in the symbol table.
                     51:  */
                     52: #define        XUSER   0       /* User macro */
                     53: #define        XUSERA  1       /* User macro with arguments */
                     54: #define        XUFILE  2       /* Macro __FILE__ */
                     55: #define        XULINE  3       /* Macro __LINE__ */
                     56: #define XUDATE 4       /* Macro __DATE__ */
                     57: #define XUTIME 5       /* Macro __TIME__ */
                     58: #define XUSTDC 6       /* Macro __STDC__ */
                     59: #define XDEFINED 8     /* User macro defined() */
                     60: #define        XDEFINE 9       /* #define */
                     61: #define        XINCLUDE 10     /* #include */
                     62: #define        XUNDEF  11      /* #undef */
                     63: #define        XLINE   12      /* #line */
                     64: #define        XASSERT 13      /* #assert */
                     65: #define XERROR 14      /* #error */
                     66: #define XPRAGMA        15      /* #pragma */
                     67: #define        XIF     20      /* #if is the first conditional */
                     68: #define        XIFDEF  21      /* #ifdef */
                     69: #define        XIFNDEF 22      /* #ifndef */
                     70: #define        XELSE   23      /* #else */
                     71: #define XELIF  24      /* #elif */
                     72: #define        XENDIF  25      /* #endif */
                     73: 
                     74: /*
                     75:  * Tokens.
                     76:  * Character classes.
                     77:  * Other things that are C compiler parser specific.
                     78:  * By convention, these begin at 100 decimal.
                     79:  */
                     80: #define DOT    100             /* . */
                     81: #define ARROW  101             /* -> */
                     82: #define SEMI   102             /* ; */
                     83: #define SHARP  103             /* # */
                     84: #define JUNK   104             /* Junk character */
                     85: #define SKIP   105             /* Whitespace */
                     86: #define LBRACE 106             /* { */
                     87: #define RBRACE 107             /* } */
                     88: #define LBRACK 108             /* [ */
                     89: #define RBRACK 109             /* ] */
                     90: #define LPAREN 110             /* ( */
                     91: #define RPAREN 111             /* ) */
                     92: #define ID     112             /* All identifiers */
                     93: #define CON    113             /* Constants */
                     94: #define QUOTE  114             /* ' */
                     95: #define STRING 115             /* " */
                     96: #define HIGH0  116             /* High parity junk, 0200..0237 */
                     97: #define HIGH1  117             /* High parity junk, 0240..0277 */
                     98: #define HIGH2  118             /* High parity junk, 0300..0337 */
                     99: #define HIGH3  119             /* High parity junk, 0340..0377 */
                    100: #define BACKDIV        120             /* Back slash */
                    101: 
                    102: /*
                    103:  * Types.
                    104:  * Classes.
                    105:  * Do not change these unless you update the tables in "gcandt.c".
                    106:  */
                    107: #define INT    150             /* int */
                    108: #define CHAR   151             /* char */
                    109: #define FLOAT  152             /* float */
                    110: #define DOUBLE 153             /* double */
                    111: #define        VOID    154             /* void */
                    112: #define STRUCT 155             /* struct */
                    113: #define UNION  156             /* union */
                    114: #define ENUM   157             /* enum */
                    115: #define LONG   158             /* long */
                    116: #define SHORT  159             /* short */
                    117: #define UNSIGNED 160           /* unsigned */
                    118: #define EXTERN 161             /* extern */
                    119: #define STATIC 162             /* static */
                    120: #define REGISTER 163           /* register */
                    121: #define TYPEDEF        164             /* typedef */
                    122: #define AUTO   165             /* auto */
                    123: #define CONST  166             /* const */
                    124: #define VOLATILE 167           /* volatile */
                    125: #define SIGNED 168             /* signed */
                    126: 
                    127: /*
                    128:  * Other C reserved words.
                    129:  * These are in no particular order at all.
                    130:  */
                    131: #define DEFAULT        180             /* default */
                    132: #define DO     181             /* do */
                    133: #define ELSE   182             /* else */
                    134: #define GOTO   183             /* goto */
                    135: #define IF     184             /* if */
                    136: #define RETURN 185             /* return */
                    137: #define SWITCH 186             /* switch */
                    138: #define CONTINUE 187           /* continue */
                    139: #define FOR    188             /* for */
                    140: #define WHILE  189             /* while */
                    141: #define BREAK  190             /* break */
                    142: #define        CASE    191             /* case */
                    143: 
                    144: /* MWC proprietary keywords */
                    145: #define        READONLY 200            /* readonly */
                    146: #define ALIEN   201            /* Other language interface */
                    147: 
                    148: /*
                    149:  * Types.
                    150:  */
                    151: #define T_NONE  0              /* No type (yet) */
                    152: #define T_CHAR  1              /* Char */
                    153: #define T_UCHAR 2              /* Unsigned char */
                    154: #define T_SHORT 3              /* Short */
                    155: #define T_USHORT 4             /* Unsigned short */
                    156: #define T_INT   5              /* Int */
                    157: #define T_UINT  6              /* Unsigned int */
                    158: #define T_PTR   7              /* Pointer */
                    159: #define T_LONG  8              /* Long */
                    160: #define T_ULONG 9              /* Unsigned long */
                    161: #define T_FLOAT 10             /* Float */
                    162: #define T_DOUBLE 11            /* Double */
                    163: #define        T_VOID  12              /* Void */
                    164: #define T_STRUCT 13            /* Struct */
                    165: #define T_FSTRUCT 14           /* Forward struct reference */
                    166: #define T_UNION 15             /* Union */
                    167: #define T_FUNION 16            /* Forward union reference */
                    168: #define T_ENUM  17             /* Enumeration */
                    169: #define T_FENUM 18             /* Forward enumeration reference */
                    170: #define T_LDOUBLE 19           /* Long double, should follow double NB */
                    171: 
                    172: /*
                    173:  * Storage classes.
                    174:  */
                    175: #define C_NONE  0              /* No class */
                    176: #define C_AUTO  1              /* Auto */
                    177: #define C_SIN   2              /* Static internal */
                    178: #define C_SEX   3              /* Static external */
                    179: #define C_GDEF  4              /* Global def. */
                    180: #define C_GREF  5              /* Global ref. */
                    181: #define C_ARG   6              /* Argument */
                    182: #define C_CXT   7              /* Contextual */
                    183: #define C_LAB   8              /* Label */
                    184: #define C_FREF  9              /* Forward ref. label */
                    185: #define C_KEY   10             /* Keyword */
                    186: #define C_TYPE  11             /* Typedef name */
                    187: #define C_REG   12             /* Register */
                    188: #define C_STAG  13             /* Structure tag */
                    189: #define C_UTAG  14             /* Union tag */
                    190: #define C_ETAG  15             /* Enumeration tag */
                    191: #define C_MOS   16             /* Member of structure */
                    192: #define C_MOU   17             /* Member of union */
                    193: #define C_MOE   18             /* Member of enumeration */
                    194: #define C_PAUTO 19             /* Parametric auto */
                    195: #define C_PREG  20             /* Parametric register */
                    196: 
                    197: /*
                    198:  * Dimensions.
                    199:  * A list of these begins at the "s_dp" of a symbol
                    200:  * and at the "e_dp" of an expression tree node.
                    201:  */
                    202: typedef        struct  dim {
                    203:        struct  dim *d_dp;              /* Link */
                    204:        short   d_type;                 /* Type */
                    205:        sizeof_t d_bound;               /* Array bound */
                    206: }      DIM;
                    207: 
                    208: #define D_PTR   0                      /* Pointer */
                    209: #define D_FUNC  1                      /* Function returning */
                    210: #define D_ARRAY 2                      /* Array */
                    211: #define D_MOSAR 3                      /* MOS array */
                    212: #define D_CONST        4                       /* const modifier */
                    213: #define D_VOLATILE 5                   /* volatile modifier */
                    214: 
                    215: /*
                    216:  * An INFO structure keeps track of structure elements,
                    217:  * union elements and enumeration constants.
                    218:  * It is pointed to by the INFO links of symbols and expressions.
                    219:  * The reference count only considers symbol usages.
                    220:  */
                    221: typedef        struct  {
                    222:        short   i_refc;                 /* Reference count */
                    223:        short   i_nsp;                  /* Number of symbols */
                    224:        union {
                    225:                sizeof_t i_data0;
                    226:                int      i_data1;
                    227:        } i_data;
                    228:        struct  sym *i_sp[];            /* The symbols */
                    229: }      INFO;
                    230: 
                    231: #define        i_size  i_data.i_data0          /* Structure or union size */
                    232: #define        i_type  i_data.i_data1          /* Base type of an enumeration */
                    233: 
                    234: /*
                    235:  * Symbol.
                    236:  * Symbols are kept in a hash table.
                    237:  * Each bucket has the keywords on the front.
                    238:  */
                    239: 
                    240: typedef struct symbol SYM;
                    241: typedef struct token TOK;
                    242: struct symbol {
                    243:        SYM     *s_sp;                  /* Link */
                    244:        int     s_slevel;               /* Symbol table level */
                    245:        int     s_value;                /* Value */
                    246:        int     s_dline;                /* Decl. line number */
                    247:        char    s_level;                /* Block level */
                    248:        char    s_flag;                 /* Flag */
                    249:        char    s_width;                /* Field width */
                    250:        char    s_offset;               /* Bit offset */
                    251:        char    s_seg;                  /* Segment */
                    252:        char    s_class;                /* Class */
                    253:        char    s_type;                 /* Type */
                    254:        DIM     *s_dp;                  /* Dimensions */
                    255:        INFO    *s_ip;                  /* Info */
                    256:        char    *s_id;                  /* Name string */
                    257: };
                    258: 
                    259: /* Keyword symbols occupy less space */
                    260: typedef struct {
                    261:        SYM     *s_sp;
                    262:        int     s_slevel;
                    263:        int     s_value;
                    264: } KEYSYM;
                    265: 
                    266: /* Preprocessor symbols take a little more space */
                    267: typedef struct {
                    268:        SYM     *s_sp;
                    269:        int     s_slevel;
                    270:        int     s_value;
                    271:        int     s_narg;
                    272: #if ANSI_STUPID
                    273:        TOK     *s_targs;
                    274: #endif
                    275:        char    s_body[];
                    276: } CPPSYM;
                    277: 
                    278: /* C symbol s_flag values */
                    279: #define        S_RONLY 01                      /* Readonly */
                    280: #define S_ALIEN        02                      /* Other language */
                    281: #define S_USED  04                     /* Used */
                    282: #define        S_TAG   010                     /* Tag present */
                    283: #define        S_INIT  020                     /* Initialized */
                    284: #define S_SYMB 040                     /* Written to debug table */
                    285: 
                    286: /* Disjunct symbol table levels */
                    287: #define SL_CPP -2                      /* Cpp tokens */
                    288: #define SL_KEY -1                      /* C keywords and ops */
                    289: #define SL_VAR 0                       /* Normal symbols */
                    290: #define SL_LAB 1                       /* Labels */
                    291: #define SL_TAG 2                       /* Tags */
                    292: #define SL_MOS 3                       /* Members of structures, and up */
                    293: 
                    294: /* Lexical scope levels */
                    295: #define LL_EXT 0                       /* Externals */
                    296: #define LL_ARG 1                       /* Parameters */
                    297: #define LL_AUTO        2                       /* Automatics, and up */
                    298: 
                    299: /*
                    300:  * All tokens are hashed.
                    301:  * Each unique token is the head
                    302:  * of a list of symbol buckets.
                    303:  */
                    304: struct token {
                    305:        TOK     *t_tp;
                    306:        SYM     *t_sym;
                    307:        char    t_id[];
                    308: };
                    309: 
                    310: /*
                    311:  * Macro expansion stack.
                    312:  */
                    313: typedef        struct {
                    314:        char    ds_type;                /* Type of stack item */
                    315:        char    ds_char;                /* Ungotten char or temp */
                    316:        char    *ds_ptr;                /* Pointer to string */
                    317: } DSTACK;
                    318: 
                    319: #define DS_FILE                0       /* Dstack is at source file level */
                    320: #define DS_UNGET       1       /* Dstack is ungotten character */
                    321: #define DS_FUNGET      2       /* Dstack is ungotten file character */
                    322: #define DS_STRNG       3       /* Dstack is normal string to read */
                    323: #define DS_PARAM       4       /* Dstack is parameter to be expanded */
                    324: #define DS_SHARP       5       /* Dstack is parameter to stringize */
                    325: #define DS_SHARP2      6       /* Dstack is parameter to glue */
                    326: #define DS_DPUTP       7       /* Dstack is pushed dputp pointer */
                    327: #define DS_NAME                8       /* Dstack is pushed name of macro */
                    328: #define DS_IEOF                9       /* Dstack is internal end of file */
                    329: #define DS_UFILE       10      /* Dstack is __FILE__ to expand */
                    330: 
                    331: /*
                    332:  * Macro hide set structure.
                    333:  */
                    334: typedef struct hideset HIDESET;
                    335: typedef struct hidemem HIDEMEM;
                    336: struct hideset {
                    337:        HIDESET *h_next_set;
                    338:        HIDEMEM *h_this_set;
                    339: };
                    340: struct hidemem {
                    341:        HIDEMEM *h_next_mem;
                    342:        TOK     *h_this_mem;
                    343: };
                    344: 
                    345: /*
                    346:  * Conditional stack.
                    347:  * One of these is allocated when a #if* line
                    348:  * is encountered to store the state of the
                    349:  * conditional block until the matching #endif
                    350:  * is found.
                    351:  */
                    352: typedef struct {
                    353:        int             c_op;           /* Last operator seen in block */
                    354:        int             c_state;        /* Has any block been true */
                    355: } CSTACK;
                    356: 
                    357: /*
                    358:  * Include pushdown stack entry.
                    359:  * One of these is allocated when a #include line
                    360:  * is encountered to hold the file name, the line number
                    361:  * and the FILE pointer of the old source file.
                    362:  */
                    363: typedef        struct {
                    364:        FILE            *i_fp;          /* Saved FILE pointer */
                    365:        int             i_line;         /* Saved line */
                    366:        TOK             *i_file;        /* Saved file name */
                    367:        CSTACK          *i_cstackp;     /* Saved conditional stack state */
                    368: } ISTACK;
                    369: 
                    370: /*
                    371:  * These structures keep track of the labels and constants for switches.
                    372:  * It is used by code in the statement reader "stat.c".
                    373:  */
                    374: typedef struct {
                    375:        int     sc_lab;                 /* Label number */
                    376:        ival_t  sc_val;                 /* Value */
                    377: } SCASE;
                    378: 
                    379: typedef struct {
                    380:        int     sb_ncase;               /* # of cases */
                    381:        int     sb_dlab;                /* Default label */
                    382:        SCASE   sb_case[];              /* Adjustable array */
                    383: }      SBLOCK;
                    384: 
                    385: /*
                    386:  * Tree nodes.
                    387:  * All tree nodes are the same size.
                    388:  * A node of any type may be changed into a node of any other type.
                    389:  * The madness with the defines and the dots is just niceness
                    390:  * in the wake of wishing to compile under both Bell and UCB structure rules.
                    391:  */
                    392: typedef        struct tree TREE;
                    393: struct tree
                    394: {
                    395:        short   t_op;                   /* Opcode */
                    396:        short   t_type;                 /* Internal type (T_) */
                    397:        DIM     *t_dp;                  /* DIM list */
                    398:        INFO    *t_ip;                  /* INFO if aggregate */
                    399:        union   {
                    400:                struct  {
                    401:                        TREE    *t_xlp;
                    402:                        union   {
                    403:                                TREE    *t_xrp;
                    404:                                struct  {
                    405:                                        char    t_xfw;
                    406:                                        char    t_xfb;
                    407:                                }       t_1;
                    408:                        }       t_2;
                    409:                }       t_3;
                    410:                ival_t  t_xival;
                    411:                lval_t  t_xlval;
                    412:                dval_t  t_xdval;
                    413:                sizeof_t t_xzval;
                    414:                struct  {
                    415:                        sizeof_t t_xoffs;
                    416:                        int     t_xseg;
                    417:                        union   {
                    418:                                int     t_xlab;
                    419:                                SYM     *t_xsp;
                    420:                        }       t_4;
                    421:                }       t_5;
                    422:                short   t_xreg;
                    423:        }       t_6;
                    424: };
                    425: 
                    426: #define        t_lp    t_6.t_3.t_xlp           /* Left link */
                    427: #define        t_rp    t_6.t_3.t_2.t_xrp       /* Right link */
                    428: #define        t_width t_6.t_3.t_2.t_1.t_xfw   /* Field width, bits */
                    429: #define        t_base  t_6.t_3.t_2.t_1.t_xfb   /* Field base bit */
                    430: #define        t_ival  t_6.t_xival             /* ICON value */
                    431: #define        t_lval  t_6.t_xlval             /* LCON value */
                    432: #define        t_dval  t_6.t_xdval             /* DCON value */
                    433: #define t_zval t_6.t_xzval             /* ZCON value */
                    434: #define        t_reg   t_6.t_xreg              /* Register code */
                    435: #define t_offs t_6.t_5.t_xoffs         /* Label offset */
                    436: #define        t_seg   t_6.t_5.t_xseg          /* Segment */
                    437: #define        t_label t_6.t_5.t_4.t_xlab      /* Label # */
                    438: #define        t_sp    t_6.t_5.t_4.t_xsp       /* Global symbol link */
                    439: 
                    440: /*
                    441:  * Opdope flag bits.
                    442:  */
                    443: #define PRIO    037                    /* Priority */
                    444: #define NSTL   040                     /* No structures on left */
                    445: #define RAS     0100                   /* Right associative */
                    446: #define RLVL    0200                   /* Require lvalue on left */
                    447: #define NFLT    0400                   /* No floats */
                    448: #define NPTR    01000                  /* No pointers on right */
                    449: #define NPTL    02000                  /* No pointers on left */
                    450: #define RTOR    04000                  /* Require truth value on right */
                    451: #define RTOL    010000                 /* Require truth value on left */
                    452: #define ASGN    020000                 /* Assignment op */
                    453: #define NSTR    040000                 /* No structures on right */
                    454: 
                    455: /*
                    456:  * Conversion dope bits.
                    457:  */
                    458: #define GOAL   077                     /* Goal type */
                    459: #define CVRA   0100                    /* Convert right on assignment */
                    460: #define CVR    0200                    /* Convert right */
                    461: #define CVL    0400                    /* Convert left */
                    462: #define GTL     01000                  /* Goal type from left */
                    463: #define GTR     02000                  /* Goal type from right */
                    464: #define UREL    04000                  /* Unsigned relation check needed */
                    465: #define CARA   010000                  /* Cast right on assignment */
                    466: 
                    467: /*
                    468:  * cpp variables.
                    469:  */
                    470: extern char    dbuf[NDBUF], *dputp, *dpshp;
                    471: extern DSTACK  dstack[], *dstackp, *dlistp;
                    472: extern ISTACK  istack[], *istackp;
                    473: extern CSTACK  cstack[], *cstackp;
                    474: extern HIDESET *hidefree, *hidesets;
                    475: extern int     cstate;
                    476: extern int     lastchar;
                    477: extern int     instring;
                    478: extern int     notskip;
                    479: extern int     ndirs;
                    480: extern char    *incdirs[];
                    481: extern char    deftrue[];
                    482: extern char    deffalse[];
                    483: extern long    curtime;
                    484: 
                    485: /*
                    486:  * Functions and variables.
                    487:  */
                    488: extern  int     mysizes[];
                    489: extern  SYM    *cfsym;
                    490: extern  int     cflab;
                    491: extern  char    id[];
                    492: extern  unsigned     idhash;
                    493: extern unsigned     idhide;
                    494: extern int     idsize;
                    495: extern TOK     *idp;
                    496: extern  TOK    *hash0[];
                    497: extern  int     llex;
                    498: extern int     lsym;
                    499: extern  int     s;
                    500: extern  ival_t  ival;
                    501: extern  lval_t  lval;
                    502: extern dval_t  dval;
                    503: extern short   tval;
                    504: extern  int     line;
                    505: extern  char    file[];
                    506: extern TOK     *tfile;
                    507: extern unsigned char ct[];
                    508: extern TOK     *newtoken();
                    509: extern  SYM    *newsym();
                    510: extern CPPSYM  *newcpp();
                    511: extern  DIM    *dupldim();
                    512: extern  DIM    *tackdim();
                    513: extern  INFO    *newinfo();
                    514: extern  char    *new();
                    515: extern  int     nerr;
                    516: extern char    *passname;
                    517: extern  int     nargs;
                    518: extern  SYM    *args[];
                    519: extern TREE    *expr();
                    520: extern int     incpp;
                    521: extern  int     ininit;
                    522: extern int     incase;
                    523: extern  char    *talloc();
                    524: extern TREE    *transform();
                    525: extern  short   opdope[];
                    526: extern  short   cvdope[];
                    527: extern TREE    *pexpr();
                    528: extern  DIM    *tdalloc();
                    529: extern TREE    *build();
                    530: extern TREE    *charray();
                    531: extern TREE    *chfun();
                    532: extern TREE    *bicon();
                    533: extern TREE    *bzcon();
                    534: extern TREE    *bid();
                    535: extern TREE    *bcvt();
                    536: extern TREE    *bconvert();
                    537: extern TREE    *term();
                    538: extern TREE    *tree();
                    539: extern TREE    *bstring();
                    540: extern  char    mytypes[];
                    541: extern TREE    *fold0();
                    542: extern SYM     *deflookup();
                    543: extern SYM     *reflookup();
                    544: extern SYM     *moslookup();
                    545: extern SYM     *fakedef();
                    546: extern SYM     *taglookup();
                    547: extern SYM     *fixlevel();
                    548: extern SYM     *declare();
                    549: extern long    fieldalign();
                    550: extern sizeof_t ssize();
                    551: extern sizeof_t tsize();
                    552: extern sizeof_t sdsize();
                    553: extern sizeof_t tidsize();
                    554: extern sizeof_t psize();
                    555: extern sizeof_t getbound();
                    556: extern sizeof_t szcheck();     /* mch - object size check */
                    557: extern TREE    *cast();        /* cast declarator reader */
                    558: extern int     oldseg;
                    559: extern int     mnamef;
                    560: extern int     labgen;
                    561: extern int     cblab;
                    562: extern int     cclab;
                    563: extern SBLOCK  *sbp;
                    564: extern FILE    *ifp;
                    565: extern FILE    *ofp;           /* Output file */
                    566: 
                    567: #if OVERLAID
                    568: extern jmp_buf death;          /* Fatal errors */
                    569: #endif

unix.superglobalmegacorp.com

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