#define PDP11 4 #define BIGGEST_SHORT 0x7fff /* Assumes 32-bit arithmetic */ #define BIGGEST_LONG 0x7fffffff /* Assumes 32-bit arithmetic */ #define M(x) (1<<x) /* Mask (x) returns 2^x */ #define ALLOC(x) (struct x *) ckalloc(sizeof(struct x)) #define ALLEXPR (expptr) ckalloc( sizeof(union Expression) ) typedef int *ptr; typedef char *charptr; typedef FILE *FILEP; typedef int flag; typedef char field; /* actually need only 4 bits */ typedef long int ftnint; #define LOCAL static #define NO 0 #define YES 1 #define CNULL (char *) 0 /* Character string null */ #define PNULL (ptr) 0 #define CHNULL (chainp) 0 /* Chain null */ #define ENULL (expptr) 0 /* BAD_MEMNO - used to distinguish between long string constants and other constants in the table */ #define BAD_MEMNO -32768 /* block tag values -- syntactic stuff */ #define TNAME 1 #define TCONST 2 #define TEXPR 3 #define TADDR 4 #define TPRIM 5 /* Primitive datum - should not appear in an expptr variable, it should have already been identified */ #define TLIST 6 #define TIMPLDO 7 #define TERROR 8 /* parser states - order is important, since there are several tests for state < INDATA */ #define OUTSIDE 0 #define INSIDE 1 #define INDCL 2 #define INDATA 3 #define INEXEC 4 /* procedure classes */ #define PROCMAIN 1 #define PROCBLOCK 2 #define PROCSUBR 3 #define PROCFUNCT 4 /* storage classes -- vstg values. BSS and INIT are used in the later merge pass over identifiers; and they are entered differently into the symbol table */ #define STGUNKNOWN 0 #define STGARG 1 /* adjustable dimensions */ #define STGAUTO 2 /* for stack references */ #define STGBSS 3 /* uninitialized storage (normal variables) */ #define STGINIT 4 /* initialized storage */ #define STGCONST 5 #define STGEXT 6 /* external storage */ #define STGINTR 7 /* intrinsic (late decision) reference. See chapter 5 of the Fortran 77 standard */ #define STGSTFUNCT 8 #define STGCOMMON 9 #define STGEQUIV 10 #define STGREG 11 /* register - the outermost DO loop index will be in a register (because the compiler is one pass, it can't know where the innermost loop is */ #define STGLENG 12 #define STGNULL 13 #define STGMEMNO 14 /* interemediate-file pointer to constant table */ /* name classes -- vclass values, also procclass values */ #define CLUNKNOWN 0 #define CLPARAM 1 /* Parameter - macro definition */ #define CLVAR 2 /* variable */ #define CLENTRY 3 #define CLMAIN 4 #define CLBLOCK 5 #define CLPROC 6 #define CLNAMELIST 7 /* in data with this tag, the vdcldone flag should be ignored (according to vardcl()) */ /* vprocclass values -- there is some overlap with the vclass values given above */ #define PUNKNOWN 0 #define PEXTERNAL 1 #define PINTRINSIC 2 #define PSTFUNCT 3 #define PTHISPROC 4 /* here to allow recursion - further distinction is given in the CL tag (those just above). This applies to the presence of the name of a function used within itself. The function name means either call the function again, or assign some value to the storage allocated to the function's return value. */ /* control stack codes - these are part of a state machine which handles the nesting of blocks (i.e. what to do about the ELSE statement) */ #define CTLDO 1 #define CTLIF 2 #define CTLELSE 3 #define CTLIFX 4 /* operators for both Fortran input and C output. They are common because so many are shared between the trees */ #define OPPLUS 1 #define OPMINUS 2 #define OPSTAR 3 #define OPSLASH 4 #define OPPOWER 5 #define OPNEG 6 #define OPOR 7 #define OPAND 8 #define OPEQV 9 #define OPNEQV 10 #define OPNOT 11 #define OPCONCAT 12 #define OPLT 13 #define OPEQ 14 #define OPGT 15 #define OPLE 16 #define OPNE 17 #define OPGE 18 #define OPCALL 19 #define OPCCALL 20 #define OPASSIGN 21 #define OPPLUSEQ 22 #define OPSTAREQ 23 #define OPCONV 24 #define OPLSHIFT 25 #define OPMOD 26 #define OPCOMMA 27 #define OPQUEST 28 #define OPCOLON 29 #define OPABS 30 #define OPMIN 31 #define OPMAX 32 #define OPADDR 33 #define OPCOMMA_ARG 34 #define OPBITOR 35 #define OPBITAND 36 #define OPBITXOR 37 #define OPBITNOT 38 #define OPRSHIFT 39 #define OPWHATSIN 40 /* dereferencing operator */ #define OPMINUSEQ 41 /* assignment operators */ #define OPSLASHEQ 42 #define OPMODEQ 43 #define OPLSHIFTEQ 44 #define OPRSHIFTEQ 45 #define OPBITANDEQ 46 #define OPBITXOREQ 47 #define OPBITOREQ 48 #define OPPREINC 49 /* Preincrement (++x) operator */ #define OPPREDEC 50 /* Predecrement (--x) operator */ #define OPDOT 51 /* structure field reference */ #define OPARROW 52 /* structure pointer field reference */ #define OPNEG1 53 /* simple negation under forcedouble */ #define OPDMIN 54 /* min(a,b) macro under forcedouble */ #define OPDMAX 55 /* max(a,b) macro under forcedouble */ #define OPASSIGNI 56 /* assignment for inquire stmt */ #define OPIDENTITY 57 /* for turning TADDR into TEXPR */ #define OPCHARCAST 58 /* for casting to char * (in I/O stmts) */ #define OPDABS 59 /* abs macro under forcedouble */ #define OPMIN2 60 /* min(a,b) macro */ #define OPMAX2 61 /* max(a,b) macro */ /* label type codes -- used with the ASSIGN statement */ #define LABUNKNOWN 0 #define LABEXEC 1 #define LABFORMAT 2 #define LABOTHER 3 /* INTRINSIC function codes*/ #define INTREND 0 #define INTRCONV 1 #define INTRMIN 2 #define INTRMAX 3 #define INTRGEN 4 /* General intrinsic, e.g. cos v. dcos, zcos, ccos */ #define INTRSPEC 5 #define INTRBOOL 6 #define INTRCNST 7 /* constants, e.g. bigint(1.0) v. bigint (1d0) */ /* I/O statement codes - these all form Integer Constants, and are always reevaluated */ #define IOSTDIN ICON(5) #define IOSTDOUT ICON(6) #define IOSTDERR ICON(0) #define IOSBAD (-1) #define IOSPOSITIONAL 0 #define IOSUNIT 1 #define IOSFMT 2 #define IOINQUIRE 1 #define IOOPEN 2 #define IOCLOSE 3 #define IOREWIND 4 #define IOBACKSPACE 5 #define IOENDFILE 6 #define IOREAD 7 #define IOWRITE 8 /* User name tags -- these identify the form of the original identifier stored in a struct Addrblock structure (in the user field). */ #define UNAM_UNKNOWN 0 /* Not specified */ #define UNAM_NAME 1 /* Local symbol, store in the hash table */ #define UNAM_IDENT 2 /* Character string not stored elsewhere */ #define UNAM_EXTERN 3 /* External reference; check symbol table using memno as index */ #define UNAM_CONST 4 /* Constant value */ #define UNAM_CHARP 5 /* pointer to string */ #define IDENT_LEN 31 /* Maximum length user.ident */ /* type masks - TYLOGICAL defined in ftypes */ #define MSKLOGICAL M(TYLOGICAL) #define MSKADDR M(TYADDR) #define MSKCHAR M(TYCHAR) #define MSKINT M(TYSHORT)|M(TYLONG) #define MSKREAL M(TYREAL)|M(TYDREAL) /* DREAL means Double Real */ #define MSKCOMPLEX M(TYCOMPLEX)|M(TYDCOMPLEX) #define MSKSTATIC (M(STGINIT)|M(STGBSS)|M(STGCOMMON)|M(STGEQUIV)|M(STGCONST)) /* miscellaneous macros */ /* ONEOF (x, y) -- x is the number of one of the OR'ed masks in y (i.e., x is the log of one of the OR'ed masks in y) */ #define ONEOF(x,y) (M(x) & (y)) #define ISCOMPLEX(z) ONEOF(z, MSKCOMPLEX) #define ISREAL(z) ONEOF(z, MSKREAL) #define ISNUMERIC(z) ONEOF(z, MSKINT|MSKREAL|MSKCOMPLEX) #define ISICON(z) (z->tag==TCONST && ISINT(z->constblock.vtype)) /* ISCHAR assumes that z has some kind of structure, i.e. is not null */ #define ISCHAR(z) (z->headblock.vtype==TYCHAR) #define ISINT(z) ONEOF(z, MSKINT) /* z is a tag, i.e. a mask number */ #define ISCONST(z) (z->tag==TCONST) #define ISERROR(z) (z->tag==TERROR) #define ISPLUSOP(z) (z->tag==TEXPR && z->exprblock.opcode==OPPLUS) #define ISSTAROP(z) (z->tag==TEXPR && z->exprblock.opcode==OPSTAR) #define ISONE(z) (ISICON(z) && z->constblock.Const.ci==1) #define INT(z) ONEOF(z, MSKINT|MSKCHAR) /* has INT storage in real life */ #define ICON(z) mkintcon( (ftnint)(z) ) /* NO66 -- F77 feature is being used NOEXT -- F77 extension is being used */ #define NO66(s) if(no66flag) err66(s) #define NOEXT(s) if(noextflag) errext(s) /* round a up to the nearest multiple of b: a = b * floor ( (a + (b - 1)) / b )*/ #define roundup(a,b) ( b * ( (a+b-1)/b) )