1733Speter /* Copyright (c) 1979 Regents of the University of California */ 2733Speter 3*20193Smckusick /* static char sccsid[] = "@(#)0.h 2.2 05/13/85"; */ 4733Speter 5733Speter #define DEBUG 63071Smckusic #define CONSETS 7733Speter #define CHAR 8733Speter #define STATIC 9733Speter #define hp21mx 0 10733Speter 11733Speter #include <stdio.h> 12733Speter #include <sys/types.h> 13733Speter 143071Smckusic typedef enum {FALSE, TRUE} bool; 15733Speter 16733Speter /* 17733Speter * Option flags 18733Speter * 19733Speter * The following options are recognized in the text of the program 20733Speter * and also on the command line: 21733Speter * 22733Speter * b block buffer the file output 23733Speter * 24733Speter * i make a listing of the procedures and functions in 25733Speter * the following include files 26733Speter * 27733Speter * l make a listing of the program 28733Speter * 29733Speter * n place each include file on a new page with a header 30733Speter * 31733Speter * p disable post mortem and statement limit counting 32733Speter * 33733Speter * t disable run-time tests 34733Speter * 35733Speter * u card image mode; only first 72 chars of input count 36733Speter * 37733Speter * w suppress special diagnostic warnings 38733Speter * 39733Speter * z generate counters for an execution profile 40733Speter */ 41733Speter #ifdef DEBUG 42733Speter bool fulltrace, errtrace, testtrace, yyunique; 43733Speter #endif DEBUG 44733Speter 45733Speter /* 46733Speter * Each option has a stack of 17 option values, with opts giving 47733Speter * the current, top value, and optstk the value beneath it. 48733Speter * One refers to option `l' as, e.g., opt('l') in the text for clarity. 49733Speter */ 50733Speter char opts[ 'z' - 'A' + 1]; 51733Speter short optstk[ 'z' - 'A' + 1]; 52733Speter 53733Speter #define opt(c) opts[c-'A'] 54733Speter 55733Speter /* 56733Speter * Monflg is set when we are generating 57733Speter * a pxp profile. this is set by the -z command line option. 58733Speter */ 59733Speter bool monflg; 60733Speter 61733Speter /* 62733Speter * profflag is set when we are generating a prof profile. 63733Speter * this is set by the -p command line option. 64733Speter */ 6514750Sthien #ifdef PC 66733Speter bool profflag; 6714750Sthien #endif 68733Speter 69733Speter 70733Speter /* 71733Speter * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES 72733Speter * 73733Speter * Pi uses expandable tables for 74733Speter * its namelist (symbol table), string table 75733Speter * hash table, and parse tree space. The following 76733Speter * definitions specify the size of the increments 77733Speter * for these items in fundamental units so that 78733Speter * each uses approximately 1024 bytes. 79733Speter */ 80733Speter 81733Speter #define STRINC 1024 /* string space increment */ 82*20193Smckusick #define TRINC 1024 /* tree space increment */ 83733Speter #define HASHINC 509 /* hash table size in words, each increment */ 84733Speter #define NLINC 56 /* namelist increment size in nl structs */ 85733Speter 86733Speter /* 87733Speter * The initial sizes of the structures. 88733Speter * These should be large enough to compile 89733Speter * an "average" sized program so as to minimize 90733Speter * storage requests. 91733Speter * On a small system or and 11/34 or 11/40 92733Speter * these numbers can be trimmed to make the 93733Speter * compiler smaller. 94733Speter */ 95733Speter #define ITREE 2000 96733Speter #define INL 200 97733Speter #define IHASH 509 98733Speter 99733Speter /* 100733Speter * The following limits on hash and tree tables currently 101733Speter * allow approximately 1200 symbols and 20k words of tree 102733Speter * space. The fundamental limit of 64k total data space 103733Speter * should be exceeded well before these are full. 104733Speter */ 105733Speter /* 106733Speter * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables 107733Speter */ 10810658Speter #ifdef ADDR32 109733Speter #define TABLE_MULTIPLIER 8 11010658Speter #endif ADDR32 11110658Speter #ifdef ADDR16 1123071Smckusic #define TABLE_MULTIPLIER 1 11310658Speter #endif ADDR16 114733Speter #define MAXHASH (4 * TABLE_MULTIPLIER) 115733Speter #define MAXNL (12 * TABLE_MULTIPLIER) 116*20193Smckusick #define MAXTREE (40 * TABLE_MULTIPLIER) 117733Speter /* 118733Speter * MAXDEPTH is the depth of the parse stack. 119733Speter * STACK_MULTIPLIER is for increasing its size. 120733Speter */ 12110658Speter #ifdef ADDR32 122733Speter #define STACK_MULTIPLIER 8 12310658Speter #endif ADDR32 12410658Speter #ifdef ADDR16 1253071Smckusic #define STACK_MULTIPLIER 1 12610658Speter #endif ADDR16 127733Speter #define MAXDEPTH ( 150 * STACK_MULTIPLIER ) 128733Speter 129733Speter /* 130733Speter * ERROR RELATED DEFINITIONS 131733Speter */ 132733Speter 133733Speter /* 134733Speter * Exit statuses to pexit 135733Speter * 136733Speter * AOK 137733Speter * ERRS Compilation errors inhibit obj productin 138733Speter * NOSTART Errors before we ever got started 139733Speter * DIED We ran out of memory or some such 140733Speter */ 141733Speter #define AOK 0 142733Speter #define ERRS 1 143733Speter #define NOSTART 2 144733Speter #define DIED 3 145733Speter 146733Speter bool Recovery; 147733Speter 14814750Sthien #define eholdnl() Eholdnl = TRUE 14914750Sthien #define nocascade() Enocascade = TRUE 150733Speter 151733Speter bool Eholdnl, Enocascade; 152733Speter 153733Speter 154733Speter /* 155733Speter * The flag eflg is set whenever we have a hard error. 156733Speter * The character in errpfx will precede the next error message. 157733Speter * When cgenflg is set code generation is suppressed. 158733Speter * This happens whenver we have an error (i.e. if eflg is set) 159733Speter * and when we are walking the tree to determine types only. 160733Speter */ 161733Speter bool eflg; 162733Speter char errpfx; 163733Speter 164733Speter #define setpfx(x) errpfx = x 165733Speter 166733Speter #define standard() setpfx('s') 167733Speter #define warning() setpfx('w') 168733Speter #define recovered() setpfx('e') 1696358Speter #define continuation() setpfx(' ') 170733Speter 1713071Smckusic int cgenflg; 172733Speter 173733Speter 174733Speter /* 175733Speter * The flag syneflg is used to suppress the diagnostics of the form 176733Speter * E 10 a, defined in someprocedure, is neither used nor set 177733Speter * when there were syntax errors in "someprocedure". 178733Speter * In this case, it is likely that these warinings would be spurious. 179733Speter */ 180733Speter bool syneflg; 181733Speter 182733Speter /* 183733Speter * The compiler keeps its error messages in a file. 184733Speter * The variable efil is the unit number on which 185733Speter * this file is open for reading of error message text. 186733Speter * Similarly, the file ofil is the unit of the file 187733Speter * "obj" where we write the interpreter code. 188733Speter */ 189733Speter short efil; 19014750Sthien 19114750Sthien #ifdef OBJ 192733Speter short ofil; 19314750Sthien 194733Speter short obuf[518]; 19514750Sthien #endif 196733Speter 1973071Smckusic bool Enoline; 1983071Smckusic #define elineoff() Enoline = TRUE 1993071Smckusic #define elineon() Enoline = FALSE 200733Speter 201733Speter 202733Speter /* 203733Speter * SYMBOL TABLE STRUCTURE DEFINITIONS 204733Speter * 205733Speter * The symbol table is henceforth referred to as the "namelist". 206733Speter * It consists of a number of structures of the form "nl" below. 207733Speter * These are contained in a number of segments of the symbol 208733Speter * table which are dynamically allocated as needed. 209733Speter * The major namelist manipulation routines are contained in the 210733Speter * file "nl.c". 211733Speter * 212733Speter * The major components of a namelist entry are the "symbol", giving 213733Speter * a pointer into the string table for the string associated with this 214733Speter * entry and the "class" which tells which of the (currently 19) 215733Speter * possible types of structure this is. 216733Speter * 217733Speter * Many of the classes use the "type" field for a pointer to the type 218733Speter * which the entry has. 219733Speter * 220733Speter * Other pieces of information in more than one class include the block 221733Speter * in which the symbol is defined, flags indicating whether the symbol 222733Speter * has been used and whether it has been assigned to, etc. 223733Speter * 224733Speter * A more complete discussion of the features of the namelist is impossible 225733Speter * here as it would be too voluminous. Refer to the "PI 1.0 Implementation 226733Speter * Notes" for more details. 227733Speter */ 228733Speter 229733Speter /* 230733Speter * The basic namelist structure. 2317915Smckusick * There is a union of data types defining the stored information 2327915Smckusick * as pointers, integers, longs, or a double. 233733Speter * 234733Speter * The array disptab defines the hash header for the symbol table. 235733Speter * Symbols are hashed based on the low 6 bits of their pointer into 236733Speter * the string table; see the routines in the file "lookup.c" and also "fdec.c" 237733Speter * especially "funcend". 238733Speter */ 2393220Smckusic extern int pnumcnt; 2403220Smckusic 241733Speter struct nl { 242733Speter char *symbol; 2437915Smckusick char info[4]; 244733Speter struct nl *type; 245733Speter struct nl *chain, *nl_next; 2467915Smckusick union { 24714750Sthien struct nl *un_ptr[5]; 24814750Sthien int un_value[5]; 24914750Sthien long un_range[2]; 25014750Sthien double un_real; 25115972Smckusick struct nl *un_nptr[5]; /* Points to conformant array bounds */ 2527915Smckusick } nl_un; 253733Speter # ifdef PTREE 254733Speter pPointer inTree; 255733Speter # endif PTREE 2567915Smckusick }; 257733Speter 2588680Speter #define class info[0] 2598680Speter #define nl_flags info[1] 2608680Speter #define nl_block info[1] 2618680Speter #define extra_flags info[2] 2628680Speter #define align_info info[3] 263733Speter 2648680Speter #define range nl_un.un_range 2658680Speter #define value nl_un.un_value 2668680Speter #define ptr nl_un.un_ptr 2678680Speter #define real nl_un.un_real 26815972Smckusick #define nptr nl_un.un_nptr 269733Speter 2707915Smckusick extern struct nl *nlp, *disptab[077+1], *Fp; 2717915Smckusick extern struct nl nl[INL]; 272733Speter 2733370Speter 274733Speter /* 275733Speter * NL FLAGS BITS 276733Speter * 277733Speter * Definitions of the usage of the bits in 278733Speter * the nl_flags byte. Note that the low 5 bits of the 279733Speter * byte are the "nl_block" and that some classes make use 280733Speter * of this byte as a "width". 281733Speter * 282733Speter * The only non-obvious bit definition here is "NFILES" 283733Speter * which records whether a structure contains any files. 284733Speter * Such structures are not allowed to be dynamically allocated. 285733Speter */ 2863370Speter 2873370Speter #define BLOCKNO( flag ) ( flag & 037 ) 2883370Speter #define NLFLAGS( flag ) ( flag &~ 037 ) 2893370Speter 290733Speter #define NUSED 0100 291733Speter #define NMOD 0040 292733Speter #define NFORWD 0200 293733Speter #define NFILES 0200 294733Speter #ifdef PC 295733Speter #define NEXTERN 0001 /* flag used to mark external funcs and procs */ 2963823Speter #define NLOCAL 0002 /* variable is a local */ 2973823Speter #define NPARAM 0004 /* variable is a parameter */ 2983823Speter #define NGLOBAL 0010 /* variable is a global */ 2993823Speter #define NREGVAR 0020 /* or'ed in if variable is in a register */ 3009126Smckusick #define NNLOCAL 0040 /* named local variable, not used in symbol table */ 3013823Speter #endif PC 3023370Speter 3033540Speter /* 3043540Speter * used to mark value[ NL_FORV ] for loop variables 3053540Speter */ 3063540Speter #define FORVAR 1 307733Speter 308733Speter /* 309733Speter * Definition of the commonly used "value" fields. 310733Speter * The most important one is NL_OFFS which gives 311733Speter * the offset of a variable in its stack mark. 312733Speter */ 313733Speter #define NL_OFFS 0 314733Speter 315733Speter #define NL_CNTR 1 3163296Smckusic #define NL_NLSTRT 2 3173296Smckusic #define NL_LINENO 3 318733Speter #define NL_FVAR 3 3197915Smckusick #define NL_ENTLOC 4 /* FUNC, PROC - entry point */ 3207915Smckusick #define NL_FCHAIN 4 /* FFUNC, FPROC - ptr to formals */ 321733Speter 322733Speter #define NL_GOLEV 2 323733Speter #define NL_GOLINE 3 324733Speter #define NL_FORV 1 325733Speter 3268680Speter /* 3278680Speter * nlp -> nl_un.un_ptr[] subscripts for records 3288680Speter * NL_FIELDLIST the chain of fixed fields of a record, in order. 3298680Speter * the fields are also chained through ptr[NL_FIELDLIST]. 3308680Speter * this does not include the tag, or fields of variants. 3318680Speter * NL_VARNT pointer to the variants of a record, 3328680Speter * these are then chained through the .chain field. 3338680Speter * NL_VTOREC pointer from a VARNT to the RECORD that is the variant. 3348680Speter * NL_TAG pointer from a RECORD to the tagfield 3358680Speter * if there are any variants. 3368680Speter * align_info the alignment of a RECORD is in info[3]. 3378680Speter */ 3388680Speter #define NL_FIELDLIST 1 3398680Speter #define NL_VARNT 2 3408680Speter #define NL_VTOREC 2 3418680Speter #define NL_TAG 3 3428680Speter /* and align_info is info[3]. #defined above */ 343733Speter 3447915Smckusick #define NL_ELABEL 4 /* SCAL - ptr to definition of enums */ 345733Speter 346733Speter /* 347733Speter * For BADUSE nl structures, NL_KINDS is a bit vector 348733Speter * indicating the kinds of illegal usages complained about 349733Speter * so far. For kind of bad use "kind", "1 << kind" is set. 350733Speter * The low bit is reserved as ISUNDEF to indicate whether 351733Speter * this identifier is totally undefined. 352733Speter */ 353733Speter #define NL_KINDS 0 354733Speter 355733Speter #define ISUNDEF 1 3563275Smckusic 3573823Speter /* 3583823Speter * variables come in three flavors: globals, parameters, locals; 3593823Speter * they can also hide in registers, but that's a different flag 3603823Speter */ 3613275Smckusic #define PARAMVAR 1 3623275Smckusic #define LOCALVAR 2 3633823Speter #define GLOBALVAR 3 3649126Smckusick #define NAMEDLOCALVAR 4 365733Speter 366733Speter /* 367733Speter * NAMELIST CLASSES 368733Speter * 369733Speter * The following are the namelist classes. 370733Speter * Different classes make use of the value fields 371733Speter * of the namelist in different ways. 372733Speter * 373733Speter * The namelist should be redesigned by providing 374733Speter * a number of structure definitions with one corresponding 375733Speter * to each namelist class, ala a variant record in Pascal. 376733Speter */ 377733Speter #define BADUSE 0 378733Speter #define CONST 1 379733Speter #define TYPE 2 380733Speter #define VAR 3 381733Speter #define ARRAY 4 382733Speter #define PTRFILE 5 383733Speter #define RECORD 6 384733Speter #define FIELD 7 385733Speter #define PROC 8 386733Speter #define FUNC 9 387733Speter #define FVAR 10 388733Speter #define REF 11 389733Speter #define PTR 12 390733Speter #define FILET 13 391733Speter #define SET 14 392733Speter #define RANGE 15 393733Speter #define LABEL 16 394733Speter #define WITHPTR 17 395733Speter #define SCAL 18 396733Speter #define STR 19 397733Speter #define PROG 20 398733Speter #define IMPROPER 21 399733Speter #define VARNT 22 4001194Speter #define FPROC 23 4011194Speter #define FFUNC 24 40215972Smckusick #define CRANGE 25 403733Speter 404733Speter /* 405733Speter * Clnames points to an array of names for the 406733Speter * namelist classes. 407733Speter */ 408733Speter char **clnames; 409733Speter 410733Speter /* 411733Speter * PRE-DEFINED NAMELIST OFFSETS 412733Speter * 413733Speter * The following are the namelist offsets for the 414733Speter * primitive types. The ones which are negative 415733Speter * don't actually exist, but are generated and tested 416733Speter * internally. These definitions are sensitive to the 417733Speter * initializations in nl.c. 418733Speter */ 419733Speter #define TFIRST -7 420733Speter #define TFILE -7 421733Speter #define TREC -6 422733Speter #define TARY -5 423733Speter #define TSCAL -4 424733Speter #define TPTR -3 425733Speter #define TSET -2 426733Speter #define TSTR -1 427733Speter #define NIL 0 428733Speter #define TBOOL 1 429733Speter #define TCHAR 2 430733Speter #define TINT 3 431733Speter #define TDOUBLE 4 432733Speter #define TNIL 5 433733Speter #define T1INT 6 434733Speter #define T2INT 7 435733Speter #define T4INT 8 436733Speter #define T1CHAR 9 437733Speter #define T1BOOL 10 438733Speter #define T8REAL 11 439733Speter #define TLAST 11 440733Speter 441733Speter /* 442733Speter * SEMANTIC DEFINITIONS 443733Speter */ 444733Speter 445733Speter /* 446733Speter * NOCON and SAWCON are flags in the tree telling whether 447733Speter * a constant set is part of an expression. 4483314Speter * these are no longer used, 4493314Speter * since we now do constant sets at compile time. 450733Speter */ 451733Speter #define NOCON 0 452733Speter #define SAWCON 1 453733Speter 454733Speter /* 455733Speter * The variable cbn gives the current block number, 456733Speter * the variable bn is set as a side effect of a call to 457733Speter * lookup, and is the block number of the variable which 458733Speter * was found. 459733Speter */ 460733Speter short bn, cbn; 461733Speter 462733Speter /* 463733Speter * The variable line is the current semantic 464733Speter * line and is set in stat.c from the numbers 465733Speter * embedded in statement type tree nodes. 466733Speter */ 467733Speter short line; 468733Speter 469733Speter /* 470733Speter * The size of the display 471733Speter * which defines the maximum nesting 472733Speter * of procedures and functions allowed. 473733Speter * Because of the flags in the current namelist 474733Speter * this must be no greater than 32. 475733Speter */ 476733Speter #define DSPLYSZ 20 477733Speter 478733Speter /* 479733Speter * the following structure records whether a level declares 480733Speter * any variables which are (or contain) files. 481733Speter * this so that the runtime routines for file cleanup can be invoked. 482733Speter */ 483733Speter bool dfiles[ DSPLYSZ ]; 484733Speter 485733Speter /* 486733Speter * Structure recording information about a constant 487733Speter * declaration. It is actually the return value from 488733Speter * the routine "gconst", but since C doesn't support 489733Speter * record valued functions, this is more convenient. 490733Speter */ 491733Speter struct { 492733Speter struct nl *ctype; 493733Speter short cival; 494733Speter double crval; 49514750Sthien char *cpval; /* note used to be int * */ 496733Speter } con; 497733Speter 498733Speter /* 499733Speter * The set structure records the lower bound 500733Speter * and upper bound with the lower bound normalized 501733Speter * to zero when working with a set. It is set by 502733Speter * the routine setran in var.c. 503733Speter */ 504733Speter struct { 505733Speter short lwrb, uprbp; 506733Speter } set; 507733Speter 508733Speter /* 509733Speter * structures of this kind are filled in by precset and used by postcset 510733Speter * to indicate things about constant sets. 511733Speter */ 512733Speter struct csetstr { 513733Speter struct nl *csettype; 514733Speter long paircnt; 515733Speter long singcnt; 516733Speter bool comptime; 517733Speter }; 518733Speter /* 519733Speter * The following flags are passed on calls to lvalue 520733Speter * to indicate how the reference is to affect the usage 521733Speter * information for the variable being referenced. 522733Speter * MOD is used to set the NMOD flag in the namelist 523733Speter * entry for the variable, ASGN permits diagnostics 524733Speter * to be formed when a for variable is assigned to in 525733Speter * the range of the loop. 526733Speter */ 527733Speter #define NOFLAGS 0 528733Speter #define MOD 01 529733Speter #define ASGN 02 530733Speter #define NOUSE 04 531733Speter 532733Speter /* 533733Speter * the following flags are passed to lvalue and rvalue 534733Speter * to tell them whether an lvalue or rvalue is required. 535733Speter * the semantics checking is done according to the function called, 536733Speter * but for pc, lvalue may put out an rvalue by indirecting afterwards, 537733Speter * and rvalue may stop short of putting out the indirection. 538733Speter */ 539733Speter #define LREQ 01 540733Speter #define RREQ 02 541733Speter 542733Speter double MAXINT; 543733Speter double MININT; 544733Speter 545733Speter /* 546733Speter * Variables for generation of profile information. 547733Speter * Monflg is set when we want to generate a profile. 548733Speter * Gocnt record the total number of goto's and 549733Speter * cnts records the current counter for generating 550733Speter * COUNT operators. 551733Speter */ 552733Speter short gocnt; 553733Speter short cnts; 554733Speter 555733Speter /* 556733Speter * Most routines call "incompat" rather than asking "!compat" 557733Speter * for historical reasons. 558733Speter */ 559733Speter #define incompat !compat 560733Speter 561733Speter /* 562733Speter * Parts records which declaration parts have been seen. 563833Speter * The grammar allows the "label" "const" "type" "var" and routine 564733Speter * parts to be repeated and to be in any order, so that 565733Speter * they can be detected semantically to give better 566733Speter * error diagnostics. 5679126Smckusick * 5689126Smckusick * The flag NONLOCALVAR indicates that a non-local var has actually 5699126Smckusick * been used hence the display must be saved; NONLOCALGOTO indicates 5709126Smckusick * that a non-local goto has been done hence that a setjmp must be done. 571733Speter */ 572833Speter int parts[ DSPLYSZ ]; 573733Speter 5749126Smckusick #define LPRT 0x0001 5759126Smckusick #define CPRT 0x0002 5769126Smckusick #define TPRT 0x0004 5779126Smckusick #define VPRT 0x0008 5789126Smckusick #define RPRT 0x0010 579733Speter 5809126Smckusick #define NONLOCALVAR 0x0020 5819126Smckusick #define NONLOCALGOTO 0x0040 5829126Smckusick 583733Speter /* 584733Speter * Flags for the "you used / instead of div" diagnostic 585733Speter */ 586733Speter bool divchk; 587733Speter bool divflg; 588733Speter 5893071Smckusic bool errcnt[DSPLYSZ]; 590733Speter 591733Speter /* 592733Speter * Forechain links those types which are 593733Speter * ^ sometype 594733Speter * so that they can be evaluated later, permitting 595733Speter * circular, recursive list structures to be defined. 596733Speter */ 597733Speter struct nl *forechain; 598733Speter 599733Speter /* 600733Speter * Withlist links all the records which are currently 601733Speter * opened scopes because of with statements. 602733Speter */ 603733Speter struct nl *withlist; 604733Speter 605733Speter struct nl *intset; 606733Speter struct nl *input, *output; 607733Speter struct nl *program; 608733Speter 609733Speter /* progseen flag used by PC to determine if 610733Speter * a routine segment is being compiled (and 611733Speter * therefore no program statement seen) 612733Speter */ 613733Speter bool progseen; 614733Speter 615733Speter 616733Speter /* 617733Speter * STRUCTURED STATEMENT GOTO CHECKING 618733Speter * 619733Speter * The variable level keeps track of the current 620733Speter * "structured statement level" when processing the statement 621733Speter * body of blocks. This is used in the detection of goto's into 622733Speter * structured statements in a block. 623733Speter * 624733Speter * Each label's namelist entry contains two pieces of information 625733Speter * related to this check. The first `NL_GOLEV' either contains 626733Speter * the level at which the label was declared, `NOTYET' if the label 627733Speter * has not yet been declared, or `DEAD' if the label is dead, i.e. 628733Speter * if we have exited the level in which the label was defined. 629733Speter * 630733Speter * When we discover a "goto" statement, if the label has not 631733Speter * been defined yet, then we record the current level and the current line 632733Speter * for a later error check. If the label has been already become "DEAD" 633733Speter * then a reference to it is an error. Now the compiler maintains, 634733Speter * for each block, a linked list of the labels headed by "gotos[bn]". 635733Speter * When we exit a structured level, we perform the routine 636733Speter * ungoto in stat.c. It notices labels whose definition levels have been 637733Speter * exited and makes them be dead. For labels which have not yet been 638733Speter * defined, ungoto will maintain NL_GOLEV as the minimum structured level 639733Speter * since the first usage of the label. It is not hard to see that the label 640733Speter * must eventually be declared at this level or an outer level to this 641733Speter * one or a goto into a structured statement will exist. 642733Speter */ 643733Speter short level; 644733Speter struct nl *gotos[DSPLYSZ]; 645733Speter 646733Speter #define NOTYET 10000 647733Speter #define DEAD 10000 648733Speter 649733Speter /* 650733Speter * Noreach is true when the next statement will 651733Speter * be unreachable unless something happens along 652733Speter * (like exiting a looping construct) to save 653733Speter * the day. 654733Speter */ 655733Speter bool noreach; 656733Speter 657733Speter /* 658733Speter * UNDEFINED VARIABLE REFERENCE STRUCTURES 659733Speter */ 660733Speter struct udinfo { 661733Speter int ud_line; 662733Speter struct udinfo *ud_next; 663733Speter char nullch; 664733Speter }; 665733Speter 666733Speter /* 667733Speter * CODE GENERATION DEFINITIONS 668733Speter */ 669733Speter 670733Speter /* 671733Speter * NSTAND is or'ed onto the abstract machine opcode 672733Speter * for non-standard built-in procedures and functions. 673733Speter */ 674733Speter #define NSTAND 0400 675733Speter 676733Speter #define codeon() cgenflg++ 677733Speter #define codeoff() --cgenflg 6783314Speter #define CGENNING ( cgenflg >= 0 ) 679733Speter 680733Speter /* 681733Speter * Codeline is the last lino output in the code generator. 682733Speter * It used to be used to suppress LINO operators but no 683733Speter * more since we now count statements. 684733Speter * Lc is the intepreter code location counter. 685733Speter * 686733Speter short codeline; 687733Speter */ 68814750Sthien #ifdef OBJ 689733Speter char *lc; 69014750Sthien #endif 691733Speter 692733Speter 693733Speter /* 694733Speter * Routines which need types 695733Speter * other than "integer" to be 696733Speter * assumed by the compiler. 697733Speter */ 698733Speter double atof(); 699733Speter long lwidth(); 7003071Smckusic long leven(); 701733Speter long aryconst(); 702733Speter long a8tol(); 7033071Smckusic long roundup(); 7043823Speter struct nl *tmpalloc(); 705733Speter struct nl *lookup(); 706733Speter double atof(); 707733Speter int *hash(); 708733Speter char *alloc(); 70914750Sthien int *pcalloc(); 710733Speter char *savestr(); 71114750Sthien char *esavestr(); 7123283Smckusic char *parnam(); 71314750Sthien char *malloc(); 71414750Sthien char *getlab(); 71514750Sthien char *getnext(); 71614750Sthien char *skipbl(); 71714750Sthien char *nameof(); 71814750Sthien char *pstrcpy(); 71914750Sthien char *myctime(); 72014750Sthien char *putlab(); 7213283Smckusic bool fcompat(); 72214750Sthien bool constval(); 72314750Sthien bool precset(); 72414750Sthien bool nilfnil(); 72514750Sthien struct nl *funccod(); 72614750Sthien struct nl *pcfunccod(); 727733Speter struct nl *lookup1(); 728733Speter struct nl *hdefnl(); 729733Speter struct nl *defnl(); 73014750Sthien struct nl *flvalue(); 73114750Sthien struct nl *plist(); 732733Speter struct nl *enter(); 733733Speter struct nl *nlcopy(); 7348680Speter struct nl *tyrec(); 735733Speter struct nl *tyary(); 73614750Sthien struct nl *tyrang(); 73714750Sthien struct nl *tyscal(); 738733Speter struct nl *deffld(); 73914750Sthien struct nl *stklval(); 74014750Sthien struct nl *scalar(); 74114750Sthien struct nl *gen(); 74214750Sthien struct nl *stkrval(); 74314750Sthien struct nl *funcext(); 74414750Sthien struct nl *funchdr(); 74514750Sthien struct nl *funcbody(); 74614750Sthien struct nl *yybaduse(); 74714750Sthien struct nl *stackRV(); 748733Speter struct nl *defvnt(); 749733Speter struct nl *tyrec1(); 750733Speter struct nl *reclook(); 751733Speter struct nl *asgnop1(); 75215983Saoki struct nl *pcasgconf(); 753733Speter struct nl *gtype(); 754733Speter struct nl *call(); 755733Speter struct nl *lvalue(); 75614750Sthien struct nl *pclvalue(); 757733Speter struct nl *rvalue(); 758733Speter struct nl *cset(); 75915983Saoki struct nl *tycrang(); 76014750Sthien struct tnode *newlist(); 76114750Sthien struct tnode *addlist(); 76214750Sthien struct tnode *fixlist(); 76314750Sthien struct tnode *setupvar(); 76414750Sthien struct tnode *setuptyrec(); 76514750Sthien struct tnode *setupfield(); 76614750Sthien struct tnode *tree(); 76714750Sthien struct tnode *tree1(); 76814750Sthien struct tnode *tree2(); 76914750Sthien struct tnode *tree3(); 77014750Sthien struct tnode *tree4(); 77114750Sthien struct tnode *tree5(); 772733Speter 773733Speter /* 774733Speter * type cast NIL to keep lint happy (which is not so bad) 775733Speter */ 776733Speter #define NLNIL ( (struct nl *) NIL ) 77714750Sthien #define TR_NIL ( (struct tnode *) NIL) 778733Speter 779733Speter /* 780733Speter * Funny structures to use 781733Speter * pointers in wild and wooly ways 782733Speter */ 78314750Sthien struct cstruct{ 784733Speter char pchar; 785733Speter }; 786733Speter struct { 787733Speter short pint; 788733Speter short pint2; 789733Speter }; 79014750Sthien struct lstruct { 791733Speter long plong; 792733Speter }; 793733Speter struct { 794733Speter double pdouble; 795733Speter }; 796733Speter 797733Speter #define OCT 1 798733Speter #define HEX 2 799733Speter 800733Speter /* 801733Speter * MAIN PROGRAM VARIABLES, MISCELLANY 802733Speter */ 803733Speter 804733Speter /* 805733Speter * Variables forming a data base referencing 806733Speter * the command line arguments with the "i" option, e.g. 807733Speter * in "pi -i scanner.i compiler.p". 808733Speter */ 809733Speter char **pflist; 810733Speter short pflstc; 811733Speter short pfcnt; 812733Speter 813733Speter char *filename; /* current source file name */ 814733Speter long tvec; 815733Speter extern char *snark; /* SNARK */ 816733Speter extern char *classes[ ]; /* maps namelist classes to string names */ 817733Speter 818733Speter #define derror error 819733Speter 820733Speter #ifdef PC 821733Speter 822733Speter /* 823733Speter * the current function number, for [ lines 824733Speter */ 825733Speter int ftnno; 826733Speter 827733Speter /* 828733Speter * the pc output stream 829733Speter */ 830733Speter FILE *pcstream; 831733Speter 832733Speter #endif PC 833