Annotation of 40BSD/cmd/pi/0.h, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: /* static      char sccsid[] = "@(#)0.h 1.3 10/2/80"; */
                      4: 
                      5: #define DEBUG
                      6: #define        CHAR
                      7: #define        STATIC
                      8: #define hp21mx 0
                      9: 
                     10: #include       <stdio.h>
                     11: #include       <sys/types.h>
                     12: 
                     13: #define                bool    short
                     14: #define                TRUE    1
                     15: #define                FALSE   0
                     16: 
                     17: /*
                     18:  * Option flags
                     19:  *
                     20:  * The following options are recognized in the text of the program
                     21:  * and also on the command line:
                     22:  *
                     23:  *     b       block buffer the file output
                     24:  *
                     25:  *     i       make a listing of the procedures and functions in
                     26:  *             the following include files
                     27:  *
                     28:  *     l       make a listing of the program
                     29:  *
                     30:  *     n       place each include file on a new page with a header
                     31:  *
                     32:  *     p       disable post mortem and statement limit counting
                     33:  *
                     34:  *     t       disable run-time tests
                     35:  *
                     36:  *     u       card image mode; only first 72 chars of input count
                     37:  *
                     38:  *     w       suppress special diagnostic warnings
                     39:  *
                     40:  *     z       generate counters for an execution profile
                     41:  */
                     42: #ifdef DEBUG
                     43: bool   fulltrace, errtrace, testtrace, yyunique;
                     44: #endif DEBUG
                     45: 
                     46: /*
                     47:  * Each option has a stack of 17 option values, with opts giving
                     48:  * the current, top value, and optstk the value beneath it.
                     49:  * One refers to option `l' as, e.g., opt('l') in the text for clarity.
                     50:  */
                     51: char   opts[ 'z' - 'A' + 1];
                     52: short  optstk[ 'z' - 'A' + 1];
                     53: 
                     54: #define opt(c) opts[c-'A']
                     55: 
                     56: /*
                     57:  * Monflg is set when we are generating
                     58:  * a pxp profile.  this is set by the -z command line option.
                     59:  */
                     60: bool   monflg;
                     61: 
                     62:     /*
                     63:      * profflag is set when we are generating a prof profile.
                     64:      * this is set by the -p command line option.
                     65:      */
                     66: bool   profflag;
                     67: 
                     68: 
                     69: /*
                     70:  * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
                     71:  *
                     72:  * Pi uses expandable tables for
                     73:  * its namelist (symbol table), string table
                     74:  * hash table, and parse tree space.  The following
                     75:  * definitions specify the size of the increments
                     76:  * for these items in fundamental units so that
                     77:  * each uses approximately 1024 bytes.
                     78:  */
                     79: 
                     80: #define        STRINC  1024            /* string space increment */
                     81: #define        TRINC   512             /* tree space increment */
                     82: #define        HASHINC 509             /* hash table size in words, each increment */
                     83: #define        NLINC   56              /* namelist increment size in nl structs */
                     84: 
                     85: /*
                     86:  * The initial sizes of the structures.
                     87:  * These should be large enough to compile
                     88:  * an "average" sized program so as to minimize
                     89:  * storage requests.
                     90:  * On a small system or and 11/34 or 11/40
                     91:  * these numbers can be trimmed to make the
                     92:  * compiler smaller.
                     93:  */
                     94: #define        ITREE   2000
                     95: #define        INL     200
                     96: #define        IHASH   509
                     97: 
                     98: /*
                     99:  * The following limits on hash and tree tables currently
                    100:  * allow approximately 1200 symbols and 20k words of tree
                    101:  * space.  The fundamental limit of 64k total data space
                    102:  * should be exceeded well before these are full.
                    103:  */
                    104: /*
                    105:  * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
                    106:  */
                    107: #define TABLE_MULTIPLIER       8
                    108: #define        MAXHASH (4 * TABLE_MULTIPLIER)
                    109: #define        MAXNL   (12 * TABLE_MULTIPLIER)
                    110: #define        MAXTREE (30 * TABLE_MULTIPLIER)
                    111: /*
                    112:  * MAXDEPTH is the depth of the parse stack.
                    113:  * STACK_MULTIPLIER is for increasing its size.
                    114:  */
                    115: #define        STACK_MULTIPLIER        8
                    116: #define        MAXDEPTH ( 150 * STACK_MULTIPLIER )
                    117: 
                    118: /*
                    119:  * ERROR RELATED DEFINITIONS
                    120:  */
                    121: 
                    122: /*
                    123:  * Exit statuses to pexit
                    124:  *
                    125:  * AOK
                    126:  * ERRS                Compilation errors inhibit obj productin
                    127:  * NOSTART     Errors before we ever got started
                    128:  * DIED                We ran out of memory or some such
                    129:  */
                    130: #define        AOK     0
                    131: #define        ERRS    1
                    132: #define        NOSTART 2
                    133: #define        DIED    3
                    134: 
                    135: bool   Recovery;
                    136: 
                    137: #define        eholdnl()       Eholdnl = 1
                    138: #define        nocascade()     Enocascade = 1
                    139: 
                    140: bool   Eholdnl, Enocascade;
                    141: 
                    142: 
                    143: /*
                    144:  * The flag eflg is set whenever we have a hard error.
                    145:  * The character in errpfx will precede the next error message.
                    146:  * When cgenflg is set code generation is suppressed.
                    147:  * This happens whenver we have an error (i.e. if eflg is set)
                    148:  * and when we are walking the tree to determine types only.
                    149:  */
                    150: bool   eflg;
                    151: char   errpfx;
                    152: 
                    153: #define        setpfx(x)       errpfx = x
                    154: 
                    155: #define        standard()      setpfx('s')
                    156: #define        warning()       setpfx('w')
                    157: #define        recovered()     setpfx('e')
                    158: 
                    159: bool   cgenflg;
                    160: 
                    161: 
                    162: /*
                    163:  * The flag syneflg is used to suppress the diagnostics of the form
                    164:  *     E 10 a, defined in someprocedure, is neither used nor set
                    165:  * when there were syntax errors in "someprocedure".
                    166:  * In this case, it is likely that these warinings would be spurious.
                    167:  */
                    168: bool   syneflg;
                    169: 
                    170: /*
                    171:  * The compiler keeps its error messages in a file.
                    172:  * The variable efil is the unit number on which
                    173:  * this file is open for reading of error message text.
                    174:  * Similarly, the file ofil is the unit of the file
                    175:  * "obj" where we write the interpreter code.
                    176:  */
                    177: short  efil;
                    178: short  ofil;
                    179: short  obuf[518];
                    180: 
                    181: #define        elineoff()      Enoline++
                    182: #define        elineon()       Enoline = 0
                    183: 
                    184: bool   Enoline;
                    185: 
                    186: /*
                    187:  * SYMBOL TABLE STRUCTURE DEFINITIONS
                    188:  *
                    189:  * The symbol table is henceforth referred to as the "namelist".
                    190:  * It consists of a number of structures of the form "nl" below.
                    191:  * These are contained in a number of segments of the symbol
                    192:  * table which are dynamically allocated as needed.
                    193:  * The major namelist manipulation routines are contained in the
                    194:  * file "nl.c".
                    195:  *
                    196:  * The major components of a namelist entry are the "symbol", giving
                    197:  * a pointer into the string table for the string associated with this
                    198:  * entry and the "class" which tells which of the (currently 19)
                    199:  * possible types of structure this is.
                    200:  *
                    201:  * Many of the classes use the "type" field for a pointer to the type
                    202:  * which the entry has.
                    203:  *
                    204:  * Other pieces of information in more than one class include the block
                    205:  * in which the symbol is defined, flags indicating whether the symbol
                    206:  * has been used and whether it has been assigned to, etc.
                    207:  *
                    208:  * A more complete discussion of the features of the namelist is impossible
                    209:  * here as it would be too voluminous.  Refer to the "PI 1.0 Implementation
                    210:  * Notes" for more details.
                    211:  */
                    212: 
                    213: /*
                    214:  * The basic namelist structure.
                    215:  * There are also two other variants, defining the real
                    216:  * field as longs or integers given below.
                    217:  *
                    218:  * The array disptab defines the hash header for the symbol table.
                    219:  * Symbols are hashed based on the low 6 bits of their pointer into
                    220:  * the string table; see the routines in the file "lookup.c" and also "fdec.c"
                    221:  * especially "funcend".
                    222:  */
                    223: #ifdef PTREE
                    224: #   include    "pTree.h"
                    225: #endif PTREE
                    226: struct nl {
                    227:        char    *symbol;
                    228:        char    class, nl_flags;
                    229: #ifdef PC
                    230:        char    ext_flags;      /* an extra flag is used for externals */
                    231: #endif PC
                    232:        struct  nl *type;
                    233:        struct  nl *chain, *nl_next;
                    234:        int     *ptr[4];
                    235: #ifdef PI
                    236:        int     entloc;
                    237: #endif PI
                    238: #      ifdef PTREE
                    239:            pPointer    inTree;
                    240: #      endif PTREE
                    241: } *nlp, *disptab[077+1];
                    242: 
                    243: extern struct nl nl[INL];
                    244: 
                    245: struct {
                    246:        char    *symbol;
                    247:        char    class, nl_flags;
                    248: #ifdef PC
                    249:        char    ext_flags;
                    250: #endif
                    251:        struct  nl *type;
                    252:        struct  nl *chain, *nl_next;
                    253:        double  real;
                    254: };
                    255: 
                    256: struct {
                    257:        char    *symbol;
                    258:        char    class, nl_block;
                    259: #ifdef PC
                    260:        char    ext_flags;
                    261: #endif
                    262:        struct  nl *type;
                    263:        struct  nl *chain, *nl_next;
                    264:        long    range[2];
                    265: };
                    266: 
                    267: struct {
                    268:        char    *symbol;
                    269:        char    class, nl_flags;
                    270: #ifdef PC
                    271:        char    ext_flags;
                    272: #endif
                    273:        struct  nl *type;
                    274:        struct  nl *chain, *nl_next;
                    275:        long    value[4];
                    276: };
                    277: 
                    278: /*
                    279:  * NL FLAGS BITS
                    280:  *
                    281:  * Definitions of the usage of the bits in
                    282:  * the nl_flags byte. Note that the low 5 bits of the
                    283:  * byte are the "nl_block" and that some classes make use
                    284:  * of this byte as a "width".
                    285:  *
                    286:  * The only non-obvious bit definition here is "NFILES"
                    287:  * which records whether a structure contains any files.
                    288:  * Such structures are not allowed to be dynamically allocated.
                    289:  */
                    290: #define        NUSED   0100
                    291: #define        NMOD    0040
                    292: #define        NFORWD  0200
                    293: #define        NFILES  0200
                    294: 
                    295: #ifdef PC
                    296: #define NEXTERN 0001   /* flag used to mark external funcs and procs */
                    297: #endif
                    298: 
                    299: /*
                    300:  * Definition of the commonly used "value" fields.
                    301:  * The most important one is NL_OFFS which gives
                    302:  * the offset of a variable in its stack mark.
                    303:  */
                    304: #define NL_OFFS        0
                    305: 
                    306: #define        NL_CNTR 1
                    307: #define        NL_FVAR 3
                    308: 
                    309: #define NL_GOLEV 2
                    310: #define NL_GOLINE 3
                    311: #define NL_FORV 1
                    312: 
                    313: #define        NL_FLDSZ 1
                    314: #define        NL_VARNT 2
                    315: #define        NL_VTOREC 2
                    316: #define        NL_TAG  3
                    317: 
                    318: #define        NL_ELABEL       3
                    319: 
                    320: /*
                    321:  * For BADUSE nl structures, NL_KINDS is a bit vector
                    322:  * indicating the kinds of illegal usages complained about
                    323:  * so far.  For kind of bad use "kind", "1 << kind" is set.
                    324:  * The low bit is reserved as ISUNDEF to indicate whether
                    325:  * this identifier is totally undefined.
                    326:  */
                    327: #define        NL_KINDS        0
                    328: 
                    329: #define        ISUNDEF         1
                    330: 
                    331: /*
                    332:  * NAMELIST CLASSES
                    333:  *
                    334:  * The following are the namelist classes.
                    335:  * Different classes make use of the value fields
                    336:  * of the namelist in different ways.
                    337:  *
                    338:  * The namelist should be redesigned by providing
                    339:  * a number of structure definitions with one corresponding
                    340:  * to each namelist class, ala a variant record in Pascal.
                    341:  */
                    342: #define        BADUSE  0
                    343: #define        CONST   1
                    344: #define        TYPE    2
                    345: #define        VAR     3
                    346: #define        ARRAY   4
                    347: #define        PTRFILE 5
                    348: #define        RECORD  6
                    349: #define        FIELD   7
                    350: #define        PROC    8
                    351: #define        FUNC    9
                    352: #define        FVAR    10
                    353: #define        REF     11
                    354: #define        PTR     12
                    355: #define        FILET   13
                    356: #define        SET     14
                    357: #define        RANGE   15
                    358: #define        LABEL   16
                    359: #define        WITHPTR 17
                    360: #define        SCAL    18
                    361: #define        STR     19
                    362: #define        PROG    20
                    363: #define        IMPROPER 21
                    364: #define        VARNT   22
                    365: #define        FPROC   23
                    366: #define        FFUNC   24
                    367: 
                    368: /*
                    369:  * Clnames points to an array of names for the
                    370:  * namelist classes.
                    371:  */
                    372: char   **clnames;
                    373: 
                    374: /*
                    375:  * PRE-DEFINED NAMELIST OFFSETS
                    376:  *
                    377:  * The following are the namelist offsets for the
                    378:  * primitive types. The ones which are negative
                    379:  * don't actually exist, but are generated and tested
                    380:  * internally. These definitions are sensitive to the
                    381:  * initializations in nl.c.
                    382:  */
                    383: #define        TFIRST -7
                    384: #define        TFILE  -7
                    385: #define        TREC   -6
                    386: #define        TARY   -5
                    387: #define        TSCAL  -4
                    388: #define        TPTR   -3
                    389: #define        TSET   -2
                    390: #define        TSTR   -1
                    391: #define        NIL     0
                    392: #define        TBOOL   1
                    393: #define        TCHAR   2
                    394: #define        TINT    3
                    395: #define        TDOUBLE 4
                    396: #define        TNIL    5
                    397: #define        T1INT   6
                    398: #define        T2INT   7
                    399: #define        T4INT   8
                    400: #define        T1CHAR  9
                    401: #define        T1BOOL  10
                    402: #define        T8REAL  11
                    403: #define TLAST  11
                    404: 
                    405: /*
                    406:  * SEMANTIC DEFINITIONS
                    407:  */
                    408: 
                    409: /*
                    410:  * NOCON and SAWCON are flags in the tree telling whether
                    411:  * a constant set is part of an expression.
                    412:  */
                    413: #define NOCON  0
                    414: #define SAWCON 1
                    415: 
                    416: /*
                    417:  * The variable cbn gives the current block number,
                    418:  * the variable bn is set as a side effect of a call to
                    419:  * lookup, and is the block number of the variable which
                    420:  * was found.
                    421:  */
                    422: short  bn, cbn;
                    423: 
                    424: /*
                    425:  * The variable line is the current semantic
                    426:  * line and is set in stat.c from the numbers
                    427:  * embedded in statement type tree nodes.
                    428:  */
                    429: short  line;
                    430: 
                    431: /*
                    432:  * The size of the display
                    433:  * which defines the maximum nesting
                    434:  * of procedures and functions allowed.
                    435:  * Because of the flags in the current namelist
                    436:  * this must be no greater than 32.
                    437:  */
                    438: #define        DSPLYSZ 20
                    439: 
                    440: /*
                    441:  * The following structure is used
                    442:  * to keep track of the amount of variable
                    443:  * storage required by each block.
                    444:  * "Max" is the high water mark, "off"
                    445:  * the current need. Temporaries for "for"
                    446:  * loops and "with" statements are allocated
                    447:  * in the local variable area and these
                    448:  * numbers are thereby changed if necessary.
                    449:  */
                    450: struct om {
                    451:        long    om_off;
                    452:        long    om_max;
                    453: } sizes[DSPLYSZ];
                    454: 
                    455:     /*
                    456:      * the following structure records whether a level declares
                    457:      * any variables which are (or contain) files.
                    458:      * this so that the runtime routines for file cleanup can be invoked.
                    459:      */
                    460: bool   dfiles[ DSPLYSZ ];
                    461: 
                    462: /*
                    463:  * Structure recording information about a constant
                    464:  * declaration.  It is actually the return value from
                    465:  * the routine "gconst", but since C doesn't support
                    466:  * record valued functions, this is more convenient.
                    467:  */
                    468: struct {
                    469:        struct nl       *ctype;
                    470:        short           cival;
                    471:        double          crval;
                    472:        int             *cpval;
                    473: } con;
                    474: 
                    475: /*
                    476:  * The set structure records the lower bound
                    477:  * and upper bound with the lower bound normalized
                    478:  * to zero when working with a set. It is set by
                    479:  * the routine setran in var.c.
                    480:  */
                    481: struct {
                    482:        short   lwrb, uprbp;
                    483: } set;
                    484: 
                    485:     /*
                    486:      * structures of this kind are filled in by precset and used by postcset
                    487:      * to indicate things about constant sets.
                    488:      */
                    489: struct csetstr {
                    490:     struct nl  *csettype;
                    491:     long       paircnt;
                    492:     long       singcnt;
                    493:     bool       comptime;
                    494: };
                    495: /*
                    496:  * The following flags are passed on calls to lvalue
                    497:  * to indicate how the reference is to affect the usage
                    498:  * information for the variable being referenced.
                    499:  * MOD is used to set the NMOD flag in the namelist
                    500:  * entry for the variable, ASGN permits diagnostics
                    501:  * to be formed when a for variable is assigned to in
                    502:  * the range of the loop.
                    503:  */
                    504: #define        NOFLAGS 0
                    505: #define        MOD     01
                    506: #define        ASGN    02
                    507: #define        NOUSE   04
                    508: 
                    509:     /*
                    510:      * the following flags are passed to lvalue and rvalue
                    511:      * to tell them whether an lvalue or rvalue is required.
                    512:      * the semantics checking is done according to the function called,
                    513:      * but for pc, lvalue may put out an rvalue by indirecting afterwards,
                    514:      * and rvalue may stop short of putting out the indirection.
                    515:      */
                    516: #define        LREQ    01
                    517: #define        RREQ    02
                    518: 
                    519: double MAXINT;
                    520: double MININT;
                    521: 
                    522: /*
                    523:  * Variables for generation of profile information.
                    524:  * Monflg is set when we want to generate a profile.
                    525:  * Gocnt record the total number of goto's and
                    526:  * cnts records the current counter for generating
                    527:  * COUNT operators.
                    528:  */
                    529: short  gocnt;
                    530: short  cnts;
                    531: 
                    532: /*
                    533:  * Most routines call "incompat" rather than asking "!compat"
                    534:  * for historical reasons.
                    535:  */
                    536: #define incompat       !compat
                    537: 
                    538: /*
                    539:  * Parts records which declaration parts have been seen.
                    540:  * The grammar allows the "label" "const" "type" "var" and routine
                    541:  * parts to be repeated and to be in any order, so that
                    542:  * they can be detected semantically to give better
                    543:  * error diagnostics.
                    544:  */
                    545: int    parts[ DSPLYSZ ];
                    546: 
                    547: #define        LPRT    1
                    548: #define        CPRT    2
                    549: #define        TPRT    4
                    550: #define        VPRT    8
                    551: #define        RPRT    16
                    552: 
                    553: /*
                    554:  * Flags for the "you used / instead of div" diagnostic
                    555:  */
                    556: bool   divchk;
                    557: bool   divflg;
                    558: 
                    559: short  errcnt[DSPLYSZ];
                    560: 
                    561: /*
                    562:  * Forechain links those types which are
                    563:  *     ^ sometype
                    564:  * so that they can be evaluated later, permitting
                    565:  * circular, recursive list structures to be defined.
                    566:  */
                    567: struct nl *forechain;
                    568: 
                    569: /*
                    570:  * Withlist links all the records which are currently
                    571:  * opened scopes because of with statements.
                    572:  */
                    573: struct nl *withlist;
                    574: 
                    575: struct nl *intset;
                    576: struct nl *input, *output;
                    577: struct nl *program;
                    578: 
                    579: /* progseen flag used by PC to determine if
                    580:  * a routine segment is being compiled (and
                    581:  * therefore no program statement seen)
                    582:  */
                    583: bool   progseen;
                    584: 
                    585: 
                    586: /*
                    587:  * STRUCTURED STATEMENT GOTO CHECKING
                    588:  *
                    589:  * The variable level keeps track of the current
                    590:  * "structured statement level" when processing the statement
                    591:  * body of blocks.  This is used in the detection of goto's into
                    592:  * structured statements in a block.
                    593:  *
                    594:  * Each label's namelist entry contains two pieces of information
                    595:  * related to this check. The first `NL_GOLEV' either contains
                    596:  * the level at which the label was declared, `NOTYET' if the label
                    597:  * has not yet been declared, or `DEAD' if the label is dead, i.e.
                    598:  * if we have exited the level in which the label was defined.
                    599:  *
                    600:  * When we discover a "goto" statement, if the label has not
                    601:  * been defined yet, then we record the current level and the current line
                    602:  * for a later error check.  If the label has been already become "DEAD"
                    603:  * then a reference to it is an error.  Now the compiler maintains,
                    604:  * for each block, a linked list of the labels headed by "gotos[bn]".
                    605:  * When we exit a structured level, we perform the routine
                    606:  * ungoto in stat.c. It notices labels whose definition levels have been
                    607:  * exited and makes them be dead. For labels which have not yet been
                    608:  * defined, ungoto will maintain NL_GOLEV as the minimum structured level
                    609:  * since the first usage of the label. It is not hard to see that the label
                    610:  * must eventually be declared at this level or an outer level to this
                    611:  * one or a goto into a structured statement will exist.
                    612:  */
                    613: short  level;
                    614: struct nl *gotos[DSPLYSZ];
                    615: 
                    616: #define        NOTYET  10000
                    617: #define        DEAD    10000
                    618: 
                    619: /*
                    620:  * Noreach is true when the next statement will
                    621:  * be unreachable unless something happens along
                    622:  * (like exiting a looping construct) to save
                    623:  * the day.
                    624:  */
                    625: bool   noreach;
                    626: 
                    627: /*
                    628:  * UNDEFINED VARIABLE REFERENCE STRUCTURES
                    629:  */
                    630: struct udinfo {
                    631:        int     ud_line;
                    632:        struct  udinfo *ud_next;
                    633:        char    nullch;
                    634: };
                    635: 
                    636: /*
                    637:  * CODE GENERATION DEFINITIONS
                    638:  */
                    639: 
                    640: /*
                    641:  * NSTAND is or'ed onto the abstract machine opcode
                    642:  * for non-standard built-in procedures and functions.
                    643:  */
                    644: #define        NSTAND  0400
                    645: 
                    646: #define        codeon()        cgenflg++
                    647: #define        codeoff()       --cgenflg
                    648: 
                    649: /*
                    650:  * Codeline is the last lino output in the code generator.
                    651:  * It used to be used to suppress LINO operators but no
                    652:  * more since we now count statements.
                    653:  * Lc is the intepreter code location counter.
                    654:  *
                    655: short  codeline;
                    656:  */
                    657: char   *lc;
                    658: 
                    659: 
                    660: /*
                    661:  * Routines which need types
                    662:  * other than "integer" to be
                    663:  * assumed by the compiler.
                    664:  */
                    665: double         atof();
                    666: long           lwidth();
                    667: long           aryconst();
                    668: long           a8tol();
                    669: struct nl      *lookup();
                    670: double         atof();
                    671: int            *tree();
                    672: int            *hash();
                    673: char           *alloc();
                    674: int            *calloc();
                    675: char           *savestr();
                    676: struct nl      *lookup1();
                    677: struct nl      *hdefnl();
                    678: struct nl      *defnl();
                    679: struct nl      *enter();
                    680: struct nl      *nlcopy();
                    681: struct nl      *tyrecl();
                    682: struct nl      *tyary();
                    683: struct nl      *fields();
                    684: struct nl      *variants();
                    685: struct nl      *deffld();
                    686: struct nl      *defvnt();
                    687: struct nl      *tyrec1();
                    688: struct nl      *reclook();
                    689: struct nl      *asgnop1();
                    690: struct nl      *gtype();
                    691: struct nl      *call();
                    692: struct nl      *lvalue();
                    693: struct nl      *rvalue();
                    694: struct nl      *cset();
                    695: 
                    696: /*
                    697:  * type cast NIL to keep lint happy (which is not so bad)
                    698:  */
                    699: #define                NLNIL   ( (struct nl *) NIL )
                    700: 
                    701: /*
                    702:  * Funny structures to use
                    703:  * pointers in wild and wooly ways
                    704:  */
                    705: struct {
                    706:        char    pchar;
                    707: };
                    708: struct {
                    709:        short   pint;
                    710:        short   pint2;
                    711: };
                    712: struct {
                    713:        long    plong;
                    714: };
                    715: struct {
                    716:        double  pdouble;
                    717: };
                    718: 
                    719: #define        OCT     1
                    720: #define        HEX     2
                    721: 
                    722: /*
                    723:  * MAIN PROGRAM VARIABLES, MISCELLANY
                    724:  */
                    725: 
                    726: /*
                    727:  * Variables forming a data base referencing
                    728:  * the command line arguments with the "i" option, e.g.
                    729:  * in "pi -i scanner.i compiler.p".
                    730:  */
                    731: char   **pflist;
                    732: short  pflstc;
                    733: short  pfcnt;
                    734: 
                    735: char   *filename;              /* current source file name */
                    736: long   tvec;
                    737: extern char    *snark;         /* SNARK */
                    738: extern char    *classes[ ];    /* maps namelist classes to string names */
                    739: 
                    740: #define        derror error
                    741: 
                    742: #ifdef PC
                    743: 
                    744:     /*
                    745:      * the current function number, for [ lines
                    746:      */
                    747:     int        ftnno;
                    748: 
                    749:     /*
                    750:      * the pc output stream
                    751:      */
                    752:     FILE *pcstream;
                    753: 
                    754: #endif PC

unix.superglobalmegacorp.com

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