directives.c 72 KB
Newer Older
1
/* CPP Library. (Directive handling.)
Jeff Law committed
2
   Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3
   1999, 2000, 2001, 2002, 2003, 2004, 2005,
4
   2007, 2008, 2009 Free Software Foundation, Inc.
5
   Contributed by Per Bothner, 1994-95.
6
   Based on CCCP program by Paul Rubin, June 1986
Per Bothner committed
7 8 9 10
   Adapted to ANSI C, Richard Stallman, Jan 1987

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
11
Free Software Foundation; either version 3, or (at your option) any
Per Bothner committed
12 13 14 15 16 17 18 19
later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
20 21
along with this program; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
Per Bothner committed
22

Jeff Law committed
23
#include "config.h"
24
#include "system.h"
Jeff Law committed
25
#include "cpplib.h"
26
#include "internal.h"
27
#include "mkdeps.h"
28
#include "obstack.h"
Per Bothner committed
29

30 31 32 33 34
/* Stack of conditionals currently in progress
   (including both successful and failing conditionals).  */
struct if_stack
{
  struct if_stack *next;
35
  linenum_type line;		/* Line where condition started.  */
Neil Booth committed
36
  const cpp_hashnode *mi_cmacro;/* macro name for #ifndef around entire file */
37 38
  bool skip_elses;		/* Can future #else / #elif be skipped?  */
  bool was_skipping;		/* If were skipping on entry.  */
39
  int type;			/* Most recent conditional for diagnostics.  */
40 41
};

42
/* Contains a registered pragma or pragma namespace.  */
43
typedef void (*pragma_cb) (cpp_reader *);
44 45 46
struct pragma_entry
{
  struct pragma_entry *next;
47
  const cpp_hashnode *pragma;	/* Name and length.  */
48 49
  bool is_nspace;
  bool is_internal;
50 51
  bool is_deferred;
  bool allow_expansion;
52 53 54
  union {
    pragma_cb handler;
    struct pragma_entry *space;
55
    unsigned int ident;
56 57 58
  } u;
};

Neil Booth committed
59 60 61 62 63 64 65 66 67 68 69
/* Values for the origin field of struct directive.  KANDR directives
   come from traditional (K&R) C.  STDC89 directives come from the
   1989 C standard.  EXTENSION directives are extensions.  */
#define KANDR		0
#define STDC89		1
#define EXTENSION	2

/* Values for the flags field of struct directive.  COND indicates a
   conditional; IF_COND an opening conditional.  INCL means to treat
   "..." and <...> as q-char and h-char sequences respectively.  IN_I
   means this directive should be handled even if -fpreprocessed is in
70 71
   effect (these are the directives with callback hooks).

Neil Booth committed
72
   EXPAND is set on directives that are always macro-expanded.  */
Neil Booth committed
73 74 75 76
#define COND		(1 << 0)
#define IF_COND		(1 << 1)
#define INCL		(1 << 2)
#define IN_I		(1 << 3)
77
#define EXPAND		(1 << 4)
78
#define DEPRECATED	(1 << 5)
Neil Booth committed
79 80

/* Defines one #-directive, including how to handle it.  */
81
typedef void (*directive_handler) (cpp_reader *);
Neil Booth committed
82 83 84 85
typedef struct directive directive;
struct directive
{
  directive_handler handler;	/* Function to handle directive.  */
86
  const uchar *name;		/* Name of directive.  */
Neil Booth committed
87 88 89 90 91
  unsigned short length;	/* Length of name.  */
  unsigned char origin;		/* Origin of directive.  */
  unsigned char flags;	        /* Flags describing this directive.  */
};

92 93
/* Forward declarations.  */

94
static void skip_rest_of_line (cpp_reader *);
95
static void check_eol (cpp_reader *, bool);
96 97 98 99 100 101
static void start_directive (cpp_reader *);
static void prepare_directive_trad (cpp_reader *);
static void end_directive (cpp_reader *, int);
static void directive_diagnostics (cpp_reader *, const directive *, int);
static void run_directive (cpp_reader *, int, const char *, size_t);
static char *glue_header_name (cpp_reader *);
102 103
static const char *parse_include (cpp_reader *, int *, const cpp_token ***,
				  source_location *);
104 105
static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *);
static unsigned int read_flag (cpp_reader *, unsigned int);
106
static bool strtolinenum (const uchar *, size_t, linenum_type *, bool *);
107
static void do_diagnostic (cpp_reader *, int, int, int);
108
static cpp_hashnode *lex_macro_node (cpp_reader *, bool);
Geoffrey Keating committed
109
static int undefine_macros (cpp_reader *, cpp_hashnode *, void *);
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
static void do_include_common (cpp_reader *, enum include_type);
static struct pragma_entry *lookup_pragma_entry (struct pragma_entry *,
                                                 const cpp_hashnode *);
static int count_registered_pragmas (struct pragma_entry *);
static char ** save_registered_pragmas (struct pragma_entry *, char **);
static char ** restore_registered_pragmas (cpp_reader *, struct pragma_entry *,
                                           char **);
static void do_pragma_once (cpp_reader *);
static void do_pragma_poison (cpp_reader *);
static void do_pragma_system_header (cpp_reader *);
static void do_pragma_dependency (cpp_reader *);
static void do_linemarker (cpp_reader *);
static const cpp_token *get_token_no_padding (cpp_reader *);
static const cpp_token *get__Pragma_string (cpp_reader *);
static void destringize_and_run (cpp_reader *, const cpp_string *);
125
static int parse_answer (cpp_reader *, struct answer **, int, source_location);
126 127 128
static cpp_hashnode *parse_assertion (cpp_reader *, struct answer **, int);
static struct answer ** find_answer (cpp_hashnode *, const struct answer *);
static void handle_assertion (cpp_reader *, const char *, int);
Kai Tietz committed
129 130
static void do_pragma_push_macro (cpp_reader *);
static void do_pragma_pop_macro (cpp_reader *);
131

132 133 134 135
/* This is the table of directive handlers.  It is ordered by
   frequency of occurrence; the numbers at the end are directive
   counts from all the source code I have lying around (egcs and libc
   CVS as of 1999-05-18, plus grub-0.5.91, linux-2.2.9, and
Neil Booth committed
136
   pcmcia-cs-3.0.9).  This is no longer important as directive lookup
137 138 139
   is now O(1).  All extensions other than #warning, #include_next,
   and #import are deprecated.  The name is where the extension
   appears to have come from.  */
140

Neil Booth committed
141 142
#define DIRECTIVE_TABLE							\
D(define,	T_DEFINE = 0,	KANDR,     IN_I)	   /* 270554 */ \
Neil Booth committed
143
D(include,	T_INCLUDE,	KANDR,     INCL | EXPAND)  /*  52262 */ \
Neil Booth committed
144 145
D(endif,	T_ENDIF,	KANDR,     COND)	   /*  45855 */ \
D(ifdef,	T_IFDEF,	KANDR,     COND | IF_COND) /*  22000 */ \
146
D(if,		T_IF,		KANDR, COND | IF_COND | EXPAND) /*  18162 */ \
Neil Booth committed
147 148 149
D(else,		T_ELSE,		KANDR,     COND)	   /*   9863 */ \
D(ifndef,	T_IFNDEF,	KANDR,     COND | IF_COND) /*   9675 */ \
D(undef,	T_UNDEF,	KANDR,     IN_I)	   /*   4837 */ \
150 151
D(line,		T_LINE,		KANDR,     EXPAND)	   /*   2465 */ \
D(elif,		T_ELIF,		STDC89,    COND | EXPAND)  /*    610 */ \
Neil Booth committed
152 153 154
D(error,	T_ERROR,	STDC89,    0)		   /*    475 */ \
D(pragma,	T_PRAGMA,	STDC89,    IN_I)	   /*    195 */ \
D(warning,	T_WARNING,	EXTENSION, 0)		   /*     22 */ \
Neil Booth committed
155
D(include_next,	T_INCLUDE_NEXT,	EXTENSION, INCL | EXPAND)  /*     19 */ \
156
D(ident,	T_IDENT,	EXTENSION, IN_I)           /*     11 */ \
Neil Booth committed
157
D(import,	T_IMPORT,	EXTENSION, INCL | EXPAND)  /* 0 ObjC */	\
158 159
D(assert,	T_ASSERT,	EXTENSION, DEPRECATED)	   /* 0 SVR4 */	\
D(unassert,	T_UNASSERT,	EXTENSION, DEPRECATED)	   /* 0 SVR4 */	\
160
D(sccs,		T_SCCS,		EXTENSION, IN_I)           /* 0 SVR4? */
161 162 163

/* #sccs is synonymous with #ident.  */
#define do_sccs do_ident
164

165 166 167
/* Use the table to generate a series of prototypes, an enum for the
   directive names, and an array of directive handlers.  */

168
#define D(name, t, o, f) static void do_##name (cpp_reader *);
169 170 171
DIRECTIVE_TABLE
#undef D

Zack Weinberg committed
172
#define D(n, tag, o, f) tag,
173 174 175 176
enum
{
  DIRECTIVE_TABLE
  N_DIRECTIVES
Per Bothner committed
177
};
178 179
#undef D

