a2223c7302
doesn't depend on the 'comp' set. ok espie@ deraadt@
197 lines
5.8 KiB
C
197 lines
5.8 KiB
C
/*
|
|
* (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"
|
|
|
|
/*
|
|
* 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 {
|
|
hash_item_header head; /* 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
|
|
#define wipe_assertions ucpp_wipe_assertions
|
|
|
|
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 *);
|
|
void wipe_assertions(void);
|
|
|
|
/*
|
|
* 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_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 wipe_macros ucpp_wipe_macros
|
|
#define dsharp_lexer ucpp_dsharp_lexer
|
|
#define compile_time ucpp_compile_time
|
|
#define compile_date ucpp_compile_date
|
|
#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 *);
|
|
void wipe_macros(void);
|
|
|
|
extern struct lexer_state dsharp_lexer;
|
|
extern char compile_time[], compile_date[];
|
|
#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
|