
/*
 *	I n t e r n a l   D e f i n i t i o n s    f o r   C P P
 *
 * In general, definitions in this file should not be changed.
 */

#ifndef toupper
#define toupper(c) ((c) + ('A' - 'a'))
#endif /* no toupper */
#ifndef tolower
#define tolower(c) ((c) + ('a' - 'A'))
#endif /* no tolower */

#ifndef TRUE
#define TRUE		1
#define FALSE		0
#endif
#ifndef EOS
/*
 * This is predefined in Decus C
 */
#define EOS		'\0'            /* End of string                */
#endif
#define EOF_CHAR	0		/* Returned by get() on eof     */
#define NULLST		((char *) NULL) /* Pointer to nowhere (linted)  */
#define DEF_NOARGS	(-1)            /* #define foo vs #define foo() */

/*
 * The following may need to change if the host system doesn't use ASCII.
 */
#define QUOTE_PARM	0x1C		/* Magic quoting operator	*/
#define DEF_MAGIC	0x1D		/* Magic for #defines		*/
#define TOK_SEP 	0x1E		/* Token concatenation delim.	*/
#define COM_SEP 	0x1F		/* Magic comment separator	*/

/*
 * Note -- in Ascii, the following will map macro formals onto DEL + the
 * C1 control character region (decimal 128 .. (128 + PAR_MAC)) which will
 * be ok as long as PAR_MAC is less than 33).  Note that the last PAR_MAC
 * value is reserved for string substitution.
 */

#define MAC_PARM	0x7F		/* Macro formals start here	*/
#if PAR_MAC >= 33
	assertion fails -- PAR_MAC isn't less than 33
#endif
#define LASTPARM	(PAR_MAC - 1)

/*
 * Character type codes.
 */

#define INV		0		/* Invalid, must be zero	*/
#define OP_EOE		INV		/* End of expression		*/
#define DIG		1		/* Digit			*/
#define LET		2		/* Identifier start		*/
#define FIRST_BINOP	OP_ADD
#define OP_ADD		3
#define OP_SUB		4
#define OP_MUL		5
#define OP_DIV		6
#define OP_MOD		7
#define OP_ASL		8
#define OP_ASR		9
#define OP_AND		10		/* &, not &&			*/
#define OP_OR		11		/* |, not ||			*/
#define OP_XOR		12
#define OP_EQ		13
#define OP_NE		14
#define OP_LT		15
#define OP_LE		16
#define OP_GE		17
#define OP_GT		18
#define OP_ANA		19		/* &&				*/
#define OP_ORO		20		/* ||				*/
#define OP_QUE		21		/* ?				*/
#define OP_COL		22		/* :				*/
#define OP_CMA		23		/* , (relevant?)                */
#define LAST_BINOP	OP_CMA		/* Last binary operand		*/
/*
 * The following are unary.
 */
#define FIRST_UNOP	OP_PLU		/* First Unary operand		*/
#define OP_PLU		24		/* + (draft ANSI standard)      */
#define OP_NEG		25		/* -				*/
#define OP_COM		26		/* ~				*/
#define OP_NOT		27		/* !				*/
#define LAST_UNOP	OP_NOT
#define OP_LPA		28		/* (                            */
#define OP_RPA		29		/* )				*/
#define OP_END		30		/* End of expression marker	*/
#define OP_MAX		(OP_END + 1)    /* Number of operators          */
#define OP_FAIL 	(OP_END + 1)    /* For error returns            */

/*
 * The following are for lexical scanning only.
 */

#define QUO		65		/* Both flavors of quotation	*/
#define DOT		66		/* . might start a number	*/
#define SPA		67		/* Space and tab		*/
#define BSH		68		/* Just a backslash		*/
#define END		69		/* EOF				*/

/*
 * These bits are set in ifstack[]
 */
#define WAS_COMPILING	1		/* TRUE if compile set at entry */
#define ELSE_SEEN	2		/* TRUE when #else processed	*/
#define TRUE_SEEN	4		/* TRUE when #if TRUE processed */

/*
 * Define bits for the basic types and their adjectives
 */

#define T_CHAR		  1
#define T_INT		  2
#define T_FLOAT 	  4
#define T_DOUBLE	  8
#define T_SHORT 	 16
#define T_LONG		 32
#define T_SIGNED	 64
#define T_UNSIGNED	128
#define T_PTR		256		/* Pointer			*/
#define T_FPTR		512		/* Pointer to functions 	*/

/*
 * The DEFBUF structure stores information about #defined
 * macros.  Note that the defbuf->repl information is always
 * in malloc storage.
 */