Zack Weinberg committed
180
#define D(name, t, origin, flags) \
181 182
{ do_##name, (const uchar *) #name, \
  sizeof #name - 1, origin, flags },
Neil Booth committed
183
static const directive dtable[] =
184 185 186 187 188
{
DIRECTIVE_TABLE
};
#undef D
#undef DIRECTIVE_TABLE
Per Bothner committed
189

190 191 192 193 194
/* Wrapper struct directive for linemarkers.
   The origin is more or less true - the original K+R cpp
   did use this notation in its preprocessed output.  */
static const directive linemarker_dir =
{
195
  do_linemarker, UC"#", 1, KANDR, IN_I
196 197
};

198
#define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF)
199

Neil Booth committed
200 201
/* Skip any remaining tokens in a directive.  */
static void
202
skip_rest_of_line (cpp_reader *pfile)
Zack Weinberg committed
203
{
Neil Booth committed
204
  /* Discard all stacked contexts.  */
205
  while (pfile->context->prev)
Neil Booth committed
206 207
    _cpp_pop_context (pfile);

208
  /* Sweep up all tokens remaining on the line.  */
209 210 211
  if (! SEEN_EOL ())
    while (_cpp_lex_token (pfile)->type != CPP_EOF)
      ;
Neil Booth committed
212
}
Zack Weinberg committed
213

214 215
/* Ensure there are no stray tokens at the end of a directive.  If
   EXPAND is true, tokens macro-expanding to nothing are allowed.  */
Neil Booth committed
216
static void
217
check_eol (cpp_reader *pfile, bool expand)
Neil Booth committed
218
{
219 220 221
  if (! SEEN_EOL () && (expand
			? cpp_get_token (pfile)
			: _cpp_lex_token (pfile))->type != CPP_EOF)
222
    cpp_error (pfile, CPP_DL_PEDWARN, "extra tokens at end of #%s directive",
223
	       pfile->directive->name);
Neil Booth committed
224 225
}

226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
/* Ensure there are no stray tokens other than comments at the end of
   a directive, and gather the comments.  */
static const cpp_token **
check_eol_return_comments (cpp_reader *pfile)
{
  size_t c;
  size_t capacity = 8;
  const cpp_token **buf;

  buf = XNEWVEC (const cpp_token *, capacity);
  c = 0;
  if (! SEEN_EOL ())
    {
      while (1)
	{
	  const cpp_token *tok;

	  tok = _cpp_lex_token (pfile);
	  if (tok->type == CPP_EOF)
	    break;
	  if (tok->type != CPP_COMMENT)
	    cpp_error (pfile, CPP_DL_PEDWARN,
		       "extra tokens at end of #%s directive",
		       pfile->directive->name);
	  else
	    {
	      if (c + 1 >= capacity)
		{
		  capacity *= 2;
		  buf = XRESIZEVEC (const cpp_token *, buf, capacity);
		}
	      buf[c] = tok;
	      ++c;
	    }
	}
    }
  buf[c] = NULL;
  return buf;
}

266 267
/* Called when entering a directive, _Pragma or command-line directive.  */
static void
268
start_directive (cpp_reader *pfile)
Neil Booth committed
269
{
270 271 272
  /* Setup in-directive state.  */
  pfile->state.in_directive = 1;
  pfile->state.save_comments = 0;
273
  pfile->directive_result.type = CPP_PADDING;
274

Neil Booth committed
275
  /* Some handlers need the position of the # for diagnostics.  */
276
  pfile->directive_line = pfile->line_table->highest_line;
277 278 279 280
}

/* Called when leaving a directive, _Pragma or command-line directive.  */
static void
281
end_directive (cpp_reader *pfile, int skip_line)
282
{
283 284 285
  if (pfile->state.in_deferred_pragma)
    ;
  else if (CPP_OPTION (pfile, traditional))
286
    {
Neil Booth committed
287 288 289
      /* Revert change of prepare_directive_trad.  */
      pfile->state.prevent_expansion--;

290
      if (pfile->directive != &dtable[T_DEFINE])
291 292
	_cpp_remove_overlay (pfile);
    }
293
  /* We don't skip for an assembler #.  */
294
  else if (skip_line)
295 296
    {
      skip_rest_of_line (pfile);
297 298 299 300 301
      if (!pfile->keep_tokens)
	{
	  pfile->cur_run = &pfile->base_run;
	  pfile->cur_token = pfile->base_run.base;
	}
302
    }
303 304 305 306

  /* Restore state.  */
  pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
  pfile->state.in_directive = 0;
Neil Booth committed
307
  pfile->state.in_expression = 0;
308 309 310 311
  pfile->state.angled_headers = 0;
  pfile->directive = 0;
}

312 313
/* Prepare to handle the directive in pfile->directive.  */
static void
314
prepare_directive_trad (cpp_reader *pfile)
315
{
316
  if (pfile->directive != &dtable[T_DEFINE])
317
    {
318 319
      bool no_expand = (pfile->directive
			&& ! (pfile->directive->flags & EXPAND));
320
      bool was_skipping = pfile->state.skipping;
321

Neil Booth committed
322 323
      pfile->state.in_expression = (pfile->directive == &dtable[T_IF]
				    || pfile->directive == &dtable[T_ELIF]);
324 325 326
      if (pfile->state.in_expression)
	pfile->state.skipping = false;

327 328
      if (no_expand)
	pfile->state.prevent_expansion++;
329
      _cpp_scan_out_logical_line (pfile, NULL);
330 331
      if (no_expand)
	pfile->state.prevent_expansion--;
332

333
      pfile->state.skipping = was_skipping;
334 335 336
      _cpp_overlay_buffer (pfile, pfile->out.base,
			   pfile->out.cur - pfile->out.base);
    }
Neil Booth committed
337 338 339

  /* Stop ISO C from expanding anything.  */
  pfile->state.prevent_expansion++;
340 341
}

342
/* Output diagnostics for a directive DIR.  INDENTED is nonzero if
343 344
   the '#' was indented.  */
static void
345
directive_diagnostics (cpp_reader *pfile, const directive *dir, int indented)
346
{
347 348 349 350 351 352 353 354 355 356 357
  /* Issue -pedantic or deprecated warnings for extensions.  We let
     -pedantic take precedence if both are applicable.  */
  if (! pfile->state.skipping)
    {
      if (dir->origin == EXTENSION
	  && !(dir == &dtable[T_IMPORT] && CPP_OPTION (pfile, objc))
	  && CPP_PEDANTIC (pfile))
	cpp_error (pfile, CPP_DL_PEDWARN, "#%s is a GCC extension", dir->name);
      else if (((dir->flags & DEPRECATED) != 0
		|| (dir == &dtable[T_IMPORT] && !CPP_OPTION (pfile, objc)))
	       && CPP_OPTION (pfile, warn_deprecated))
358 359
	cpp_warning (pfile, CPP_W_DEPRECATED,
                     "#%s is a deprecated GCC extension", dir->name);
360
    }
361 362 363 364 365 366 367 368

  /* Traditionally, a directive is ignored unless its # is in
     column 1.  Therefore in code intended to work with K+R
     compilers, directives added by C89 must have their #
     indented, and directives present in traditional C must not.
     This is true even of directives in skipped conditional
     blocks.  #elif cannot be used at all.  */
  if (CPP_WTRADITIONAL (pfile))
369
    {
370
      if (dir == &dtable[T_ELIF])
371 372
	cpp_warning (pfile, CPP_W_TRADITIONAL,
		     "suggest not using #elif in traditional C");
373
      else if (indented && dir->origin == KANDR)
374 375 376
	cpp_warning (pfile, CPP_W_TRADITIONAL,
		     "traditional C ignores #%s with the # indented",
		     dir->name);
377
      else if (!indented && dir->origin != KANDR)
378 379 380
	cpp_warning (pfile, CPP_W_TRADITIONAL,
		     "suggest hiding #%s from traditional C with an indented #",
		     dir->name);
381 382 383
    }
}

384
/* Check if we have a known directive.  INDENTED is nonzero if the
385
   '#' of the directive was indented.  This function is in this file
386
   to save unnecessarily exporting dtable etc. to lex.c.  Returns
387
   nonzero if the line of tokens has been handled, zero if we should
388
   continue processing the line.  */
389
int
390
_cpp_handle_directive (cpp_reader *pfile, int indented)
391 392
{
  const directive *dir = 0;
393
  const cpp_token *dname;
394
  bool was_parsing_args = pfile->state.parsing_args;
395
  bool was_discarding_output = pfile->state.discarding_output;
396 397
  int skip = 1;

398 399 400
  if (was_discarding_output)
    pfile->state.prevent_expansion = 0;

401 402 403
  if (was_parsing_args)
    {
      if (CPP_OPTION (pfile, pedantic))
404
	cpp_error (pfile, CPP_DL_PEDWARN,
405 406 407 408
	     "embedding a directive within macro arguments is not portable");
      pfile->state.parsing_args = 0;
      pfile->state.prevent_expansion = 0;
    }
409
  start_directive (pfile);
410
  dname = _cpp_lex_token (pfile);
411

412
  if (dname->type == CPP_NAME)
413
    {
414 415
      if (dname->val.node.node->is_directive)
	dir = &dtable[dname->val.node.node->directive_index];
416
    }
417
  /* We do not recognize the # followed by a number extension in
418
     assembler code.  */
419
  else if (dname->type == CPP_NUMBER && CPP_OPTION (pfile, lang) != CLK_ASM)
420
    {
421 422 423
      dir = &linemarker_dir;
      if (CPP_PEDANTIC (pfile) && ! CPP_OPTION (pfile, preprocessed)
	  && ! pfile->state.skipping)
424
	cpp_error (pfile, CPP_DL_PEDWARN,
425
		   "style of line directive is a GCC extension");
Neil Booth committed
426
    }
427

Neil Booth committed
428 429
  if (dir)
    {
430 431 432 433 434 435 436 437 438 439 440 441
      /* If we have a directive that is not an opening conditional,
	 invalidate any control macro.  */
      if (! (dir->flags & IF_COND))
	pfile->mi_valid = false;

      /* Kluge alert.  In order to be sure that code like this

	 #define HASH #
	 HASH define foo bar

	 does not cause '#define foo bar' to get executed when
	 compiled with -save-temps, we recognize directives in
442
	 -fpreprocessed mode only if the # is in column 1.  macro.c
443 444 445 446 447
	 puts a space in front of any '#' at the start of a macro.
	 
	 We exclude the -fdirectives-only case because macro expansion
	 has not been performed yet, and block comments can cause spaces
	 to preceed the directive.  */
448
      if (CPP_OPTION (pfile, preprocessed)
449
	  && !CPP_OPTION (pfile, directives_only)
450
	  && (indented || !(dir->flags & IN_I)))
451
	{
452 453
	  skip = 0;
	  dir = 0;
454 455
	}
      else
Neil Booth committed
456
	{
457 458 459 460 461
	  /* In failed conditional groups, all non-conditional
	     directives are ignored.  Before doing that, whether
	     skipping or not, we should lex angle-bracketed headers
	     correctly, and maybe output some diagnostics.  */
	  pfile->state.angled_headers = dir->flags & INCL;
462
	  pfile->state.directive_wants_padding = dir->flags & INCL;
463 464 465 466
	  if (! CPP_OPTION (pfile, preprocessed))
	    directive_diagnostics (pfile, dir, indented);
	  if (pfile->state.skipping && !(dir->flags & COND))
	    dir = 0;
Neil Booth committed
467 468
	}
    }
469
  else if (dname->type == CPP_EOF)
470 471
    ;	/* CPP_EOF is the "null directive".  */
  else
Neil Booth committed
472 473 474 475 476
    {
      /* An unknown directive.  Don't complain about it in assembly
	 source: we don't know where the comments are, and # may
	 introduce assembler pseudo-ops.  Don't complain about invalid
	 directives in skipped conditional groups (6.10 p4).  */
477
      if (CPP_OPTION (pfile, lang) == CLK_ASM)
478 479
	skip = 0;
      else if (!pfile->state.skipping)
480
	cpp_error (pfile, CPP_DL_ERROR, "invalid preprocessing directive #%s",
481
		   cpp_token_as_text (pfile, dname));
482 483
    }

484 485 486 487
  pfile->directive = dir;
  if (CPP_OPTION (pfile, traditional))
    prepare_directive_trad (pfile);

488
  if (dir)
489
    pfile->directive->handler (pfile);
490 491 492 493
  else if (skip == 0)
    _cpp_backup_tokens (pfile, 1);

  end_directive (pfile, skip);
494
  if (was_parsing_args && !pfile->state.in_deferred_pragma)
495 496 497 498 499
    {
      /* Restore state when within macro args.  */
      pfile->state.parsing_args = 2;
      pfile->state.prevent_expansion = 1;
    }
500 501
  if (was_discarding_output)
    pfile->state.prevent_expansion = 1;
502
  return skip;
Zack Weinberg committed
503
}
Per Bothner committed
504

Neil Booth committed
505
/* Directive handler wrapper used by the command line option
506
   processor.  BUF is \n terminated.  */
Neil Booth committed
507
static void
508
run_directive (cpp_reader *pfile, int dir_no, const char *buf, size_t count)
509
{
510
  cpp_push_buffer (pfile, (const uchar *) buf, count,
511
		   /* from_stage3 */ true);
512
  start_directive (pfile);
513 514 515 516 517

  /* This is a short-term fix to prevent a leading '#' being
     interpreted as a directive.  */
  _cpp_clean_line (pfile);

518
  pfile->directive = &dtable[dir_no];
519 520
  if (CPP_OPTION (pfile, traditional))
    prepare_directive_trad (pfile);
521
  pfile->directive->handler (pfile);
522
  end_directive (pfile, 1);
523
  _cpp_pop_buffer (pfile);
Neil Booth committed
524 525 526
}

/* Checks for validity the macro name in #define, #undef, #ifdef and
527 528 529
   #ifndef directives.  IS_DEF_OR_UNDEF is true if this call is
   processing a #define or #undefine directive, and false
   otherwise.  */
Zack Weinberg committed
530
static cpp_hashnode *
531
lex_macro_node (cpp_reader *pfile, bool is_def_or_undef)
Zack Weinberg committed
532
{
533
  const cpp_token *token = _cpp_lex_token (pfile);
534

535
  /* The token immediately after #define must be an identifier.  That
536 537 538 539
     identifier may not be "defined", per C99 6.10.8p4.
     In C++, it may not be any of the "named operators" either,
     per C++98 [lex.digraph], [lex.key].
     Finally, the identifier may not have been poisoned.  (In that case
540
     the lexer has issued the error message for us.)  */
541

542 543
  if (token->type == CPP_NAME)
    {
544
      cpp_hashnode *node = token->val.node.node;
545

546
      if (is_def_or_undef && node == pfile->spec_nodes.n_defined)
547
	cpp_error (pfile, CPP_DL_ERROR,
548 549 550
		   "\"defined\" cannot be used as a macro name");
      else if (! (node->flags & NODE_POISONED))
	return node;
551
    }
552
  else if (token->flags & NAMED_OP)
553
    cpp_error (pfile, CPP_DL_ERROR,
554
       "\"%s\" cannot be used as a macro name as it is an operator in C++",
555
	       NODE_NAME (token->val.node.node));
556
  else if (token->type == CPP_EOF)
557
    cpp_error (pfile, CPP_DL_ERROR, "no macro name given in #%s directive",
558 559
	       pfile->directive->name);
  else
560
    cpp_error (pfile, CPP_DL_ERROR, "macro names must be identifiers");
561

562
  return NULL;
Per Bothner committed
563 564
}

565
/* Process a #define directive.  Most work is done in macro.c.  */
Zack Weinberg committed
566
static void
567
do_define (cpp_reader *pfile)
Per Bothner committed
568
{
569
  cpp_hashnode *node = lex_macro_node (pfile, true);
570

Neil Booth committed
571 572
  if (node)
    {
573 574 575 576 577
      /* If we have been requested to expand comments into macros,
	 then re-enable saving of comments.  */
      pfile->state.save_comments =
	! CPP_OPTION (pfile, discard_comments_in_macro_exp);

578 579 580
      if (pfile->cb.before_define)
	pfile->cb.before_define (pfile);

Neil Booth committed
581 582
      if (_cpp_create_definition (pfile, node))
	if (pfile->cb.define)
583
	  pfile->cb.define (pfile, pfile->directive_line, node);
584 585

      node->flags &= ~NODE_USED;
Neil Booth committed
586
    }
Zack Weinberg committed
587 588
}

589
/* Handle #undef.  Mark the identifier NT_VOID in the hash table.  */
Zack Weinberg committed
590
static void
591
do_undef (cpp_reader *pfile)
Zack Weinberg committed
592
{
593
  cpp_hashnode *node = lex_macro_node (pfile, true);
594

595
  if (node)
596
    {
597 598 599
      if (pfile->cb.before_define)
	pfile->cb.before_define (pfile);

600
      if (pfile->cb.undef)
601
	pfile->cb.undef (pfile, pfile->directive_line, node);
602

603 604 605 606 607 608 609
      /* 6.10.3.5 paragraph 2: [#undef] is ignored if the specified
	 identifier is not currently defined as a macro name.  */
      if (node->type == NT_MACRO)
	{
	  if (node->flags & NODE_WARN)
	    cpp_error (pfile, CPP_DL_WARNING,
		       "undefining \"%s\"", NODE_NAME (node));
610

611 612
	  if (CPP_OPTION (pfile, warn_unused_macros))
	    _cpp_warn_if_unused_macro (pfile, node, NULL);
613

614 615
	  _cpp_free_definition (node);
	}
616
    }
617

618
  check_eol (pfile, false);
Per Bothner committed
619 620
}

Geoffrey Keating committed
621 622 623
/* Undefine a single macro/assertion/whatever.  */

static int
624
undefine_macros (cpp_reader *pfile ATTRIBUTE_UNUSED, cpp_hashnode *h,
Geoffrey Keating committed
625 626
		 void *data_p ATTRIBUTE_UNUSED)
{
627 628 629
  /* Body of _cpp_free_definition inlined here for speed.
     Macros and assertions no longer have anything to free.  */
  h->type = NT_VOID;
630
  h->flags &= ~(NODE_POISONED|NODE_BUILTIN|NODE_DISABLED|NODE_USED);
Geoffrey Keating committed
631 632 633 634 635 636 637 638 639 640 641 642
  return 1;
}

/* Undefine all macros and assertions.  */

void
cpp_undef_all (cpp_reader *pfile)
{
  cpp_forall_identifiers (pfile, undefine_macros, NULL);
}


Neil Booth committed
643 644
/* Helper routine used by parse_include.  Reinterpret the current line
   as an h-char-sequence (< ... >); we are looking at the first token
645 646
   after the <.  Returns a malloced filename.  */
static char *
647
glue_header_name (cpp_reader *pfile)
Neil Booth committed
648
{
649
  const cpp_token *token;
650
  char *buffer;
651
  size_t len, total_len = 0, capacity = 1024;
Neil Booth committed
652 653 654

  /* To avoid lexed tokens overwriting our glued name, we can only
     allocate from the string pool once we've lexed everything.  */
655
  buffer = XNEWVEC (char, capacity);
Neil Booth committed
656 657
  for (;;)
    {
658
      token = get_token_no_padding (pfile);
Neil Booth committed
659

660
      if (token->type == CPP_GREATER)
Neil Booth committed
661
	break;
662 663
      if (token->type == CPP_EOF)
	{
664
	  cpp_error (pfile, CPP_DL_ERROR, "missing terminating > character");
665 666
	  break;
	}
Neil Booth committed
667

668
      len = cpp_token_len (token) + 2; /* Leading space, terminating \0.  */
669
      if (total_len + len > capacity)
Neil Booth committed
670
	{
671
	  capacity = (capacity + len) * 2;
672
	  buffer = XRESIZEVEC (char, buffer, capacity);
Neil Booth committed
673 674
	}

675
      if (token->flags & PREV_WHITE)
676
	buffer[total_len++] = ' ';
Neil Booth committed
677

678 679
      total_len = (cpp_spell_token (pfile, token, (uchar *) &buffer[total_len],
				    true)
680
		   - (uchar *) buffer);
Neil Booth committed
681
    }
Zack Weinberg committed
682

683 684
  buffer[total_len] = '\0';
  return buffer;
Neil Booth committed
685
}
Per Bothner committed
686

687 688
/* Returns the file name of #include, #include_next, #import and
   #pragma dependency.  The string is malloced and the caller should
689 690 691
   free it.  Returns NULL on error.  LOCATION is the source location
   of the file name.  */

692
static const char *
693
parse_include (cpp_reader *pfile, int *pangle_brackets,
694
	       const cpp_token ***buf, source_location *location)
Per Bothner committed
695
{
696
  char *fname;
697
  const cpp_token *header;
Per Bothner committed
698

Neil Booth committed
699
  /* Allow macro expansion.  */
700
  header = get_token_no_padding (pfile);
701
  *location = header->src_loc;
702 703
  if ((header->type == CPP_STRING && header->val.str.text[0] != 'R')
      || header->type == CPP_HEADER_NAME)
Per Bothner committed
704
    {
705
      fname = XNEWVEC (char, header->val.str.len - 1);
706 707
      memcpy (fname, header->val.str.text + 1, header->val.str.len - 2);
      fname[header->val.str.len - 2] = '\0';
708
      *pangle_brackets = header->type == CPP_HEADER_NAME;
Per Bothner committed
709
    }
710
  else if (header->type == CPP_LESS)
Per Bothner committed
711
    {
712 713 714 715 716 717 718 719
      fname = glue_header_name (pfile);
      *pangle_brackets = 1;
    }
  else
    {
      const unsigned char *dir;

      if (pfile->directive == &dtable[T_PRAGMA])
720
	dir = UC"pragma dependency";
721 722
      else
	dir = pfile->directive->name;
723
      cpp_error (pfile, CPP_DL_ERROR, "#%s expects \"FILENAME\" or <FILENAME>",
724 725
		 dir);

726
      return NULL;
Per Bothner committed
727 728
    }

729 730 731 732 733
  if (pfile->directive == &dtable[T_PRAGMA])
    {
      /* This pragma allows extra tokens after the file name.  */
    }
  else if (buf == NULL || CPP_OPTION (pfile, discard_comments))
734
    check_eol (pfile, true);
735 736 737 738 739 740 741
  else
    {
      /* If we are not discarding comments, then gather them while
	 doing the eol check.  */
      *buf = check_eol_return_comments (pfile);
    }

742
  return fname;
743
}
744

745
/* Handle #include, #include_next and #import.  */
Zack Weinberg committed
746
static void
747
do_include_common (cpp_reader *pfile, enum include_type type)
748
{
749 750
  const char *fname;
  int angle_brackets;
751
  const cpp_token **buf = NULL;
752
  source_location location;
753 754 755 756

  /* Re-enable saving of comments if requested, so that the include
     callback can dump comments which follow #include.  */
  pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
757

758
  fname = parse_include (pfile, &angle_brackets, &buf, &location);
759
  if (!fname)
760 761 762 763 764
    {
      if (buf)
	XDELETEVEC (buf);
      return;
    }
Per Bothner committed
765

766 767
  if (!*fname)
  {
768 769 770
    cpp_error_with_line (pfile, CPP_DL_ERROR, location, 0,
			 "empty filename in #%s",
			 pfile->directive->name);
771 772 773
    XDELETEVEC (fname);
    if (buf)
      XDELETEVEC (buf);
774 775 776
    return;
  }

777
  /* Prevent #include recursion.  */
778
  if (pfile->line_table->depth >= CPP_STACK_MAX)
779
    cpp_error (pfile, CPP_DL_ERROR, "#include nested too deeply");
780
  else
781
    {
782 783
      /* Get out of macro context, if we are.  */
      skip_rest_of_line (pfile);
784

785
      if (pfile->cb.include)
786
	pfile->cb.include (pfile, pfile->directive_line,
787 788
			   pfile->directive->name, fname, angle_brackets,
			   buf);
789

790
      _cpp_stack_include (pfile, fname, angle_brackets, type);
791
    }
792

793 794 795
  XDELETEVEC (fname);
  if (buf)
    XDELETEVEC (buf);
796
}
797

Zack Weinberg committed
798
static void
799
do_include (cpp_reader *pfile)
800
{
801 802
  do_include_common (pfile, IT_INCLUDE);
}
803

804
static void
805
do_import (cpp_reader *pfile)
806 807
{
  do_include_common (pfile, IT_IMPORT);
808
}
Per Bothner committed
809

Zack Weinberg committed
810
static void
811
do_include_next (cpp_reader *pfile)
812
{
813 814 815 816
  enum include_type type = IT_INCLUDE_NEXT;

  /* If this is the primary source file, warn and use the normal
     search logic.  */
817
  if (cpp_in_primary_file (pfile))
818
    {
819
      cpp_error (pfile, CPP_DL_WARNING,
820 821 822 823
		 "#include_next in primary source file");
      type = IT_INCLUDE;
    }
  do_include_common (pfile, type);
Per Bothner committed
824 825
}

826 827 828 829
/* Subroutine of do_linemarker.  Read possible flags after file name.
   LAST is the last flag seen; 0 if this is the first flag. Return the
   flag if it is valid, 0 at the end of the directive. Otherwise
   complain.  */
830
static unsigned int
831
read_flag (cpp_reader *pfile, unsigned int last)
832
{
833
  const cpp_token *token = _cpp_lex_token (pfile);
834

835
  if (token->type == CPP_NUMBER && token->val.str.len == 1)
836
    {
837
      unsigned int flag = token->val.str.text[0] - '0';
838 839 840 841 842

      if (flag > last && flag <= 4
	  && (flag != 4 || last == 3)
	  && (flag != 2 || last == 0))
	return flag;
843
    }
Neil Booth committed
844

845
  if (token->type != CPP_EOF)
846
    cpp_error (pfile, CPP_DL_ERROR, "invalid flag \"%s\" in line directive",
847
	       cpp_token_as_text (pfile, token));
Neil Booth committed
848
  return 0;
849 850
}

851
/* Subroutine of do_line and do_linemarker.  Convert a number in STR,
852 853 854 855 856
   of length LEN, to binary; store it in NUMP, and return false if the
   number was well-formed, true if not. WRAPPED is set to true if the
   number did not fit into 'unsigned long'.  */
static bool
strtolinenum (const uchar *str, size_t len, linenum_type *nump, bool *wrapped)
Zack Weinberg committed
857
{
858
  linenum_type reg = 0;
859 860
  linenum_type reg_prev = 0;

861
  uchar c;
862
  *wrapped = false;
Zack Weinberg committed
863 864 865 866
  while (len--)
    {
      c = *str++;
      if (!ISDIGIT (c))
867
	return true;
Zack Weinberg committed
868 869
      reg *= 10;
      reg += c - '0';
870 871 872
      if (reg < reg_prev) 
	*wrapped = true;
      reg_prev = reg;
Zack Weinberg committed
873 874
    }
  *nump = reg;
875
  return false;
Zack Weinberg committed
876 877
}

878
/* Interpret #line command.
879 880
   Note that the filename string (if any) is a true string constant
   (escapes are interpreted), unlike in #line.  */
Zack Weinberg committed
881
static void
882
do_line (cpp_reader *pfile)
Per Bothner committed
883
{
884 885
  const struct line_maps *line_table = pfile->line_table;
  const struct line_map *map = &line_table->maps[line_table->used - 1];
886 887 888 889 890

  /* skip_rest_of_line() may cause line table to be realloc()ed so note down
     sysp right now.  */

  unsigned char map_sysp = map->sysp;
891
  const cpp_token *token;
892
  const char *new_file = map->to_file;
893
  linenum_type new_lineno;
Neil Booth committed
894

895
  /* C99 raised the minimum limit on #line numbers.  */
896
  linenum_type cap = CPP_OPTION (pfile, c99) ? 2147483647 : 32767;
897
  bool wrapped;
898

Neil Booth committed
899
  /* #line commands expand macros.  */
900 901
  token = cpp_get_token (pfile);
  if (token->type != CPP_NUMBER
902
      || strtolinenum (token->val.str.text, token->val.str.len,
903
		       &new_lineno, &wrapped))
Per Bothner committed
904
    {
905 906 907 908 909 910
      if (token->type == CPP_EOF)
	cpp_error (pfile, CPP_DL_ERROR, "unexpected end of file after #line");
      else
	cpp_error (pfile, CPP_DL_ERROR,
		   "\"%s\" after #line is not a positive integer",
		   cpp_token_as_text (pfile, token));
911
      return;
912
    }
Per Bothner committed
913

914
  if (CPP_PEDANTIC (pfile) && (new_lineno == 0 || new_lineno > cap || wrapped))
915
    cpp_error (pfile, CPP_DL_PEDWARN, "line number out of range");
916 917
  else if (wrapped)
    cpp_error (pfile, CPP_DL_WARNING, "line number out of range");
Per Bothner committed
918

919 920
  token = cpp_get_token (pfile);
  if (token->type == CPP_STRING)
921
    {
922
      cpp_string s = { 0, 0 };
923
      if (cpp_interpret_string_notranslate (pfile, &token->val.str, 1,
924
					    &s, CPP_STRING))
925
	new_file = (const char *)s.text;
926
      check_eol (pfile, true);
927 928 929
    }
  else if (token->type != CPP_EOF)
    {
930
      cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename",
931 932 933 934 935
		 cpp_token_as_text (pfile, token));
      return;
    }

  skip_rest_of_line (pfile);
936
  _cpp_do_file_change (pfile, LC_RENAME_VERBATIM, new_file, new_lineno,
937
		       map_sysp);
938 939 940 941 942 943
}

