/*
 * (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
