|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.