/* Interpret the # 44 "file" [flags] notation, which has slightly
   different syntax and semantics from #line:  Flags are allowed,
   and we never complain about the line number being too big.  */
static void
944
do_linemarker (cpp_reader *pfile)
945
{
946 947
  const struct line_maps *line_table = pfile->line_table;
  const struct line_map *map = &line_table->maps[line_table->used - 1];
948
  const cpp_token *token;
949
  const char *new_file = map->to_file;
950
  linenum_type new_lineno;
951
  unsigned int new_sysp = map->sysp;
952
  enum lc_reason reason = LC_RENAME_VERBATIM;
953
  int flag;
954
  bool wrapped;
955 956 957 958 959 960 961 962 963

  /* Back up so we can get the number again.  Putting this in
     _cpp_handle_directive risks two calls to _cpp_backup_tokens in
     some circumstances, which can segfault.  */
  _cpp_backup_tokens (pfile, 1);

  /* #line commands expand macros.  */
  token = cpp_get_token (pfile);
  if (token->type != CPP_NUMBER
964
      || strtolinenum (token->val.str.text, token->val.str.len,
965
		       &new_lineno, &wrapped))
966
    {
967 968
      /* Unlike #line, there does not seem to be a way to get an EOF
	 here.  So, it should be safe to always spell the token.  */
969 970
      cpp_error (pfile, CPP_DL_ERROR,
		 "\"%s\" after # is not a positive integer",
971 972
		 cpp_token_as_text (pfile, token));
      return;
973
    }
974

975 976 977
  token = cpp_get_token (pfile);
  if (token->type == CPP_STRING)
    {
978
      cpp_string s = { 0, 0 };
979
      if (cpp_interpret_string_notranslate (pfile, &token->val.str,
980
					    1, &s, CPP_STRING))
981
	new_file = (const char *)s.text;
982

983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
      new_sysp = 0;
      flag = read_flag (pfile, 0);
      if (flag == 1)
	{
	  reason = LC_ENTER;
	  /* Fake an include for cpp_included ().  */
	  _cpp_fake_include (pfile, new_file);
	  flag = read_flag (pfile, flag);
	}
      else if (flag == 2)
	{
	  reason = LC_LEAVE;
	  flag = read_flag (pfile, flag);
	}
      if (flag == 3)
Neil Booth committed
998
	{
999 1000 1001 1002
	  new_sysp = 1;
	  flag = read_flag (pfile, flag);
	  if (flag == 4)
	    new_sysp = 2;
Neil Booth committed
1003
	}
1004
      pfile->buffer->sysp = new_sysp;
1005

1006
      check_eol (pfile, false);
Zack Weinberg committed
1007
    }
1008
  else if (token->type != CPP_EOF)
1009
    {
1010
      cpp_error (pfile, CPP_DL_ERROR, "\"%s\" is not a valid filename",
1011
		 cpp_token_as_text (pfile, token));
1012 1013
      return;
    }
Per Bothner committed
1014

1015
  skip_rest_of_line (pfile);
1016 1017 1018 1019 1020 1021 1022 1023

  /* Compensate for the increment in linemap_add that occurs in
     _cpp_do_file_change.  We're currently at the start of the line
     *following* the #line directive.  A separate source_location for this
     location makes no sense (until we do the LC_LEAVE), and
     complicates LAST_SOURCE_LINE_LOCATION.  */
  pfile->line_table->highest_location--;

1024
  _cpp_do_file_change (pfile, reason, new_file, new_lineno, new_sysp);
1025 1026
}

