Mon Dec 6 14:41:09 PST 1999
(Raster) fixed proottype difference in epp... wonder hwo that got there... SVN revision: 1504
This commit is contained in:
parent
af85621ae6
commit
67a62c504b
|
@ -92,3 +92,10 @@ Thu Oct 28 12:49:19 PDT 1999
|
|||
(Mandrake)
|
||||
|
||||
Tru64 (again)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Mon Dec 6 14:41:09 PST 1999
|
||||
(Raster)
|
||||
|
||||
fixed proottype difference in epp... wonder hwo that got there...
|
||||
|
|
|
@ -36,7 +36,7 @@ void *
|
|||
xmalloc(size)
|
||||
unsigned size;
|
||||
{
|
||||
char *ptr = (char *)malloc(size);
|
||||
char *ptr = (char *)malloc(size);
|
||||
|
||||
if (ptr != 0)
|
||||
return (ptr);
|
||||
|
@ -50,7 +50,7 @@ xrealloc(old, size)
|
|||
void *old;
|
||||
unsigned size;
|
||||
{
|
||||
char *ptr = (char *)realloc(old, size);
|
||||
char *ptr = (char *)realloc(old, size);
|
||||
|
||||
if (ptr == 0)
|
||||
memory_full();
|
||||
|
@ -61,7 +61,7 @@ void *
|
|||
xcalloc(number, size)
|
||||
unsigned number, size;
|
||||
{
|
||||
char *ptr = (char *)calloc(number, size);
|
||||
char *ptr = (char *)calloc(number, size);
|
||||
|
||||
if (ptr == 0)
|
||||
memory_full();
|
||||
|
|
110
epp/cppexp.c
110
epp/cppexp.c
|
@ -41,12 +41,12 @@
|
|||
|
||||
/* This is used for communicating lists of keywords with cccp.c. */
|
||||
struct arglist
|
||||
{
|
||||
struct arglist *next;
|
||||
unsigned char *name;
|
||||
int length;
|
||||
int argno;
|
||||
};
|
||||
{
|
||||
struct arglist *next;
|
||||
unsigned char *name;
|
||||
int length;
|
||||
int argno;
|
||||
};
|
||||
|
||||
/* Define a generic NULL if one hasn't already been defined. */
|
||||
|
||||
|
@ -128,13 +128,13 @@ static long right_shift();
|
|||
/*#define UNSIGNEDP 16 */
|
||||
|
||||
struct operation
|
||||
{
|
||||
short op;
|
||||
char rprio; /* Priority of op (relative to it right operand). */
|
||||
char flags;
|
||||
char unsignedp; /* true if value should be treated as unsigned */
|
||||
HOST_WIDE_INT value; /* The value logically "right" of op. */
|
||||
};
|
||||
{
|
||||
short op;
|
||||
char rprio; /* Priority of op (relative to it right operand). */
|
||||
char flags;
|
||||
char unsignedp; /* true if value should be treated as unsigned */
|
||||
HOST_WIDE_INT value; /* The value logically "right" of op. */
|
||||
};
|
||||
|
||||
/* Take care of parsing a number (anything that starts with a digit).
|
||||
* LEN is the number of characters in it. */
|
||||
|
@ -148,13 +148,13 @@ parse_number(pfile, start, olen)
|
|||
int olen;
|
||||
{
|
||||
struct operation op;
|
||||
char *p = start;
|
||||
int c;
|
||||
unsigned long n = 0, nd, ULONG_MAX_over_base;
|
||||
int base = 10;
|
||||
int len = olen;
|
||||
int overflow = 0;
|
||||
int digit, largest_digit = 0;
|
||||
char *p = start;
|
||||
int c;
|
||||
unsigned long n = 0, nd, ULONG_MAX_over_base;
|
||||
int base = 10;
|
||||
int len = olen;
|
||||
int overflow = 0;
|
||||
int digit, largest_digit = 0;
|
||||
int spec_long = 0;
|
||||
|
||||
op.unsignedp = 0;
|
||||
|
@ -240,7 +240,8 @@ parse_number(pfile, start, olen)
|
|||
if ((long)n < 0 && !op.unsignedp)
|
||||
{
|
||||
if (base == 10)
|
||||
cpp_warning(pfile, "integer constant is so large that it is unsigned");
|
||||
cpp_warning(pfile,
|
||||
"integer constant is so large that it is unsigned");
|
||||
op.unsignedp = 1;
|
||||
}
|
||||
op.value = n;
|
||||
|
@ -254,8 +255,7 @@ struct token
|
|||
int token;
|
||||
};
|
||||
|
||||
static struct token tokentab2[] =
|
||||
{
|
||||
static struct token tokentab2[] = {
|
||||
{"&&", ANDAND},
|
||||
{"||", OROR},
|
||||
{"<<", LSH},
|
||||
|
@ -275,11 +275,11 @@ struct operation
|
|||
cpp_lex(pfile)
|
||||
cpp_reader *pfile;
|
||||
{
|
||||
int c;
|
||||
struct token *toktab;
|
||||
int c;
|
||||
struct token *toktab;
|
||||
enum cpp_token token;
|
||||
struct operation op;
|
||||
unsigned char *tok_start, *tok_end;
|
||||
unsigned char *tok_start, *tok_end;
|
||||
int old_written;
|
||||
|
||||
retry:
|
||||
|
@ -327,18 +327,20 @@ cpp_lex(pfile)
|
|||
* handles multicharacter constants and wide characters.
|
||||
* It is mostly copied from c-lex.c. */
|
||||
{
|
||||
int result = 0;
|
||||
int num_chars = 0;
|
||||
int result = 0;
|
||||
int num_chars = 0;
|
||||
unsigned width = MAX_CHAR_TYPE_SIZE;
|
||||
int wide_flag = 0;
|
||||
int max_chars;
|
||||
unsigned char *ptr = tok_start;
|
||||
unsigned char *ptr = tok_start;
|
||||
|
||||
#ifdef MULTIBYTE_CHARS
|
||||
char token_buffer[MAX_LONG_TYPE_SIZE / MAX_CHAR_TYPE_SIZE + MB_CUR_MAX];
|
||||
char token_buffer[MAX_LONG_TYPE_SIZE /
|
||||
MAX_CHAR_TYPE_SIZE + MB_CUR_MAX];
|
||||
|
||||
#else
|
||||
char token_buffer[MAX_LONG_TYPE_SIZE / MAX_CHAR_TYPE_SIZE + 1];
|
||||
char token_buffer[MAX_LONG_TYPE_SIZE /
|
||||
MAX_CHAR_TYPE_SIZE + 1];
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -367,7 +369,7 @@ cpp_lex(pfile)
|
|||
if (width < HOST_BITS_PER_INT
|
||||
&& (unsigned)c >= (unsigned)(1 << width))
|
||||
cpp_pedwarn(pfile,
|
||||
"escape sequence out of range for character");
|
||||
"escape sequence out of range for character");
|
||||
}
|
||||
num_chars++;
|
||||
|
||||
|
@ -405,10 +407,13 @@ cpp_lex(pfile)
|
|||
sizeof("__CHAR_UNSIGNED__") - 1, -1)
|
||||
|| ((result >> (num_bits - 1)) & 1) == 0)
|
||||
op.value
|
||||
= result & ((unsigned long)~0 >> (HOST_BITS_PER_LONG - num_bits));
|
||||
=
|
||||
result & ((unsigned long)~0 >>
|
||||
(HOST_BITS_PER_LONG - num_bits));
|
||||
else
|
||||
op.value
|
||||
= result | ~((unsigned long)~0 >> (HOST_BITS_PER_LONG - num_bits));
|
||||
op.value =
|
||||
result | ~((unsigned long)~0 >>
|
||||
(HOST_BITS_PER_LONG - num_bits));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -426,7 +431,8 @@ cpp_lex(pfile)
|
|||
if (mbtowc(&wc, token_buffer, num_chars) == num_chars)
|
||||
result = wc;
|
||||
else
|
||||
cpp_warning(pfile, "Ignoring invalid multibyte character");
|
||||
cpp_warning(pfile,
|
||||
"Ignoring invalid multibyte character");
|
||||
}
|
||||
#endif
|
||||
op.value = result;
|
||||
|
@ -456,7 +462,8 @@ cpp_lex(pfile)
|
|||
|
||||
memset(buf, 0, 40);
|
||||
|
||||
sprintf(buf, "`%s' not allowed in operand of `#if'", tok_start);
|
||||
sprintf(buf, "`%s' not allowed in operand of `#if'",
|
||||
tok_start);
|
||||
cpp_error(pfile, buf);
|
||||
free(buf);
|
||||
}
|
||||
|
@ -489,7 +496,7 @@ cpp_parse_escape(pfile, string_ptr)
|
|||
cpp_reader *pfile;
|
||||
char **string_ptr;
|
||||
{
|
||||
int c = *(*string_ptr)++;
|
||||
int c = *(*string_ptr)++;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
|
@ -527,8 +534,8 @@ cpp_parse_escape(pfile, string_ptr)
|
|||
case '6':
|
||||
case '7':
|
||||
{
|
||||
int i = c - '0';
|
||||
int count = 0;
|
||||
int i = c - '0';
|
||||
int count = 0;
|
||||
|
||||
while (++count < 3)
|
||||
{
|
||||
|
@ -551,7 +558,7 @@ cpp_parse_escape(pfile, string_ptr)
|
|||
}
|
||||
case 'x':
|
||||
{
|
||||
unsigned i = 0, overflow = 0, digits_found = 0, digit;
|
||||
unsigned i = 0, overflow = 0, digits_found = 0, digit;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
@ -665,9 +672,9 @@ right_shift(pfile, a, unsignedp, b)
|
|||
/* Parse and evaluate a C expression, reading from PFILE.
|
||||
* Returns the value of the expression. */
|
||||
|
||||
HOST_WIDE_INT
|
||||
cpp_parse_expr(pfile)
|
||||
cpp_reader *pfile;
|
||||
HOST_WIDE_INT cpp_parse_expr(pfile)
|
||||
cpp_reader *
|
||||
pfile;
|
||||
{
|
||||
/* The implementation is an operator precedence parser,
|
||||
* i.e. a bottom-up parser, using a stack for not-yet-reduced tokens.
|
||||
|
@ -683,7 +690,7 @@ cpp_parse_expr(pfile)
|
|||
struct operation init_stack[INIT_STACK_SIZE];
|
||||
struct operation *stack = init_stack;
|
||||
struct operation *limit = stack + INIT_STACK_SIZE;
|
||||
struct operation *top = stack;
|
||||
struct operation *top = stack;
|
||||
int lprio = 0, rprio = 0;
|
||||
int skip_evaluation = 0;
|
||||
|
||||
|
@ -804,7 +811,8 @@ cpp_parse_expr(pfile)
|
|||
while (top->rprio > lprio)
|
||||
{
|
||||
long v1 = top[-1].value, v2 = top[0].value;
|
||||
int unsigned1 = top[-1].unsignedp, unsigned2 = top[0].unsignedp;
|
||||
int unsigned1 = top[-1].unsignedp, unsigned2 =
|
||||
top[0].unsignedp;
|
||||
|
||||
top--;
|
||||
if ((top[1].flags & LEFT_OPERAND_REQUIRED)
|
||||
|
@ -839,7 +847,7 @@ cpp_parse_expr(pfile)
|
|||
}
|
||||
break;
|
||||
case '-':
|
||||
if (skip_evaluation); /* do nothing */
|
||||
if (skip_evaluation); /* do nothing */
|
||||
else if (!(top->flags & HAVE_VALUE))
|
||||
{ /* Unary '-' */
|
||||
top->value = -v2;
|
||||
|
@ -1021,8 +1029,7 @@ cpp_parse_expr(pfile)
|
|||
case ')':
|
||||
if ((top[1].flags & HAVE_VALUE)
|
||||
|| !(top[0].flags & HAVE_VALUE)
|
||||
|| top[0].op != '('
|
||||
|| (top[-1].flags & HAVE_VALUE))
|
||||
|| top[0].op != '(' || (top[-1].flags & HAVE_VALUE))
|
||||
{
|
||||
cpp_error(pfile, "mismatched parentheses in #if");
|
||||
goto syntax_error;
|
||||
|
@ -1039,8 +1046,7 @@ cpp_parse_expr(pfile)
|
|||
fprintf(stderr,
|
||||
top[1].op >= ' ' && top[1].op <= '~'
|
||||
? "unimplemented operator '%c'\n"
|
||||
: "unimplemented operator '\\%03o'\n",
|
||||
top[1].op);
|
||||
: "unimplemented operator '\\%03o'\n", top[1].op);
|
||||
}
|
||||
}
|
||||
if (op.op == 0)
|
||||
|
@ -1065,7 +1071,7 @@ cpp_parse_expr(pfile)
|
|||
else
|
||||
{
|
||||
new_stack = (struct operation *)xmalloc(new_size);
|
||||
memcpy((char *)new_stack,(char *)stack, old_size);
|
||||
memcpy((char *)new_stack, (char *)stack, old_size);
|
||||
}
|
||||
stack = new_stack;
|
||||
top = (struct operation *)((char *)new_stack + old_size);
|
||||
|
|
|
@ -26,11 +26,11 @@
|
|||
#include "cpphash.h"
|
||||
|
||||
static HASHNODE *hashtab[HASHSIZE];
|
||||
HASHNODE *cpp_lookup(struct parse_file *pfile, const unsigned char * name, int len,
|
||||
int hash);
|
||||
HASHNODE *cpp_lookup(struct parse_file *pfile,
|
||||
const unsigned char *name, int len, int hash);
|
||||
void delete_macro(HASHNODE * hp);
|
||||
HASHNODE *install(unsigned char * name, int len, enum node_type type, int ivalue,
|
||||
char *value, int hash);
|
||||
HASHNODE *install(unsigned char *name, int len, enum node_type type,
|
||||
int ivalue, char *value, int hash);
|
||||
|
||||
/* Define a generic NULL if one hasn't already been defined. */
|
||||
|
||||
|
@ -53,7 +53,7 @@ HASHNODE *install(unsigned char * name, int len, enum node_type type,
|
|||
int
|
||||
hashf(const unsigned char *name, int len, int hashsize)
|
||||
{
|
||||
int r = 0;
|
||||
int r = 0;
|
||||
|
||||
while (len--)
|
||||
r = HASHSTEP(r, *name++);
|
||||
|
@ -72,10 +72,11 @@ hashf(const unsigned char *name, int len, int hashsize)
|
|||
* Otherwise, compute the hash code.
|
||||
*/
|
||||
HASHNODE *
|
||||
cpp_lookup(struct parse_file *pfile, const unsigned char *name, int len, int hash)
|
||||
cpp_lookup(struct parse_file * pfile, const unsigned char *name, int len,
|
||||
int hash)
|
||||
{
|
||||
const unsigned char *bp;
|
||||
HASHNODE *bucket;
|
||||
HASHNODE *bucket;
|
||||
|
||||
pfile = NULL;
|
||||
if (len < 0)
|
||||
|
@ -157,16 +158,16 @@ delete_macro(hp)
|
|||
*/
|
||||
HASHNODE *
|
||||
install(name, len, type, ivalue, value, hash)
|
||||
unsigned char *name;
|
||||
unsigned char *name;
|
||||
int len;
|
||||
enum node_type type;
|
||||
int ivalue;
|
||||
char *value;
|
||||
int hash;
|
||||
{
|
||||
HASHNODE *hp;
|
||||
int i, bucket;
|
||||
unsigned char *p, *q;
|
||||
HASHNODE *hp;
|
||||
int i, bucket;
|
||||
unsigned char *p, *q;
|
||||
|
||||
if (len < 0)
|
||||
{
|
||||
|
@ -193,7 +194,7 @@ install(name, len, type, ivalue, value, hash)
|
|||
hp->value.ival = ivalue;
|
||||
else
|
||||
hp->value.cpval = value;
|
||||
hp->name = ((unsigned char *) hp) + sizeof(HASHNODE);
|
||||
hp->name = ((unsigned char *)hp) + sizeof(HASHNODE);
|
||||
p = hp->name;
|
||||
q = name;
|
||||
for (i = 0; i < len; i++)
|
||||
|
@ -206,7 +207,7 @@ void
|
|||
cpp_hash_cleanup(pfile)
|
||||
cpp_reader *pfile;
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
pfile = NULL;
|
||||
for (i = HASHSIZE; --i >= 0;)
|
||||
|
|
|
@ -2,22 +2,24 @@ enum node_type;
|
|||
|
||||
/* different kinds of things that can appear in the value field
|
||||
of a hash node. Actually, this may be useless now. */
|
||||
union hashval {
|
||||
int ival;
|
||||
char *cpval;
|
||||
DEFINITION *defn;
|
||||
union hashval
|
||||
{
|
||||
int ival;
|
||||
char *cpval;
|
||||
DEFINITION *defn;
|
||||
};
|
||||
|
||||
struct hashnode {
|
||||
struct hashnode *next; /* double links for easy deletion */
|
||||
struct hashnode *prev;
|
||||
struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
|
||||
chain is kept, in case the node is the head
|
||||
of the chain and gets deleted. */
|
||||
enum node_type type; /* type of special token */
|
||||
int length; /* length of token, for quick comparison */
|
||||
unsigned char *name; /* the actual name */
|
||||
union hashval value; /* pointer to expansion, or whatever */
|
||||
struct hashnode
|
||||
{
|
||||
struct hashnode *next; /* double links for easy deletion */
|
||||
struct hashnode *prev;
|
||||
struct hashnode **bucket_hdr; /* also, a back pointer to this node's hash
|
||||
* chain is kept, in case the node is the head
|
||||
* of the chain and gets deleted. */
|
||||
enum node_type type; /* type of special token */
|
||||
int length; /* length of token, for quick comparison */
|
||||
unsigned char *name; /* the actual name */
|
||||
union hashval value; /* pointer to expansion, or whatever */
|
||||
};
|
||||
|
||||
typedef struct hashnode HASHNODE;
|
||||
|
@ -31,6 +33,7 @@ typedef struct hashnode HASHNODE;
|
|||
|
||||
#define HASHSIZE 1403
|
||||
#define HASHSTEP(old, c) ((old << 2) + c)
|
||||
#define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
|
||||
#define MAKE_POS(v) (v & 0x7fffffff) /* make number positive */
|
||||
|
||||
extern HASHNODE* install PARAMS ((unsigned char*,int,enum node_type, int,char*,int));
|
||||
extern HASHNODE *install
|
||||
PARAMS((unsigned char *, int, enum node_type, int, char *, int));
|
||||
|
|
941
epp/cpplib.c
941
epp/cpplib.c
File diff suppressed because it is too large
Load Diff
728
epp/cpplib.h
728
epp/cpplib.h
|
@ -1,3 +1,4 @@
|
|||
|
||||
/* Definitions for CPP library.
|
||||
Copyright (C) 1995 Free Software Foundation, Inc.
|
||||
Written by Per Bothner, 1994-95.
|
||||
|
@ -24,38 +25,40 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
#include <sys/stat.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#define STATIC_BUFFERS
|
||||
|
||||
struct parse_file;
|
||||
typedef struct cpp_reader cpp_reader;
|
||||
typedef struct cpp_buffer cpp_buffer;
|
||||
typedef struct cpp_options cpp_options;
|
||||
typedef struct hashnode cpp_hashnode;
|
||||
struct parse_file;
|
||||
typedef struct cpp_reader cpp_reader;
|
||||
typedef struct cpp_buffer cpp_buffer;
|
||||
typedef struct cpp_options cpp_options;
|
||||
typedef struct hashnode cpp_hashnode;
|
||||
|
||||
enum cpp_token {
|
||||
CPP_EOF = -1,
|
||||
CPP_OTHER = 0,
|
||||
CPP_COMMENT = 1,
|
||||
CPP_HSPACE,
|
||||
CPP_VSPACE, /* newlines and #line directives */
|
||||
CPP_NAME,
|
||||
CPP_NUMBER,
|
||||
CPP_CHAR,
|
||||
CPP_STRING,
|
||||
CPP_DIRECTIVE,
|
||||
CPP_LPAREN, /* "(" */
|
||||
CPP_RPAREN, /* ")" */
|
||||
CPP_LBRACE, /* "{" */
|
||||
CPP_RBRACE, /* "}" */
|
||||
CPP_COMMA, /* "," */
|
||||
CPP_SEMICOLON,/* ";" */
|
||||
CPP_3DOTS, /* "..." */
|
||||
/* POP_TOKEN is returned when we've popped a cpp_buffer. */
|
||||
CPP_POP
|
||||
};
|
||||
enum cpp_token
|
||||
{
|
||||
CPP_EOF = -1,
|
||||
CPP_OTHER = 0,
|
||||
CPP_COMMENT = 1,
|
||||
CPP_HSPACE,
|
||||
CPP_VSPACE, /* newlines and #line directives */
|
||||
CPP_NAME,
|
||||
CPP_NUMBER,
|
||||
CPP_CHAR,
|
||||
CPP_STRING,
|
||||
CPP_DIRECTIVE,
|
||||
CPP_LPAREN, /* "(" */
|
||||
CPP_RPAREN, /* ")" */
|
||||
CPP_LBRACE, /* "{" */
|
||||
CPP_RBRACE, /* "}" */
|
||||
CPP_COMMA, /* "," */
|
||||
CPP_SEMICOLON, /* ";" */
|
||||
CPP_3DOTS, /* "..." */
|
||||
/* POP_TOKEN is returned when we've popped a cpp_buffer. */
|
||||
CPP_POP
|
||||
};
|
||||
|
||||
#ifndef PARAMS
|
||||
#ifdef __STDC
|
||||
|
@ -63,92 +66,94 @@ enum cpp_token {
|
|||
#else
|
||||
#define PARAMS(P) ()
|
||||
#endif
|
||||
#endif /* !PARAMS */
|
||||
#endif /* !PARAMS */
|
||||
|
||||
typedef enum cpp_token (*parse_underflow_t) PARAMS((cpp_reader*));
|
||||
typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader*));
|
||||
typedef enum cpp_token (*parse_underflow_t) PARAMS((cpp_reader *));
|
||||
typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader *));
|
||||
|
||||
/* A parse_marker indicates a previous position,
|
||||
which we can backtrack to. */
|
||||
|
||||
struct parse_marker {
|
||||
cpp_buffer *buf;
|
||||
struct parse_marker *next;
|
||||
int position;
|
||||
};
|
||||
struct parse_marker
|
||||
{
|
||||
cpp_buffer *buf;
|
||||
struct parse_marker *next;
|
||||
int position;
|
||||
};
|
||||
|
||||
extern void parse_set_mark PARAMS ((struct parse_marker*, cpp_reader*));
|
||||
extern void parse_clear_mark PARAMS ((struct parse_marker*));
|
||||
extern void parse_goto_mark PARAMS((struct parse_marker*, cpp_reader*));
|
||||
extern void parse_move_mark PARAMS((struct parse_marker*, cpp_reader*));
|
||||
|
||||
extern int cpp_handle_options PARAMS ((cpp_reader*, int, char**));
|
||||
extern enum cpp_token cpp_get_token PARAMS ((struct parse_marker*));
|
||||
extern void cpp_skip_hspace PARAMS((cpp_reader*));
|
||||
extern enum cpp_token cpp_get_non_space_token PARAMS ((cpp_reader *));
|
||||
extern void parse_set_mark PARAMS((struct parse_marker *, cpp_reader *));
|
||||
extern void parse_clear_mark PARAMS((struct parse_marker *));
|
||||
extern void parse_goto_mark PARAMS((struct parse_marker *, cpp_reader *));
|
||||
extern void parse_move_mark PARAMS((struct parse_marker *, cpp_reader *));
|
||||
|
||||
extern int cpp_handle_options PARAMS((cpp_reader *, int, char **));
|
||||
extern enum cpp_token cpp_get_token PARAMS((cpp_reader *));
|
||||
extern void cpp_skip_hspace PARAMS((cpp_reader *));
|
||||
extern enum cpp_token cpp_get_non_space_token PARAMS((cpp_reader *));
|
||||
|
||||
/* Maintain and search list of included files, for #import. */
|
||||
|
||||
#define IMPORT_HASH_SIZE 31
|
||||
|
||||
struct import_file {
|
||||
char *name;
|
||||
ino_t inode;
|
||||
dev_t dev;
|
||||
struct import_file *next;
|
||||
};
|
||||
struct import_file
|
||||
{
|
||||
char *name;
|
||||
ino_t inode;
|
||||
dev_t dev;
|
||||
struct import_file *next;
|
||||
};
|
||||
|
||||
/* If we have a huge buffer, may need to cache more recent counts */
|
||||
#define CPP_LINE_BASE(BUF) ((BUF)->buf + (BUF)->line_base)
|
||||
|
||||
struct cpp_buffer {
|
||||
unsigned char *buf;
|
||||
unsigned char *cur;
|
||||
unsigned char *rlimit; /* end of valid data */
|
||||
unsigned char *alimit; /* end of allocated buffer */
|
||||
unsigned char *prev; /* start of current token */
|
||||
struct cpp_buffer
|
||||
{
|
||||
unsigned char *buf;
|
||||
unsigned char *cur;
|
||||
unsigned char *rlimit; /* end of valid data */
|
||||
unsigned char *alimit; /* end of allocated buffer */
|
||||
unsigned char *prev; /* start of current token */
|
||||
|
||||
char *fname;
|
||||
/* Filename specified with #line command. */
|
||||
char *nominal_fname;
|
||||
char *fname;
|
||||
/* Filename specified with #line command. */
|
||||
char *nominal_fname;
|
||||
|
||||
/* Record where in the search path this file was found.
|
||||
For #include_next. */
|
||||
struct file_name_list *dir;
|
||||
/* Record where in the search path this file was found.
|
||||
* For #include_next. */
|
||||
struct file_name_list *dir;
|
||||
|
||||
long line_base;
|
||||
long lineno; /* Line number at CPP_LINE_BASE. */
|
||||
long colno; /* Column number at CPP_LINE_BASE. */
|
||||
long line_base;
|
||||
long lineno; /* Line number at CPP_LINE_BASE. */
|
||||
long colno; /* Column number at CPP_LINE_BASE. */
|
||||
#ifndef STATIC_BUFFERS
|
||||
cpp_buffer *chain;
|
||||
cpp_buffer *chain;
|
||||
#endif
|
||||
parse_underflow_t underflow;
|
||||
parse_cleanup_t cleanup;
|
||||
void *data;
|
||||
struct parse_marker *marks;
|
||||
/* Value of if_stack at start of this file.
|
||||
Used to prohibit unmatched #endif (etc) in an include file. */
|
||||
struct if_stack *if_stack;
|
||||
parse_underflow_t underflow;
|
||||
parse_cleanup_t cleanup;
|
||||
void *data;
|
||||
struct parse_marker *marks;
|
||||
/* Value of if_stack at start of this file.
|
||||
* Used to prohibit unmatched #endif (etc) in an include file. */
|
||||
struct if_stack *if_stack;
|
||||
|
||||
/* True if this is a header file included using <FILENAME>. */
|
||||
char system_header_p;
|
||||
char seen_eof;
|
||||
/* True if this is a header file included using <FILENAME>. */
|
||||
char system_header_p;
|
||||
char seen_eof;
|
||||
|
||||
/* True if buffer contains escape sequences.
|
||||
Currently there are are only two kind:
|
||||
"@-" means following identifier should not be macro-expanded.
|
||||
"@ " means a token-separator. This turns into " " in final output
|
||||
if not stringizing and needed to separate tokens; otherwise nothing.
|
||||
"@@" means a normal '@'.
|
||||
(An '@' inside a string stands for itself and is never an escape.) */
|
||||
char has_escapes;
|
||||
};
|
||||
/* True if buffer contains escape sequences.
|
||||
* Currently there are are only two kind:
|
||||
* "@-" means following identifier should not be macro-expanded.
|
||||
* "@ " means a token-separator. This turns into " " in final output
|
||||
* if not stringizing and needed to separate tokens; otherwise nothing.
|
||||
* "@@" means a normal '@'.
|
||||
* (An '@' inside a string stands for itself and is never an escape.) */
|
||||
char has_escapes;
|
||||
};
|
||||
|
||||
struct cpp_pending; /* Forward declaration - for C++. */
|
||||
struct file_name_map_list;
|
||||
struct cpp_pending; /* Forward declaration - for C++. */
|
||||
struct file_name_map_list;
|
||||
|
||||
typedef struct assertion_hashnode ASSERTION_HASHNODE;
|
||||
typedef struct assertion_hashnode ASSERTION_HASHNODE;
|
||||
#define ASSERTION_HASHSIZE 37
|
||||
|
||||
#ifdef STATIC_BUFFERS
|
||||
|
@ -157,96 +162,97 @@ typedef struct assertion_hashnode ASSERTION_HASHNODE;
|
|||
#define CPP_STACK_MAX 200
|
||||
#endif
|
||||
|
||||
struct cpp_reader {
|
||||
unsigned char *limit;
|
||||
parse_underflow_t get_token;
|
||||
cpp_buffer *buffer;
|
||||
struct cpp_reader
|
||||
{
|
||||
unsigned char *limit;
|
||||
parse_underflow_t get_token;
|
||||
cpp_buffer *buffer;
|
||||
#ifdef STATIC_BUFFERS
|
||||
cpp_buffer buffer_stack[CPP_STACK_MAX];
|
||||
cpp_buffer buffer_stack[CPP_STACK_MAX];
|
||||
#endif
|
||||
|
||||
int errors; /* Error counter for exit code */
|
||||
void *data;
|
||||
int errors; /* Error counter for exit code */
|
||||
void *data;
|
||||
|
||||
unsigned char *token_buffer;
|
||||
int token_buffer_size;
|
||||
unsigned char *token_buffer;
|
||||
int token_buffer_size;
|
||||
|
||||
/* Line where a newline was first seen in a string constant. */
|
||||
int multiline_string_line;
|
||||
/* Line where a newline was first seen in a string constant. */
|
||||
int multiline_string_line;
|
||||
|
||||
/* Current depth in #include directives that use <...>. */
|
||||
int system_include_depth;
|
||||
/* Current depth in #include directives that use <...>. */
|
||||
int system_include_depth;
|
||||
|
||||
/* List of included files that contained #pragma once. */
|
||||
struct file_name_list *dont_repeat_files;
|
||||
/* List of included files that contained #pragma once. */
|
||||
struct file_name_list *dont_repeat_files;
|
||||
|
||||
/* List of other included files.
|
||||
If ->control_macro if nonzero, the file had a #ifndef
|
||||
around the entire contents, and ->control_macro gives the macro name. */
|
||||
struct file_name_list *all_include_files;
|
||||
/* List of other included files.
|
||||
* If ->control_macro if nonzero, the file had a #ifndef
|
||||
* around the entire contents, and ->control_macro gives the macro name. */
|
||||
struct file_name_list *all_include_files;
|
||||
|
||||
/* Current maximum length of directory names in the search path
|
||||
for include files. (Altered as we get more of them.) */
|
||||
int max_include_len;
|
||||
/* Current maximum length of directory names in the search path
|
||||
* for include files. (Altered as we get more of them.) */
|
||||
int max_include_len;
|
||||
|
||||
/* Hash table of files already included with #include or #import. */
|
||||
struct import_file *import_hash_table[IMPORT_HASH_SIZE];
|
||||
/* Hash table of files already included with #include or #import. */
|
||||
struct import_file *import_hash_table[IMPORT_HASH_SIZE];
|
||||
|
||||
struct if_stack *if_stack;
|
||||
struct if_stack *if_stack;
|
||||
|
||||
/* Nonzero means we are inside an IF during a -pcp run. In this mode
|
||||
macro expansion is done, and preconditions are output for all macro
|
||||
uses requiring them. */
|
||||
char pcp_inside_if;
|
||||
/* Nonzero means we are inside an IF during a -pcp run. In this mode
|
||||
* macro expansion is done, and preconditions are output for all macro
|
||||
* uses requiring them. */
|
||||
char pcp_inside_if;
|
||||
|
||||
/* Nonzero means we have printed (while error reporting) a list of
|
||||
containing files that matches the current status. */
|
||||
char input_stack_listing_current;
|
||||
/* Nonzero means we have printed (while error reporting) a list of
|
||||
* containing files that matches the current status. */
|
||||
char input_stack_listing_current;
|
||||
|
||||
/* If non-zero, macros are not expanded. */
|
||||
char no_macro_expand;
|
||||
/* If non-zero, macros are not expanded. */
|
||||
char no_macro_expand;
|
||||
|
||||
/* Print column number in error messages. */
|
||||
char show_column;
|
||||
/* Print column number in error messages. */
|
||||
char show_column;
|
||||
|
||||
/* We're printed a warning recommending against using #import. */
|
||||
char import_warning;
|
||||
/* We're printed a warning recommending against using #import. */
|
||||
char import_warning;
|
||||
|
||||
/* If true, character between '<' and '>' are a single (string) token. */
|
||||
char parsing_include_directive;
|
||||
/* If true, character between '<' and '>' are a single (string) token. */
|
||||
char parsing_include_directive;
|
||||
|
||||
/* True if escape sequences (as described for has_escapes in
|
||||
parse_buffer) should be emitted. */
|
||||
char output_escapes;
|
||||
/* True if escape sequences (as described for has_escapes in
|
||||
* parse_buffer) should be emitted. */
|
||||
char output_escapes;
|
||||
|
||||
/* 0: Have seen non-white-space on this line.
|
||||
1: Only seen white space so far on this line.
|
||||
2: Only seen white space so far in this file. */
|
||||
char only_seen_white;
|
||||
/* 0: Have seen non-white-space on this line.
|
||||
* 1: Only seen white space so far on this line.
|
||||
* 2: Only seen white space so far in this file. */
|
||||
char only_seen_white;
|
||||
|
||||
/* Nonzero means this file was included with a -imacros or -include
|
||||
command line and should not be recorded as an include file. */
|
||||
/* Nonzero means this file was included with a -imacros or -include
|
||||
* command line and should not be recorded as an include file. */
|
||||
|
||||
int no_record_file;
|
||||
int no_record_file;
|
||||
|
||||
long lineno;
|
||||
long lineno;
|
||||
|
||||
struct tm *timebuf;
|
||||
struct tm *timebuf;
|
||||
|
||||
ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE];
|
||||
ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE];
|
||||
|
||||
/* Buffer of -M output. */
|
||||
char *deps_buffer;
|
||||
/* Buffer of -M output. */
|
||||
char *deps_buffer;
|
||||
|
||||
/* Number of bytes allocated in above. */
|
||||
int deps_allocated_size;
|
||||
/* Number of bytes allocated in above. */
|
||||
int deps_allocated_size;
|
||||
|
||||
/* Number of bytes used. */
|
||||
int deps_size;
|
||||
/* Number of bytes used. */
|
||||
int deps_size;
|
||||
|
||||
/* Number of bytes since the last newline. */
|
||||
int deps_column;
|
||||
};
|
||||
/* Number of bytes since the last newline. */
|
||||
int deps_column;
|
||||
};
|
||||
|
||||
#define CPP_BUF_PEEK(BUFFER) \
|
||||
((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF)
|
||||
|
@ -290,116 +296,117 @@ struct cpp_reader {
|
|||
#endif
|
||||
|
||||
/* Pointed to by parse_file::data. */
|
||||
struct cpp_options {
|
||||
char *in_fname;
|
||||
struct cpp_options
|
||||
{
|
||||
char *in_fname;
|
||||
|
||||
/* Name of output file, for error messages. */
|
||||
char *out_fname;
|
||||
/* Name of output file, for error messages. */
|
||||
char *out_fname;
|
||||
|
||||
struct file_name_map_list *map_list;
|
||||
struct file_name_map_list *map_list;
|
||||
|
||||
/* Non-0 means -v, so print the full set of include dirs. */
|
||||
char verbose;
|
||||
/* Non-0 means -v, so print the full set of include dirs. */
|
||||
char verbose;
|
||||
|
||||
/* Nonzero means use extra default include directories for C++. */
|
||||
/* Nonzero means use extra default include directories for C++. */
|
||||
|
||||
char cplusplus;
|
||||
char cplusplus;
|
||||
|
||||
/* Nonzero means handle cplusplus style comments */
|
||||
/* Nonzero means handle cplusplus style comments */
|
||||
|
||||
char cplusplus_comments;
|
||||
char cplusplus_comments;
|
||||
|
||||
/* Nonzero means handle #import, for objective C. */
|
||||
/* Nonzero means handle #import, for objective C. */
|
||||
|
||||
char objc;
|
||||
char objc;
|
||||
|
||||
/* Nonzero means this is an assembly file, and allow
|
||||
unknown directives, which could be comments. */
|
||||
/* Nonzero means this is an assembly file, and allow
|
||||
* unknown directives, which could be comments. */
|
||||
|
||||
int lang_asm;
|
||||
int lang_asm;
|
||||
|
||||
/* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
|
||||
/* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
|
||||
|
||||
char for_lint;
|
||||
char for_lint;
|
||||
|
||||
/* Nonzero means handle CHILL comment syntax
|
||||
and output CHILL string delimiter for __DATE___ etc. */
|
||||
/* Nonzero means handle CHILL comment syntax
|
||||
* and output CHILL string delimiter for __DATE___ etc. */
|
||||
|
||||
char chill;
|
||||
char chill;
|
||||
|
||||
/* Nonzero means copy comments into the output file. */
|
||||
/* Nonzero means copy comments into the output file. */
|
||||
|
||||
char put_out_comments;
|
||||
char put_out_comments;
|
||||
|
||||
/* Nonzero means don't process the ANSI trigraph sequences. */
|
||||
/* Nonzero means don't process the ANSI trigraph sequences. */
|
||||
|
||||
char no_trigraphs;
|
||||
char no_trigraphs;
|
||||
|
||||
/* Nonzero means print the names of included files rather than
|
||||
the preprocessed output. 1 means just the #include "...",
|
||||
2 means #include <...> as well. */
|
||||
/* Nonzero means print the names of included files rather than
|
||||
* the preprocessed output. 1 means just the #include "...",
|
||||
* 2 means #include <...> as well. */
|
||||
|
||||
char print_deps;
|
||||
char print_deps;
|
||||
|
||||
/* Nonzero if missing .h files in -M output are assumed to be generated
|
||||
files and not errors. */
|
||||
/* Nonzero if missing .h files in -M output are assumed to be generated
|
||||
* files and not errors. */
|
||||
|
||||
char print_deps_missing_files;
|
||||
char print_deps_missing_files;
|
||||
|
||||
/* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
|
||||
char print_deps_append;
|
||||
/* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
|
||||
char print_deps_append;
|
||||
|
||||
/* Nonzero means print names of header files (-H). */
|
||||
/* Nonzero means print names of header files (-H). */
|
||||
|
||||
char print_include_names;
|
||||
char print_include_names;
|
||||
|
||||
/* Nonzero means try to make failure to fit ANSI C an error. */
|
||||
/* Nonzero means try to make failure to fit ANSI C an error. */
|
||||
|
||||
char pedantic_errors;
|
||||
char pedantic_errors;
|
||||
|
||||
/* Nonzero means don't print warning messages. -w. */
|
||||
/* Nonzero means don't print warning messages. -w. */
|
||||
|
||||
char inhibit_warnings;
|
||||
char inhibit_warnings;
|
||||
|
||||
/* Nonzero means warn if slash-star appears in a comment. */
|
||||
/* Nonzero means warn if slash-star appears in a comment. */
|
||||
|
||||
char warn_comments;
|
||||
char warn_comments;
|
||||
|
||||
/* Nonzero means warn if there are any trigraphs. */
|
||||
/* Nonzero means warn if there are any trigraphs. */
|
||||
|
||||
char warn_trigraphs;
|
||||
char warn_trigraphs;
|
||||
|
||||
/* Nonzero means warn if #import is used. */
|
||||
/* Nonzero means warn if #import is used. */
|
||||
|
||||
char warn_import;
|
||||
char warn_import;
|
||||
|
||||
/* Nonzero means warn if a macro argument is (or would be)
|
||||
stringified with -traditional. */
|
||||
/* Nonzero means warn if a macro argument is (or would be)
|
||||
* stringified with -traditional. */
|
||||
|
||||
char warn_stringify;
|
||||
char warn_stringify;
|
||||
|
||||
/* Nonzero means turn warnings into errors. */
|
||||
/* Nonzero means turn warnings into errors. */
|
||||
|
||||
char warnings_are_errors;
|
||||
char warnings_are_errors;
|
||||
|
||||
/* Nonzero causes output not to be done,
|
||||
but directives such as #define that have side effects
|
||||
are still obeyed. */
|
||||
/* Nonzero causes output not to be done,
|
||||
* but directives such as #define that have side effects
|
||||
* are still obeyed. */
|
||||
|
||||
char no_output;
|
||||
char no_output;
|
||||
|
||||
/* Nonzero means don't output line number information. */
|
||||
/* Nonzero means don't output line number information. */
|
||||
|
||||
char no_line_commands;
|
||||
char no_line_commands;
|
||||
|
||||
/* Nonzero means output the text in failing conditionals,
|
||||
inside #failed ... #endfailed. */
|
||||
|
||||
char output_conditionals;
|
||||
char output_conditionals;
|
||||
|
||||
/* Nonzero means -I- has been seen,
|
||||
so don't look for #include "foo" the source-file directory. */
|
||||
char ignore_srcdir;
|
||||
/* Nonzero means -I- has been seen,
|
||||
* so don't look for #include "foo" the source-file directory. */
|
||||
char ignore_srcdir;
|
||||
|
||||
/* Zero means dollar signs are punctuation.
|
||||
-$ stores 0; -traditional may store 1. Default is 1 for VMS, 0 otherwise.
|
||||
|
@ -408,44 +415,44 @@ struct cpp_options {
|
|||
#define lose(b) foo (b)
|
||||
#define test$
|
||||
lose (test) */
|
||||
char dollars_in_ident;
|
||||
char dollars_in_ident;
|
||||
#ifndef DOLLARS_IN_IDENTIFIERS
|
||||
#define DOLLARS_IN_IDENTIFIERS 1
|
||||
#endif
|
||||
|
||||
/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
|
||||
char traditional;
|
||||
/* Nonzero means try to imitate old fashioned non-ANSI preprocessor. */
|
||||
char traditional;
|
||||
|
||||
/* Nonzero means give all the error messages the ANSI standard requires. */
|
||||
char pedantic;
|
||||
/* Nonzero means give all the error messages the ANSI standard requires. */
|
||||
char pedantic;
|
||||
|
||||
char done_initializing;
|
||||
char done_initializing;
|
||||
|
||||
struct file_name_list *include; /* First dir to search */
|
||||
/* First dir to search for <file> */
|
||||
/* This is the first element to use for #include <...>.
|
||||
If it is 0, use the entire chain for such includes. */
|
||||
struct file_name_list *first_bracket_include;
|
||||
/* This is the first element in the chain that corresponds to
|
||||
a directory of system header files. */
|
||||
struct file_name_list *first_system_include;
|
||||
struct file_name_list *last_include; /* Last in chain */
|
||||
struct file_name_list *include; /* First dir to search */
|
||||
/* First dir to search for <file> */
|
||||
/* This is the first element to use for #include <...>.
|
||||
* If it is 0, use the entire chain for such includes. */
|
||||
struct file_name_list *first_bracket_include;
|
||||
/* This is the first element in the chain that corresponds to
|
||||
* a directory of system header files. */
|
||||
struct file_name_list *first_system_include;
|
||||
struct file_name_list *last_include; /* Last in chain */
|
||||
|
||||
/* Chain of include directories to put at the end of the other chain. */
|
||||
struct file_name_list *after_include;
|
||||
struct file_name_list *last_after_include; /* Last in chain */
|
||||
/* Chain of include directories to put at the end of the other chain. */
|
||||
struct file_name_list *after_include;
|
||||
struct file_name_list *last_after_include; /* Last in chain */
|
||||
|
||||
/* Chain to put at the start of the system include files. */
|
||||
struct file_name_list *before_system;
|
||||
struct file_name_list *last_before_system; /* Last in chain */
|
||||
/* Chain to put at the start of the system include files. */
|
||||
struct file_name_list *before_system;
|
||||
struct file_name_list *last_before_system; /* Last in chain */
|
||||
|
||||
/* Directory prefix that should replace `/usr' in the standard
|
||||
include file directories. */
|
||||
char *include_prefix;
|
||||
/* Directory prefix that should replace `/usr' in the standard
|
||||
* include file directories. */
|
||||
char *include_prefix;
|
||||
|
||||
char inhibit_predefs;
|
||||
char no_standard_includes;
|
||||
char no_standard_cplusplus_includes;
|
||||
char inhibit_predefs;
|
||||
char no_standard_includes;
|
||||
char no_standard_cplusplus_includes;
|
||||
|
||||
/* dump_only means inhibit output of the preprocessed text
|
||||
and instead output the definitions of all user-defined
|
||||
|
@ -454,8 +461,9 @@ struct cpp_options {
|
|||
dump_definitions means pass the whole definition (plus #define) through
|
||||
*/
|
||||
|
||||
enum {dump_none = 0, dump_only, dump_names, dump_definitions}
|
||||
dump_macros;
|
||||
enum
|
||||
{ dump_none = 0, dump_only, dump_names, dump_definitions }
|
||||
dump_macros;
|
||||
|
||||
/* Nonzero means pass all #define and #undef directives which we actually
|
||||
process through to the output stream. This feature is used primarily
|
||||
|
@ -463,18 +471,18 @@ struct cpp_options {
|
|||
debuggers which understand about preprocessor macros, but it may
|
||||
also be useful with -E to figure out how symbols are defined, and
|
||||
where they are defined. */
|
||||
int debug_output;
|
||||
int debug_output;
|
||||
|
||||
/* Pending -D, -U and -A options, in reverse order. */
|
||||
struct cpp_pending *pending;
|
||||
/* Pending -D, -U and -A options, in reverse order. */
|
||||
struct cpp_pending *pending;
|
||||
|
||||
/* File name which deps are being written to.
|
||||
This is 0 if deps are being written to stdout. */
|
||||
char *deps_file;
|
||||
/* File name which deps are being written to.
|
||||
* This is 0 if deps are being written to stdout. */
|
||||
char *deps_file;
|
||||
|
||||
/* Target-name to write with the dependency information. */
|
||||
char *deps_target;
|
||||
};
|
||||
/* Target-name to write with the dependency information. */
|
||||
char *deps_target;
|
||||
};
|
||||
|
||||
#define CPP_TRADITIONAL(PFILE) (CPP_OPTIONS(PFILE)-> traditional)
|
||||
#define CPP_PEDANTIC(PFILE) (CPP_OPTIONS (PFILE)->pedantic)
|
||||
|
@ -482,7 +490,7 @@ struct cpp_options {
|
|||
|
||||
/* Name under which this program was invoked. */
|
||||
|
||||
extern char *progname;
|
||||
extern char *progname;
|
||||
|
||||
/* The structure of a node in the hash table. The hash table
|
||||
has entries for all tokens defined by #define commands (type T_MACRO),
|
||||
|
@ -492,54 +500,55 @@ extern char *progname;
|
|||
by a separate piece of code. */
|
||||
|
||||
/* different flavors of hash nodes --- also used in keyword table */
|
||||
enum node_type {
|
||||
T_DEFINE = 1, /* the `#define' keyword */
|
||||
T_INCLUDE, /* the `#include' keyword */
|
||||
T_INCLUDE_NEXT, /* the `#include_next' keyword */
|
||||
T_IMPORT, /* the `#import' keyword */
|
||||
T_IFDEF, /* the `#ifdef' keyword */
|
||||
T_IFNDEF, /* the `#ifndef' keyword */
|
||||
T_IF, /* the `#if' keyword */
|
||||
T_ELSE, /* `#else' */
|
||||
T_PRAGMA, /* `#pragma' */
|
||||
T_ELIF, /* `#elif' */
|
||||
T_UNDEF, /* `#undef' */
|
||||
T_LINE, /* `#line' */
|
||||
T_ERROR, /* `#error' */
|
||||
T_WARNING, /* `#warning' */
|
||||
T_ENDIF, /* `#endif' */
|
||||
T_SCCS, /* `#sccs', used on system V. */
|
||||
T_IDENT, /* `#ident', used on system V. */
|
||||
T_ASSERT, /* `#assert', taken from system V. */
|
||||
T_UNASSERT, /* `#unassert', taken from system V. */
|
||||
T_SPECLINE, /* special symbol `__LINE__' */
|
||||
T_DATE, /* `__DATE__' */
|
||||
T_FILE, /* `__FILE__' */
|
||||
T_BASE_FILE, /* `__BASE_FILE__' */
|
||||
T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
|
||||
T_VERSION, /* `__VERSION__' */
|
||||
T_SIZE_TYPE, /* `__SIZE_TYPE__' */
|
||||
T_PTRDIFF_TYPE, /* `__PTRDIFF_TYPE__' */
|
||||
T_WCHAR_TYPE, /* `__WCHAR_TYPE__' */
|
||||
T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */
|
||||
T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */
|
||||
T_TIME, /* `__TIME__' */
|
||||
T_CONST, /* Constant value, used by `__STDC__' */
|
||||
T_MACRO, /* macro defined by `#define' */
|
||||
T_DISABLED, /* macro temporarily turned off for rescan */
|
||||
T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
|
||||
T_PCSTRING, /* precompiled string (hashval is KEYDEF *) */
|
||||
T_UNUSED /* Used for something not defined. */
|
||||
};
|
||||
enum node_type
|
||||
{
|
||||
T_DEFINE = 1, /* the `#define' keyword */
|
||||
T_INCLUDE, /* the `#include' keyword */
|
||||
T_INCLUDE_NEXT, /* the `#include_next' keyword */
|
||||
T_IMPORT, /* the `#import' keyword */
|
||||
T_IFDEF, /* the `#ifdef' keyword */
|
||||
T_IFNDEF, /* the `#ifndef' keyword */
|
||||
T_IF, /* the `#if' keyword */
|
||||
T_ELSE, /* `#else' */
|
||||
T_PRAGMA, /* `#pragma' */
|
||||
T_ELIF, /* `#elif' */
|
||||
T_UNDEF, /* `#undef' */
|
||||
T_LINE, /* `#line' */
|
||||
T_ERROR, /* `#error' */
|
||||
T_WARNING, /* `#warning' */
|
||||
T_ENDIF, /* `#endif' */
|
||||
T_SCCS, /* `#sccs', used on system V. */
|
||||
T_IDENT, /* `#ident', used on system V. */
|
||||
T_ASSERT, /* `#assert', taken from system V. */
|
||||
T_UNASSERT, /* `#unassert', taken from system V. */
|
||||
T_SPECLINE, /* special symbol `__LINE__' */
|
||||
T_DATE, /* `__DATE__' */
|
||||
T_FILE, /* `__FILE__' */
|
||||
T_BASE_FILE, /* `__BASE_FILE__' */
|
||||
T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
|
||||
T_VERSION, /* `__VERSION__' */
|
||||
T_SIZE_TYPE, /* `__SIZE_TYPE__' */
|
||||
T_PTRDIFF_TYPE, /* `__PTRDIFF_TYPE__' */
|
||||
T_WCHAR_TYPE, /* `__WCHAR_TYPE__' */
|
||||
T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */
|
||||
T_REGISTER_PREFIX_TYPE, /* `__REGISTER_PREFIX__' */
|
||||
T_TIME, /* `__TIME__' */
|
||||
T_CONST, /* Constant value, used by `__STDC__' */
|
||||
T_MACRO, /* macro defined by `#define' */
|
||||
T_DISABLED, /* macro temporarily turned off for rescan */
|
||||
T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
|
||||
T_PCSTRING, /* precompiled string (hashval is KEYDEF *) */
|
||||
T_UNUSED /* Used for something not defined. */
|
||||
};
|
||||
|
||||
/* Structure returned by create_definition */
|
||||
typedef struct macrodef MACRODEF;
|
||||
struct macrodef
|
||||
{
|
||||
struct definition *defn;
|
||||
unsigned char *symnam;
|
||||
int symlen;
|
||||
};
|
||||
typedef struct macrodef MACRODEF;
|
||||
struct macrodef
|
||||
{
|
||||
struct definition *defn;
|
||||
unsigned char *symnam;
|
||||
int symlen;
|
||||
};
|
||||
|
||||
/* Structure allocated for every #define. For a simple replacement
|
||||
such as
|
||||
|
@ -562,75 +571,82 @@ struct macrodef
|
|||
{ (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
|
||||
where (x, y) means (nchars, argno). */
|
||||
|
||||
typedef struct definition DEFINITION;
|
||||
struct definition {
|
||||
int nargs;
|
||||
int length; /* length of expansion string */
|
||||
int predefined; /* True if the macro was builtin or */
|
||||
/* came from the command line */
|
||||
unsigned char *expansion;
|
||||
int line; /* Line number of definition */
|
||||
char *file; /* File of definition */
|
||||
char rest_args; /* Nonzero if last arg. absorbs the rest */
|
||||
struct reflist {
|
||||
struct reflist *next;
|
||||
char stringify; /* nonzero if this arg was preceded by a
|
||||
# operator. */
|
||||
char raw_before; /* Nonzero if a ## operator before arg. */
|
||||
char raw_after; /* Nonzero if a ## operator after arg. */
|
||||
char rest_args; /* Nonzero if this arg. absorbs the rest */
|
||||
int nchars; /* Number of literal chars to copy before
|
||||
this arg occurrence. */
|
||||
int argno; /* Number of arg to substitute (origin-0) */
|
||||
} *pattern;
|
||||
union {
|
||||
/* Names of macro args, concatenated in reverse order
|
||||
with comma-space between them.
|
||||
The only use of this is that we warn on redefinition
|
||||
if this differs between the old and new definitions. */
|
||||
unsigned char *argnames;
|
||||
} args;
|
||||
};
|
||||
typedef struct definition DEFINITION;
|
||||
struct definition
|
||||
{
|
||||
int nargs;
|
||||
int length; /* length of expansion string */
|
||||
int predefined; /* True if the macro was builtin or */
|
||||
/* came from the command line */
|
||||
unsigned char *expansion;
|
||||
int line; /* Line number of definition */
|
||||
char *file; /* File of definition */
|
||||
char rest_args; /* Nonzero if last arg. absorbs the rest */
|
||||
struct reflist
|
||||
{
|
||||
struct reflist *next;
|
||||
char stringify; /* nonzero if this arg was preceded by a
|
||||
* # operator. */
|
||||
char raw_before; /* Nonzero if a ## operator before arg. */
|
||||
char raw_after; /* Nonzero if a ## operator after arg. */
|
||||
char rest_args; /* Nonzero if this arg. absorbs the rest */
|
||||
int nchars; /* Number of literal chars to copy before
|
||||
* this arg occurrence. */
|
||||
int argno; /* Number of arg to substitute (origin-0) */
|
||||
}
|
||||
*pattern;
|
||||
union
|
||||
{
|
||||
/* Names of macro args, concatenated in reverse order
|
||||
* with comma-space between them.
|
||||
* The only use of this is that we warn on redefinition
|
||||
* if this differs between the old and new definitions. */
|
||||
unsigned char *argnames;
|
||||
}
|
||||
args;
|
||||
};
|
||||
|
||||
extern unsigned char is_idchar[256];
|
||||
extern unsigned char is_idchar[256];
|
||||
|
||||
/* Stack of conditionals currently in progress
|
||||
(including both successful and failing conditionals). */
|
||||
|
||||
struct if_stack {
|
||||
struct if_stack *next; /* for chaining to the next stack frame */
|
||||
char *fname; /* copied from input when frame is made */
|
||||
int lineno; /* similarly */
|
||||
int if_succeeded; /* true if a leg of this if-group
|
||||
has been passed through rescan */
|
||||
unsigned char *control_macro; /* For #ifndef at start of file,
|
||||
this is the macro name tested. */
|
||||
enum node_type type; /* type of last directive seen in this group */
|
||||
};
|
||||
typedef struct if_stack IF_STACK_FRAME;
|
||||
struct if_stack
|
||||
{
|
||||
struct if_stack *next; /* for chaining to the next stack frame */
|
||||
char *fname; /* copied from input when frame is made */
|
||||
int lineno; /* similarly */
|
||||
int if_succeeded; /* true if a leg of this if-group
|
||||
* has been passed through rescan */
|
||||
unsigned char *control_macro; /* For #ifndef at start of file,
|
||||
* this is the macro name tested. */
|
||||
enum node_type type; /* type of last directive seen in this group */
|
||||
};
|
||||
typedef struct if_stack IF_STACK_FRAME;
|
||||
|
||||
extern void cpp_buf_line_and_col PARAMS((cpp_buffer*, long*, long*));
|
||||
extern cpp_buffer* cpp_file_buffer PARAMS((cpp_reader*));
|
||||
extern void cpp_define PARAMS ((cpp_reader*, unsigned char*));
|
||||
extern void cpp_buf_line_and_col PARAMS((cpp_buffer *, long *, long *));
|
||||
extern cpp_buffer *cpp_file_buffer PARAMS((cpp_reader *));
|
||||
extern void cpp_define PARAMS((cpp_reader *, unsigned char *));
|
||||
|
||||
extern void cpp_error ();
|
||||
extern void cpp_warning ();
|
||||
extern void cpp_pedwarn ();
|
||||
extern void cpp_error_with_line ();
|
||||
extern void cpp_pedwarn_with_line ();
|
||||
extern void cpp_pedwarn_with_file_and_line ();
|
||||
extern void fatal ();
|
||||
extern void cpp_error_from_errno ();
|
||||
extern void cpp_perror_with_name ();
|
||||
extern void cpp_pfatal_with_name ();
|
||||
extern void cpp_error();
|
||||
extern void cpp_warning();
|
||||
extern void cpp_pedwarn();
|
||||
extern void cpp_error_with_line();
|
||||
extern void cpp_pedwarn_with_line();
|
||||
extern void cpp_pedwarn_with_file_and_line();
|
||||
extern void fatal();
|
||||
extern void cpp_error_from_errno();
|
||||
extern void cpp_perror_with_name();
|
||||
extern void cpp_pfatal_with_name();
|
||||
|
||||
extern void cpp_grow_buffer PARAMS ((cpp_reader*, long));
|
||||
extern int cpp_parse_escape PARAMS ((cpp_reader*, char**));
|
||||
extern cpp_buffer* cpp_push_buffer PARAMS ((cpp_reader *, unsigned char*, long));
|
||||
extern cpp_buffer* cpp_pop_buffer PARAMS ((cpp_reader *));
|
||||
extern void cpp_grow_buffer PARAMS((cpp_reader *, long));
|
||||
extern int cpp_parse_escape PARAMS((cpp_reader *, char **));
|
||||
extern cpp_buffer *cpp_push_buffer
|
||||
PARAMS((cpp_reader *, unsigned char *, long));
|
||||
extern cpp_buffer *cpp_pop_buffer PARAMS((cpp_reader *));
|
||||
|
||||
extern cpp_hashnode* cpp_lookup PARAMS ((cpp_reader*, const unsigned char*,
|
||||
int, int));
|
||||
extern cpp_hashnode *cpp_lookup PARAMS((cpp_reader *, const unsigned char *,
|
||||
int, int));
|
||||
|
||||
#ifdef __EMX__
|
||||
#define PATH_SEPARATOR ';'
|
||||
|
|
108
epp/header.h
108
epp/header.h
|
@ -20,55 +20,63 @@
|
|||
|
||||
struct directive
|
||||
{
|
||||
int length;
|
||||
int (*func) ();
|
||||
char *name;
|
||||
enum node_type type;
|
||||
char command_reads_line;
|
||||
char traditional_comments;
|
||||
char pass_thru;
|
||||
int length;
|
||||
int (*func) ();
|
||||
char *name;
|
||||
enum node_type type;
|
||||
char command_reads_line;
|
||||
char traditional_comments;
|
||||
char pass_thru;
|
||||
};
|
||||
|
||||
void *xmalloc(unsigned size);
|
||||
void *xrealloc(void *old, unsigned size);
|
||||
void *xcalloc(unsigned number, unsigned size);
|
||||
void cpp_print_containing_files(cpp_reader *pfile);
|
||||
void cpp_file_line_for_message(cpp_reader *pfile, char *filename, int line,
|
||||
int column);
|
||||
void cpp_message(cpp_reader *pfile, int is_error, char *msg, char *arg1,
|
||||
char *arg2, char *arg3);
|
||||
void cpp_pfatal_with_name(cpp_reader *pfile, char *name);
|
||||
struct operation parse_number(cpp_reader *pfile, char *start, int olen);
|
||||
struct operation cpp_lex(cpp_reader *pfile);
|
||||
int cpp_parse_escape(cpp_reader *pfile, char **string_ptr);
|
||||
HOST_WIDE_INT cpp_parse_expr(cpp_reader *pfile);
|
||||
void cpp_grow_buffer(cpp_reader *pfile, long n);
|
||||
void cpp_define(cpp_reader *pfile, unsigned char *str);
|
||||
void init_parse_options(struct cpp_options *opts);
|
||||
enum cpp_token null_underflow(cpp_reader *pfile);
|
||||
int null_cleanup(cpp_buffer *pbuf, cpp_reader *pfile);
|
||||
int macro_cleanup(cpp_buffer *pbuf, cpp_reader *pfile);
|
||||
int file_cleanup(cpp_buffer *pbuf, cpp_reader *pfile);
|
||||
void cpp_skip_hspace(cpp_reader *pfile);
|
||||
void copy_rest_of_line(cpp_reader *pfile);
|
||||
void skip_rest_of_line(cpp_reader *pfile);
|
||||
int handle_directive(cpp_reader *pfile);
|
||||
cpp_buffer *cpp_push_buffer(cpp_reader *pfile, unsigned char *buffer, long length);
|
||||
cpp_buffer *cpp_pop_buffer(cpp_reader *pfile);
|
||||
void cpp_scan_buffer(cpp_reader *pfile);
|
||||
void cpp_buf_line_and_col(cpp_buffer *pbuf, long *linep, long *colp);
|
||||
int hashf(const unsigned char *name,int len, int hashsize);
|
||||
void cpp_hash_cleanup(cpp_reader *pfile);
|
||||
int cpp_read_check(cpp_reader *pfile);
|
||||
int parse_name(cpp_reader *pfile, int c);
|
||||
void init_parse_file(cpp_reader *pfile);
|
||||
void init_parse_options(struct cpp_options *opts);
|
||||
int push_parse_file(cpp_reader *pfile, char *fname);
|
||||
void cpp_finish(cpp_reader *pfile);
|
||||
cpp_buffer *cpp_file_buffer(cpp_reader *pfile);
|
||||
int cpp_read_check_assertion(cpp_reader *pfile);
|
||||
void fancy_abort(void);
|
||||
enum cpp_token cpp_get_token(cpp_reader *pfile);
|
||||
enum cpp_token cpp_get_non_space_token(cpp_reader *pfile);
|
||||
int cpp_handle_options(cpp_reader *pfile, int argc, char **argv);
|
||||
void cpp_print_file_and_line(cpp_reader *pfile);
|
||||
void *xmalloc(unsigned size);
|
||||
void *xrealloc(void *old, unsigned size);
|
||||
void *xcalloc(unsigned number, unsigned size);
|
||||
void cpp_print_containing_files(cpp_reader * pfile);
|
||||
void cpp_file_line_for_message(cpp_reader * pfile,
|
||||
char *filename, int line,
|
||||
|
||||
int column);
|
||||
void cpp_message(cpp_reader * pfile, int is_error, char *msg,
|
||||
char *arg1, char *arg2, char *arg3);
|
||||
void cpp_pfatal_with_name(cpp_reader * pfile, char *name);
|
||||
struct operation parse_number(cpp_reader * pfile, char *start, int olen);
|
||||
struct operation cpp_lex(cpp_reader * pfile);
|
||||
int cpp_parse_escape(cpp_reader * pfile, char **string_ptr);
|
||||
HOST_WIDE_INT cpp_parse_expr(cpp_reader * pfile);
|
||||
void cpp_grow_buffer(cpp_reader * pfile, long n);
|
||||
void cpp_define(cpp_reader * pfile, unsigned char *str);
|
||||
void init_parse_options(struct cpp_options *opts);
|
||||
enum cpp_token null_underflow(cpp_reader * pfile);
|
||||
int null_cleanup(cpp_buffer * pbuf, cpp_reader * pfile);
|
||||
int macro_cleanup(cpp_buffer * pbuf, cpp_reader * pfile);
|
||||
int file_cleanup(cpp_buffer * pbuf, cpp_reader * pfile);
|
||||
void cpp_skip_hspace(cpp_reader * pfile);
|
||||
void copy_rest_of_line(cpp_reader * pfile);
|
||||
void skip_rest_of_line(cpp_reader * pfile);
|
||||
int handle_directive(cpp_reader * pfile);
|
||||
cpp_buffer *cpp_push_buffer(cpp_reader * pfile, unsigned char *buffer,
|
||||
|
||||
long length);
|
||||
cpp_buffer *cpp_pop_buffer(cpp_reader * pfile);
|
||||
void cpp_scan_buffer(cpp_reader * pfile);
|
||||
void cpp_buf_line_and_col(cpp_buffer * pbuf, long *linep,
|
||||
|
||||
long *colp);
|
||||
int hashf(const unsigned char *name, int len, int hashsize);
|
||||
void cpp_hash_cleanup(cpp_reader * pfile);
|
||||
int cpp_read_check(cpp_reader * pfile);
|
||||
int parse_name(cpp_reader * pfile, int c);
|
||||
void init_parse_file(cpp_reader * pfile);
|
||||
void init_parse_options(struct cpp_options *opts);
|
||||
int push_parse_file(cpp_reader * pfile, char *fname);
|
||||
void cpp_finish(cpp_reader * pfile);
|
||||
cpp_buffer *cpp_file_buffer(cpp_reader * pfile);
|
||||
int cpp_read_check_assertion(cpp_reader * pfile);
|
||||
void fancy_abort(void);
|
||||
enum cpp_token cpp_get_token(cpp_reader * pfile);
|
||||
enum cpp_token cpp_get_non_space_token(cpp_reader * pfile);
|
||||
int cpp_handle_options(cpp_reader * pfile, int argc,
|
||||
|
||||
char **argv);
|
||||
void cpp_print_file_and_line(cpp_reader * pfile);
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
#define E_CHECKOUT_DATE "$Date$"
|
Loading…
Reference in New Issue