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