1027
/* Arrange the file_change callback.  pfile->line has changed to
Neil Booth committed
1028
   FILE_LINE of TO_FILE, for reason REASON.  SYSP is 1 for a system
1029
   header, 2 for a system header that needs to be extern "C" protected,
Neil Booth committed
1030
   and zero otherwise.  */
1031
void
1032
_cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason,
1033
		     const char *to_file, linenum_type file_line,
1034
		     unsigned int sysp)
1035
{
1036 1037
  const struct line_map *map = linemap_add (pfile->line_table, reason, sysp,
					    to_file, file_line);
1038 1039
  if (map != NULL)
    linemap_line_start (pfile->line_table, map->to_line, 127);
Neil Booth committed
1040

1041
  if (pfile->cb.file_change)
1042
    pfile->cb.file_change (pfile, map);
Per Bothner committed
1043
}
1044

1045 1046
/* Report a warning or error detected by the program we are
   processing.  Use the directive's tokens in the error message.  */
Zack Weinberg committed
1047
static void
1048
do_diagnostic (cpp_reader *pfile, int code, int reason, int print_dir)
Per Bothner committed
1049
{
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
  const unsigned char *dir_name;
  unsigned char *line;
  source_location src_loc = pfile->cur_token[-1].src_loc;

  if (print_dir)
    dir_name = pfile->directive->name;
  else
    dir_name = NULL;
  pfile->state.prevent_expansion++;
  line = cpp_output_line_to_string (pfile, dir_name);
  pfile->state.prevent_expansion--;

1062 1063 1064 1065 1066 1067
  if (code == CPP_DL_WARNING_SYSHDR && reason)
    cpp_warning_with_line_syshdr (pfile, reason, src_loc, 0, "%s", line);
  else if (code == CPP_DL_WARNING && reason)
    cpp_warning_with_line (pfile, reason, src_loc, 0, "%s", line);
  else
    cpp_error_with_line (pfile, code, src_loc, 0, "%s", line);
1068
  free (line);
Per Bothner committed
1069 1070
}

1071
static void
1072
do_error (cpp_reader *pfile)
1073
{
1074
  do_diagnostic (pfile, CPP_DL_ERROR, 0, 1);
1075
}
Per Bothner committed
1076

Zack Weinberg committed
1077
static void
1078
do_warning (cpp_reader *pfile)
Per Bothner committed
1079
{
1080
  /* We want #warning diagnostics to be emitted in system headers too.  */
1081
  do_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, CPP_W_WARNING_DIRECTIVE, 1);
Per Bothner committed
1082 1083
}

1084
/* Report program identification.  */
Zack Weinberg committed
1085
static void
1086
do_ident (cpp_reader *pfile)
Per Bothner committed
1087
{
1088
  const cpp_token *str = cpp_get_token (pfile);
1089

1090
  if (str->type != CPP_STRING)
1091 1092
    cpp_error (pfile, CPP_DL_ERROR, "invalid #%s directive",
	       pfile->directive->name);
Neil Booth committed
1093
  else if (pfile->cb.ident)
1094
    pfile->cb.ident (pfile, pfile->directive_line, &str->val.str);
1095

1096
  check_eol (pfile, false);
Per Bothner committed
1097 1098
}

1099 1100 1101 1102
/* Lookup a PRAGMA name in a singly-linked CHAIN.  Returns the
   matching entry, or NULL if none is found.  The returned entry could
   be the start of a namespace chain, or a pragma.  */
static struct pragma_entry *
1103
lookup_pragma_entry (struct pragma_entry *chain, const cpp_hashnode *pragma)
1104
{
1105 1106
  while (chain && chain->pragma != pragma)
    chain = chain->next;
1107 1108 1109 1110

  return chain;
}

1111 1112
/* Create and insert a blank pragma entry at the beginning of a
   singly-linked CHAIN.  */
1113
static struct pragma_entry *
1114
new_pragma_entry (cpp_reader *pfile, struct pragma_entry **chain)
1115
{
1116
  struct pragma_entry *new_entry;
1117

1118
  new_entry = (struct pragma_entry *)
1119
    _cpp_aligned_alloc (pfile, sizeof (struct pragma_entry));
1120

1121
  memset (new_entry, 0, sizeof (struct pragma_entry));
1122
  new_entry->next = *chain;
1123

1124 1125
  *chain = new_entry;
  return new_entry;
1126
}
1127

1128
/* Register a pragma NAME in namespace SPACE.  If SPACE is null, it
1129 1130 1131 1132
   goes in the global namespace.  */
static struct pragma_entry *
register_pragma_1 (cpp_reader *pfile, const char *space, const char *name,
		   bool allow_name_expansion)
1133
{
1134 1135
  struct pragma_entry **chain = &pfile->pragmas;
  struct pragma_entry *entry;
1136
  const cpp_hashnode *node;
1137 1138

  if (space)
1139
    {
1140
      node = cpp_lookup (pfile, UC space, strlen (space));
1141
      entry = lookup_pragma_entry (*chain, node);
1142
      if (!entry)
1143 1144 1145 1146 1147 1148
	{
	  entry = new_pragma_entry (pfile, chain);
	  entry->pragma = node;
	  entry->is_nspace = true;
	  entry->allow_expansion = allow_name_expansion;
	}
1149 1150
      else if (!entry->is_nspace)
	goto clash;
1151 1152 1153 1154 1155 1156 1157
      else if (entry->allow_expansion != allow_name_expansion)
	{
	  cpp_error (pfile, CPP_DL_ICE,
		     "registering pragmas in namespace \"%s\" with mismatched "
		     "name expansion", space);
	  return NULL;
	}
1158
      chain = &entry->u.space;
1159
    }
1160 1161 1162 1163 1164 1165 1166
  else if (allow_name_expansion)
    {
      cpp_error (pfile, CPP_DL_ICE,
		 "registering pragma \"%s\" with name expansion "
		 "and no namespace", name);
      return NULL;
    }
1167

1168
  /* Check for duplicates.  */
1169
  node = cpp_lookup (pfile, UC name, strlen (name));
1170
  entry = lookup_pragma_entry (*chain, node);
1171
  if (entry == NULL)
1172
    {
1173 1174 1175
      entry = new_pragma_entry (pfile, chain);
      entry->pragma = node;
      return entry;
1176
    }
1177 1178 1179 1180 1181 1182 1183 1184 1185

  if (entry->is_nspace)
    clash:
    cpp_error (pfile, CPP_DL_ICE,
	       "registering \"%s\" as both a pragma and a pragma namespace",
	       NODE_NAME (node));
  else if (space)
    cpp_error (pfile, CPP_DL_ICE, "#pragma %s %s is already registered",
	       space, name);
1186
  else
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
    cpp_error (pfile, CPP_DL_ICE, "#pragma %s is already registered", name);

  return NULL;
}

/* Register a cpplib internal pragma SPACE NAME with HANDLER.  */
static void
register_pragma_internal (cpp_reader *pfile, const char *space,
			  const char *name, pragma_cb handler)
{
  struct pragma_entry *entry;

  entry = register_pragma_1 (pfile, space, name, false);
  entry->is_internal = true;
  entry->u.handler = handler;
1202 1203 1204 1205
}

/* Register a pragma NAME in namespace SPACE.  If SPACE is null, it
   goes in the global namespace.  HANDLER is the handler it will call,
1206 1207 1208
   which must be non-NULL.  If ALLOW_EXPANSION is set, allow macro
   expansion while parsing pragma NAME.  This function is exported
   from libcpp. */
1209 1210
void
cpp_register_pragma (cpp_reader *pfile, const char *space, const char *name,
1211
		     pragma_cb handler, bool allow_expansion)
1212
{
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226
  struct pragma_entry *entry;

  if (!handler)
    {
      cpp_error (pfile, CPP_DL_ICE, "registering pragma with NULL handler");
      return;
    }

  entry = register_pragma_1 (pfile, space, name, false);
  if (entry)
    {
      entry->allow_expansion = allow_expansion;
      entry->u.handler = handler;
    }
1227
}
1228

1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247
/* Similarly, but create mark the pragma for deferred processing.
   When found, a CPP_PRAGMA token will be insertted into the stream
   with IDENT in the token->u.pragma slot.  */
