2012-04-04 07:30:07 +04:00
|
|
|
/******************************************************************************
|
|
|
|
* FREXXWARE
|
|
|
|
* ----------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* Project: Frexx C Preprocessor
|
|
|
|
* $Source: /home/user/start/cpp/RCS/cpp.h,v $
|
|
|
|
* $Revision: 1.3 $
|
|
|
|
* $Date: 1993/12/06 13:51:20 $
|
|
|
|
* $Author: start $
|
|
|
|
* $State: Exp $
|
|
|
|
* $Locker: start $
|
|
|
|
*
|
|
|
|
* ----------------------------------------------------------------------------
|
|
|
|
* $Log: cpp.h,v $
|
|
|
|
* Revision 1.3 1993/12/06 13:51:20 start
|
|
|
|
* A lot of new stuff (too much to mention)
|
|
|
|
*
|
|
|
|
* Revision 1.2 1993/11/11 07:16:39 start
|
|
|
|
* New stuff
|
|
|
|
*
|
|
|
|
* Revision 1.2 1993/11/11 07:16:39 start
|
|
|
|
* New stuff
|
|
|
|
*
|
|
|
|
* Revision 1.1 1993/11/03 09:15:59 start
|
|
|
|
* Initial revision
|
|
|
|
*
|
|
|
|
*
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2018-12-09 03:40:58 +03:00
|
|
|
#include <stdio.h>
|
2012-04-04 07:30:07 +04:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2018-12-09 03:40:58 +03:00
|
|
|
|
2018-04-25 06:07:38 +03:00
|
|
|
#ifndef fpp_toupper
|
|
|
|
#define fpp_toupper(c) ((c) + ('A' - 'a'))
|
|
|
|
#endif /* no fpp_toupper */
|
|
|
|
#ifndef fpp_tolower
|
|
|
|
#define fpp_tolower(c) ((c) + ('a' - 'A'))
|
|
|
|
#endif /* no fpp_tolower */
|
2012-04-04 07:30:07 +04:00
|
|
|
|
2018-04-25 06:07:38 +03:00
|
|
|
#ifndef FPP_TRUE
|
|
|
|
#define FPP_TRUE 1
|
|
|
|
#define FPP_FALSE 0
|
2012-04-04 07:30:07 +04:00
|
|
|
#endif
|
|
|
|
#ifndef EOS
|
|
|
|
/*
|
|
|
|
* This is predefined in Decus C
|
|
|
|
*/
|
|
|
|
#define EOS '\0' /* End of string */
|
|
|
|
#endif
|
2018-04-25 06:07:38 +03:00
|
|
|
#define EOF_CHAR 0 /* Returned by fpp_get() on eof */
|
2012-04-04 07:30:07 +04:00
|
|
|
#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 */
|
|
|
|
#ifndef OS9
|
|
|
|
#if (PAR_MAC >= 33)
|
|
|
|
#error "assertion fails -- PAR_MAC isn't less than 33"
|
|
|
|
|
|
|
|
#endif
|
|
|
|
#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[]
|
|
|
|
*/
|
2018-04-25 06:07:38 +03:00
|
|
|
#define WAS_COMPILING 1 /* FPP_TRUE if compile set at entry */
|
|
|
|
#define ELSE_SEEN 2 /* FPP_TRUE when #else processed */
|
|
|
|
#define FPP_TRUE_SEEN 4 /* FPP_TRUE when #if FPP_TRUE processed */
|
2012-04-04 07:30:07 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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
|
2012-11-26 06:24:50 +04:00
|
|
|
#define cput generate /* cput concatenates tokens */
|
2012-04-04 07:30:07 +04:00
|
|
|
#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
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "fpp.h" /* structs and defines */
|
|
|
|
#include "cppadd.h" /* Added prototypes for ANSI complience! */
|
|
|
|
|
|
|
|
#ifdef AMIGA
|
|
|
|
#include <dos.h>
|
|
|
|
extern int _OSERR;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
extern char type[]; /* Character classifier */
|
|
|
|
|
|
|
|
#define compiling global->ifstack[0]
|
|
|
|
#if DEBUG
|
|
|
|
extern int debug; /* Debug level */
|
|
|
|
#endif
|
|
|
|
extern SIZES size_table[]; /* For #if sizeof sizes */
|
|
|
|
|
|
|
|
#define MAX_SPACE_SIZE 512 /* maximum number of whitespaces possible
|
|
|
|
to remember */
|