1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
|
/*
* (c) Thomas Pornin 1999 - 2002
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 4. The name of the authors may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#ifndef UCPP__UCPPI__
#define UCPP__UCPPI__
#include "tune.h"
#include "cpp.h"
#include "nhash.h"
#include "reent.h"
/*
* A macro represented in a compact form; simple tokens are represented
* by one byte, containing their number. Tokens with a string value are
* followed by the value (string finished by a 0). Macro arguments are
* followed by the argument number (in one byte -- thus implying a hard
* limit of 254 arguments (number 255 is for __VA_ARGS__).
*/
struct comp_token_fifo {
size_t length;
size_t rp;
unsigned char *t;
};
/* These declarations are used only internally by ucpp */
/*
* S_TOKEN(x) checks whether x is a token type with an embedded string
* ttMWS(x) checks whether x is macro whitespace (space, comment...)
* ttWHI(x) checks whether x is whitespace (MWS or newline)
*/
#define S_TOKEN(x) STRING_TOKEN(x)
#define ttMWS(x) ((x) == NONE || (x) == COMMENT || (x) == OPT_NONE)
#define ttWHI(x) (ttMWS(x) || (x) == NEWLINE)
/*
* Function prototypes
*/
/*
* from lexer.c
*/
#define init_cppm UCPP_PRIVATE(init_cppm)
#define put_char UCPP_PRIVATE(put_char)
#define discard_char UCPP_PRIVATE(discard_char)
#define next_token UCPP_PRIVATE(next_token)
#define grap_char UCPP_PRIVATE(grap_char)
#define space_char UCPP_PRIVATE(space_char)
void init_cppm(pCPP);
void put_char(pCPP_ struct lexer_state *, unsigned char);
void discard_char(pCPP_ struct lexer_state *);
int next_token(pCPP_ struct lexer_state *);
int grap_char(pCPP_ struct lexer_state *);
int space_char(int);
#ifdef UCPP_REENTRANT
#define new_cppm UCPP_PRIVATE(new_cppm)
#define del_cppm UCPP_PRIVATE(del_cppm)
CPPM new_cppm(void);
void del_cppm(CPPM);
#endif
#ifdef UCPP_CLONE
#define clone_cppm UCPP_PRIVATE(clone_cppm)
CPPM clone_cppm(const CPPM);
#endif
/*
* from assert.c
*/
struct assert {
hash_item_header head; /* first field */
size_t nbval;
struct token_fifo *val;
};
#define cmp_token_list UCPP_PRIVATE(cmp_token_list)
#define handle_assert UCPP_PRIVATE(handle_assert)
#define handle_unassert UCPP_PRIVATE(handle_unassert)
#define get_assertion UCPP_PRIVATE(get_assertion)
#define wipe_assertions UCPP_PRIVATE(wipe_assertions)
int cmp_token_list(struct token_fifo *, struct token_fifo *);
int handle_assert(pCPP_ struct lexer_state *);
int handle_unassert(pCPP_ struct lexer_state *);
struct assert *get_assertion(pCPP_ char *);
void wipe_assertions(pCPP);
/*
* from macro.c
*/
struct macro {
hash_item_header head; /* first field */
int narg;
char **arg;
int nest;
int vaarg;
#ifdef LOW_MEM
struct comp_token_fifo cval;
#else
struct token_fifo val;
#endif
};
#define print_token UCPP_PRIVATE(print_token)
#define handle_define UCPP_PRIVATE(handle_define)
#define handle_undef UCPP_PRIVATE(handle_undef)
#define handle_ifdef UCPP_PRIVATE(handle_ifdef)
#define handle_ifndef UCPP_PRIVATE(handle_ifndef)
#define substitute_macro UCPP_PRIVATE(substitute_macro)
#define get_macro UCPP_PRIVATE(get_macro)
#define wipe_macros UCPP_PRIVATE(wipe_macros)
void print_token(pCPP_ struct lexer_state *, struct token *, long);
int handle_define(pCPP_ struct lexer_state *);
int handle_undef(pCPP_ struct lexer_state *);
int handle_ifdef(pCPP_ struct lexer_state *);
int handle_ifndef(pCPP_ struct lexer_state *);
int substitute_macro(pCPP_ struct lexer_state *, struct macro *,
struct token_fifo *, int, int, long);
struct macro *get_macro(pCPP_ char *);
void wipe_macros(pCPP);
#ifdef UCPP_REENTRANT
#define dsharp_lexer (REENTR->_global.dsharp_lexer)
#define compile_time (REENTR->_global.compile_time)
#define compile_date (REENTR->_global.compile_date)
#ifdef PRAGMA_TOKENIZE
#define tokenize_lexer (REENTR->_global.tokenize_lexer)
#endif
#else
#define dsharp_lexer UCPP_PRIVATE(dsharp_lexer)
#define compile_time UCPP_PRIVATE(compile_time)
#define compile_date UCPP_PRIVATE(compile_date)
extern struct lexer_state dsharp_lexer;
extern char compile_time[], compile_date[];
#ifdef PRAGMA_TOKENIZE
#define tokenize_lexer UCPP_PRIVATE(tokenize_lexer)
extern struct lexer_state tokenize_lexer;
#endif
#endif /* UCPP_REENTRANT */
/*
* from eval.c
*/
#define strtoconst UCPP_PRIVATE(strtoconst)
#define eval_expr UCPP_PRIVATE(eval_expr)
unsigned long strtoconst(pCPP_ char *);
unsigned long eval_expr(pCPP_ struct token_fifo *, int *, int);
#ifdef UCPP_REENTRANT
#define eval_line (REENTR->_global.eval_line)
#else
#define eval_line UCPP_PRIVATE(eval_line)
extern long eval_line;
#endif
#ifdef UCPP_REENTRANT
#define eval_exception (REENTR->_global.eval_exception)
#else
#define eval_exception UCPP_PRIVATE(eval_exception)
extern JMP_BUF eval_exception;
#endif
/*
* from cpp.c
*/
#define token_name UCPP_PRIVATE(token_name)
#define throw_away UCPP_PRIVATE(throw_away)
#define garbage_collect UCPP_PRIVATE(garbage_collect)
#define init_buf_lexer_state UCPP_PRIVATE(init_buf_lexer_state)
#ifdef PRAGMA_TOKENIZE
#define compress_token_list UCPP_PRIVATE(compress_token_list)
#endif
char *token_name(struct token *);
void throw_away(struct garbage_fifo *, char *);
void garbage_collect(struct garbage_fifo *);
void init_buf_lexer_state(struct lexer_state *, int);
#ifdef PRAGMA_TOKENIZE
struct comp_token_fifo compress_token_list(struct token_fifo *);
#endif
#ifdef UCPP_REENTRANT
#define no_special_macros (REENTR->no_special_macros)
#define emit_dependencies (REENTR->emit_dependencies)
#define emit_defines (REENTR->emit_defines)
#define emit_assertions (REENTR->emit_assertions)
#define c99_compliant (REENTR->c99_compliant)
#define c99_hosted (REENTR->c99_hosted)
#define emit_output (REENTR->emit_output)
#define current_filename (REENTR->current_filename)
#define current_long_filename (REENTR->current_long_filename)
#define ouch (REENTR->ucpp_ouch)
#define error (REENTR->ucpp_error)
#define warning (REENTR->ucpp_warning)
#define transient_characters (REENTR->transient_characters)
#define protect_detect (REENTR->protect_detect)
#else
#define ouch ucpp_ouch
#define error ucpp_error
#define warning ucpp_warning
#endif
#endif
|