void
cpp_register_deferred_pragma (cpp_reader *pfile, const char *space,
			      const char *name, unsigned int ident,
			      bool allow_expansion, bool allow_name_expansion)
{
  struct pragma_entry *entry;

  entry = register_pragma_1 (pfile, space, name, allow_name_expansion);
  if (entry)
    {
      entry->is_deferred = true;
      entry->allow_expansion = allow_expansion;
      entry->u.ident = ident;
    }
}  

1248
/* Register the pragmas the preprocessor itself handles.  */
1249
void
1250
_cpp_init_internal_pragmas (cpp_reader *pfile)
1251
{
1252
  /* Pragmas in the global namespace.  */
1253
  register_pragma_internal (pfile, 0, "once", do_pragma_once);
Kai Tietz committed
1254 1255
  register_pragma_internal (pfile, 0, "push_macro", do_pragma_push_macro);
  register_pragma_internal (pfile, 0, "pop_macro", do_pragma_pop_macro);
1256

1257
  /* New GCC-specific pragmas should be put in the GCC namespace.  */
1258 1259 1260 1261
  register_pragma_internal (pfile, "GCC", "poison", do_pragma_poison);
  register_pragma_internal (pfile, "GCC", "system_header",
			    do_pragma_system_header);
  register_pragma_internal (pfile, "GCC", "dependency", do_pragma_dependency);
1262
}
Per Bothner committed
1263

1264 1265 1266
/* Return the number of registered pragmas in PE.  */

static int
1267
count_registered_pragmas (struct pragma_entry *pe)
1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
{
  int ct = 0;
  for (; pe != NULL; pe = pe->next)
    {
      if (pe->is_nspace)
	ct += count_registered_pragmas (pe->u.space);
      ct++;
    }
  return ct;
}

/* Save into SD the names of the registered pragmas referenced by PE,
   and return a pointer to the next free space in SD.  */

static char **
1283
save_registered_pragmas (struct pragma_entry *pe, char **sd)
1284 1285 1286 1287 1288
{
  for (; pe != NULL; pe = pe->next)
    {
      if (pe->is_nspace)
	sd = save_registered_pragmas (pe->u.space, sd);
1289 1290 1291
      *sd++ = (char *) xmemdup (HT_STR (&pe->pragma->ident),
                                HT_LEN (&pe->pragma->ident),
                                HT_LEN (&pe->pragma->ident) + 1);
1292 1293 1294 1295 1296 1297 1298 1299
    }
  return sd;
}

/* Return a newly-allocated array which saves the names of the
   registered pragmas.  */

char **
1300
_cpp_save_pragma_names (cpp_reader *pfile)
1301 1302
{
  int ct = count_registered_pragmas (pfile->pragmas);
1303
  char **result = XNEWVEC (char *, ct);
1304 1305 1306 1307 1308 1309 1310 1311
  (void) save_registered_pragmas (pfile->pragmas, result);
  return result;
}

/* Restore from SD the names of the registered pragmas referenced by PE,
   and return a pointer to the next unused name in SD.  */

static char **
1312 1313
restore_registered_pragmas (cpp_reader *pfile, struct pragma_entry *pe,
			    char **sd)
1314 1315 1316 1317 1318
{
  for (; pe != NULL; pe = pe->next)
    {
      if (pe->is_nspace)
	sd = restore_registered_pragmas (pfile, pe->u.space, sd);
1319
      pe->pragma = cpp_lookup (pfile, UC *sd, strlen (*sd));
1320 1321 1322 1323 1324 1325 1326 1327 1328
      free (*sd);
      sd++;
    }
  return sd;
}

/* Restore the names of the registered pragmas from SAVED.  */

void
1329
_cpp_restore_pragma_names (cpp_reader *pfile, char **saved)
1330 1331 1332 1333 1334
{
  (void) restore_registered_pragmas (pfile, pfile->pragmas, saved);
  free (saved);
}

1335 1336 1337 1338
/* Pragmata handling.  We handle some, and pass the rest on to the
   front end.  C99 defines three pragmas and says that no macro
   expansion is to be performed on them; whether or not macro
   expansion happens for other pragmas is implementation defined.
1339 1340 1341
   This implementation allows for a mix of both, since GCC did not
   traditionally macro expand its (few) pragmas, whereas OpenMP
   specifies that macro expansion should happen.  */
Zack Weinberg committed
1342
static void
1343
do_pragma (cpp_reader *pfile)
Per Bothner committed
1344
{
1345
  const struct pragma_entry *p = NULL;
1346
  const cpp_token *token, *pragma_token = pfile->cur_token;
1347
  cpp_token ns_token;
1348
  unsigned int count = 1;
Zack Weinberg committed
1349

Neil Booth committed
1350
  pfile->state.prevent_expansion++;
1351

1352
  token = cpp_get_token (pfile);
1353
  ns_token = *token;
1354
  if (token->type == CPP_NAME)
1355
    {
1356
      p = lookup_pragma_entry (pfile->pragmas, token->val.node.node);
1357
      if (p && p->is_nspace)
1358
	{
1359 1360 1361
	  bool allow_name_expansion = p->allow_expansion;
	  if (allow_name_expansion)
	    pfile->state.prevent_expansion--;
1362 1363
	  token = cpp_get_token (pfile);
	  if (token->type == CPP_NAME)
1364
	    p = lookup_pragma_entry (p->u.space, token->val.node.node);
1365 1366
	  else
	    p = NULL;
1367 1368 1369
	  if (allow_name_expansion)
	    pfile->state.prevent_expansion++;
	  count = 2;
1370 1371
	}
    }
Zack Weinberg committed
1372

1373
  if (p)
1374
    {
1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386
      if (p->is_deferred)
	{
	  pfile->directive_result.src_loc = pragma_token->src_loc;
	  pfile->directive_result.type = CPP_PRAGMA;
	  pfile->directive_result.flags = pragma_token->flags;
	  pfile->directive_result.val.pragma = p->u.ident;
	  pfile->state.in_deferred_pragma = true;
	  pfile->state.pragma_allow_expansion = p->allow_expansion;
	  if (!p->allow_expansion)
	    pfile->state.prevent_expansion++;
	}
      else
1387
	{
1388 1389
	  /* Since the handler below doesn't get the line number, that
	     it might need for diagnostics, make sure it has the right
1390 1391 1392
	     numbers in place.  */
	  if (pfile->cb.line_change)
	    (*pfile->cb.line_change) (pfile, pragma_token, false);
1393
	  if (p->allow_expansion)
1394
	    pfile->state.prevent_expansion--;
1395
	  (*p->u.handler) (pfile);
1396
	  if (p->allow_expansion)
1397
	    pfile->state.prevent_expansion++;
1398
	}
1399
    }
Neil Booth committed
1400
  else if (pfile->cb.def_pragma)
1401
    {
1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417
      if (count == 1 || pfile->context->prev == NULL)
	_cpp_backup_tokens (pfile, count);
      else
	{
	  /* Invalid name comes from macro expansion, _cpp_backup_tokens
	     won't allow backing 2 tokens.  */
	  /* ??? The token buffer is leaked.  Perhaps if def_pragma hook
	     reads both tokens, we could perhaps free it, but if it doesn't,
	     we don't know the exact lifespan.  */
	  cpp_token *toks = XNEWVEC (cpp_token, 2);
	  toks[0] = ns_token;
	  toks[0].flags |= NO_EXPAND;
	  toks[1] = *token;
	  toks[1].flags |= NO_EXPAND;
	  _cpp_push_token_context (pfile, NULL, toks, 2);
	}
1418
      pfile->cb.def_pragma (pfile, pfile->directive_line);
1419
    }
1420

1421
  pfile->state.prevent_expansion--;
1422 1423
}

1424
/* Handle #pragma once.  */
1425
static void
1426
do_pragma_once (cpp_reader *pfile)
1427
{
1428
  if (cpp_in_primary_file (pfile))
1429
    cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file");
Neil Booth committed
1430

1431
  check_eol (pfile, false);
1432
  _cpp_mark_file_once_only (pfile, pfile->buffer->file);
1433
}
1434

Kai Tietz committed
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
/* Handle #pragma push_macro(STRING).  */
static void
do_pragma_push_macro (cpp_reader *pfile)
{
  char *macroname, *dest;
  const char *limit, *src;
  const cpp_token *txt;
  struct def_pragma_macro *c;

  txt = get__Pragma_string (pfile);
  if (!txt)
    {
      source_location src_loc = pfile->cur_token[-1].src_loc;
      cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0,
		 "invalid #pragma push_macro directive");
      check_eol (pfile, false);
      skip_rest_of_line (pfile);
      return;
    }
  dest = macroname = (char *) alloca (txt->val.str.len + 2);
  src = (const char *) (txt->val.str.text + 1 + (txt->val.str.text[0] == 'L'));
  limit = (const char *) (txt->val.str.text + txt->val.str.len - 1);
  while (src < limit)
    {
      /* We know there is a character following the backslash.  */
      if (*src == '\\' && (src[1] == '\\' || src[1] == '"'))
	src++;
      *dest++ = *src++;
    }
  *dest = 0;
  check_eol (pfile, false);
  skip_rest_of_line (pfile);
  c = XNEW (struct def_pragma_macro);
  c->name = XNEWVAR (char, strlen (macroname) + 1);
  strcpy (c->name, macroname);
  c->next = pfile->pushed_macros;
  c->value = cpp_push_definition (pfile, c->name);
  pfile->pushed_macros = c;
}

/* Handle #pragma pop_macro(STRING).  */
static void
do_pragma_pop_macro (cpp_reader *pfile)
{
  char *macroname, *dest;
  const char *limit, *src;
  const cpp_token *txt;
  struct def_pragma_macro *l = NULL, *c = pfile->pushed_macros;
  txt = get__Pragma_string (pfile);
  if (!txt)
    {
      source_location src_loc = pfile->cur_token[-1].src_loc;
      cpp_error_with_line (pfile, CPP_DL_ERROR, src_loc, 0,
		 "invalid #pragma pop_macro directive");
      check_eol (pfile, false);
      skip_rest_of_line (pfile);
      return;
    }
  dest = macroname = (char *) alloca (txt->val.str.len + 2);
  src = (const char *) (txt->val.str.text + 1 + (txt->val.str.text[0] == 'L'));
  limit = (const char *) (txt->val.str.text + txt->val.str.len - 1);
  while (src < limit)
    {
      /* We know there is a character following the backslash.  */
      if (*src == '\\' && (src[1] == '\\' || src[1] == '"'))
	src++;
      *dest++ = *src++;
    }
  *dest = 0;
  check_eol (pfile, false);
  skip_rest_of_line (pfile);

  while (c != NULL)
    {
      if (!strcmp (c->name, macroname))
	{
	  if (!l)
	    pfile->pushed_macros = c->next;
	  else
	    l->next = c->next;
	  cpp_pop_definition (pfile, c->name, c->value);
	  free (c->name);
	  free (c);
	  break;
	}
      l = c;
      c = c->next;
    }
}

1525 1526
/* Handle #pragma GCC poison, to poison one or more identifiers so
   that the lexer produces a hard error for each subsequent usage.  */
1527
static void
1528
do_pragma_poison (cpp_reader *pfile)
1529
{
1530
  const cpp_token *tok;
1531
  cpp_hashnode *hp;
1532

Neil Booth committed
1533
  pfile->state.poisoned_ok = 1;
1534 1535
  for (;;)
    {
1536 1537
      tok = _cpp_lex_token (pfile);
      if (tok->type == CPP_EOF)
1538
	break;
1539
      if (tok->type != CPP_NAME)
1540
	{
1541 1542
	  cpp_error (pfile, CPP_DL_ERROR,
		     "invalid #pragma GCC poison directive");
Neil Booth committed
1543
	  break;
1544 1545
	}

1546
      hp = tok->val.node.node;
Neil Booth committed
1547 1548 1549 1550
      if (hp->flags & NODE_POISONED)
	continue;

      if (hp->type == NT_MACRO)
1551
	cpp_error (pfile, CPP_DL_WARNING, "poisoning existing macro \"%s\"",
1552
		   NODE_NAME (hp));
Neil Booth committed
1553 1554
      _cpp_free_definition (hp);
      hp->flags |= NODE_POISONED | NODE_DIAGNOSTIC;
1555
    }
Neil Booth committed
1556
  pfile->state.poisoned_ok = 0;
Per Bothner committed
1557
}
1558 1559 1560 1561 1562 1563 1564

/* Mark the current header as a system header.  This will suppress
   some categories of warnings (notably those from -pedantic).  It is
   intended for use in system libraries that cannot be implemented in
   conforming C, but cannot be certain that their headers appear in a
   system include directory.  To prevent abuse, it is rejected in the
   primary source file.  */
