289 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			289 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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) )
 |