blob: 876506bbaad37cf290a3461c991ac5685dd4d8f0 [file] [log] [blame]
Neil Booth93c803682000-10-28 17:59:06 +00001/* Part of CPP library. (Macro and #define handling.)
Zack Weinberg711b8822000-07-18 00:59:49 +00002 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1998,
Neil Booth5d8ebbd2002-01-03 21:43:09 +00003 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Zack Weinberg711b8822000-07-18 00:59:49 +00004 Written by Per Bothner, 1994.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7
8This program is free software; you can redistribute it and/or modify it
9under the terms of the GNU General Public License as published by the
10Free Software Foundation; either version 2, or (at your option) any
11later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22 In other words, you are welcome to use, share and improve this program.
23 You are forbidden to forbid anyone else to use, share and improve
24 what you give them. Help stamp out software-hoarding! */
25
26#include "config.h"
27#include "system.h"
28#include "cpplib.h"
29#include "cpphash.h"
30
Neil Booth93c803682000-10-28 17:59:06 +000031struct cpp_macro
Zack Weinberg711b8822000-07-18 00:59:49 +000032{
Neil Booth93c803682000-10-28 17:59:06 +000033 cpp_hashnode **params; /* Parameters, if any. */
Kazu Hirata6d2f8882001-10-10 11:33:39 +000034 cpp_token *expansion; /* First token of replacement list. */
Neil Booth93c803682000-10-28 17:59:06 +000035 unsigned int line; /* Starting line number. */
36 unsigned int count; /* Number of tokens in expansion. */
37 unsigned short paramc; /* Number of parameters. */
38 unsigned int fun_like : 1; /* If a function-like macro. */
Neil Booth28e0f042000-12-09 12:06:37 +000039 unsigned int variadic : 1; /* If a variadic macro. */
Neil Booth7065e132001-02-14 07:38:20 +000040 unsigned int syshdr : 1; /* If macro defined in system header. */
Zack Weinberg711b8822000-07-18 00:59:49 +000041};
42
Neil Booth93c803682000-10-28 17:59:06 +000043typedef struct macro_arg macro_arg;
44struct macro_arg
45{
Neil Booth4ed5bcf2001-09-24 22:53:12 +000046 const cpp_token **first; /* First token in unexpanded argument. */
Kazu Hirata6d2f8882001-10-10 11:33:39 +000047 const cpp_token **expanded; /* Macro-expanded argument. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +000048 const cpp_token *stringified; /* Stringified argument. */
Neil Booth93c803682000-10-28 17:59:06 +000049 unsigned int count; /* # of tokens in argument. */
50 unsigned int expanded_count; /* # of tokens in expanded argument. */
51};
Zack Weinberg711b8822000-07-18 00:59:49 +000052
Neil Booth93c803682000-10-28 17:59:06 +000053/* Macro expansion. */
54
Neil Booth29b10742000-11-13 18:40:37 +000055static int enter_macro_context PARAMS ((cpp_reader *, cpp_hashnode *));
Neil Booth644edda2001-10-02 12:57:24 +000056static int builtin_macro PARAMS ((cpp_reader *, cpp_hashnode *));
Neil Booth4ed5bcf2001-09-24 22:53:12 +000057static void push_token_context
Neil Booth644edda2001-10-02 12:57:24 +000058 PARAMS ((cpp_reader *, cpp_hashnode *, const cpp_token *, unsigned int));
Neil Booth4ed5bcf2001-09-24 22:53:12 +000059static void push_ptoken_context
Neil Booth644edda2001-10-02 12:57:24 +000060 PARAMS ((cpp_reader *, cpp_hashnode *, _cpp_buff *,
Neil Booth1e013d22001-09-26 21:44:35 +000061 const cpp_token **, unsigned int));
Neil Boothb8af0ca2001-09-26 17:52:50 +000062static _cpp_buff *collect_args PARAMS ((cpp_reader *, const cpp_hashnode *));
Neil Booth93c803682000-10-28 17:59:06 +000063static cpp_context *next_context PARAMS ((cpp_reader *));
Neil Booth4ed5bcf2001-09-24 22:53:12 +000064static const cpp_token *padding_token
65 PARAMS ((cpp_reader *, const cpp_token *));
Neil Booth93c803682000-10-28 17:59:06 +000066static void expand_arg PARAMS ((cpp_reader *, macro_arg *));
Neil Booth562a5c22002-04-21 18:46:42 +000067static const cpp_token *new_string_token PARAMS ((cpp_reader *, uchar *,
Neil Booth4ed5bcf2001-09-24 22:53:12 +000068 unsigned int));
Neil Boothd15a58c2002-01-03 18:32:55 +000069static const cpp_token *new_number_token PARAMS ((cpp_reader *, unsigned int));
Neil Booth4ed5bcf2001-09-24 22:53:12 +000070static const cpp_token *stringify_arg PARAMS ((cpp_reader *, macro_arg *));
71static void paste_all_tokens PARAMS ((cpp_reader *, const cpp_token *));
Neil Boothc9e7a602001-09-27 12:59:38 +000072static bool paste_tokens PARAMS ((cpp_reader *, const cpp_token **,
73 const cpp_token *));
Neil Boothe808ec92002-02-27 07:24:53 +000074static void replace_args PARAMS ((cpp_reader *, cpp_hashnode *, cpp_macro *,
75 macro_arg *));
Neil Boothd6da8362001-10-08 06:15:14 +000076static _cpp_buff *funlike_invocation_p PARAMS ((cpp_reader *, cpp_hashnode *));
Neil Booth93c803682000-10-28 17:59:06 +000077
Neil Booth93c803682000-10-28 17:59:06 +000078/* #define directive parsing and handling. */
79
Neil Booth14baae02001-09-17 18:26:12 +000080static cpp_token *alloc_expansion_token PARAMS ((cpp_reader *, cpp_macro *));
Neil Booth93c803682000-10-28 17:59:06 +000081static cpp_token *lex_expansion_token PARAMS ((cpp_reader *, cpp_macro *));
Neil Booth4d6baaf2001-11-26 23:44:54 +000082static int warn_of_redefinition PARAMS ((const cpp_hashnode *,
Neil Booth618cdda2001-02-25 09:43:03 +000083 const cpp_macro *));
Neil Booth93c803682000-10-28 17:59:06 +000084static int save_parameter PARAMS ((cpp_reader *, cpp_macro *, cpp_hashnode *));
85static int parse_params PARAMS ((cpp_reader *, cpp_macro *));
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +000086static void check_trad_stringification PARAMS ((cpp_reader *,
Neil Booth93c803682000-10-28 17:59:06 +000087 const cpp_macro *,
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +000088 const cpp_string *));
Zack Weinberg711b8822000-07-18 00:59:49 +000089
Neil Booth4ed5bcf2001-09-24 22:53:12 +000090/* Allocates and returns a CPP_STRING token, containing TEXT of length
91 LEN, after null-terminating it. TEXT must be in permanent storage. */
92static const cpp_token *
93new_string_token (pfile, text, len)
94 cpp_reader *pfile;
95 unsigned char *text;
Neil Booth93c803682000-10-28 17:59:06 +000096 unsigned int len;
Zack Weinberg711b8822000-07-18 00:59:49 +000097{
Neil Booth4ed5bcf2001-09-24 22:53:12 +000098 cpp_token *token = _cpp_temp_token (pfile);
Zack Weinberg711b8822000-07-18 00:59:49 +000099
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000100 text[len] = '\0';
Neil Booth93c803682000-10-28 17:59:06 +0000101 token->type = CPP_STRING;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000102 token->val.str.len = len;
103 token->val.str.text = text;
Neil Booth93c803682000-10-28 17:59:06 +0000104 token->flags = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000105 return token;
Neil Booth93c803682000-10-28 17:59:06 +0000106}
107
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000108/* Allocates and returns a CPP_NUMBER token evaluating to NUMBER. */
109static const cpp_token *
110new_number_token (pfile, number)
Neil Booth93c803682000-10-28 17:59:06 +0000111 cpp_reader *pfile;
Neil Boothd15a58c2002-01-03 18:32:55 +0000112 unsigned int number;
Neil Booth93c803682000-10-28 17:59:06 +0000113{
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000114 cpp_token *token = _cpp_temp_token (pfile);
Neil Boothd15a58c2002-01-03 18:32:55 +0000115 /* 21 bytes holds all NUL-terminated unsigned 64-bit numbers. */
116 unsigned char *buf = _cpp_unaligned_alloc (pfile, 21);
Neil Booth93c803682000-10-28 17:59:06 +0000117
Neil Boothd15a58c2002-01-03 18:32:55 +0000118 sprintf ((char *) buf, "%u", number);
Neil Booth93c803682000-10-28 17:59:06 +0000119 token->type = CPP_NUMBER;
120 token->val.str.text = buf;
121 token->val.str.len = ustrlen (buf);
122 token->flags = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000123 return token;
Neil Booth93c803682000-10-28 17:59:06 +0000124}
125
126static const char * const monthnames[] =
127{
128 "Jan", "Feb", "Mar", "Apr", "May", "Jun",
129 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
130};
131
Neil Booth644edda2001-10-02 12:57:24 +0000132/* Handle builtin macros like __FILE__, and push the resulting token
133 on the context stack. Also handles _Pragma, for which no new token
Neil Boothd15a58c2002-01-03 18:32:55 +0000134 is created. Returns 1 if it generates a new token context, 0 to
135 return the token to the caller. */
Neil Booth644edda2001-10-02 12:57:24 +0000136static int
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000137builtin_macro (pfile, node)
Neil Booth93c803682000-10-28 17:59:06 +0000138 cpp_reader *pfile;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000139 cpp_hashnode *node;
Neil Booth93c803682000-10-28 17:59:06 +0000140{
Neil Booth644edda2001-10-02 12:57:24 +0000141 const cpp_token *result;
142
Neil Booth93c803682000-10-28 17:59:06 +0000143 switch (node->value.builtin)
144 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000145 default:
Neil Boothebef4e82002-04-14 18:42:47 +0000146 cpp_error (pfile, DL_ICE, "invalid built-in macro \"%s\"",
147 NODE_NAME (node));
Neil Booth644edda2001-10-02 12:57:24 +0000148 return 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000149
Neil Booth93c803682000-10-28 17:59:06 +0000150 case BT_FILE:
151 case BT_BASE_FILE:
Zack Weinberg711b8822000-07-18 00:59:49 +0000152 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000153 unsigned int len;
Neil Booth0bda4762000-12-11 07:45:16 +0000154 const char *name;
Neil Booth562a5c22002-04-21 18:46:42 +0000155 uchar *buf;
Neil Boothbb74c962001-08-17 22:23:49 +0000156 const struct line_map *map = pfile->map;
Neil Booth93c803682000-10-28 17:59:06 +0000157
Neil Booth0bda4762000-12-11 07:45:16 +0000158 if (node->value.builtin == BT_BASE_FILE)
Neil Boothbb74c962001-08-17 22:23:49 +0000159 while (! MAIN_FILE_P (map))
160 map = INCLUDED_FROM (&pfile->line_maps, map);
Neil Booth93c803682000-10-28 17:59:06 +0000161
Neil Boothbb74c962001-08-17 22:23:49 +0000162 name = map->to_file;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000163 len = strlen (name);
Neil Boothece54d52001-09-28 09:40:22 +0000164 buf = _cpp_unaligned_alloc (pfile, len * 4 + 1);
Zack Weinbergdcc229e2002-03-14 18:17:18 +0000165 len = cpp_quote_string (buf, (const unsigned char *) name, len) - buf;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000166
Neil Booth644edda2001-10-02 12:57:24 +0000167 result = new_string_token (pfile, buf, len);
Zack Weinberg711b8822000-07-18 00:59:49 +0000168 }
Neil Booth644edda2001-10-02 12:57:24 +0000169 break;
170
Neil Booth93c803682000-10-28 17:59:06 +0000171 case BT_INCLUDE_LEVEL:
Neil Boothd8693c62001-08-21 23:05:12 +0000172 /* The line map depth counts the primary source as level 1, but
173 historically __INCLUDE_DEPTH__ has called the primary source
174 level 0. */
Neil Booth644edda2001-10-02 12:57:24 +0000175 result = new_number_token (pfile, pfile->line_maps.depth - 1);
176 break;
Neil Booth93c803682000-10-28 17:59:06 +0000177
178 case BT_SPECLINE:
179 /* If __LINE__ is embedded in a macro, it must expand to the
180 line of the macro's invocation, not its definition.
181 Otherwise things like assert() will not work properly. */
Neil Booth644edda2001-10-02 12:57:24 +0000182 result = new_number_token (pfile,
183 SOURCE_LINE (pfile->map,
184 pfile->cur_token[-1].line));
185 break;
Neil Booth93c803682000-10-28 17:59:06 +0000186
187 case BT_STDC:
188 {
Neil Booth618cdda2001-02-25 09:43:03 +0000189 int stdc = (!CPP_IN_SYSTEM_HEADER (pfile)
190 || pfile->spec_nodes.n__STRICT_ANSI__->type != NT_VOID);
Neil Booth644edda2001-10-02 12:57:24 +0000191 result = new_number_token (pfile, stdc);
Neil Booth93c803682000-10-28 17:59:06 +0000192 }
Neil Booth644edda2001-10-02 12:57:24 +0000193 break;
Neil Booth93c803682000-10-28 17:59:06 +0000194
195 case BT_DATE:
196 case BT_TIME:
197 if (pfile->date.type == CPP_EOF)
198 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000199 /* Allocate __DATE__ and __TIME__ strings from permanent
200 storage. We only do this once, and don't generate them
201 at init time, because time() and localtime() are very
202 slow on some systems. */
Neil Booth93c803682000-10-28 17:59:06 +0000203 time_t tt = time (NULL);
204 struct tm *tb = localtime (&tt);
205
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000206 pfile->date.val.str.text =
Neil Boothece54d52001-09-28 09:40:22 +0000207 _cpp_unaligned_alloc (pfile, sizeof ("Oct 11 1347"));
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000208 pfile->date.val.str.len = sizeof ("Oct 11 1347") - 1;
209 pfile->date.type = CPP_STRING;
210 pfile->date.flags = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000211 sprintf ((char *) pfile->date.val.str.text, "%s %2d %4d",
212 monthnames[tb->tm_mon], tb->tm_mday, tb->tm_year + 1900);
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000213
214 pfile->time.val.str.text =
Neil Boothece54d52001-09-28 09:40:22 +0000215 _cpp_unaligned_alloc (pfile, sizeof ("12:34:56"));
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000216 pfile->time.val.str.len = sizeof ("12:34:56") - 1;
217 pfile->time.type = CPP_STRING;
218 pfile->time.flags = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000219 sprintf ((char *) pfile->time.val.str.text, "%02d:%02d:%02d",
220 tb->tm_hour, tb->tm_min, tb->tm_sec);
221 }
Neil Booth93c803682000-10-28 17:59:06 +0000222
Neil Booth644edda2001-10-02 12:57:24 +0000223 if (node->value.builtin == BT_DATE)
224 result = &pfile->date;
225 else
226 result = &pfile->time;
227 break;
228
229 case BT_PRAGMA:
230 /* Don't interpret _Pragma within directives. The standard is
231 not clear on this, but to me this makes most sense. */
232 if (pfile->state.in_directive)
233 return 0;
234
235 _cpp_do__Pragma (pfile);
236 return 1;
Neil Booth93c803682000-10-28 17:59:06 +0000237 }
Neil Booth644edda2001-10-02 12:57:24 +0000238
239 push_token_context (pfile, NULL, result, 1);
240 return 1;
Neil Booth93c803682000-10-28 17:59:06 +0000241}
242
Neil Boothd15a58c2002-01-03 18:32:55 +0000243/* Copies SRC, of length LEN, to DEST, adding backslashes before all
244 backslashes and double quotes. Non-printable characters are
Zack Weinbergdcc229e2002-03-14 18:17:18 +0000245 converted to octal. DEST must be of sufficient size. Returns
246 a pointer to the end of the string. */
Neil Booth562a5c22002-04-21 18:46:42 +0000247uchar *
Zack Weinbergdcc229e2002-03-14 18:17:18 +0000248cpp_quote_string (dest, src, len)
Neil Booth562a5c22002-04-21 18:46:42 +0000249 uchar *dest;
250 const uchar *src;
Neil Booth93c803682000-10-28 17:59:06 +0000251 unsigned int len;
252{
253 while (len--)
254 {
Neil Booth562a5c22002-04-21 18:46:42 +0000255 uchar c = *src++;
Neil Booth93c803682000-10-28 17:59:06 +0000256
257 if (c == '\\' || c == '"')
258 {
259 *dest++ = '\\';
260 *dest++ = c;
261 }
262 else
263 {
264 if (ISPRINT (c))
265 *dest++ = c;
266 else
267 {
268 sprintf ((char *) dest, "\\%03o", c);
269 dest += 4;
270 }
271 }
272 }
273
274 return dest;
275}
276
Neil Boothd15a58c2002-01-03 18:32:55 +0000277/* Convert a token sequence ARG to a single string token according to
278 the rules of the ISO C #-operator. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000279static const cpp_token *
Neil Booth93c803682000-10-28 17:59:06 +0000280stringify_arg (pfile, arg)
281 cpp_reader *pfile;
282 macro_arg *arg;
283{
Neil Boothece54d52001-09-28 09:40:22 +0000284 unsigned char *dest = BUFF_FRONT (pfile->u_buff);
285 unsigned int i, escape_it, backslash_count = 0;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000286 const cpp_token *source = NULL;
Neil Boothece54d52001-09-28 09:40:22 +0000287 size_t len;
Neil Booth93c803682000-10-28 17:59:06 +0000288
289 /* Loop, reading in the argument's tokens. */
290 for (i = 0; i < arg->count; i++)
291 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000292 const cpp_token *token = arg->first[i];
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000293
294 if (token->type == CPP_PADDING)
295 {
296 if (source == NULL)
297 source = token->val.source;
298 continue;
299 }
Neil Booth93c803682000-10-28 17:59:06 +0000300
301 escape_it = (token->type == CPP_STRING || token->type == CPP_WSTRING
Zack Weinbergcc937582001-03-07 01:32:01 +0000302 || token->type == CPP_CHAR || token->type == CPP_WCHAR);
Neil Booth93c803682000-10-28 17:59:06 +0000303
Neil Boothece54d52001-09-28 09:40:22 +0000304 /* Room for each char being written in octal, initial space and
305 final NUL. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000306 len = cpp_token_len (token);
Neil Booth93c803682000-10-28 17:59:06 +0000307 if (escape_it)
Neil Booth93c803682000-10-28 17:59:06 +0000308 len *= 4;
Neil Boothece54d52001-09-28 09:40:22 +0000309 len += 2;
Neil Booth93c803682000-10-28 17:59:06 +0000310
Neil Boothece54d52001-09-28 09:40:22 +0000311 if ((size_t) (BUFF_LIMIT (pfile->u_buff) - dest) < len)
Neil Booth93c803682000-10-28 17:59:06 +0000312 {
Neil Boothece54d52001-09-28 09:40:22 +0000313 size_t len_so_far = dest - BUFF_FRONT (pfile->u_buff);
Neil Booth8c3b2692001-09-30 10:03:11 +0000314 _cpp_extend_buff (pfile, &pfile->u_buff, len);
Neil Boothece54d52001-09-28 09:40:22 +0000315 dest = BUFF_FRONT (pfile->u_buff) + len_so_far;
Neil Booth93c803682000-10-28 17:59:06 +0000316 }
317
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000318 /* Leading white space? */
Neil Boothece54d52001-09-28 09:40:22 +0000319 if (dest != BUFF_FRONT (pfile->u_buff))
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000320 {
321 if (source == NULL)
322 source = token;
323 if (source->flags & PREV_WHITE)
324 *dest++ = ' ';
325 }
326 source = NULL;
Neil Booth93c803682000-10-28 17:59:06 +0000327
328 if (escape_it)
329 {
Neil Boothece54d52001-09-28 09:40:22 +0000330 _cpp_buff *buff = _cpp_get_buff (pfile, len);
331 unsigned char *buf = BUFF_FRONT (buff);
Neil Booth93c803682000-10-28 17:59:06 +0000332 len = cpp_spell_token (pfile, token, buf) - buf;
Zack Weinbergdcc229e2002-03-14 18:17:18 +0000333 dest = cpp_quote_string (dest, buf, len);
Neil Boothece54d52001-09-28 09:40:22 +0000334 _cpp_release_buff (pfile, buff);
Neil Booth93c803682000-10-28 17:59:06 +0000335 }
336 else
337 dest = cpp_spell_token (pfile, token, dest);
Neil Booth93c803682000-10-28 17:59:06 +0000338
Neil Booth6c53ebf2000-11-06 18:43:32 +0000339 if (token->type == CPP_OTHER && token->val.c == '\\')
Neil Booth93c803682000-10-28 17:59:06 +0000340 backslash_count++;
341 else
342 backslash_count = 0;
343 }
344
345 /* Ignore the final \ of invalid string literals. */
346 if (backslash_count & 1)
347 {
Neil Boothebef4e82002-04-14 18:42:47 +0000348 cpp_error (pfile, DL_WARNING,
349 "invalid string literal, ignoring final '\\'");
Neil Boothece54d52001-09-28 09:40:22 +0000350 dest--;
Neil Booth93c803682000-10-28 17:59:06 +0000351 }
352
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000353 /* Commit the memory, including NUL, and return the token. */
Neil Boothece54d52001-09-28 09:40:22 +0000354 len = dest - BUFF_FRONT (pfile->u_buff);
355 BUFF_FRONT (pfile->u_buff) = dest + 1;
356 return new_string_token (pfile, dest - len, len);
Neil Booth93c803682000-10-28 17:59:06 +0000357}
358
Neil Boothc9e7a602001-09-27 12:59:38 +0000359/* Try to paste two tokens. On success, return non-zero. In any
360 case, PLHS is updated to point to the pasted token, which is
361 guaranteed to not have the PASTE_LEFT flag set. */
362static bool
363paste_tokens (pfile, plhs, rhs)
Neil Boothd63eefb2000-11-20 23:59:26 +0000364 cpp_reader *pfile;
Neil Boothc9e7a602001-09-27 12:59:38 +0000365 const cpp_token **plhs, *rhs;
Neil Boothd63eefb2000-11-20 23:59:26 +0000366{
Neil Boothc9e7a602001-09-27 12:59:38 +0000367 unsigned char *buf, *end;
368 const cpp_token *lhs;
369 unsigned int len;
370 bool valid;
Neil Boothd63eefb2000-11-20 23:59:26 +0000371
Neil Boothc9e7a602001-09-27 12:59:38 +0000372 lhs = *plhs;
373 len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1;
374 buf = (unsigned char *) alloca (len);
375 end = cpp_spell_token (pfile, lhs, buf);
Neil Boothd63eefb2000-11-20 23:59:26 +0000376
Neil Boothc9e7a602001-09-27 12:59:38 +0000377 /* Avoid comment headers, since they are still processed in stage 3.
378 It is simpler to insert a space here, rather than modifying the
379 lexer to ignore comments in some circumstances. Simply returning
380 false doesn't work, since we want to clear the PASTE_LEFT flag. */
381 if (lhs->type == CPP_DIV
382 && (rhs->type == CPP_MULT || rhs->type == CPP_DIV))
383 *end++ = ' ';
384 end = cpp_spell_token (pfile, rhs, end);
Neil Booth4d6baaf2001-11-26 23:44:54 +0000385 *end = '\0';
Neil Boothd63eefb2000-11-20 23:59:26 +0000386
Neil Boothc9e7a602001-09-27 12:59:38 +0000387 cpp_push_buffer (pfile, buf, end - buf, /* from_stage3 */ true, 1);
Neil Boothd63eefb2000-11-20 23:59:26 +0000388
Neil Boothc9e7a602001-09-27 12:59:38 +0000389 /* Tweak the column number the lexer will report. */
390 pfile->buffer->col_adjust = pfile->cur_token[-1].col - 1;
Neil Boothd63eefb2000-11-20 23:59:26 +0000391
Neil Boothc9e7a602001-09-27 12:59:38 +0000392 /* We don't want a leading # to be interpreted as a directive. */
393 pfile->buffer->saved_flags = 0;
Neil Boothd63eefb2000-11-20 23:59:26 +0000394
Neil Boothc9e7a602001-09-27 12:59:38 +0000395 /* Set pfile->cur_token as required by _cpp_lex_direct. */
396 pfile->cur_token = _cpp_temp_token (pfile);
397 *plhs = _cpp_lex_direct (pfile);
Neil Booth480709c2001-10-21 14:04:42 +0000398 valid = pfile->buffer->cur == pfile->buffer->rlimit;
Neil Boothc9e7a602001-09-27 12:59:38 +0000399 _cpp_pop_buffer (pfile);
Neil Boothd63eefb2000-11-20 23:59:26 +0000400
Neil Boothc9e7a602001-09-27 12:59:38 +0000401 return valid;
Neil Boothd63eefb2000-11-20 23:59:26 +0000402}
403
Neil Boothd15a58c2002-01-03 18:32:55 +0000404/* Handles an arbitrarily long sequence of ## operators, with initial
405 operand LHS. This implementation is left-associative,
406 non-recursive, and finishes a paste before handling succeeding
407 ones. If a paste fails, we back up to the RHS of the failing ##
408 operator before pushing the context containing the result of prior
409 successful pastes, with the effect that the RHS appears in the
410 output stream after the pasted LHS normally. */
Neil Booth93c803682000-10-28 17:59:06 +0000411static void
412paste_all_tokens (pfile, lhs)
413 cpp_reader *pfile;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000414 const cpp_token *lhs;
Neil Booth93c803682000-10-28 17:59:06 +0000415{
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000416 const cpp_token *rhs;
417 cpp_context *context = pfile->context;
418
Neil Booth93c803682000-10-28 17:59:06 +0000419 do
420 {
421 /* Take the token directly from the current context. We can do
422 this, because we are in the replacement list of either an
423 object-like macro, or a function-like macro with arguments
424 inserted. In either case, the constraints to #define
Neil Boothd63eefb2000-11-20 23:59:26 +0000425 guarantee we have at least one more token. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000426 if (context->direct_p)
427 rhs = context->first.token++;
428 else
429 rhs = *context->first.ptoken++;
430
431 if (rhs->type == CPP_PADDING)
432 abort ();
433
Neil Boothc9e7a602001-09-27 12:59:38 +0000434 if (!paste_tokens (pfile, &lhs, rhs))
Neil Booth93c803682000-10-28 17:59:06 +0000435 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000436 _cpp_backup_tokens (pfile, 1);
Neil Boothc9e7a602001-09-27 12:59:38 +0000437
438 /* Mandatory warning for all apart from assembler. */
439 if (CPP_OPTION (pfile, lang) != CLK_ASM)
Neil Boothebef4e82002-04-14 18:42:47 +0000440 cpp_error (pfile, DL_WARNING,
Neil Boothc9e7a602001-09-27 12:59:38 +0000441 "pasting \"%s\" and \"%s\" does not give a valid preprocessing token",
Neil Boothebef4e82002-04-14 18:42:47 +0000442 cpp_token_as_text (pfile, lhs),
443 cpp_token_as_text (pfile, rhs));
Neil Booth4c2b6472000-11-11 13:19:01 +0000444 break;
Neil Booth93c803682000-10-28 17:59:06 +0000445 }
Neil Booth93c803682000-10-28 17:59:06 +0000446 }
447 while (rhs->flags & PASTE_LEFT);
448
Neil Boothc9e7a602001-09-27 12:59:38 +0000449 /* Put the resulting token in its own context. */
450 push_token_context (pfile, NULL, lhs, 1);
Neil Booth93c803682000-10-28 17:59:06 +0000451}
452
Neil Boothd15a58c2002-01-03 18:32:55 +0000453/* Reads and returns the arguments to a function-like macro
454 invocation. Assumes the opening parenthesis has been processed.
455 If there is an error, emits an appropriate diagnostic and returns
456 NULL. Each argument is terminated by a CPP_EOF token, for the
457 future benefit of expand_arg(). */
Neil Boothb8af0ca2001-09-26 17:52:50 +0000458static _cpp_buff *
459collect_args (pfile, node)
Neil Booth93c803682000-10-28 17:59:06 +0000460 cpp_reader *pfile;
461 const cpp_hashnode *node;
462{
Neil Boothb8af0ca2001-09-26 17:52:50 +0000463 _cpp_buff *buff, *base_buff;
464 cpp_macro *macro;
465 macro_arg *args, *arg;
466 const cpp_token *token;
467 unsigned int argc;
468 bool error = false;
Neil Booth93c803682000-10-28 17:59:06 +0000469
Neil Boothb8af0ca2001-09-26 17:52:50 +0000470 macro = node->value.macro;
471 if (macro->paramc)
472 argc = macro->paramc;
473 else
474 argc = 1;
475 buff = _cpp_get_buff (pfile, argc * (50 * sizeof (cpp_token *)
476 + sizeof (macro_arg)));
477 base_buff = buff;
478 args = (macro_arg *) buff->base;
479 memset (args, 0, argc * sizeof (macro_arg));
Neil Boothece54d52001-09-28 09:40:22 +0000480 buff->cur = (unsigned char *) &args[argc];
Neil Boothb8af0ca2001-09-26 17:52:50 +0000481 arg = args, argc = 0;
Neil Booth93c803682000-10-28 17:59:06 +0000482
Neil Boothb8af0ca2001-09-26 17:52:50 +0000483 /* Collect the tokens making up each argument. We don't yet know
484 how many arguments have been supplied, whether too many or too
485 few. Hence the slightly bizarre usage of "argc" and "arg". */
486 do
Neil Booth93c803682000-10-28 17:59:06 +0000487 {
Neil Boothb8af0ca2001-09-26 17:52:50 +0000488 unsigned int paren_depth = 0;
489 unsigned int ntokens = 0;
490
Neil Booth93c803682000-10-28 17:59:06 +0000491 argc++;
Neil Boothb8af0ca2001-09-26 17:52:50 +0000492 arg->first = (const cpp_token **) buff->cur;
Neil Booth93c803682000-10-28 17:59:06 +0000493
Neil Boothb8af0ca2001-09-26 17:52:50 +0000494 for (;;)
495 {
496 /* Require space for 2 new tokens (including a CPP_EOF). */
Neil Boothece54d52001-09-28 09:40:22 +0000497 if ((unsigned char *) &arg->first[ntokens + 2] > buff->limit)
Neil Boothb8af0ca2001-09-26 17:52:50 +0000498 {
Neil Booth8c3b2692001-09-30 10:03:11 +0000499 buff = _cpp_append_extend_buff (pfile, buff,
500 1000 * sizeof (cpp_token *));
Neil Boothb8af0ca2001-09-26 17:52:50 +0000501 arg->first = (const cpp_token **) buff->cur;
502 }
Neil Booth93c803682000-10-28 17:59:06 +0000503
Neil Boothb8af0ca2001-09-26 17:52:50 +0000504 token = cpp_get_token (pfile);
505
506 if (token->type == CPP_PADDING)
507 {
508 /* Drop leading padding. */
509 if (ntokens == 0)
510 continue;
511 }
512 else if (token->type == CPP_OPEN_PAREN)
513 paren_depth++;
514 else if (token->type == CPP_CLOSE_PAREN)
515 {
516 if (paren_depth-- == 0)
517 break;
518 }
519 else if (token->type == CPP_COMMA)
520 {
521 /* A comma does not terminate an argument within
522 parentheses or as part of a variable argument. */
523 if (paren_depth == 0
524 && ! (macro->variadic && argc == macro->paramc))
525 break;
526 }
527 else if (token->type == CPP_EOF
528 || (token->type == CPP_HASH && token->flags & BOL))
529 break;
530
531 arg->first[ntokens++] = token;
532 }
533
534 /* Drop trailing padding. */
535 while (ntokens > 0 && arg->first[ntokens - 1]->type == CPP_PADDING)
536 ntokens--;
537
538 arg->count = ntokens;
539 arg->first[ntokens] = &pfile->eof;
540
541 /* Terminate the argument. Excess arguments loop back and
542 overwrite the final legitimate argument, before failing. */
543 if (argc <= macro->paramc)
544 {
Neil Boothece54d52001-09-28 09:40:22 +0000545 buff->cur = (unsigned char *) &arg->first[ntokens + 1];
Neil Boothb8af0ca2001-09-26 17:52:50 +0000546 if (argc != macro->paramc)
547 arg++;
548 }
Neil Booth93c803682000-10-28 17:59:06 +0000549 }
Neil Boothe808ec92002-02-27 07:24:53 +0000550 while (token->type != CPP_CLOSE_PAREN && token->type != CPP_EOF);
Neil Booth93c803682000-10-28 17:59:06 +0000551
Neil Boothe808ec92002-02-27 07:24:53 +0000552 if (token->type == CPP_EOF)
Neil Booth93c803682000-10-28 17:59:06 +0000553 {
Neil Boothece54d52001-09-28 09:40:22 +0000554 /* We still need the CPP_EOF to end directives, and to end
555 pre-expansion of a macro argument. Step back is not
556 unconditional, since we don't want to return a CPP_EOF to our
557 callers at the end of an -include-d file. */
Neil Boothe808ec92002-02-27 07:24:53 +0000558 if (pfile->context->prev || pfile->state.in_directive)
Neil Boothb8af0ca2001-09-26 17:52:50 +0000559 _cpp_backup_tokens (pfile, 1);
Neil Boothebef4e82002-04-14 18:42:47 +0000560 cpp_error (pfile, DL_ERROR,
561 "unterminated argument list invoking macro \"%s\"",
Neil Bootha28c50352001-05-16 22:02:09 +0000562 NODE_NAME (node));
Neil Boothb8af0ca2001-09-26 17:52:50 +0000563 error = true;
Neil Booth93c803682000-10-28 17:59:06 +0000564 }
565 else if (argc < macro->paramc)
566 {
567 /* As an extension, a rest argument is allowed to not appear in
568 the invocation at all.
569 e.g. #define debug(format, args...) something
570 debug("string");
571
572 This is exactly the same as if there had been an empty rest
573 argument - debug("string", ). */
574
Neil Booth28e0f042000-12-09 12:06:37 +0000575 if (argc + 1 == macro->paramc && macro->variadic)
Neil Booth93c803682000-10-28 17:59:06 +0000576 {
Neil Booth7065e132001-02-14 07:38:20 +0000577 if (CPP_PEDANTIC (pfile) && ! macro->syshdr)
Neil Boothebef4e82002-04-14 18:42:47 +0000578 cpp_error (pfile, DL_PEDWARN,
579 "ISO C99 requires rest arguments to be used");
Neil Booth93c803682000-10-28 17:59:06 +0000580 }
581 else
582 {
Neil Boothebef4e82002-04-14 18:42:47 +0000583 cpp_error (pfile, DL_ERROR,
Neil Booth93c803682000-10-28 17:59:06 +0000584 "macro \"%s\" requires %u arguments, but only %u given",
Neil Bootha28c50352001-05-16 22:02:09 +0000585 NODE_NAME (node), macro->paramc, argc);
Neil Boothb8af0ca2001-09-26 17:52:50 +0000586 error = true;
Neil Booth93c803682000-10-28 17:59:06 +0000587 }
588 }
589 else if (argc > macro->paramc)
590 {
Neil Booth4c2b6472000-11-11 13:19:01 +0000591 /* Empty argument to a macro taking no arguments is OK. */
Neil Boothb8af0ca2001-09-26 17:52:50 +0000592 if (argc != 1 || arg->count)
Neil Booth93c803682000-10-28 17:59:06 +0000593 {
Neil Boothebef4e82002-04-14 18:42:47 +0000594 cpp_error (pfile, DL_ERROR,
Neil Booth93c803682000-10-28 17:59:06 +0000595 "macro \"%s\" passed %u arguments, but takes just %u",
Neil Bootha28c50352001-05-16 22:02:09 +0000596 NODE_NAME (node), argc, macro->paramc);
Neil Boothb8af0ca2001-09-26 17:52:50 +0000597 error = true;
Neil Booth93c803682000-10-28 17:59:06 +0000598 }
599 }
600
Neil Boothb8af0ca2001-09-26 17:52:50 +0000601 if (!error)
602 return base_buff;
Neil Booth93c803682000-10-28 17:59:06 +0000603
Neil Boothb8af0ca2001-09-26 17:52:50 +0000604 _cpp_release_buff (pfile, base_buff);
605 return NULL;
Neil Booth93c803682000-10-28 17:59:06 +0000606}
607
Neil Boothd6da8362001-10-08 06:15:14 +0000608/* Search for an opening parenthesis to the macro of NODE, in such a
609 way that, if none is found, we don't lose the information in any
610 intervening padding tokens. If we find the parenthesis, collect
611 the arguments and return the buffer containing them. */
612static _cpp_buff *
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000613funlike_invocation_p (pfile, node)
Neil Booth93c803682000-10-28 17:59:06 +0000614 cpp_reader *pfile;
Neil Booth644edda2001-10-02 12:57:24 +0000615 cpp_hashnode *node;
Neil Booth93c803682000-10-28 17:59:06 +0000616{
Neil Boothd6da8362001-10-08 06:15:14 +0000617 const cpp_token *token, *padding = NULL;
Neil Booth93c803682000-10-28 17:59:06 +0000618
Neil Boothd6da8362001-10-08 06:15:14 +0000619 for (;;)
Neil Boothbdcbe492001-09-13 20:05:17 +0000620 {
Neil Boothd6da8362001-10-08 06:15:14 +0000621 token = cpp_get_token (pfile);
622 if (token->type != CPP_PADDING)
623 break;
624 if (padding == NULL
625 || (!(padding->flags & PREV_WHITE) && token->val.source == NULL))
626 padding = token;
Neil Boothbdcbe492001-09-13 20:05:17 +0000627 }
Neil Booth93c803682000-10-28 17:59:06 +0000628
Neil Boothd6da8362001-10-08 06:15:14 +0000629 if (token->type == CPP_OPEN_PAREN)
Neil Booth93c803682000-10-28 17:59:06 +0000630 {
Neil Boothd6da8362001-10-08 06:15:14 +0000631 pfile->state.parsing_args = 2;
632 return collect_args (pfile, node);
Neil Booth93c803682000-10-28 17:59:06 +0000633 }
634
Neil Booth9ac3b1b2002-04-21 16:17:55 +0000635 /* CPP_EOF can be the end of macro arguments, or the end of the
636 file. We mustn't back up over the latter. Ugh. */
637 if (token->type != CPP_EOF || token == &pfile->eof)
638 {
639 /* Back up. We may have skipped padding, in which case backing
640 up more than one token when expanding macros is in general
641 too difficult. We re-insert it in its own context. */
642 _cpp_backup_tokens (pfile, 1);
643 if (padding)
644 push_token_context (pfile, NULL, padding, 1);
645 }
Neil Boothd6da8362001-10-08 06:15:14 +0000646
647 return NULL;
Neil Booth93c803682000-10-28 17:59:06 +0000648}
649
Neil Boothd15a58c2002-01-03 18:32:55 +0000650/* Push the context of a macro with hash entry NODE onto the context
651 stack. If we can successfully expand the macro, we push a context
652 containing its yet-to-be-rescanned replacement list and return one.
653 Otherwise, we don't push a context and return zero. */
Neil Booth93c803682000-10-28 17:59:06 +0000654static int
Neil Booth29b10742000-11-13 18:40:37 +0000655enter_macro_context (pfile, node)
Neil Booth93c803682000-10-28 17:59:06 +0000656 cpp_reader *pfile;
Neil Booth29b10742000-11-13 18:40:37 +0000657 cpp_hashnode *node;
Neil Booth93c803682000-10-28 17:59:06 +0000658{
Neil Boothd15a58c2002-01-03 18:32:55 +0000659 /* The presence of a macro invalidates a file's controlling macro. */
Neil Booth644edda2001-10-02 12:57:24 +0000660 pfile->mi_valid = false;
661
Neil Boothd15a58c2002-01-03 18:32:55 +0000662 /* Handle standard macros. */
Neil Booth644edda2001-10-02 12:57:24 +0000663 if (! (node->flags & NODE_BUILTIN))
Neil Booth93c803682000-10-28 17:59:06 +0000664 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000665 cpp_macro *macro = node->value.macro;
666
Neil Boothd6da8362001-10-08 06:15:14 +0000667 if (macro->fun_like)
668 {
669 _cpp_buff *buff;
670
671 pfile->state.prevent_expansion++;
672 pfile->keep_tokens++;
673 pfile->state.parsing_args = 1;
674 buff = funlike_invocation_p (pfile, node);
675 pfile->state.parsing_args = 0;
676 pfile->keep_tokens--;
677 pfile->state.prevent_expansion--;
678
679 if (buff == NULL)
680 {
681 if (CPP_WTRADITIONAL (pfile) && ! node->value.macro->syshdr)
Neil Boothebef4e82002-04-14 18:42:47 +0000682 cpp_error (pfile, DL_WARNING,
Neil Boothd6da8362001-10-08 06:15:14 +0000683 "function-like macro \"%s\" must be used with arguments in traditional C",
Neil Boothebef4e82002-04-14 18:42:47 +0000684 NODE_NAME (node));
Neil Boothd6da8362001-10-08 06:15:14 +0000685
686 return 0;
687 }
688
Neil Boothe808ec92002-02-27 07:24:53 +0000689 if (macro->paramc > 0)
690 replace_args (pfile, node, macro, (macro_arg *) buff->base);
Neil Boothd6da8362001-10-08 06:15:14 +0000691 _cpp_release_buff (pfile, buff);
692 }
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000693
694 /* Disable the macro within its expansion. */
Neil Booth644edda2001-10-02 12:57:24 +0000695 node->flags |= NODE_DISABLED;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000696
697 if (macro->paramc == 0)
Neil Booth644edda2001-10-02 12:57:24 +0000698 push_token_context (pfile, node, macro->expansion, macro->count);
699
700 return 1;
Neil Booth93c803682000-10-28 17:59:06 +0000701 }
Neil Booth644edda2001-10-02 12:57:24 +0000702
Neil Boothd15a58c2002-01-03 18:32:55 +0000703 /* Handle built-in macros and the _Pragma operator. */
Neil Booth644edda2001-10-02 12:57:24 +0000704 return builtin_macro (pfile, node);
Zack Weinberg711b8822000-07-18 00:59:49 +0000705}
706
Neil Boothd15a58c2002-01-03 18:32:55 +0000707/* Replace the parameters in a function-like macro of NODE with the
708 actual ARGS, and place the result in a newly pushed token context.
709 Expand each argument before replacing, unless it is operated upon
710 by the # or ## operators. */
Neil Booth93c803682000-10-28 17:59:06 +0000711static void
Neil Boothe808ec92002-02-27 07:24:53 +0000712replace_args (pfile, node, macro, args)
Neil Booth93c803682000-10-28 17:59:06 +0000713 cpp_reader *pfile;
Neil Booth644edda2001-10-02 12:57:24 +0000714 cpp_hashnode *node;
Neil Boothe808ec92002-02-27 07:24:53 +0000715 cpp_macro *macro;
Neil Booth93c803682000-10-28 17:59:06 +0000716 macro_arg *args;
Neil Booth93c803682000-10-28 17:59:06 +0000717{
718 unsigned int i, total;
719 const cpp_token *src, *limit;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000720 const cpp_token **dest, **first;
Neil Booth93c803682000-10-28 17:59:06 +0000721 macro_arg *arg;
Neil Booth1e013d22001-09-26 21:44:35 +0000722 _cpp_buff *buff;
Neil Booth93c803682000-10-28 17:59:06 +0000723
Neil Booth93c803682000-10-28 17:59:06 +0000724 /* First, fully macro-expand arguments, calculating the number of
Neil Booth1e013d22001-09-26 21:44:35 +0000725 tokens in the final expansion as we go. The ordering of the if
726 statements below is subtle; we must handle stringification before
727 pasting. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000728 total = macro->count;
729 limit = macro->expansion + macro->count;
730
731 for (src = macro->expansion; src < limit; src++)
Neil Booth93c803682000-10-28 17:59:06 +0000732 if (src->type == CPP_MACRO_ARG)
733 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000734 /* Leading and trailing padding tokens. */
735 total += 2;
736
Neil Booth93c803682000-10-28 17:59:06 +0000737 /* We have an argument. If it is not being stringified or
738 pasted it is macro-replaced before insertion. */
Neil Booth6c53ebf2000-11-06 18:43:32 +0000739 arg = &args[src->val.arg_no - 1];
Neil Booth4c2b6472000-11-11 13:19:01 +0000740
Neil Booth93c803682000-10-28 17:59:06 +0000741 if (src->flags & STRINGIFY_ARG)
742 {
743 if (!arg->stringified)
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000744 arg->stringified = stringify_arg (pfile, arg);
Neil Booth93c803682000-10-28 17:59:06 +0000745 }
746 else if ((src->flags & PASTE_LEFT)
747 || (src > macro->expansion && (src[-1].flags & PASTE_LEFT)))
748 total += arg->count - 1;
749 else
750 {
751 if (!arg->expanded)
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000752 expand_arg (pfile, arg);
Neil Booth93c803682000-10-28 17:59:06 +0000753 total += arg->expanded_count - 1;
754 }
755 }
756
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000757 /* Now allocate space for the expansion, copy the tokens and replace
758 the arguments. */
Neil Booth1e013d22001-09-26 21:44:35 +0000759 buff = _cpp_get_buff (pfile, total * sizeof (cpp_token *));
760 first = (const cpp_token **) buff->base;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000761 dest = first;
Neil Booth93c803682000-10-28 17:59:06 +0000762
763 for (src = macro->expansion; src < limit; src++)
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000764 {
765 unsigned int count;
766 const cpp_token **from, **paste_flag;
Neil Booth93c803682000-10-28 17:59:06 +0000767
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000768 if (src->type != CPP_MACRO_ARG)
769 {
770 *dest++ = src;
771 continue;
772 }
773
774 paste_flag = 0;
775 arg = &args[src->val.arg_no - 1];
776 if (src->flags & STRINGIFY_ARG)
777 count = 1, from = &arg->stringified;
778 else if (src->flags & PASTE_LEFT)
779 count = arg->count, from = arg->first;
780 else if (src != macro->expansion && (src[-1].flags & PASTE_LEFT))
781 {
Neil Booth93c803682000-10-28 17:59:06 +0000782 count = arg->count, from = arg->first;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000783 if (dest != first)
784 {
785 /* GCC has special semantics for , ## b where b is a
786 varargs parameter: the comma disappears if b was
787 given no actual arguments (not merely if b is an
788 empty argument); otherwise the paste flag is removed. */
789 if (dest[-1]->type == CPP_COMMA
790 && macro->variadic
791 && src->val.arg_no == macro->paramc)
792 {
793 if (count == 0)
794 dest--;
795 else
796 paste_flag = dest - 1;
797 }
798 /* Remove the paste flag if the RHS is a placemarker. */
799 else if (count == 0)
800 paste_flag = dest - 1;
801 }
802 }
803 else
804 count = arg->expanded_count, from = arg->expanded;
Neil Booth93c803682000-10-28 17:59:06 +0000805
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000806 /* Padding on the left of an argument (unless RHS of ##). */
807 if (!pfile->state.in_directive
808 && src != macro->expansion && !(src[-1].flags & PASTE_LEFT))
809 *dest++ = padding_token (pfile, src);
Neil Booth93c803682000-10-28 17:59:06 +0000810
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000811 if (count)
812 {
813 memcpy (dest, from, count * sizeof (cpp_token *));
814 dest += count;
Neil Booth93c803682000-10-28 17:59:06 +0000815
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000816 /* With a non-empty argument on the LHS of ##, the last
817 token should be flagged PASTE_LEFT. */
818 if (src->flags & PASTE_LEFT)
819 paste_flag = dest - 1;
820 }
Neil Booth4c2b6472000-11-11 13:19:01 +0000821
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000822 /* Avoid paste on RHS (even case count == 0). */
823 if (!pfile->state.in_directive && !(src->flags & PASTE_LEFT))
824 *dest++ = &pfile->avoid_paste;
Neil Booth26ec42e2001-01-28 11:22:23 +0000825
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000826 /* Add a new paste flag, or remove an unwanted one. */
827 if (paste_flag)
828 {
829 cpp_token *token = _cpp_temp_token (pfile);
830 token->type = (*paste_flag)->type;
831 token->val.str = (*paste_flag)->val.str;
832 if (src->flags & PASTE_LEFT)
833 token->flags = (*paste_flag)->flags | PASTE_LEFT;
834 else
835 token->flags = (*paste_flag)->flags & ~PASTE_LEFT;
836 *paste_flag = token;
837 }
838 }
Neil Booth4c2b6472000-11-11 13:19:01 +0000839
Neil Booth93c803682000-10-28 17:59:06 +0000840 /* Free the expanded arguments. */
841 for (i = 0; i < macro->paramc; i++)
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000842 if (args[i].expanded)
843 free (args[i].expanded);
844
Neil Booth644edda2001-10-02 12:57:24 +0000845 push_ptoken_context (pfile, node, buff, first, dest - first);
Neil Booth93c803682000-10-28 17:59:06 +0000846}
847
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000848/* Return a special padding token, with padding inherited from SOURCE. */
849static const cpp_token *
850padding_token (pfile, source)
Neil Booth93c803682000-10-28 17:59:06 +0000851 cpp_reader *pfile;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000852 const cpp_token *source;
853{
854 cpp_token *result = _cpp_temp_token (pfile);
855
856 result->type = CPP_PADDING;
857 result->val.source = source;
858 result->flags = 0;
859 return result;
860}
861
Neil Boothd15a58c2002-01-03 18:32:55 +0000862/* Get a new uninitialized context. Create a new one if we cannot
863 re-use an old one. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000864static cpp_context *
865next_context (pfile)
866 cpp_reader *pfile;
867{
868 cpp_context *result = pfile->context->next;
869
870 if (result == 0)
871 {
872 result = xnew (cpp_context);
873 result->prev = pfile->context;
874 result->next = 0;
875 pfile->context->next = result;
876 }
877
878 pfile->context = result;
879 return result;
880}
881
882/* Push a list of pointers to tokens. */
883static void
Neil Booth1e013d22001-09-26 21:44:35 +0000884push_ptoken_context (pfile, macro, buff, first, count)
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000885 cpp_reader *pfile;
Neil Booth644edda2001-10-02 12:57:24 +0000886 cpp_hashnode *macro;
Neil Booth1e013d22001-09-26 21:44:35 +0000887 _cpp_buff *buff;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000888 const cpp_token **first;
889 unsigned int count;
Neil Booth93c803682000-10-28 17:59:06 +0000890{
891 cpp_context *context = next_context (pfile);
Neil Booth93c803682000-10-28 17:59:06 +0000892
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000893 context->direct_p = false;
894 context->macro = macro;
Neil Booth1e013d22001-09-26 21:44:35 +0000895 context->buff = buff;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000896 context->first.ptoken = first;
897 context->last.ptoken = first + count;
898}
899
900/* Push a list of tokens. */
901static void
902push_token_context (pfile, macro, first, count)
903 cpp_reader *pfile;
Neil Booth644edda2001-10-02 12:57:24 +0000904 cpp_hashnode *macro;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000905 const cpp_token *first;
906 unsigned int count;
907{
908 cpp_context *context = next_context (pfile);
909
910 context->direct_p = true;
911 context->macro = macro;
Neil Booth1e013d22001-09-26 21:44:35 +0000912 context->buff = NULL;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000913 context->first.token = first;
914 context->last.token = first + count;
Neil Booth93c803682000-10-28 17:59:06 +0000915}
916
Neil Boothd15a58c2002-01-03 18:32:55 +0000917/* Expand an argument ARG before replacing parameters in a
918 function-like macro. This works by pushing a context with the
919 argument's tokens, and then expanding that into a temporary buffer
920 as if it were a normal part of the token stream. collect_args()
921 has terminated the argument's tokens with a CPP_EOF so that we know
922 when we have fully expanded the argument. */
Neil Booth93c803682000-10-28 17:59:06 +0000923static void
924expand_arg (pfile, arg)
925 cpp_reader *pfile;
926 macro_arg *arg;
927{
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000928 unsigned int capacity;
929
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000930 if (arg->count == 0)
931 return;
Neil Booth93c803682000-10-28 17:59:06 +0000932
933 /* Loop, reading in the arguments. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000934 capacity = 256;
935 arg->expanded = (const cpp_token **)
936 xmalloc (capacity * sizeof (cpp_token *));
Neil Booth93c803682000-10-28 17:59:06 +0000937
Neil Booth1e013d22001-09-26 21:44:35 +0000938 push_ptoken_context (pfile, NULL, NULL, arg->first, arg->count + 1);
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000939 for (;;)
Neil Booth93c803682000-10-28 17:59:06 +0000940 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000941 const cpp_token *token;
942
943 if (arg->expanded_count + 1 >= capacity)
Neil Booth93c803682000-10-28 17:59:06 +0000944 {
945 capacity *= 2;
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000946 arg->expanded = (const cpp_token **)
947 xrealloc (arg->expanded, capacity * sizeof (cpp_token *));
Neil Booth93c803682000-10-28 17:59:06 +0000948 }
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000949
950 token = cpp_get_token (pfile);
951
952 if (token->type == CPP_EOF)
953 break;
954
955 arg->expanded[arg->expanded_count++] = token;
Neil Booth93c803682000-10-28 17:59:06 +0000956 }
Neil Booth93c803682000-10-28 17:59:06 +0000957
Neil Booth1e013d22001-09-26 21:44:35 +0000958 _cpp_pop_context (pfile);
Neil Booth93c803682000-10-28 17:59:06 +0000959}
960
Neil Boothd15a58c2002-01-03 18:32:55 +0000961/* Pop the current context off the stack, re-enabling the macro if the
962 context represented a macro's replacement list. The context
963 structure is not freed so that we can re-use it later. */
Neil Booth93c803682000-10-28 17:59:06 +0000964void
965_cpp_pop_context (pfile)
966 cpp_reader *pfile;
967{
Neil Booth1e013d22001-09-26 21:44:35 +0000968 cpp_context *context = pfile->context;
Neil Booth93c803682000-10-28 17:59:06 +0000969
Neil Booth1e013d22001-09-26 21:44:35 +0000970 if (context->macro)
Neil Booth644edda2001-10-02 12:57:24 +0000971 context->macro->flags &= ~NODE_DISABLED;
Neil Booth1e013d22001-09-26 21:44:35 +0000972
973 if (context->buff)
974 _cpp_release_buff (pfile, context->buff);
975
976 pfile->context = context->prev;
Neil Booth93c803682000-10-28 17:59:06 +0000977}
978
Neil Booth7f2f1a62000-11-14 18:32:06 +0000979/* Eternal routine to get a token. Also used nearly everywhere
980 internally, except for places where we know we can safely call
981 the lexer directly, such as lexing a directive name.
982
983 Macro expansions and directives are transparently handled,
984 including entering included files. Thus tokens are post-macro
985 expansion, and after any intervening directives. External callers
986 see CPP_EOF only at EOF. Internal callers also see it when meeting
987 a directive inside a macro call, when at the end of a directive and
988 state.in_directive is still 1, and at the end of argument
989 pre-expansion. */
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000990const cpp_token *
991cpp_get_token (pfile)
Neil Booth93c803682000-10-28 17:59:06 +0000992 cpp_reader *pfile;
Neil Booth93c803682000-10-28 17:59:06 +0000993{
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000994 const cpp_token *result;
995
Neil Booth29b10742000-11-13 18:40:37 +0000996 for (;;)
Neil Booth93c803682000-10-28 17:59:06 +0000997 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +0000998 cpp_hashnode *node;
Neil Booth93c803682000-10-28 17:59:06 +0000999 cpp_context *context = pfile->context;
1000
Neil Booth93c803682000-10-28 17:59:06 +00001001 /* Context->prev == 0 <=> base context. */
Neil Boothbdcbe492001-09-13 20:05:17 +00001002 if (!context->prev)
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001003 result = _cpp_lex_token (pfile);
1004 else if (context->first.token != context->last.token)
Neil Booth29b10742000-11-13 18:40:37 +00001005 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001006 if (context->direct_p)
1007 result = context->first.token++;
1008 else
1009 result = *context->first.ptoken++;
1010
1011 if (result->flags & PASTE_LEFT)
Neil Boothec1a23e2001-01-31 07:48:54 +00001012 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001013 paste_all_tokens (pfile, result);
1014 if (pfile->state.in_directive)
1015 continue;
1016 return padding_token (pfile, result);
Neil Boothec1a23e2001-01-31 07:48:54 +00001017 }
Neil Booth29b10742000-11-13 18:40:37 +00001018 }
Neil Booth93c803682000-10-28 17:59:06 +00001019 else
1020 {
Neil Boothbdcbe492001-09-13 20:05:17 +00001021 _cpp_pop_context (pfile);
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001022 if (pfile->state.in_directive)
1023 continue;
1024 return &pfile->avoid_paste;
Neil Booth93c803682000-10-28 17:59:06 +00001025 }
Neil Booth93c803682000-10-28 17:59:06 +00001026
Jason Thorpe477cdac2002-04-07 03:12:23 +00001027 if (pfile->state.in_directive && result->type == CPP_COMMENT)
1028 continue;
1029
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001030 if (result->type != CPP_NAME)
Neil Booth93c803682000-10-28 17:59:06 +00001031 break;
1032
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001033 node = result->val.node;
Neil Booth4c2b6472000-11-11 13:19:01 +00001034
Neil Booth644edda2001-10-02 12:57:24 +00001035 if (node->type != NT_MACRO || (result->flags & NO_EXPAND))
1036 break;
1037
1038 if (!(node->flags & NODE_DISABLED))
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001039 {
Neil Booth644edda2001-10-02 12:57:24 +00001040 if (!pfile->state.prevent_expansion
1041 && enter_macro_context (pfile, node))
Neil Boothbd969772001-02-01 19:13:53 +00001042 {
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001043 if (pfile->state.in_directive)
1044 continue;
1045 return padding_token (pfile, result);
Neil Boothbd969772001-02-01 19:13:53 +00001046 }
Neil Booth93c803682000-10-28 17:59:06 +00001047 }
Neil Booth644edda2001-10-02 12:57:24 +00001048 else
1049 {
Neil Boothd15a58c2002-01-03 18:32:55 +00001050 /* Flag this token as always unexpandable. FIXME: move this
1051 to collect_args()?. */
Neil Booth644edda2001-10-02 12:57:24 +00001052 cpp_token *t = _cpp_temp_token (pfile);
1053 t->type = result->type;
1054 t->flags = result->flags | NO_EXPAND;
1055 t->val.str = result->val.str;
1056 result = t;
1057 }
Neil Bootha5c3ccc2000-10-30 22:29:00 +00001058
Neil Booth644edda2001-10-02 12:57:24 +00001059 break;
Neil Booth93c803682000-10-28 17:59:06 +00001060 }
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001061
1062 return result;
Neil Booth93c803682000-10-28 17:59:06 +00001063}
1064
Neil Booth7065e132001-02-14 07:38:20 +00001065/* Returns true if we're expanding an object-like macro that was
1066 defined in a system header. Just checks the macro at the top of
1067 the stack. Used for diagnostic suppression. */
1068int
Neil Boothc6911452001-03-03 11:32:32 +00001069cpp_sys_macro_p (pfile)
Neil Booth7065e132001-02-14 07:38:20 +00001070 cpp_reader *pfile;
1071{
Neil Booth644edda2001-10-02 12:57:24 +00001072 cpp_hashnode *node = pfile->context->macro;
Neil Booth7065e132001-02-14 07:38:20 +00001073
Neil Booth644edda2001-10-02 12:57:24 +00001074 return node && node->value.macro && node->value.macro->syshdr;
Neil Booth7065e132001-02-14 07:38:20 +00001075}
1076
Neil Boothaf0d16c2002-04-22 17:48:02 +00001077/* Read each token in, until end of the current file. Directives are
1078 transparently processed. */
Neil Booth93c803682000-10-28 17:59:06 +00001079void
Neil Boothef6e9582001-08-04 12:01:59 +00001080cpp_scan_nooutput (pfile)
Neil Booth93c803682000-10-28 17:59:06 +00001081 cpp_reader *pfile;
1082{
Neil Boothaf0d16c2002-04-22 17:48:02 +00001083 /* Request a CPP_EOF token at the end of this file, rather than
1084 transparently continuing with the including file. */
1085 pfile->buffer->return_at_eof = true;
1086
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001087 while (cpp_get_token (pfile)->type != CPP_EOF)
1088 ;
Neil Booth93c803682000-10-28 17:59:06 +00001089}
1090
Neil Boothbdcbe492001-09-13 20:05:17 +00001091/* Step back one (or more) tokens. Can only step mack more than 1 if
1092 they are from the lexer, and not from macro expansion. */
Neil Boothb528a072000-11-12 11:46:21 +00001093void
Neil Boothbdcbe492001-09-13 20:05:17 +00001094_cpp_backup_tokens (pfile, count)
Neil Booth93c803682000-10-28 17:59:06 +00001095 cpp_reader *pfile;
Neil Boothbdcbe492001-09-13 20:05:17 +00001096 unsigned int count;
Neil Booth93c803682000-10-28 17:59:06 +00001097{
Neil Boothbdcbe492001-09-13 20:05:17 +00001098 if (pfile->context->prev == NULL)
1099 {
1100 pfile->lookaheads += count;
1101 while (count--)
1102 {
Neil Booth3293c3e2001-11-19 21:04:49 +00001103 pfile->cur_token--;
1104 if (pfile->cur_token == pfile->cur_run->base
1105 /* Possible with -fpreprocessed and no leading #line. */
1106 && pfile->cur_run->prev != NULL)
Neil Boothbdcbe492001-09-13 20:05:17 +00001107 {
Neil Boothbdcbe492001-09-13 20:05:17 +00001108 pfile->cur_run = pfile->cur_run->prev;
1109 pfile->cur_token = pfile->cur_run->limit;
1110 }
1111 }
1112 }
Neil Booth93c803682000-10-28 17:59:06 +00001113 else
1114 {
Neil Boothbdcbe492001-09-13 20:05:17 +00001115 if (count != 1)
1116 abort ();
Neil Booth4ed5bcf2001-09-24 22:53:12 +00001117 if (pfile->context->direct_p)
1118 pfile->context->first.token--;
1119 else
1120 pfile->context->first.ptoken--;
Neil Booth93c803682000-10-28 17:59:06 +00001121 }
Neil Booth93c803682000-10-28 17:59:06 +00001122}
1123
1124/* #define directive parsing and handling. */
1125
Neil Booth618cdda2001-02-25 09:43:03 +00001126/* Returns non-zero if a macro redefinition warning is required. */
Neil Booth93c803682000-10-28 17:59:06 +00001127static int
Neil Booth4d6baaf2001-11-26 23:44:54 +00001128warn_of_redefinition (node, macro2)
Neil Booth93c803682000-10-28 17:59:06 +00001129 const cpp_hashnode *node;
1130 const cpp_macro *macro2;
1131{
1132 const cpp_macro *macro1;
1133 unsigned int i;
1134
Neil Booth618cdda2001-02-25 09:43:03 +00001135 /* Some redefinitions need to be warned about regardless. */
1136 if (node->flags & NODE_WARN)
1137 return 1;
Neil Booth93c803682000-10-28 17:59:06 +00001138
Neil Booth618cdda2001-02-25 09:43:03 +00001139 /* Redefinition of a macro is allowed if and only if the old and new
Kazu Hirataec5c56d2001-08-01 17:57:27 +00001140 definitions are the same. (6.10.3 paragraph 2). */
Neil Booth93c803682000-10-28 17:59:06 +00001141 macro1 = node->value.macro;
1142
1143 /* The quick failures. */
1144 if (macro1->count != macro2->count
1145 || macro1->paramc != macro2->paramc
1146 || macro1->fun_like != macro2->fun_like
Neil Booth28e0f042000-12-09 12:06:37 +00001147 || macro1->variadic != macro2->variadic)
Neil Booth618cdda2001-02-25 09:43:03 +00001148 return 1;
Zack Weinberg711b8822000-07-18 00:59:49 +00001149
Neil Booth93c803682000-10-28 17:59:06 +00001150 /* Check each token. */
1151 for (i = 0; i < macro1->count; i++)
1152 if (! _cpp_equiv_tokens (&macro1->expansion[i], &macro2->expansion[i]))
Neil Booth618cdda2001-02-25 09:43:03 +00001153 return 1;
Neil Booth93c803682000-10-28 17:59:06 +00001154
1155 /* Check parameter spellings. */
1156 for (i = 0; i < macro1->paramc; i++)
1157 if (macro1->params[i] != macro2->params[i])
Neil Booth618cdda2001-02-25 09:43:03 +00001158 return 1;
Neil Booth93c803682000-10-28 17:59:06 +00001159
Neil Booth618cdda2001-02-25 09:43:03 +00001160 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001161}
1162
Neil Booth93c803682000-10-28 17:59:06 +00001163/* Free the definition of hashnode H. */
Neil Booth93c803682000-10-28 17:59:06 +00001164void
1165_cpp_free_definition (h)
1166 cpp_hashnode *h;
Zack Weinberg711b8822000-07-18 00:59:49 +00001167{
Neil Booth93c803682000-10-28 17:59:06 +00001168 /* Macros and assertions no longer have anything to free. */
1169 h->type = NT_VOID;
1170 /* Clear builtin flag in case of redefinition. */
Neil Booth644edda2001-10-02 12:57:24 +00001171 h->flags &= ~(NODE_BUILTIN | NODE_DISABLED);
Neil Booth93c803682000-10-28 17:59:06 +00001172}
Zack Weinberg711b8822000-07-18 00:59:49 +00001173
Neil Booth14baae02001-09-17 18:26:12 +00001174/* Save parameter NODE to the parameter list of macro MACRO. Returns
Joseph Myersf5143c42001-11-04 02:51:28 +00001175 zero on success, non-zero if the parameter is a duplicate. */
Neil Booth93c803682000-10-28 17:59:06 +00001176static int
1177save_parameter (pfile, macro, node)
1178 cpp_reader *pfile;
1179 cpp_macro *macro;
1180 cpp_hashnode *node;
1181{
Neil Booth93c803682000-10-28 17:59:06 +00001182 /* Constraint 6.10.3.6 - duplicate parameter names. */
1183 if (node->arg_index)
Zack Weinberg711b8822000-07-18 00:59:49 +00001184 {
Neil Boothebef4e82002-04-14 18:42:47 +00001185 cpp_error (pfile, DL_ERROR, "duplicate macro parameter \"%s\"",
1186 NODE_NAME (node));
Neil Booth93c803682000-10-28 17:59:06 +00001187 return 1;
1188 }
1189
Neil Booth8c3b2692001-09-30 10:03:11 +00001190 if (BUFF_ROOM (pfile->a_buff)
1191 < (macro->paramc + 1) * sizeof (cpp_hashnode *))
1192 _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_hashnode *));
Neil Booth93c803682000-10-28 17:59:06 +00001193
Neil Booth8c3b2692001-09-30 10:03:11 +00001194 ((cpp_hashnode **) BUFF_FRONT (pfile->a_buff))[macro->paramc++] = node;
1195 node->arg_index = macro->paramc;
Neil Booth93c803682000-10-28 17:59:06 +00001196 return 0;
1197}
1198
Neil Booth8c3b2692001-09-30 10:03:11 +00001199/* Check the syntax of the parameters in a MACRO definition. */
Neil Booth93c803682000-10-28 17:59:06 +00001200static int
1201parse_params (pfile, macro)
1202 cpp_reader *pfile;
1203 cpp_macro *macro;
1204{
Neil Booth93c803682000-10-28 17:59:06 +00001205 unsigned int prev_ident = 0;
1206
Neil Booth93c803682000-10-28 17:59:06 +00001207 for (;;)
1208 {
Neil Booth345894b2001-09-16 13:44:29 +00001209 const cpp_token *token = _cpp_lex_token (pfile);
Neil Booth93c803682000-10-28 17:59:06 +00001210
Neil Booth345894b2001-09-16 13:44:29 +00001211 switch (token->type)
Zack Weinberg711b8822000-07-18 00:59:49 +00001212 {
1213 default:
Jason Thorpe477cdac2002-04-07 03:12:23 +00001214 /* Allow/ignore comments in parameter lists if we are
1215 preserving comments in macro expansions. */
1216 if (token->type == CPP_COMMENT
1217 && ! CPP_OPTION (pfile, discard_comments_in_macro_exp))
1218 continue;
1219
Neil Boothebef4e82002-04-14 18:42:47 +00001220 cpp_error (pfile, DL_ERROR,
1221 "\"%s\" may not appear in macro parameter list",
Neil Booth345894b2001-09-16 13:44:29 +00001222 cpp_token_as_text (pfile, token));
Neil Booth93c803682000-10-28 17:59:06 +00001223 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001224
Zack Weinberg711b8822000-07-18 00:59:49 +00001225 case CPP_NAME:
1226 if (prev_ident)
1227 {
Neil Boothebef4e82002-04-14 18:42:47 +00001228 cpp_error (pfile, DL_ERROR,
1229 "macro parameters must be comma-separated");
Neil Booth93c803682000-10-28 17:59:06 +00001230 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001231 }
Zack Weinberg711b8822000-07-18 00:59:49 +00001232 prev_ident = 1;
Neil Booth93c803682000-10-28 17:59:06 +00001233
Neil Booth345894b2001-09-16 13:44:29 +00001234 if (save_parameter (pfile, macro, token->val.node))
Neil Booth93c803682000-10-28 17:59:06 +00001235 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001236 continue;
1237
1238 case CPP_CLOSE_PAREN:
Neil Booth93c803682000-10-28 17:59:06 +00001239 if (prev_ident || macro->paramc == 0)
Neil Booth8c3b2692001-09-30 10:03:11 +00001240 return 1;
Zack Weinberg711b8822000-07-18 00:59:49 +00001241
1242 /* Fall through to pick up the error. */
1243 case CPP_COMMA:
1244 if (!prev_ident)
1245 {
Neil Boothebef4e82002-04-14 18:42:47 +00001246 cpp_error (pfile, DL_ERROR, "parameter name missing");
Neil Booth93c803682000-10-28 17:59:06 +00001247 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001248 }
1249 prev_ident = 0;
1250 continue;
1251
1252 case CPP_ELLIPSIS:
Neil Booth28e0f042000-12-09 12:06:37 +00001253 macro->variadic = 1;
Zack Weinberg711b8822000-07-18 00:59:49 +00001254 if (!prev_ident)
1255 {
Neil Booth93c803682000-10-28 17:59:06 +00001256 save_parameter (pfile, macro, pfile->spec_nodes.n__VA_ARGS__);
1257 pfile->state.va_args_ok = 1;
1258 if (! CPP_OPTION (pfile, c99) && CPP_OPTION (pfile, pedantic))
Neil Boothebef4e82002-04-14 18:42:47 +00001259 cpp_error (pfile, DL_PEDWARN,
1260 "anonymous variadic macros were introduced in C99");
Zack Weinberg711b8822000-07-18 00:59:49 +00001261 }
Neil Booth93c803682000-10-28 17:59:06 +00001262 else if (CPP_OPTION (pfile, pedantic))
Neil Boothebef4e82002-04-14 18:42:47 +00001263 cpp_error (pfile, DL_PEDWARN,
1264 "ISO C does not permit named variadic macros");
Zack Weinberg711b8822000-07-18 00:59:49 +00001265
Neil Booth93c803682000-10-28 17:59:06 +00001266 /* We're at the end, and just expect a closing parenthesis. */
Neil Booth345894b2001-09-16 13:44:29 +00001267 token = _cpp_lex_token (pfile);
1268 if (token->type == CPP_CLOSE_PAREN)
Neil Booth8c3b2692001-09-30 10:03:11 +00001269 return 1;
Neil Booth93c803682000-10-28 17:59:06 +00001270 /* Fall through. */
1271
1272 case CPP_EOF:
Neil Boothebef4e82002-04-14 18:42:47 +00001273 cpp_error (pfile, DL_ERROR, "missing ')' in macro parameter list");
Neil Booth93c803682000-10-28 17:59:06 +00001274 return 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001275 }
Zack Weinberg711b8822000-07-18 00:59:49 +00001276 }
1277}
1278
Neil Booth14baae02001-09-17 18:26:12 +00001279/* Allocate room for a token from a macro's replacement list. */
Neil Booth93c803682000-10-28 17:59:06 +00001280static cpp_token *
Neil Booth14baae02001-09-17 18:26:12 +00001281alloc_expansion_token (pfile, macro)
Zack Weinberg711b8822000-07-18 00:59:49 +00001282 cpp_reader *pfile;
Neil Booth93c803682000-10-28 17:59:06 +00001283 cpp_macro *macro;
Zack Weinberg711b8822000-07-18 00:59:49 +00001284{
Neil Booth8c3b2692001-09-30 10:03:11 +00001285 if (BUFF_ROOM (pfile->a_buff) < (macro->count + 1) * sizeof (cpp_token))
1286 _cpp_extend_buff (pfile, &pfile->a_buff, sizeof (cpp_token));
Zack Weinberg711b8822000-07-18 00:59:49 +00001287
Neil Booth8c3b2692001-09-30 10:03:11 +00001288 return &((cpp_token *) BUFF_FRONT (pfile->a_buff))[macro->count++];
Neil Booth14baae02001-09-17 18:26:12 +00001289}
1290
Neil Boothd15a58c2002-01-03 18:32:55 +00001291/* Lex a token from the expansion of MACRO, but mark parameters as we
1292 find them and warn of traditional stringification. */
Neil Booth14baae02001-09-17 18:26:12 +00001293static cpp_token *
1294lex_expansion_token (pfile, macro)
1295 cpp_reader *pfile;
1296 cpp_macro *macro;
1297{
1298 cpp_token *token;
1299
1300 pfile->cur_token = alloc_expansion_token (pfile, macro);
1301 token = _cpp_lex_direct (pfile);
Neil Booth93c803682000-10-28 17:59:06 +00001302
Neil Boothd15a58c2002-01-03 18:32:55 +00001303 /* Is this a parameter? */
Neil Booth93c803682000-10-28 17:59:06 +00001304 if (token->type == CPP_NAME && token->val.node->arg_index)
Zack Weinberg711b8822000-07-18 00:59:49 +00001305 {
Neil Booth93c803682000-10-28 17:59:06 +00001306 token->type = CPP_MACRO_ARG;
Neil Booth6c53ebf2000-11-06 18:43:32 +00001307 token->val.arg_no = token->val.node->arg_index;
Zack Weinberg711b8822000-07-18 00:59:49 +00001308 }
Neil Booth93c803682000-10-28 17:59:06 +00001309 else if (CPP_WTRADITIONAL (pfile) && macro->paramc > 0
1310 && (token->type == CPP_STRING || token->type == CPP_CHAR))
1311 check_trad_stringification (pfile, macro, &token->val.str);
Zack Weinberg711b8822000-07-18 00:59:49 +00001312
Neil Booth93c803682000-10-28 17:59:06 +00001313 return token;
Zack Weinberg711b8822000-07-18 00:59:49 +00001314}
1315
1316/* Parse a macro and save its expansion. Returns non-zero on success. */
1317int
Neil Booth93c803682000-10-28 17:59:06 +00001318_cpp_create_definition (pfile, node)
Zack Weinberg711b8822000-07-18 00:59:49 +00001319 cpp_reader *pfile;
Neil Booth93c803682000-10-28 17:59:06 +00001320 cpp_hashnode *node;
Zack Weinberg711b8822000-07-18 00:59:49 +00001321{
Neil Booth93c803682000-10-28 17:59:06 +00001322 cpp_macro *macro;
Neil Booth14baae02001-09-17 18:26:12 +00001323 cpp_token *token, *saved_cur_token;
1324 const cpp_token *ctoken;
Neil Booth93c803682000-10-28 17:59:06 +00001325 unsigned int i, ok = 1;
Zack Weinberg711b8822000-07-18 00:59:49 +00001326
Neil Booth8c3b2692001-09-30 10:03:11 +00001327 macro = (cpp_macro *) _cpp_aligned_alloc (pfile, sizeof (cpp_macro));
Neil Booth50410422001-09-15 10:18:03 +00001328 macro->line = pfile->directive_line;
Neil Booth93c803682000-10-28 17:59:06 +00001329 macro->params = 0;
1330 macro->paramc = 0;
Neil Booth28e0f042000-12-09 12:06:37 +00001331 macro->variadic = 0;
Neil Booth93c803682000-10-28 17:59:06 +00001332 macro->count = 0;
Neil Booth14baae02001-09-17 18:26:12 +00001333 macro->fun_like = 0;
Zack Weinberg711b8822000-07-18 00:59:49 +00001334
Neil Booth93c803682000-10-28 17:59:06 +00001335 /* Get the first token of the expansion (or the '(' of a
1336 function-like macro). */
Neil Booth14baae02001-09-17 18:26:12 +00001337 ctoken = _cpp_lex_token (pfile);
1338
1339 if (ctoken->type == CPP_OPEN_PAREN && !(ctoken->flags & PREV_WHITE))
Zack Weinberg711b8822000-07-18 00:59:49 +00001340 {
Neil Booth8c3b2692001-09-30 10:03:11 +00001341 ok = parse_params (pfile, macro);
1342 macro->params = (cpp_hashnode **) BUFF_FRONT (pfile->a_buff);
1343 if (!ok)
Neil Booth14baae02001-09-17 18:26:12 +00001344 goto cleanup2;
Neil Booth8c3b2692001-09-30 10:03:11 +00001345
1346 /* Success. Commit the parameter array. */
Neil Booth562a5c22002-04-21 18:46:42 +00001347 BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->params[macro->paramc];
Neil Booth93c803682000-10-28 17:59:06 +00001348 macro->fun_like = 1;
Neil Booth93c803682000-10-28 17:59:06 +00001349 }
Neil Booth14baae02001-09-17 18:26:12 +00001350 else if (ctoken->type != CPP_EOF && !(ctoken->flags & PREV_WHITE))
Neil Boothebef4e82002-04-14 18:42:47 +00001351 cpp_error (pfile, DL_PEDWARN,
1352 "ISO C requires whitespace after the macro name");
Neil Booth93c803682000-10-28 17:59:06 +00001353
Neil Booth14baae02001-09-17 18:26:12 +00001354 saved_cur_token = pfile->cur_token;
Neil Booth14baae02001-09-17 18:26:12 +00001355
1356 if (macro->fun_like)
1357 token = lex_expansion_token (pfile, macro);
1358 else
1359 {
1360 token = alloc_expansion_token (pfile, macro);
1361 *token = *ctoken;
1362 }
Neil Booth93c803682000-10-28 17:59:06 +00001363
1364 for (;;)
1365 {
1366 /* Check the stringifying # constraint 6.10.3.2.1 of
1367 function-like macros when lexing the subsequent token. */
1368 if (macro->count > 1 && token[-1].type == CPP_HASH && macro->fun_like)
Zack Weinberg711b8822000-07-18 00:59:49 +00001369 {
Neil Booth93c803682000-10-28 17:59:06 +00001370 if (token->type == CPP_MACRO_ARG)
1371 {
1372 token->flags &= ~PREV_WHITE;
1373 token->flags |= STRINGIFY_ARG;
1374 token->flags |= token[-1].flags & PREV_WHITE;
1375 token[-1] = token[0];
1376 macro->count--;
1377 }
1378 /* Let assembler get away with murder. */
Neil Boothbdb05a72000-11-26 17:31:13 +00001379 else if (CPP_OPTION (pfile, lang) != CLK_ASM)
Neil Booth93c803682000-10-28 17:59:06 +00001380 {
1381 ok = 0;
Neil Boothebef4e82002-04-14 18:42:47 +00001382 cpp_error (pfile, DL_ERROR,
1383 "'#' is not followed by a macro parameter");
Neil Booth14baae02001-09-17 18:26:12 +00001384 goto cleanup1;
Neil Booth93c803682000-10-28 17:59:06 +00001385 }
1386 }
1387
1388 if (token->type == CPP_EOF)
1389 break;
1390
1391 /* Paste operator constraint 6.10.3.3.1. */
1392 if (token->type == CPP_PASTE)
1393 {
1394 /* Token-paste ##, can appear in both object-like and
1395 function-like macros, but not at the ends. */
1396 if (--macro->count > 0)
1397 token = lex_expansion_token (pfile, macro);
1398
1399 if (macro->count == 0 || token->type == CPP_EOF)
1400 {
1401 ok = 0;
Neil Boothebef4e82002-04-14 18:42:47 +00001402 cpp_error (pfile, DL_ERROR,
Neil Booth93c803682000-10-28 17:59:06 +00001403 "'##' cannot appear at either end of a macro expansion");
Neil Booth14baae02001-09-17 18:26:12 +00001404 goto cleanup1;
Neil Booth93c803682000-10-28 17:59:06 +00001405 }
1406
1407 token[-1].flags |= PASTE_LEFT;
Neil Booth93c803682000-10-28 17:59:06 +00001408 }
1409
1410 token = lex_expansion_token (pfile, macro);
1411 }
1412
Neil Booth8c3b2692001-09-30 10:03:11 +00001413 macro->expansion = (cpp_token *) BUFF_FRONT (pfile->a_buff);
1414
Neil Booth4c2b6472000-11-11 13:19:01 +00001415 /* Don't count the CPP_EOF. */
1416 macro->count--;
Neil Booth93c803682000-10-28 17:59:06 +00001417
Neil Boothd15a58c2002-01-03 18:32:55 +00001418 /* Clear whitespace on first token for warn_of_redefinition(). */
Neil Booth8c3b2692001-09-30 10:03:11 +00001419 if (macro->count)
1420 macro->expansion[0].flags &= ~PREV_WHITE;
1421
1422 /* Commit the memory. */
Neil Booth562a5c22002-04-21 18:46:42 +00001423 BUFF_FRONT (pfile->a_buff) = (uchar *) &macro->expansion[macro->count];
Neil Booth8c3b2692001-09-30 10:03:11 +00001424
Neil Booth44ed91a2000-10-29 11:37:18 +00001425 /* Implement the macro-defined-to-itself optimisation. */
Neil Booth644edda2001-10-02 12:57:24 +00001426 if (macro->count == 1 && !macro->fun_like
1427 && macro->expansion[0].type == CPP_NAME
1428 && macro->expansion[0].val.node == node)
1429 node->flags |= NODE_DISABLED;
Neil Booth44ed91a2000-10-29 11:37:18 +00001430
Neil Booth7065e132001-02-14 07:38:20 +00001431 /* To suppress some diagnostics. */
Neil Booth47d89cf2001-08-11 07:33:39 +00001432 macro->syshdr = pfile->map->sysp != 0;
Neil Booth7065e132001-02-14 07:38:20 +00001433
Neil Booth93c803682000-10-28 17:59:06 +00001434 if (node->type != NT_VOID)
1435 {
Neil Booth4d6baaf2001-11-26 23:44:54 +00001436 if (warn_of_redefinition (node, macro))
Neil Booth93c803682000-10-28 17:59:06 +00001437 {
Neil Boothebef4e82002-04-14 18:42:47 +00001438 cpp_error_with_line (pfile, DL_PEDWARN, pfile->directive_line, 0,
1439 "\"%s\" redefined", NODE_NAME (node));
Neil Booth93c803682000-10-28 17:59:06 +00001440
Neil Booth618cdda2001-02-25 09:43:03 +00001441 if (node->type == NT_MACRO && !(node->flags & NODE_BUILTIN))
Neil Boothebef4e82002-04-14 18:42:47 +00001442 cpp_error_with_line (pfile, DL_PEDWARN, node->value.macro->line, 0,
Zack Weinberg711b8822000-07-18 00:59:49 +00001443 "this is the location of the previous definition");
1444 }
Neil Booth93c803682000-10-28 17:59:06 +00001445 _cpp_free_definition (node);
Zack Weinberg711b8822000-07-18 00:59:49 +00001446 }
1447
1448 /* Enter definition in hash table. */
Neil Booth93c803682000-10-28 17:59:06 +00001449 node->type = NT_MACRO;
1450 node->value.macro = macro;
Neil Bootha28c50352001-05-16 22:02:09 +00001451 if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_")))
Neil Booth618cdda2001-02-25 09:43:03 +00001452 node->flags |= NODE_WARN;
Zack Weinberg711b8822000-07-18 00:59:49 +00001453
Neil Booth14baae02001-09-17 18:26:12 +00001454 cleanup1:
1455
1456 /* Set type for SEEN_EOL() in cpplib.c, restore the lexer position. */
1457 saved_cur_token[-1].type = pfile->cur_token[-1].type;
1458 pfile->cur_token = saved_cur_token;
1459
1460 cleanup2:
Neil Booth93c803682000-10-28 17:59:06 +00001461
1462 /* Stop the lexer accepting __VA_ARGS__. */
1463 pfile->state.va_args_ok = 0;
1464
1465 /* Clear the fast argument lookup indices. */
1466 for (i = macro->paramc; i-- > 0; )
1467 macro->params[i]->arg_index = 0;
1468
1469 return ok;
Zack Weinberg711b8822000-07-18 00:59:49 +00001470}
1471
Neil Boothd15a58c2002-01-03 18:32:55 +00001472/* Warn if a token in STRING matches one of a function-like MACRO's
1473 parameters. */
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001474static void
Neil Booth93c803682000-10-28 17:59:06 +00001475check_trad_stringification (pfile, macro, string)
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001476 cpp_reader *pfile;
Neil Booth93c803682000-10-28 17:59:06 +00001477 const cpp_macro *macro;
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001478 const cpp_string *string;
1479{
Neil Booth93c803682000-10-28 17:59:06 +00001480 unsigned int i, len;
Neil Booth562a5c22002-04-21 18:46:42 +00001481 const uchar *p, *q, *limit = string->text + string->len;
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001482
1483 /* Loop over the string. */
1484 for (p = string->text; p < limit; p = q)
1485 {
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001486 /* Find the start of an identifier. */
Greg McGary61c16b12000-09-15 21:25:02 +00001487 while (p < limit && !is_idstart (*p))
1488 p++;
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001489
1490 /* Find the end of the identifier. */
1491 q = p;
Greg McGary61c16b12000-09-15 21:25:02 +00001492 while (q < limit && is_idchar (*q))
1493 q++;
Neil Booth93c803682000-10-28 17:59:06 +00001494
1495 len = q - p;
1496
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001497 /* Loop over the function macro arguments to see if the
1498 identifier inside the string matches one of them. */
Neil Booth93c803682000-10-28 17:59:06 +00001499 for (i = 0; i < macro->paramc; i++)
1500 {
1501 const cpp_hashnode *node = macro->params[i];
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001502
Neil Booth2a967f32001-05-20 06:26:45 +00001503 if (NODE_LEN (node) == len
1504 && !memcmp (p, NODE_NAME (node), len))
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001505 {
Neil Boothebef4e82002-04-14 18:42:47 +00001506 cpp_error (pfile, DL_WARNING,
Zack Weinbergf458d1d2002-02-27 18:48:07 +00001507 "macro argument \"%s\" would be stringified in traditional C",
Neil Boothebef4e82002-04-14 18:42:47 +00001508 NODE_NAME (node));
Kaveh R. Ghazie1aa5142000-09-10 03:41:50 +00001509 break;
1510 }
1511 }
1512 }
1513}
Neil Booth93c803682000-10-28 17:59:06 +00001514
Neil Booth70961712001-06-23 11:34:41 +00001515/* Returns the name, arguments and expansion of a macro, in a format
1516 suitable to be read back in again, and therefore also for DWARF 2
1517 debugging info. e.g. "PASTE(X, Y) X ## Y", or "MACNAME EXPANSION".
1518 Caller is expected to generate the "#define" bit if needed. The
Neil Booth93c803682000-10-28 17:59:06 +00001519 returned text is temporary, and automatically freed later. */
Neil Booth93c803682000-10-28 17:59:06 +00001520const unsigned char *
1521cpp_macro_definition (pfile, node)
1522 cpp_reader *pfile;
1523 const cpp_hashnode *node;
1524{
1525 unsigned int i, len;
1526 const cpp_macro *macro = node->value.macro;
1527 unsigned char *buffer;
1528
1529 if (node->type != NT_MACRO || (node->flags & NODE_BUILTIN))
1530 {
Neil Boothebef4e82002-04-14 18:42:47 +00001531 cpp_error (pfile, DL_ICE,
1532 "invalid hash type %d in cpp_macro_definition", node->type);
Neil Booth93c803682000-10-28 17:59:06 +00001533 return 0;
1534 }
1535
1536 /* Calculate length. */
Neil Booth70961712001-06-23 11:34:41 +00001537 len = NODE_LEN (node) + 1; /* ' ' */
Neil Booth93c803682000-10-28 17:59:06 +00001538 if (macro->fun_like)
1539 {
Jim Blandy64d08262002-04-05 00:12:40 +00001540 len += 4; /* "()" plus possible final ".." of named
1541 varargs (we have + 1 below). */
Neil Booth93c803682000-10-28 17:59:06 +00001542 for (i = 0; i < macro->paramc; i++)
Jim Blandy64d08262002-04-05 00:12:40 +00001543 len += NODE_LEN (macro->params[i]) + 1; /* "," */
Neil Booth93c803682000-10-28 17:59:06 +00001544 }
1545
Neil Booth4c2b6472000-11-11 13:19:01 +00001546 for (i = 0; i < macro->count; i++)
Neil Booth93c803682000-10-28 17:59:06 +00001547 {
Neil Booth4c2b6472000-11-11 13:19:01 +00001548 cpp_token *token = &macro->expansion[i];
Neil Booth93c803682000-10-28 17:59:06 +00001549
Neil Booth4c2b6472000-11-11 13:19:01 +00001550 if (token->type == CPP_MACRO_ARG)
Neil Bootha28c50352001-05-16 22:02:09 +00001551 len += NODE_LEN (macro->params[token->val.arg_no - 1]);
Neil Booth4c2b6472000-11-11 13:19:01 +00001552 else
1553 len += cpp_token_len (token); /* Includes room for ' '. */
1554 if (token->flags & STRINGIFY_ARG)
1555 len++; /* "#" */
1556 if (token->flags & PASTE_LEFT)
1557 len += 3; /* " ##" */
Neil Booth93c803682000-10-28 17:59:06 +00001558 }
1559
1560 if (len > pfile->macro_buffer_len)
Alexandre Oliva4b49c362001-01-09 09:30:43 +00001561 {
Neil Booth562a5c22002-04-21 18:46:42 +00001562 pfile->macro_buffer = (uchar *) xrealloc (pfile->macro_buffer, len);
Alexandre Oliva4b49c362001-01-09 09:30:43 +00001563 pfile->macro_buffer_len = len;
1564 }
Neil Booth70961712001-06-23 11:34:41 +00001565
1566 /* Fill in the buffer. Start with the macro name. */
Neil Booth93c803682000-10-28 17:59:06 +00001567 buffer = pfile->macro_buffer;
Neil Booth70961712001-06-23 11:34:41 +00001568 memcpy (buffer, NODE_NAME (node), NODE_LEN (node));
1569 buffer += NODE_LEN (node);
Neil Booth93c803682000-10-28 17:59:06 +00001570
1571 /* Parameter names. */
1572 if (macro->fun_like)
1573 {
1574 *buffer++ = '(';
1575 for (i = 0; i < macro->paramc; i++)
1576 {
1577 cpp_hashnode *param = macro->params[i];
1578
1579 if (param != pfile->spec_nodes.n__VA_ARGS__)
1580 {
Neil Bootha28c50352001-05-16 22:02:09 +00001581 memcpy (buffer, NODE_NAME (param), NODE_LEN (param));
1582 buffer += NODE_LEN (param);
Neil Booth93c803682000-10-28 17:59:06 +00001583 }
1584
1585 if (i + 1 < macro->paramc)
Jim Blandy64d08262002-04-05 00:12:40 +00001586 /* Don't emit a space after the comma here; we're trying
1587 to emit a Dwarf-friendly definition, and the Dwarf spec
1588 forbids spaces in the argument list. */
1589 *buffer++ = ',';
Neil Booth28e0f042000-12-09 12:06:37 +00001590 else if (macro->variadic)
Neil Booth93c803682000-10-28 17:59:06 +00001591 *buffer++ = '.', *buffer++ = '.', *buffer++ = '.';
1592 }
1593 *buffer++ = ')';
1594 }
1595
Jim Blandye37b38d2002-03-19 21:43:39 +00001596 /* The Dwarf spec requires a space after the macro name, even if the
1597 definition is the empty string. */
1598 *buffer++ = ' ';
1599
Neil Booth93c803682000-10-28 17:59:06 +00001600 /* Expansion tokens. */
Neil Booth4c2b6472000-11-11 13:19:01 +00001601 if (macro->count)
Neil Booth93c803682000-10-28 17:59:06 +00001602 {
Neil Booth93c803682000-10-28 17:59:06 +00001603 for (i = 0; i < macro->count; i++)
1604 {
1605 cpp_token *token = &macro->expansion[i];
1606
1607 if (token->flags & PREV_WHITE)
1608 *buffer++ = ' ';
1609 if (token->flags & STRINGIFY_ARG)
1610 *buffer++ = '#';
1611
1612 if (token->type == CPP_MACRO_ARG)
1613 {
Neil Bootha28c50352001-05-16 22:02:09 +00001614 len = NODE_LEN (macro->params[token->val.arg_no - 1]);
1615 memcpy (buffer,
1616 NODE_NAME (macro->params[token->val.arg_no - 1]), len);
Neil Booth93c803682000-10-28 17:59:06 +00001617 buffer += len;
1618 }
1619 else
1620 buffer = cpp_spell_token (pfile, token, buffer);
1621
1622 if (token->flags & PASTE_LEFT)
1623 {
1624 *buffer++ = ' ';
1625 *buffer++ = '#';
1626 *buffer++ = '#';
1627 /* Next has PREV_WHITE; see _cpp_create_definition. */
1628 }
1629 }
1630 }
1631
1632 *buffer = '\0';
1633 return pfile->macro_buffer;
1634}