|
|
1.1 ! root 1: #define PDP11 4 ! 2: ! 3: #define BIGGEST_CHAR 0x7f /* Assumes 32-bit arithmetic */ ! 4: #define BIGGEST_SHORT 0x7fff /* Assumes 32-bit arithmetic */ ! 5: #define BIGGEST_LONG 0x7fffffff /* Assumes 32-bit arithmetic */ ! 6: ! 7: #define M(x) (1<<x) /* Mask (x) returns 2^x */ ! 8: ! 9: #define ALLOC(x) (struct x *) ckalloc((int)sizeof(struct x)) ! 10: #define ALLEXPR (expptr) ckalloc((int)sizeof(union Expression) ) ! 11: typedef int *ptr; ! 12: typedef char *charptr; ! 13: typedef FILE *FILEP; ! 14: typedef int flag; ! 15: typedef char field; /* actually need only 4 bits */ ! 16: typedef long int ftnint; ! 17: #define LOCAL static ! 18: ! 19: #define NO 0 ! 20: #define YES 1 ! 21: ! 22: #define CNULL (char *) 0 /* Character string null */ ! 23: #define PNULL (ptr) 0 ! 24: #define CHNULL (chainp) 0 /* Chain null */ ! 25: #define ENULL (expptr) 0 ! 26: ! 27: ! 28: /* BAD_MEMNO - used to distinguish between long string constants and other ! 29: constants in the table */ ! 30: ! 31: #define BAD_MEMNO -32768 ! 32: ! 33: ! 34: /* block tag values -- syntactic stuff */ ! 35: ! 36: #define TNAME 1 ! 37: #define TCONST 2 ! 38: #define TEXPR 3 ! 39: #define TADDR 4 ! 40: #define TPRIM 5 /* Primitive datum - should not appear in an ! 41: expptr variable, it should have already been ! 42: identified */ ! 43: #define TLIST 6 ! 44: #define TIMPLDO 7 ! 45: #define TERROR 8 ! 46: ! 47: ! 48: /* parser states - order is important, since there are several tests for ! 49: state < INDATA */ ! 50: ! 51: #define OUTSIDE 0 ! 52: #define INSIDE 1 ! 53: #define INDCL 2 ! 54: #define INDATA 3 ! 55: #define INEXEC 4 ! 56: ! 57: /* procedure classes */ ! 58: ! 59: #define PROCMAIN 1 ! 60: #define PROCBLOCK 2 ! 61: #define PROCSUBR 3 ! 62: #define PROCFUNCT 4 ! 63: ! 64: ! 65: /* storage classes -- vstg values. BSS and INIT are used in the later ! 66: merge pass over identifiers; and they are entered differently into the ! 67: symbol table */ ! 68: ! 69: #define STGUNKNOWN 0 ! 70: #define STGARG 1 /* adjustable dimensions */ ! 71: #define STGAUTO 2 /* for stack references */ ! 72: #define STGBSS 3 /* uninitialized storage (normal variables) */ ! 73: #define STGINIT 4 /* initialized storage */ ! 74: #define STGCONST 5 ! 75: #define STGEXT 6 /* external storage */ ! 76: #define STGINTR 7 /* intrinsic (late decision) reference. See ! 77: chapter 5 of the Fortran 77 standard */ ! 78: #define STGSTFUNCT 8 ! 79: #define STGCOMMON 9 ! 80: #define STGEQUIV 10 ! 81: #define STGREG 11 /* register - the outermost DO loop index will be ! 82: in a register (because the compiler is one ! 83: pass, it can't know where the innermost loop is ! 84: */ ! 85: #define STGLENG 12 ! 86: #define STGNULL 13 ! 87: #define STGMEMNO 14 /* interemediate-file pointer to constant table */ ! 88: ! 89: /* name classes -- vclass values, also procclass values */ ! 90: ! 91: #define CLUNKNOWN 0 ! 92: #define CLPARAM 1 /* Parameter - macro definition */ ! 93: #define CLVAR 2 /* variable */ ! 94: #define CLENTRY 3 ! 95: #define CLMAIN 4 ! 96: #define CLBLOCK 5 ! 97: #define CLPROC 6 ! 98: #define CLNAMELIST 7 /* in data with this tag, the vdcldone flag should ! 99: be ignored (according to vardcl()) */ ! 100: ! 101: ! 102: /* vprocclass values -- there is some overlap with the vclass values given ! 103: above */ ! 104: ! 105: #define PUNKNOWN 0 ! 106: #define PEXTERNAL 1 ! 107: #define PINTRINSIC 2 ! 108: #define PSTFUNCT 3 ! 109: #define PTHISPROC 4 /* here to allow recursion - further distinction ! 110: is given in the CL tag (those just above). ! 111: This applies to the presence of the name of a ! 112: function used within itself. The function name ! 113: means either call the function again, or assign ! 114: some value to the storage allocated to the ! 115: function's return value. */ ! 116: ! 117: /* control stack codes - these are part of a state machine which handles ! 118: the nesting of blocks (i.e. what to do about the ELSE statement) */ ! 119: ! 120: #define CTLDO 1 ! 121: #define CTLIF 2 ! 122: #define CTLELSE 3 ! 123: #define CTLIFX 4 ! 124: ! 125: ! 126: /* operators for both Fortran input and C output. They are common because ! 127: so many are shared between the trees */ ! 128: ! 129: #define OPPLUS 1 ! 130: #define OPMINUS 2 ! 131: #define OPSTAR 3 ! 132: #define OPSLASH 4 ! 133: #define OPPOWER 5 ! 134: #define OPNEG 6 ! 135: #define OPOR 7 ! 136: #define OPAND 8 ! 137: #define OPEQV 9 ! 138: #define OPNEQV 10 ! 139: #define OPNOT 11 ! 140: #define OPCONCAT 12 ! 141: #define OPLT 13 ! 142: #define OPEQ 14 ! 143: #define OPGT 15 ! 144: #define OPLE 16 ! 145: #define OPNE 17 ! 146: #define OPGE 18 ! 147: #define OPCALL 19 ! 148: #define OPCCALL 20 ! 149: #define OPASSIGN 21 ! 150: #define OPPLUSEQ 22 ! 151: #define OPSTAREQ 23 ! 152: #define OPCONV 24 ! 153: #define OPLSHIFT 25 ! 154: #define OPMOD 26 ! 155: #define OPCOMMA 27 ! 156: #define OPQUEST 28 ! 157: #define OPCOLON 29 ! 158: #define OPABS 30 ! 159: #define OPMIN 31 ! 160: #define OPMAX 32 ! 161: #define OPADDR 33 ! 162: #define OPCOMMA_ARG 34 ! 163: #define OPBITOR 35 ! 164: #define OPBITAND 36 ! 165: #define OPBITXOR 37 ! 166: #define OPBITNOT 38 ! 167: #define OPRSHIFT 39 ! 168: #define OPWHATSIN 40 /* dereferencing operator */ ! 169: #define OPMINUSEQ 41 /* assignment operators */ ! 170: #define OPSLASHEQ 42 ! 171: #define OPMODEQ 43 ! 172: #define OPLSHIFTEQ 44 ! 173: #define OPRSHIFTEQ 45 ! 174: #define OPBITANDEQ 46 ! 175: #define OPBITXOREQ 47 ! 176: #define OPBITOREQ 48 ! 177: #define OPPREINC 49 /* Preincrement (++x) operator */ ! 178: #define OPPREDEC 50 /* Predecrement (--x) operator */ ! 179: #define OPDOT 51 /* structure field reference */ ! 180: #define OPARROW 52 /* structure pointer field reference */ ! 181: #define OPNEG1 53 /* simple negation under forcedouble */ ! 182: #define OPDMIN 54 /* min(a,b) macro under forcedouble */ ! 183: #define OPDMAX 55 /* max(a,b) macro under forcedouble */ ! 184: #define OPASSIGNI 56 /* assignment for inquire stmt */ ! 185: #define OPIDENTITY 57 /* for turning TADDR into TEXPR */ ! 186: #define OPCHARCAST 58 /* for casting to char * (in I/O stmts) */ ! 187: #define OPDABS 59 /* abs macro under forcedouble */ ! 188: #define OPMIN2 60 /* min(a,b) macro */ ! 189: #define OPMAX2 61 /* max(a,b) macro */ ! 190: ! 191: /* label type codes -- used with the ASSIGN statement */ ! 192: ! 193: #define LABUNKNOWN 0 ! 194: #define LABEXEC 1 ! 195: #define LABFORMAT 2 ! 196: #define LABOTHER 3 ! 197: ! 198: ! 199: /* INTRINSIC function codes*/ ! 200: ! 201: #define INTREND 0 ! 202: #define INTRCONV 1 ! 203: #define INTRMIN 2 ! 204: #define INTRMAX 3 ! 205: #define INTRGEN 4 /* General intrinsic, e.g. cos v. dcos, zcos, ccos */ ! 206: #define INTRSPEC 5 ! 207: #define INTRBOOL 6 ! 208: #define INTRCNST 7 /* constants, e.g. bigint(1.0) v. bigint (1d0) */ ! 209: ! 210: ! 211: /* I/O statement codes - these all form Integer Constants, and are always ! 212: reevaluated */ ! 213: ! 214: #define IOSTDIN ICON(5) ! 215: #define IOSTDOUT ICON(6) ! 216: #define IOSTDERR ICON(0) ! 217: ! 218: #define IOSBAD (-1) ! 219: #define IOSPOSITIONAL 0 ! 220: #define IOSUNIT 1 ! 221: #define IOSFMT 2 ! 222: ! 223: #define IOINQUIRE 1 ! 224: #define IOOPEN 2 ! 225: #define IOCLOSE 3 ! 226: #define IOREWIND 4 ! 227: #define IOBACKSPACE 5 ! 228: #define IOENDFILE 6 ! 229: #define IOREAD 7 ! 230: #define IOWRITE 8 ! 231: ! 232: ! 233: /* User name tags -- these identify the form of the original identifier ! 234: stored in a struct Addrblock structure (in the user field). */ ! 235: ! 236: #define UNAM_UNKNOWN 0 /* Not specified */ ! 237: #define UNAM_NAME 1 /* Local symbol, store in the hash table */ ! 238: #define UNAM_IDENT 2 /* Character string not stored elsewhere */ ! 239: #define UNAM_EXTERN 3 /* External reference; check symbol table ! 240: using memno as index */ ! 241: #define UNAM_CONST 4 /* Constant value */ ! 242: #define UNAM_CHARP 5 /* pointer to string */ ! 243: #define UNAM_REF 6 /* subscript reference with -s */ ! 244: ! 245: ! 246: #define IDENT_LEN 31 /* Maximum length user.ident */ ! 247: ! 248: /* type masks - TYLOGICAL defined in ftypes */ ! 249: ! 250: #define MSKLOGICAL M(TYLOGICAL)|M(TYLOGICAL1)|M(TYLOGICAL2) ! 251: #define MSKADDR M(TYADDR) ! 252: #define MSKCHAR M(TYCHAR) ! 253: #ifdef TYQUAD ! 254: #define MSKINT M(TYINT1)|M(TYSHORT)|M(TYLONG)|M(TYQUAD) ! 255: #else ! 256: #define MSKINT M(TYINT1)|M(TYSHORT)|M(TYLONG) ! 257: #endif ! 258: #define MSKREAL M(TYREAL)|M(TYDREAL) /* DREAL means Double Real */ ! 259: #define MSKCOMPLEX M(TYCOMPLEX)|M(TYDCOMPLEX) ! 260: #define MSKSTATIC (M(STGINIT)|M(STGBSS)|M(STGCOMMON)|M(STGEQUIV)|M(STGCONST)) ! 261: ! 262: /* miscellaneous macros */ ! 263: ! 264: /* ONEOF (x, y) -- x is the number of one of the OR'ed masks in y (i.e., x is ! 265: the log of one of the OR'ed masks in y) */ ! 266: ! 267: #define ONEOF(x,y) (M(x) & (y)) ! 268: #define ISCOMPLEX(z) ONEOF(z, MSKCOMPLEX) ! 269: #define ISREAL(z) ONEOF(z, MSKREAL) ! 270: #define ISNUMERIC(z) ONEOF(z, MSKINT|MSKREAL|MSKCOMPLEX) ! 271: #define ISICON(z) (z->tag==TCONST && ISINT(z->constblock.vtype)) ! 272: #define ISLOGICAL(z) ONEOF(z, MSKLOGICAL) ! 273: ! 274: /* ISCHAR assumes that z has some kind of structure, i.e. is not null */ ! 275: ! 276: #define ISCHAR(z) (z->headblock.vtype==TYCHAR) ! 277: #define ISINT(z) ONEOF(z, MSKINT) /* z is a tag, i.e. a mask number */ ! 278: #define ISCONST(z) (z->tag==TCONST) ! 279: #define ISERROR(z) (z->tag==TERROR) ! 280: #define ISPLUSOP(z) (z->tag==TEXPR && z->exprblock.opcode==OPPLUS) ! 281: #define ISSTAROP(z) (z->tag==TEXPR && z->exprblock.opcode==OPSTAR) ! 282: #define ISONE(z) (ISICON(z) && z->constblock.Const.ci==1) ! 283: #define INT(z) ONEOF(z, MSKINT|MSKCHAR) /* has INT storage in real life */ ! 284: #define ICON(z) mkintcon( (ftnint)(z) ) ! 285: ! 286: /* NO66 -- F77 feature is being used ! 287: NOEXT -- F77 extension is being used */ ! 288: ! 289: #define NO66(s) if(no66flag) err66(s) ! 290: #define NOEXT(s) if(noextflag) errext(s) ! 291: ! 292: /* round a up to the nearest multiple of b: ! 293: ! 294: a = b * floor ( (a + (b - 1)) / b )*/ ! 295: ! 296: #define roundup(a,b) ( b * ( (a+b-1)/b) )
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.