1565
static void
1566
do_pragma_system_header (cpp_reader *pfile)
1567
{
1568
  if (cpp_in_primary_file (pfile))
1569
    cpp_error (pfile, CPP_DL_WARNING,
1570
	       "#pragma system_header ignored outside include file");
1571
  else
Neil Booth committed
1572
    {
1573
      check_eol (pfile, false);
1574
      skip_rest_of_line (pfile);
Neil Booth committed
1575 1576
      cpp_make_system_header (pfile, 1, 0);
    }
1577
}
1578 1579 1580 1581

/* Check the modified date of the current include file against a specified
   file. Issue a diagnostic, if the specified file is newer. We use this to
   determine if a fixed header should be refixed.  */
1582
static void
1583
do_pragma_dependency (cpp_reader *pfile)
1584
{
1585 1586
  const char *fname;
  int angle_brackets, ordering;
1587
  source_location location;
1588

1589
  fname = parse_include (pfile, &angle_brackets, NULL, &location);
1590
  if (!fname)
1591
    return;
Zack Weinberg committed
1592

1593
  ordering = _cpp_compare_file_date (pfile, fname, angle_brackets);
1594
  if (ordering < 0)
1595
    cpp_error (pfile, CPP_DL_WARNING, "cannot find source file %s", fname);
1596 1597
  else if (ordering > 0)
    {
1598 1599
      cpp_error (pfile, CPP_DL_WARNING,
		 "current file is older than %s", fname);
1600
      if (cpp_get_token (pfile)->type != CPP_EOF)
1601 1602
	{
	  _cpp_backup_tokens (pfile, 1);
1603
	  do_diagnostic (pfile, CPP_DL_WARNING, 0, 0);
1604
	}
1605
    }
1606

1607
  free ((void *) fname);
1608 1609
}

1610 1611
/* Get a token but skip padding.  */
static const cpp_token *
1612
get_token_no_padding (cpp_reader *pfile)
1613
{
1614 1615 1616 1617 1618 1619 1620
  for (;;)
    {
      const cpp_token *result = cpp_get_token (pfile);
      if (result->type != CPP_PADDING)
	return result;
    }
}
1621

1622 1623 1624
/* Check syntax is "(string-literal)".  Returns the string on success,
   or NULL on failure.  */
static const cpp_token *
1625
get__Pragma_string (cpp_reader *pfile)
1626 1627
{
  const cpp_token *string;
1628
  const cpp_token *paren;
1629

1630 1631 1632 1633
  paren = get_token_no_padding (pfile);
  if (paren->type == CPP_EOF)
    _cpp_backup_tokens (pfile, 1);
  if (paren->type != CPP_OPEN_PAREN)
1634 1635 1636
    return NULL;

  string = get_token_no_padding (pfile);
1637 1638
  if (string->type == CPP_EOF)
    _cpp_backup_tokens (pfile, 1);
1639
  if (string->type != CPP_STRING && string->type != CPP_WSTRING
1640 1641
      && string->type != CPP_STRING32 && string->type != CPP_STRING16
      && string->type != CPP_UTF8STRING)
1642 1643
    return NULL;

1644 1645 1646 1647
  paren = get_token_no_padding (pfile);
  if (paren->type == CPP_EOF)
    _cpp_backup_tokens (pfile, 1);
  if (paren->type != CPP_CLOSE_PAREN)
1648
    return NULL;
1649

1650
  return string;
1651 1652
}

1653 1654 1655
/* Destringize IN into a temporary buffer, by removing the first \ of
   \" and \\ sequences, and process the result as a #pragma directive.  */
static void
1656
destringize_and_run (cpp_reader *pfile, const cpp_string *in)
1657 1658
{
  const unsigned char *src, *limit;
1659
  char *dest, *result;
1660 1661 1662 1663 1664
  cpp_context *saved_context;
  cpp_token *saved_cur_token;
  tokenrun *saved_cur_run;
  cpp_token *toks;
  int count;
1665
  const struct directive *save_directive;
1666

1667
  dest = result = (char *) alloca (in->len - 1);
1668 1669 1670
  src = in->text + 1 + (in->text[0] == 'L');
  limit = in->text + in->len - 1;
  while (src < limit)
1671 1672 1673 1674 1675 1676
    {
      /* We know there is a character following the backslash.  */
      if (*src == '\\' && (src[1] == '\\' || src[1] == '"'))
	src++;
      *dest++ = *src++;
    }
1677
  *dest = '\n';
1678

1679 1680 1681 1682 1683 1684 1685 1686
  /* Ugh; an awful kludge.  We are really not set up to be lexing
     tokens when in the middle of a macro expansion.  Use a new
     context to force cpp_get_token to lex, and so skip_rest_of_line
     doesn't go beyond the end of the text.  Also, remember the
     current lexing position so we can return to it later.

     Something like line-at-a-time lexing should remove the need for
     this.  */
1687 1688 1689
  saved_context = pfile->context;
  saved_cur_token = pfile->cur_token;
  saved_cur_run = pfile->cur_run;
Neil Booth committed
1690

1691 1692 1693
  pfile->context = XNEW (cpp_context);
  pfile->context->macro = 0;
  pfile->context->prev = 0;
1694
  pfile->context->next = 0;
Neil Booth committed
1695

1696 1697 1698 1699 1700 1701 1702
  /* Inline run_directive, since we need to delay the _cpp_pop_buffer
     until we've read all of the tokens that we want.  */
  cpp_push_buffer (pfile, (const uchar *) result, dest - result,
		   /* from_stage3 */ true);
  /* ??? Antique Disgusting Hack.  What does this do?  */
  if (pfile->buffer->prev)
    pfile->buffer->file = pfile->buffer->prev->file;
Neil Booth committed
1703

1704 1705
  start_directive (pfile);
  _cpp_clean_line (pfile);
1706 1707
  save_directive = pfile->directive;
  pfile->directive = &dtable[T_PRAGMA];
1708 1709
  do_pragma (pfile);
  end_directive (pfile, 1);
1710
  pfile->directive = save_directive;
Neil Booth committed
1711

1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
  /* We always insert at least one token, the directive result.  It'll
     either be a CPP_PADDING or a CPP_PRAGMA.  In the later case, we 
     need to insert *all* of the tokens, including the CPP_PRAGMA_EOL.  */

  /* If we're not handling the pragma internally, read all of the tokens from
     the string buffer now, while the string buffer is still installed.  */
  /* ??? Note that the token buffer allocated here is leaked.  It's not clear
     to me what the true lifespan of the tokens are.  It would appear that
     the lifespan is the entire parse of the main input stream, in which case
     this may not be wrong.  */
  if (pfile->directive_result.type == CPP_PRAGMA)
    {
      int maxcount;

      count = 1;
      maxcount = 50;
      toks = XNEWVEC (cpp_token, maxcount);
      toks[0] = pfile->directive_result;
Neil Booth committed
1730

1731 1732 1733 1734 1735 1736 1737
      do
	{
	  if (count == maxcount)
	    {
	      maxcount = maxcount * 3 / 2;
	      toks = XRESIZEVEC (cpp_token, toks, maxcount);
	    }
1738 1739 1740 1741
	  toks[count] = *cpp_get_token (pfile);
	  /* Macros have been already expanded by cpp_get_token
	     if the pragma allowed expansion.  */
	  toks[count++].flags |= NO_EXPAND;
1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768
	}
      while (toks[count-1].type != CPP_PRAGMA_EOL);
    }
  else
    {
      count = 1;
      toks = XNEW (cpp_token);
      toks[0] = pfile->directive_result;

      /* If we handled the entire pragma internally, make sure we get the
	 line number correct for the next token.  */
      if (pfile->cb.line_change)
	pfile->cb.line_change (pfile, pfile->cur_token, false);
    }

  /* Finish inlining run_directive.  */
  pfile->buffer->file = NULL;
  _cpp_pop_buffer (pfile);

  /* Reset the old macro state before ...  */
  XDELETE (pfile->context);
  pfile->context = saved_context;
  pfile->cur_token = saved_cur_token;
  pfile->cur_run = saved_cur_run;

  /* ... inserting the new tokens we collected.  */
  _cpp_push_token_context (pfile, NULL, toks, count);
1769 1770
}

1771 1772
/* Handle the _Pragma operator.  Return 0 on error, 1 if ok.  */
int
1773
_cpp_do__Pragma (cpp_reader *pfile)
1774
{
1775
  const cpp_token *string = get__Pragma_string (pfile);
1776
  pfile->directive_result.type = CPP_PADDING;
1777

Neil Booth committed
1778
  if (string)
1779 1780 1781 1782 1783 1784 1785
    {
      destringize_and_run (pfile, &string->val.str);
      return 1;
    }
  cpp_error (pfile, CPP_DL_ERROR,
	     "_Pragma takes a parenthesized string literal");
  return 0;
1786
}
1787

1788
/* Handle #ifdef.  */
Zack Weinberg committed
1789
static void
1790
do_ifdef (cpp_reader *pfile)
1791
{
Neil Booth committed
1792
  int skip = 1;
Zack Weinberg committed
1793

1794
  if (! pfile->state.skipping)
Neil Booth committed
1795
    {
1796
      cpp_hashnode *node = lex_macro_node (pfile, false);
Zack Weinberg committed
1797

Neil Booth committed
1798
      if (node)
1799 1800 1801
	{
	  skip = node->type != NT_MACRO;
	  _cpp_mark_macro_used (node);
1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815
	  if (!(node->flags & NODE_USED))
	    {
	      node->flags |= NODE_USED;
	      if (node->type == NT_MACRO)
		{
		  if (pfile->cb.used_define)
		    pfile->cb.used_define (pfile, pfile->directive_line, node);
		}
	      else
		{
		  if (pfile->cb.used_undef)
		    pfile->cb.used_undef (pfile, pfile->directive_line, node);
		}
	    }
1816 1817
	  if (pfile->cb.used)
	    pfile->cb.used (pfile, pfile->directive_line, node);
1818
	  check_eol (pfile, false);
1819
	}
Neil Booth committed
1820
    }
1821

Neil Booth committed
1822 1823
  push_conditional (pfile, skip, T_IFDEF, 0);
}
1824

1825
/* Handle #ifndef.  */
Zack Weinberg committed
1826
static void
1827
do_ifndef (cpp_reader *pfile)
1828
{
Neil Booth committed
1829
  int skip = 1;
1830
  cpp_hashnode *node = 0;
1831

1832
  if (! pfile->state.skipping)
1833
    {
1834
      node = lex_macro_node (pfile, false);
1835 1836

      if (node)
1837 1838 1839
	{
	  skip = node->type == NT_MACRO;
	  _cpp_mark_macro_used (node);
1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853
	  if (!(node->flags & NODE_USED))
	    {
	      node->flags |= NODE_USED;
	      if (node->type == NT_MACRO)
		{
		  if (pfile->cb.used_define)
		    pfile->cb.used_define (pfile, pfile->directive_line, node);
		}
	      else
		{
		  if (pfile->cb.used_undef)
		    pfile->cb.used_undef (pfile, pfile->directive_line, node);
		}
	    }
1854 1855
	  if (pfile->cb.used)
	    pfile->cb.used (pfile, pfile->directive_line, node);
1856
	  check_eol (pfile, false);
1857
	}
1858
    }
Zack Weinberg committed
1859

Neil Booth committed
1860
  push_conditional (pfile, skip, T_IFNDEF, node);
Per Bothner committed
1861 1862
}

1863 1864
/* _cpp_parse_expr puts a macro in a "#if !defined ()" expression in
   pfile->mi_ind_cmacro so we can handle multiple-include
1865
   optimizations.  If macro expansion occurs in the expression, we
1866 1867
   cannot treat it as a controlling conditional, since the expansion
   could change in the future.  That is handled by cpp_get_token.  */
Zack Weinberg committed
1868
static void
1869
do_if (cpp_reader *pfile)
Per Bothner committed
1870
{
Neil Booth committed
1871
  int skip = 1;
Per Bothner committed
1872

1873
  if (! pfile->state.skipping)
1874
    skip = _cpp_parse_expr (pfile, true) == false;
Neil Booth committed
1875

1876
  push_conditional (pfile, skip, T_IF, pfile->mi_ind_cmacro);
Per Bothner committed
1877 1878
}

1879
/* Flip skipping state if appropriate and continue without changing
1880 1881
   if_stack; this is so that the error message for missing #endif's
   etc. will point to the original #if.  */
