4 * Basic tokenization structures. NOTE! Those tokens had better
5 * be pretty small, since we're going to keep them all in memory
8 * Copyright (C) 2003 Transmeta Corp.
11 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
18 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
30 #include <sys/types.h>
34 * This describes the pure lexical elements (tokens), with
35 * no semantic meaning. In other words, an identifier doesn't
36 * have a type or meaning, it is only a specific string in
39 * Semantic meaning is handled elsewhere.
43 CONSTANT_FILE_MAYBE
, // To be determined, not inside any #ifs in this file
44 CONSTANT_FILE_IFNDEF
, // To be determined, currently inside #ifndef
45 CONSTANT_FILE_NOPE
, // No
46 CONSTANT_FILE_YES
// Yes
49 extern const char *includepath
[];
54 const char *path
; // input-file path - see set_stream_include_path()
55 const char **next_path
;
56 struct position pos
; //position of the #include, if any
58 /* Use these to check for "already parsed" */
59 enum constantfile constant
;
60 int dirty
, next_stream
, once
;
61 struct ident
*protect
;
66 extern int input_stream_nr
;
67 extern struct stream
*input_streams
;
68 extern unsigned int tabstop
;
70 extern int *hash_stream(const char *name
);
73 struct ident
*next
; /* Hash chain of identifiers */
74 struct symbol
*symbols
; /* Pointer to semantic meaning list */
75 unsigned char len
; /* Length of identifier name */
76 unsigned char tainted
:1,
79 char name
[]; /* Actual identifier */
90 TOKEN_CHAR_EMBEDDED_0
,
91 TOKEN_CHAR_EMBEDDED_1
,
92 TOKEN_CHAR_EMBEDDED_2
,
93 TOKEN_CHAR_EMBEDDED_3
,
95 TOKEN_WIDE_CHAR_EMBEDDED_0
,
96 TOKEN_WIDE_CHAR_EMBEDDED_1
,
97 TOKEN_WIDE_CHAR_EMBEDDED_2
,
98 TOKEN_WIDE_CHAR_EMBEDDED_3
,
104 TOKEN_MACRO_ARGUMENT
,
106 TOKEN_QUOTED_ARGUMENT
,
116 /* Combination tokens */
117 #define COMBINATION_STRINGS { \
129 "<<=", ">>=", "...", \
131 "<", ">", "<=", ">=" \
134 extern unsigned char combinations
[][4];
138 SPECIAL_ADD_ASSIGN
= SPECIAL_BASE
,
162 SPECIAL_ARG_SEPARATOR
,
165 SPECIAL_UNSIGNED_LTE
,
166 SPECIAL_UNSIGNED_GTE
,
170 unsigned int length
:31;
171 unsigned int immutable
:1;
175 /* will fit into 32 bits */
184 * This is a very common data structure, it should be kept
185 * as small as humanly possible. Big (rare) types go as
194 unsigned int special
;
195 struct string
*string
;
197 struct argcount count
;
202 #define MAX_STRING 8191
204 static inline struct token
*containing_token(struct token
**p
)
206 void *addr
= (char *)p
- offsetof(struct token
, next
);
210 #define token_type(x) ((x)->pos.type)
213 * Last token in the stream - points to itself.
214 * This allows us to not test for NULL pointers
215 * when following the token->next chain..
217 extern struct token eof_token_entry
;
218 #define eof_token(x) ((x) == &eof_token_entry)
220 extern int init_stream(const struct position
*pos
, const char *, int fd
, const char **next_path
);
221 extern int stream_prev(int stream
);
222 extern const char *stream_name(int stream
);
223 struct ident
*alloc_ident(const char *name
, int len
);
224 extern struct ident
*hash_ident(struct ident
*);
225 extern struct ident
*built_in_ident(const char *);
226 extern struct token
*built_in_token(int, struct ident
*);
227 extern const char *show_special(int);
228 extern const char *show_ident(const struct ident
*);
229 extern const char *show_string(const struct string
*string
);
230 extern const char *show_token(const struct token
*);
231 extern const char *quote_token(const struct token
*);
232 extern struct token
* tokenize(const struct position
*pos
, const char *, int, struct token
*, const char **next_path
);
233 extern struct token
* tokenize_buffer(void *, unsigned long, struct token
**);
235 extern void show_identifier_stats(void);
236 extern void init_include_path(void);
237 extern struct token
*preprocess(struct token
*);
239 extern void store_all_tokens(struct token
*token
);
240 extern struct token
*pos_get_token(struct position pos
);
241 extern char *pos_ident(struct position pos
);
243 extern void store_macro_pos(struct token
*);
244 extern char *get_macro_name(struct position pos
);
245 extern char *get_inner_macro(struct position pos
);
246 extern struct string_list
*get_all_macros(struct position pos
);
248 static inline int match_op(struct token
*token
, unsigned int op
)
250 return token
->pos
.type
== TOKEN_SPECIAL
&& token
->special
== op
;
253 static inline int match_ident(struct token
*token
, struct ident
*id
)
255 return token
->pos
.type
== TOKEN_IDENT
&& token
->ident
== id
;
258 static inline int match_token_zero(struct token
*token
)
260 if (token_type(token
) != TOKEN_NUMBER
)
262 return token
->number
[0] == '0' && !token
->number
[1];