

/*
 *      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 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 ST_QUOTE        0x1C            /* Magic for stringizing        */
#define DEF_MAGIC       0x1D            /* Magic for #defines           */
#define TOK_SEP         0x1E            /* Token concatenation delim.   */
#define COM_SEP         0x1F            /* Magic comment separator      */
#define MAC_PARM        0x7F            /* Macro formals signal         */

/*
 * 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 || OK_CONCAT == CON_EXPAND
#define cput(c)         { if ((c) != TOK_SEP && (c) != COM_SEP) \
                            putchar((c == ST_QUOTE) ? '"' : (c)); }
#else
#define cput(c)         { if (c != TOK_SEP) \
                            putchar((c == ST_QUOTE) ? '"' : (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_SUCCESS      (SS$_NORMAL | STS$M_INHIB_MSG)
#define IO_ERROR        SS$_ABORT
#endif
/*
 * Note: IO_SUCCESS and IO_ERROR are defined in the Decus C stdio.h file
 */
#ifndef IO_SUCCESS
#define IO_SUCCESS      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     token[IDMAX + 1];       /* Current input token          */
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      pflag;                  /* -P option (no #line output)  */
extern int      tflag;                  /* -T option (enable trigraphs) */
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.           */
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     *strcat();
extern char     *strrchr();
extern char     *strchr();
extern long     time();
extern char     *sprintf();             /* Lint needs this              */