typedef struct defbuf {
	struct defbuf	*link;		/* Next define in chain */
	char		*repl;		/* -> replacement	*/
	int		hash;		/* Symbol table hash	*/
	int		nargs;		/* For define(args)     */
	char		name[1];	/* #define name 	*/
} DEFBUF;

/*
 * The FILEINFO structure stores information about open files
 * and macros being expanded.
 */

typedef struct fileinfo {
	char		*bptr;		/* Buffer pointer	*/
	int		line;		/* for include or macro */
	FILE		*fp;		/* File if non-null	*/
	struct fileinfo *parent;	/* Link to includer	*/
	char		*filename;	/* File/macro name	*/
	char		*progname;	/* From #line statement */
	unsigned int	unrecur;	/* For macro recursion	*/
	char		buffer[1];	/* current input line	*/
} FILEINFO;

/*
 * The SIZES structure is used to store the values for #if sizeof
 */

typedef struct sizes {
    short	bits;			/* If this bit is set,		*/
    short	size;			/* this is the datum size value */
    short	psize;			/* this is the pointer size	*/
} SIZES;
/*
 * nomacarg is a built-in #define on Decus C.
 */

#ifdef	nomacarg
#define cput		output		/* cput concatenates tokens	*/
#else
#if COMMENT_INVISIBLE
#define cput(c)         { if (c != TOK_SEP && c != COM_SEP) putchar(c); }
#else
#define cput(c)         { if (c != TOK_SEP) putchar(c); }
#endif
#endif

#ifndef nomacarg
#define streq(s1, s2)   (strcmp(s1, s2) == 0)
#endif

/*
 * Error codes.  VMS uses system definitions.
 * Decus C codes are defined in stdio.h.
 * Others are cooked to order.
 */

#if HOST == SYS_VMS
#include		<ssdef.h>
#include		<stsdef.h>
#define IO_NORMAL	(SS$_NORMAL | STS$M_INHIB_MSG)
#define IO_ERROR	SS$_ABORT
#endif
/*
 * Note: IO_NORMAL and IO_ERROR are defined in the Decus C stdio.h file
 */
#ifndef IO_NORMAL
#define IO_NORMAL	0
#endif
#ifndef IO_ERROR
#define IO_ERROR	1
#endif

/*
 * Externs
 */

extern int	line;			/* Current line number		*/
extern int	wrongline;		/* Force #line to cc pass 1	*/
extern char	type[]; 		/* Character classifier 	*/
extern char	*tokenbuf;		/* Current input token		*/
extern int	tokenbsize;		/* Current size allocated in tokenbuf
					   (not counting 1 byte for zero) */
extern int	instring;		/* TRUE if scanning string	*/
extern int	inmacro;		/* TRUE if scanning #define	*/
extern int	errors; 		/* Error counter		*/
extern int	recursion;		/* Macro depth counter		*/
extern char	ifstack[BLK_NEST];	/* #if information		*/
#define compiling ifstack[0]
extern char	*ifptr; 		/* -> current ifstack item	*/
extern char	*incdir[NINCLUDE];	/* -i directories		*/
extern char	**incend;		/* -> active end of incdir	*/
extern int	cflag;			/* -C option (keep comments)    */
extern int	eflag;			/* -E option (ignore errors)    */
extern int	nflag;			/* -N option (no pre-defines)   */
extern int	wflag;			/* -W write #defines at end	*/
extern int	rec_recover;		/* unwind recursive macros	*/
extern char	*preset[];		/* Standard predefined symbols	*/
extern char	*magic[];		/* Magic predefined symbols	*/
extern FILEINFO *infile;		/* Current input file		*/
extern char	work[NWORK + 1];	/* #define scratch		*/
extern char	*workp; 		/* Free space in work		*/
#if	DEBUG
extern int	debug;			/* Debug level			*/
#endif
extern int	keepcomments;		/* Don't remove comments if set */
extern SIZES	size_table[];		/* For #if sizeof sizes 	*/
extern char	*getmem();              /* Get memory or die.           */

#ifndef amiga				/* Should track usage in cpp6.c */
extern char	*incmem();              /* Increase size of block or die.  */
#endif

extern DEFBUF	*lookid();              /* Look for a #define'd thing   */
extern DEFBUF	*defendel();            /* Symbol table enter/delete    */
extern char	*savestring();          /* Stuff string in malloc mem.  */
extern char	*strcpy();
extern char	*strncpy();
extern char	*strcat();
extern char	*strrchr();
extern char	*strchr();
extern long	time();
extern char	*sprintf();             /* Lint needs this              */
extern void	free ();
extern void	exit ();