Zack Weinberg committed
1882
static void
1883
do_else (cpp_reader *pfile)
1884
{
1885 1886
  cpp_buffer *buffer = pfile->buffer;
  struct if_stack *ifs = buffer->if_stack;
1887

1888
  if (ifs == NULL)
1889
    cpp_error (pfile, CPP_DL_ERROR, "#else without #if");
Neil Booth committed
1890
  else
1891
    {
Neil Booth committed
1892 1893
      if (ifs->type == T_ELSE)
	{
1894 1895
	  cpp_error (pfile, CPP_DL_ERROR, "#else after #else");
	  cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0,
Neil Booth committed
1896 1897
			       "the conditional began here");
	}
1898 1899
      ifs->type = T_ELSE;

1900 1901 1902
      /* Skip any future (erroneous) #elses or #elifs.  */
      pfile->state.skipping = ifs->skip_elses;
      ifs->skip_elses = true;
Per Bothner committed
1903

Neil Booth committed
1904 1905 1906
      /* Invalidate any controlling macro.  */
      ifs->mi_cmacro = 0;

1907
      /* Only check EOL if was not originally skipping.  */
1908
      if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels))
1909
	check_eol (pfile, false);
1910
    }
Per Bothner committed
1911 1912
}

1913
/* Handle a #elif directive by not changing if_stack either.  See the
Neil Booth committed
1914
   comment above do_else.  */
Zack Weinberg committed
1915
static void
1916
do_elif (cpp_reader *pfile)
Per Bothner committed
1917
{
1918 1919
  cpp_buffer *buffer = pfile->buffer;
  struct if_stack *ifs = buffer->if_stack;
Per Bothner committed
1920

1921
  if (ifs == NULL)
1922
    cpp_error (pfile, CPP_DL_ERROR, "#elif without #if");
1923
  else
1924
    {
1925 1926
      if (ifs->type == T_ELSE)
	{
1927 1928
	  cpp_error (pfile, CPP_DL_ERROR, "#elif after #else");
	  cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0,
1929 1930 1931
			       "the conditional began here");
	}
      ifs->type = T_ELIF;
Neil Booth committed
1932

1933
      if (! ifs->was_skipping)
1934
	{
1935 1936 1937 1938 1939 1940
	  bool value;
	  /* The standard mandates that the expression be parsed even
	     if we are skipping elses at this point -- the lexical
	     restrictions on #elif only apply to skipped groups, but
	     this group is not being skipped.  Temporarily set
	     skipping to false to get lexer warnings.  */
1941
	  pfile->state.skipping = 0;
1942 1943 1944 1945 1946 1947 1948 1949
	  value = _cpp_parse_expr (pfile, false);
	  if (ifs->skip_elses)
	    pfile->state.skipping = 1;
	  else
	    {
	      pfile->state.skipping = ! value;
	      ifs->skip_elses = value;
	    }
1950
	}
1951 1952 1953

      /* Invalidate any controlling macro.  */
      ifs->mi_cmacro = 0;
1954
    }
Per Bothner committed
1955 1956
}

1957
/* #endif pops the if stack and resets pfile->state.skipping.  */
Zack Weinberg committed
1958
static void
1959
do_endif (cpp_reader *pfile)
Per Bothner committed
1960
{
1961 1962
  cpp_buffer *buffer = pfile->buffer;
  struct if_stack *ifs = buffer->if_stack;
1963 1964

  if (ifs == NULL)
1965
    cpp_error (pfile, CPP_DL_ERROR, "#endif without #if");
Per Bothner committed
1966 1967
  else
    {
1968
      /* Only check EOL if was not originally skipping.  */
1969
      if (!ifs->was_skipping && CPP_OPTION (pfile, warn_endif_labels))
1970
	check_eol (pfile, false);
1971

Neil Booth committed
1972 1973 1974
      /* If potential control macro, we go back outside again.  */
      if (ifs->next == 0 && ifs->mi_cmacro)
	{
1975
	  pfile->mi_valid = true;
Neil Booth committed
1976 1977 1978
	  pfile->mi_cmacro = ifs->mi_cmacro;
	}

1979
      buffer->if_stack = ifs->next;
1980
      pfile->state.skipping = ifs->was_skipping;
1981
      obstack_free (&pfile->buffer_ob, ifs);
Per Bothner committed
1982
    }
Neil Booth committed
1983
}
Zack Weinberg committed
1984

1985 1986 1987 1988
/* Push an if_stack entry for a preprocessor conditional, and set
   pfile->state.skipping to SKIP.  If TYPE indicates the conditional
   is #if or #ifndef, CMACRO is a potentially controlling macro, and
   we need to check here that we are at the top of the file.  */
1989
static void
1990 1991
push_conditional (cpp_reader *pfile, int skip, int type,
		  const cpp_hashnode *cmacro)
1992 1993
{
  struct if_stack *ifs;
1994
  cpp_buffer *buffer = pfile->buffer;
1995

1996
  ifs = XOBNEW (&pfile->buffer_ob, struct if_stack);
1997
  ifs->line = pfile->directive_line;
1998
  ifs->next = buffer->if_stack;
1999 2000
  ifs->skip_elses = pfile->state.skipping || !skip;
  ifs->was_skipping = pfile->state.skipping;
2001
  ifs->type = type;
2002 2003
  /* This condition is effectively a test for top-of-file.  */
  if (pfile->mi_valid && pfile->mi_cmacro == 0)
Neil Booth committed
2004 2005 2006
    ifs->mi_cmacro = cmacro;
  else
    ifs->mi_cmacro = 0;
2007

2008
  pfile->state.skipping = skip;
2009
  buffer->if_stack = ifs;
2010
}
2011

2012 2013 2014
/* Read the tokens of the answer into the macro pool, in a directive
   of type TYPE.  Only commit the memory if we intend it as permanent
   storage, i.e. the #assert case.  Returns 0 on success, and sets
2015 2016
   ANSWERP to point to the answer.  PRED_LOC is the location of the
   predicate.  */
Neil Booth committed
2017
static int
2018 2019
parse_answer (cpp_reader *pfile, struct answer **answerp, int type,
	      source_location pred_loc)
Per Bothner committed
2020
{
2021
  const cpp_token *paren;
Neil Booth committed
2022
  struct answer *answer;
2023
  unsigned int acount;
Neil Booth committed
2024 2025 2026

  /* In a conditional, it is legal to not have an open paren.  We
     should save the following token in this case.  */
2027
  paren = cpp_get_token (pfile);
Neil Booth committed
2028 2029

  /* If not a paren, see if we're OK.  */
2030
  if (paren->type != CPP_OPEN_PAREN)
Zack Weinberg committed
2031
    {
Neil Booth committed
2032 2033 2034
      /* In a conditional no answer is a test for any answer.  It
         could be followed by any token.  */
      if (type == T_IF)
2035 2036 2037 2038
	{
	  _cpp_backup_tokens (pfile, 1);
	  return 0;
	}
Neil Booth committed
2039 2040

      /* #unassert with no answer is valid - it removes all answers.  */
2041
      if (type == T_UNASSERT && paren->type == CPP_EOF)
Neil Booth committed
2042
	return 0;
2043

2044 2045
      cpp_error_with_line (pfile, CPP_DL_ERROR, pred_loc, 0,
			   "missing '(' after predicate");
Neil Booth committed
2046
      return 1;
Zack Weinberg committed
2047
    }
2048

2049
  for (acount = 0;; acount++)
Zack Weinberg committed
2050
    {
2051 2052 2053
      size_t room_needed;
      const cpp_token *token = cpp_get_token (pfile);
      cpp_token *dest;
Neil Booth committed
2054

Zack Weinberg committed
2055 2056
      if (token->type == CPP_CLOSE_PAREN)
	break;
2057

Neil Booth committed
2058
      if (token->type == CPP_EOF)
Zack Weinberg committed
2059
	{
2060
	  cpp_error (pfile, CPP_DL_ERROR, "missing ')' to complete answer");
Neil Booth committed
2061
	  return 1;
Zack Weinberg committed
2062
	}
2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075

      /* struct answer includes the space for one token.  */
      room_needed = (sizeof (struct answer) + acount * sizeof (cpp_token));

      if (BUFF_ROOM (pfile->a_buff) < room_needed)
	_cpp_extend_buff (pfile, &pfile->a_buff, sizeof (struct answer));

      dest = &((struct answer *) BUFF_FRONT (pfile->a_buff))->first[acount];
      *dest = *token;

      /* Drop whitespace at start, for answer equivalence purposes.  */
      if (acount == 0)
	dest->flags &= ~PREV_WHITE;
Zack Weinberg committed
2076
    }
2077

2078
  if (acount == 0)
2079
    {
2080
      cpp_error (pfile, CPP_DL_ERROR, "predicate's answer is empty");
Neil Booth committed
2081
      return 1;
Per Bothner committed
2082
    }
Zack Weinberg committed
2083

2084 2085 2086
  answer = (struct answer *) BUFF_FRONT (pfile->a_buff);
  answer->count = acount;
  answer->next = NULL;
Neil Booth committed
2087
  *answerp = answer;
Zack Weinberg committed
2088

Neil Booth committed
2089 2090
  return 0;
}
Zack Weinberg committed
2091

2092 2093 2094
/* Parses an assertion directive of type TYPE, returning a pointer to
   the hash node of the predicate, or 0 on error.  If an answer was
   supplied, it is placed in ANSWERP, otherwise it is set to 0.  */
Neil Booth committed
2095
static cpp_hashnode *
2096
parse_assertion (cpp_reader *pfile, struct answer **answerp, int type)
Neil Booth committed
2097 2098
{
  cpp_hashnode *result = 0;
2099
  const cpp_token *predicate;
Neil Booth committed
2100 2101 2102 2103 2104

  /* We don't expand predicates or answers.  */
  pfile->state.prevent_expansion++;

  *answerp = 0;
2105 2106
  predicate = cpp_get_token (pfile);
  if (predicate->type == CPP_EOF)
2107
    cpp_error (pfile, CPP_DL_ERROR, "assertion without predicate");
2108
  else if (predicate->type != CPP_NAME)
2109 2110 2111
    cpp_error_with_line (pfile, CPP_DL_ERROR, predicate->src_loc, 0,
			 "predicate must be an identifier");
  else if (parse_answer (pfile, answerp, type, predicate->src_loc) == 0)
Neil Booth committed
2112
    {
2113
      unsigned int len = NODE_LEN (predicate->val.node.node);
2114
      unsigned char *sym = (unsigned char *) alloca (len + 1);
Zack Weinberg committed
2115

Neil Booth committed
2116 2117
      /* Prefix '#' to get it out of macro namespace.  */
      sym[0] = '#';
2118
      memcpy (sym + 1, NODE_NAME (predicate->val.node.node), len);
Neil Booth committed
2119 2120
      result = cpp_lookup (pfile, sym, len + 1);
    }
2121

Neil Booth committed
2122 2123
  pfile->state.prevent_expansion--;
  return result;
Per Bothner committed
2124
}
2125

2126
/* Returns a pointer to the pointer to CANDIDATE in the answer chain,
Zack Weinberg committed
2127
   or a pointer to NULL if the answer is not in the chain.  */
Neil Booth committed
2128
static struct answer **
2129
find_answer (cpp_hashnode *node, const struct answer *candidate)
Per Bothner committed
2130
{
Neil Booth committed
2131
  unsigned int i;
Zack Weinberg committed
2132
  struct answer **result;
Per Bothner committed
2133

Zack Weinberg committed
2134
  for (result = &node->value.answers; *result; result = &(*result)->next)
Neil Booth committed
2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147
    {
      struct answer *answer = *result;

      if (answer->count == candidate->count)
	{
	  for (i = 0; i < answer->count; i++)
	    if (! _cpp_equiv_tokens (&answer->first[i], &candidate->first[i]))
	      break;

	  if (i == answer->count)
	    break;
	}
    }
2148

Zack Weinberg committed
2149 2150
  return result;
}
2151

Neil Booth committed
2152
/* Test an assertion within a preprocessor conditional.  Returns
2153
   nonzero on failure, zero on success.  On success, the result of
2154
   the test is written into VALUE, otherwise the value 0.  */
Neil Booth committed
2155
int
2156
_cpp_test_assertion (cpp_reader *pfile, unsigned int *value)
Neil Booth committed
2157 2158 2159 2160 2161
{
  struct answer *answer;
  cpp_hashnode *node;

  node = parse_assertion (pfile, &answer, T_IF);
2162 2163 2164 2165 2166

  /* For recovery, an erroneous assertion expression is handled as a
     failing assertion.  */
  *value = 0;

Neil Booth committed
2167 2168 2169
  if (node)
    *value = (node->type == NT_ASSERTION &&
	      (answer == 0 || *find_answer (node, answer) != 0));
2170 2171
  else if (pfile->cur_token[-1].type == CPP_EOF)
    _cpp_backup_tokens (pfile, 1);
Neil Booth committed
2172 2173 2174 2175 2176

  /* We don't commit the memory for the answer - it's temporary only.  */
  return node == 0;
}

