| /* |
| * (c) Thomas Pornin 1999, 2000 |
| * |
| * 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 "cpp.h" |
| #include "tune.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_init_cppm |
| #define put_char ucpp_put_char |
| #define discard_char ucpp_discard_char |
| #define next_token ucpp_next_token |
| #define grap_char ucpp_grap_char |
| #define space_char ucpp_space_char |
| |
| void init_cppm(void); |
| void put_char(struct lexer_state *, unsigned char); |
| void discard_char(struct lexer_state *); |
| int next_token(struct lexer_state *); |
| int grap_char(struct lexer_state *); |
| int space_char(int); |
| |
| /* |
| * from assert.c |
| */ |
| struct assert { |
| char *name; /* this must be the first field */ |
| size_t nbval; |
| struct token_fifo *val; |
| }; |
| |
| #define cmp_token_list ucpp_cmp_token_list |
| #define handle_assert ucpp_handle_assert |
| #define handle_unassert ucpp_handle_unassert |
| #define get_assertion ucpp_get_assertion |
| |
| int cmp_token_list(struct token_fifo *, struct token_fifo *); |
| int handle_assert(struct lexer_state *); |
| int handle_unassert(struct lexer_state *); |
| struct assert *get_assertion(char *); |
| |
| /* |
| * from macro.c |
| */ |
| struct macro { |
| char *name; /* this must be the 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_print_token |
| #define handle_define ucpp_handle_define |
| #define handle_undef ucpp_handle_undef |
| #define handle_ifdef ucpp_handle_ifdef |
| #define handle_ifndef ucpp_handle_ifndef |
| #define substitute_macro ucpp_substitute_macro |
| #define get_macro ucpp_get_macro |
| #define dsharp_lexer ucpp_dsharp_lexer |
| #define compile_time ucpp_compile_time |
| #define compile_date ucpp_compile_date |
| #define compile_adate ucpp_compile_adate |
| #ifdef PRAGMA_TOKENIZE |
| #define tokenize_lexer ucpp_tokenize_lexer |
| #endif |
| |
| void print_token(struct lexer_state *, struct token *, long); |
| int handle_define(struct lexer_state *); |
| int handle_undef(struct lexer_state *); |
| int handle_ifdef(struct lexer_state *); |
| int handle_ifndef(struct lexer_state *); |
| int substitute_macro(struct lexer_state *, struct macro *, |
| struct token_fifo *, int, int, long); |
| struct macro *get_macro(char *); |
| |
| extern struct lexer_state dsharp_lexer; |
| extern char compile_time[], compile_date[], compile_adate[]; |
| #ifdef PRAGMA_TOKENIZE |
| extern struct lexer_state tokenize_lexer; |
| #endif |
| |
| /* |
| * from eval.c |
| */ |
| #define strtoconst ucpp_strtoconst |
| #define eval_expr ucpp_eval_expr |
| #define eval_line ucpp_eval_line |
| |
| unsigned long strtoconst(char *); |
| unsigned long eval_expr(struct token_fifo *, int *, int); |
| extern long eval_line; |
| |
| #define eval_exception ucpp_eval_exception |
| |
| #ifdef POSIX_JMP |
| #define JMP_BUF sigjmp_buf |
| #define catch(x) sigsetjmp((x), 0) |
| #define throw(x) siglongjmp((x), 1) |
| #else |
| #define JMP_BUF jmp_buf |
| #define catch(x) setjmp((x)) |
| #define throw(x) longjmp((x), 1) |
| #endif |
| extern JMP_BUF eval_exception; |
| |
| /* |
| * from cpp.c |
| */ |
| #define token_name ucpp_token_name |
| #define throw_away ucpp_throw_away |
| #define garbage_collect ucpp_garbage_collect |
| #define init_buf_lexer_state ucpp_init_buf_lexer_state |
| #ifdef PRAGMA_TOKENIZE |
| #define compress_token_list ucpp_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 |
| |
| #define ouch ucpp_ouch |
| #define error ucpp_error |
| #define warning ucpp_warning |
| |
| #endif |