File: ucppi.h

package info (click to toggle)
libconvert-binary-c-perl 0.74-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 9,100 kB
  • ctags: 21,416
  • sloc: ansic: 63,666; perl: 18,582; yacc: 2,143; makefile: 44
file content (241 lines) | stat: -rw-r--r-- 7,510 bytes parent folder | download | duplicates (6)
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