2177
/* Handle #assert.  */
Zack Weinberg committed
2178
static void
2179
do_assert (cpp_reader *pfile)
Zack Weinberg committed
2180 2181 2182
{
  struct answer *new_answer;
  cpp_hashnode *node;
2183

Neil Booth committed
2184
  node = parse_assertion (pfile, &new_answer, T_ASSERT);
Zack Weinberg committed
2185
  if (node)
2186
    {
Geoffrey Keating committed
2187 2188
      size_t answer_size;

Neil Booth committed
2189 2190
      /* Place the new answer in the answer list.  First check there
         is not a duplicate.  */
Zack Weinberg committed
2191
      new_answer->next = 0;
Neil Booth committed
2192
      if (node->type == NT_ASSERTION)
Zack Weinberg committed
2193
	{
Neil Booth committed
2194 2195
	  if (*find_answer (node, new_answer))
	    {
2196
	      cpp_error (pfile, CPP_DL_WARNING, "\"%s\" re-asserted",
2197
			 NODE_NAME (node) + 1);
Neil Booth committed
2198 2199
	      return;
	    }
Zack Weinberg committed
2200 2201
	  new_answer->next = node->value.answers;
	}
2202

Geoffrey Keating committed
2203 2204 2205 2206 2207 2208
      answer_size = sizeof (struct answer) + ((new_answer->count - 1)
					      * sizeof (cpp_token));
      /* Commit or allocate storage for the object.  */
      if (pfile->hash_table->alloc_subobject)
	{
	  struct answer *temp_answer = new_answer;
2209 2210
	  new_answer = (struct answer *) pfile->hash_table->alloc_subobject
            (answer_size);
Geoffrey Keating committed
2211 2212 2213 2214 2215
	  memcpy (new_answer, temp_answer, answer_size);
	}
      else
	BUFF_FRONT (pfile->a_buff) += answer_size;

Neil Booth committed
2216
      node->type = NT_ASSERTION;
Zack Weinberg committed
2217
      node->value.answers = new_answer;
2218
      check_eol (pfile, false);
2219
    }
Zack Weinberg committed
2220
}
2221

2222
/* Handle #unassert.  */
Zack Weinberg committed
2223
static void
2224
do_unassert (cpp_reader *pfile)
Zack Weinberg committed
2225 2226
{
  cpp_hashnode *node;
Neil Booth committed
2227
  struct answer *answer;
2228

Neil Booth committed
2229 2230 2231
  node = parse_assertion (pfile, &answer, T_UNASSERT);
  /* It isn't an error to #unassert something that isn't asserted.  */
  if (node && node->type == NT_ASSERTION)
2232
    {
Neil Booth committed
2233
      if (answer)
2234
	{
Neil Booth committed
2235
	  struct answer **p = find_answer (node, answer), *temp;
Zack Weinberg committed
2236

Neil Booth committed
2237 2238 2239 2240
	  /* Remove the answer from the list.  */
	  temp = *p;
	  if (temp)
	    *p = temp->next;
2241

Neil Booth committed
2242 2243 2244
	  /* Did we free the last answer?  */
	  if (node->value.answers == 0)
	    node->type = NT_VOID;
2245

2246
	  check_eol (pfile, false);
Neil Booth committed
2247 2248 2249
	}
      else
	_cpp_free_definition (node);
Zack Weinberg committed
2250
    }
Neil Booth committed
2251 2252

  /* We don't commit the memory for the answer - it's temporary only.  */
Per Bothner committed
2253 2254
}

2255 2256 2257 2258 2259
/* These are for -D, -U, -A.  */

/* Process the string STR as if it appeared as the body of a #define.
   If STR is just an identifier, define it with value 1.
   If STR has anything after the identifier, then it should
2260
   be identifier=definition.  */
2261
void
2262
cpp_define (cpp_reader *pfile, const char *str)
2263
{
2264 2265
  char *buf;
  const char *p;
2266 2267
  size_t count;

2268
  /* Copy the entire option so we can modify it.
2269
     Change the first "=" in the string to a space.  If there is none,
2270 2271 2272
     tack " 1" on the end.  */

  count = strlen (str);
2273
  buf = (char *) alloca (count + 3);
2274 2275 2276
  memcpy (buf, str, count);

  p = strchr (str, '=');
2277
  if (p)
2278
    buf[p - str] = ' ';
2279 2280
  else
    {
2281 2282
      buf[count++] = ' ';
      buf[count++] = '1';
2283
    }
2284
  buf[count] = '\n';
2285

2286
  run_directive (pfile, T_DEFINE, buf, count);
2287 2288
}

2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308

/* Use to build macros to be run through cpp_define() as
   described above.
   Example: cpp_define_formatted (pfile, "MACRO=%d", value);  */

void
cpp_define_formatted (cpp_reader *pfile, const char *fmt, ...)
{
  char *ptr = NULL;

  va_list ap;
  va_start (ap, fmt);
  vasprintf (&ptr, fmt, ap);
  va_end (ap);

  cpp_define (pfile, ptr);
  free (ptr);
}


2309
/* Slight variant of the above for use by initialize_builtins.  */
2310
void
2311
_cpp_define_builtin (cpp_reader *pfile, const char *str)
2312
{
2313
  size_t len = strlen (str);
2314
  char *buf = (char *) alloca (len + 1);
2315 2316 2317
  memcpy (buf, str, len);
  buf[len] = '\n';
  run_directive (pfile, T_DEFINE, buf, len);
2318
}
Mike Stump committed
2319

2320 2321
/* Process MACRO as if it appeared as the body of an #undef.  */
void
2322
cpp_undef (cpp_reader *pfile, const char *macro)
Per Bothner committed
2323
{
2324
  size_t len = strlen (macro);
2325
  char *buf = (char *) alloca (len + 1);
2326 2327 2328
  memcpy (buf, macro, len);
  buf[len] = '\n';
  run_directive (pfile, T_UNDEF, buf, len);
Per Bothner committed
2329 2330
}

2331 2332 2333 2334
/* If STR is a defined macro, return its definition node, else return NULL.  */
cpp_macro *
cpp_push_definition (cpp_reader *pfile, const char *str)
{
Kai Tietz committed
2335
  cpp_hashnode *node = _cpp_lex_identifier (pfile, str);
2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346
  if (node && node->type == NT_MACRO)
    return node->value.macro;
  else
    return NULL;
}

/* Replace a previous definition DFN of the macro STR.  If DFN is NULL,
   then the macro should be undefined.  */
void
cpp_pop_definition (cpp_reader *pfile, const char *str, cpp_macro *dfn)
{
Kai Tietz committed
2347
  cpp_hashnode *node = _cpp_lex_identifier (pfile, str);
2348 2349 2350
  if (node == NULL)
    return;

2351 2352 2353
  if (pfile->cb.before_define)
    pfile->cb.before_define (pfile);

2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375
  if (node->type == NT_MACRO)
    {
      if (pfile->cb.undef)
	pfile->cb.undef (pfile, pfile->directive_line, node);
      if (CPP_OPTION (pfile, warn_unused_macros))
	_cpp_warn_if_unused_macro (pfile, node, NULL);
    }
  if (node->type != NT_VOID)
    _cpp_free_definition (node);

  if (dfn)
    {
      node->type = NT_MACRO;
      node->value.macro = dfn;
      if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_")))
	node->flags |= NODE_WARN;

      if (pfile->cb.define)
	pfile->cb.define (pfile, pfile->directive_line, node);
    }
}

2376
/* Process the string STR as if it appeared as the body of a #assert.  */
2377
void
2378
cpp_assert (cpp_reader *pfile, const char *str)
2379
{
2380
  handle_assertion (pfile, str, T_ASSERT);
2381
}
Per Bothner committed
2382

2383
/* Process STR as if it appeared as the body of an #unassert.  */
2384
void
2385
cpp_unassert (cpp_reader *pfile, const char *str)
Per Bothner committed
2386
{
2387
  handle_assertion (pfile, str, T_UNASSERT);
2388
}
2389

2390 2391
/* Common code for cpp_assert (-A) and cpp_unassert (-A-).  */
static void
2392
handle_assertion (cpp_reader *pfile, const char *str, int type)
2393 2394 2395 2396
{
  size_t count = strlen (str);
  const char *p = strchr (str, '=');

2397 2398
  /* Copy the entire option so we can modify it.  Change the first
     "=" in the string to a '(', and tack a ')' on the end.  */
2399
  char *buf = (char *) alloca (count + 2);
2400 2401

  memcpy (buf, str, count);
2402 2403 2404 2405 2406
  if (p)
    {
      buf[p - str] = '(';
      buf[count++] = ')';
    }
2407 2408
  buf[count] = '\n';
  str = buf;
2409

2410
  run_directive (pfile, type, str, count);
2411 2412
}

2413 2414
/* The options structure.  */
cpp_options *
2415
cpp_get_options (cpp_reader *pfile)
2416 2417 2418 2419 2420 2421
{
  return &pfile->opts;
}

/* The callbacks structure.  */
cpp_callbacks *
2422
cpp_get_callbacks (cpp_reader *pfile)
2423 2424 2425 2426 2427 2428
{
  return &pfile->cb;
}

/* Copy the given callbacks structure to our own.  */
void
2429
cpp_set_callbacks (cpp_reader *pfile, cpp_callbacks *cb)
2430 2431 2432 2433
{
  pfile->cb = *cb;
}

2434 2435 2436 2437 2438 2439 2440 2441 2442
/* The dependencies structure.  (Creates one if it hasn't already been.)  */
struct deps *
cpp_get_deps (cpp_reader *pfile)
{
  if (!pfile->deps)
    pfile->deps = deps_init ();
  return pfile->deps;
}

2443 2444 2445
/* Push a new buffer on the buffer stack.  Returns the new buffer; it
   doesn't fail.  It does not generate a file change call back; that
   is the responsibility of the caller.  */
2446
cpp_buffer *
2447
cpp_push_buffer (cpp_reader *pfile, const uchar *buffer, size_t len,
2448
		 int from_stage3)
2449
{
2450
  cpp_buffer *new_buffer = XOBNEW (&pfile->buffer_ob, cpp_buffer);
Neil Booth committed
2451

2452
  /* Clears, amongst other things, if_stack and mi_cmacro.  */
2453
  memset (new_buffer, 0, sizeof (cpp_buffer));
2454

2455 2456 2457 2458 2459
  new_buffer->next_line = new_buffer->buf = buffer;
  new_buffer->rlimit = buffer + len;
  new_buffer->from_stage3 = from_stage3;
  new_buffer->prev = pfile->buffer;
  new_buffer->need_line = true;
2460

2461
  pfile->buffer = new_buffer;
2462

2463
  return new_buffer;
2464 2465
}

2466 2467
/* Pops a single buffer, with a file change call-back if appropriate.
   Then pushes the next -include file, if any remain.  */
2468
void
2469
_cpp_pop_buffer (cpp_reader *pfile)
2470
{
2471
  cpp_buffer *buffer = pfile->buffer;
2472
  struct _cpp_file *inc = buffer->file;
2473
  struct if_stack *ifs;
2474

2475 2476 2477
  /* Walk back up the conditional stack till we reach its level at
     entry to this file, issuing error messages.  */
  for (ifs = buffer->if_stack; ifs; ifs = ifs->next)
2478
    cpp_error_with_line (pfile, CPP_DL_ERROR, ifs->line, 0,
2479
			 "unterminated #%s", dtable[ifs->type].name);
2480

2481
  /* In case of a missing #endif.  */
2482
  pfile->state.skipping = 0;
2483

2484
  /* _cpp_do_file_change expects pfile->buffer to be the new one.  */
2485 2486
  pfile->buffer = buffer->prev;

2487 2488
  free (buffer->notes);

2489 2490 2491
  /* Free the buffer object now; we may want to push a new buffer
     in _cpp_push_next_include_file.  */
  obstack_free (&pfile->buffer_ob, buffer);
2492

2493 2494 2495 2496
  if (inc)
    {
      _cpp_pop_file_buffer (pfile, inc);

2497
      _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0);
2498
    }
2499 2500
}

2501
/* Enter all recognized directives in the hash table.  */
2502
void
2503
_cpp_init_directives (cpp_reader *pfile)
2504
{
2505
  unsigned int i;
Neil Booth committed
2506
  cpp_hashnode *node;
2507

2508
  for (i = 0; i < (unsigned int) N_DIRECTIVES; i++)
Neil Booth committed
2509
    {
2510
      node = cpp_lookup (pfile, dtable[i].name, dtable[i].length);
2511 2512
      node->is_directive = 1;
      node->directive_index = i;
Neil Booth committed
2513
    }
2514
}