Annotation of 43BSD/ucb/pascal/src/0.h, revision 1.1

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

unix.superglobalmegacorp.com

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