cppinit.c 55.3 KB
Newer Older
1
/* CPP Library.
Jeff Law committed
2 3
   Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
   1999, 2000 Free Software Foundation, Inc.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   Contributed by Per Bothner, 1994-95.
   Based on CCCP program by Paul Rubin, June 1986
   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
Free Software Foundation; either version 2, or (at your option) any
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
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#include "config.h"
#include "system.h"
24 25 26 27 28
#include "cpplib.h"
#include "cpphash.h"
#include "output.h"
#include "prefix.h"
#include "intl.h"
29
#include "version.h"
30
#include "mkdeps.h"
31
#include "cppdefault.h"
32 33 34 35 36 37 38

/* Predefined symbols, built-in macros, and the default include path. */

#ifndef GET_ENV_PATH_LIST
#define GET_ENV_PATH_LIST(VAR,NAME)	do { (VAR) = getenv (NAME); } while (0)
#endif

39 40 41 42 43 44 45 46 47 48 49
/* Windows does not natively support inodes, and neither does MSDOS.
   Cygwin's emulation can generate non-unique inodes, so don't use it.
   VMS has non-numeric inodes. */
#ifdef VMS
#define INO_T_EQ(a, b) (!memcmp (&(a), &(b), sizeof (a)))
#elif (defined _WIN32 && ! defined (_UWIN)) || defined __MSDOS__
#define INO_T_EQ(a, b) 0
#else
#define INO_T_EQ(a, b) ((a) == (b))
#endif

50 51
/* Internal structures and prototypes. */

52 53 54 55 56
/* A `struct pending_option' remembers one -D, -A, -U, -include, or -imacros
   switch.  There are four lists: one for -D and -U, one for -A, one
   for -include, one for -imacros.  `undef' is set for -U, clear for
   -D, ignored for the others.
   (Future: add an equivalent of -U for -A) */
57

58
typedef void (* cl_directive_handler) PARAMS ((cpp_reader *, const char *));
59
struct pending_option
60
{
61
  struct pending_option *next;
62
  const char *arg;
63
  cl_directive_handler handler;
64
};
65

66 67 68 69 70 71
/* The `pending' structure accumulates all the options that are not
   actually processed until we hit cpp_start_read.  It consists of
   several lists, one for each type of option.  We keep both head and
   tail pointers for quick insertion. */
struct cpp_pending
{
72
  struct pending_option *directive_head, *directive_tail;
73 74 75 76 77 78 79 80 81 82

  struct file_name_list *quote_head, *quote_tail;
  struct file_name_list *brack_head, *brack_tail;
  struct file_name_list *systm_head, *systm_tail;
  struct file_name_list *after_head, *after_tail;

  struct pending_option *imacros_head, *imacros_tail;
  struct pending_option *include_head, *include_tail;
};

83 84 85 86 87 88 89 90 91 92 93 94 95
#ifdef __STDC__
#define APPEND(pend, list, elt) \
  do {  if (!(pend)->list##_head) (pend)->list##_head = (elt); \
	else (pend)->list##_tail->next = (elt); \
	(pend)->list##_tail = (elt); \
  } while (0)
#else
#define APPEND(pend, list, elt) \
  do {  if (!(pend)->list/**/_head) (pend)->list/**/_head = (elt); \
	else (pend)->list/**/_tail->next = (elt); \
	(pend)->list/**/_tail = (elt); \
  } while (0)
#endif
96 97

static void print_help                  PARAMS ((void));
98 99 100
static void path_include		PARAMS ((cpp_reader *,
						 struct cpp_pending *,
						 char *, int));
101
static void initialize_builtins		PARAMS ((cpp_reader *));
102 103
static void append_include_chain	PARAMS ((cpp_reader *,
						 struct cpp_pending *,
104
						 char *, int, int));
105
static void merge_include_chains	PARAMS ((cpp_reader *));
106

107
static void initialize_dependency_output PARAMS ((cpp_reader *));
108
static void initialize_standard_includes PARAMS ((cpp_reader *));
109
static void new_pending_directive	PARAMS ((struct cpp_pending *,
110 111
						 const char *,
						 cl_directive_handler));
Zack Weinberg committed
112 113
#ifdef HOST_EBCDIC
static int opt_comp			PARAMS ((const void *, const void *));
114
static void sort_options		PARAMS ((void));
Zack Weinberg committed
115 116
#endif
static int parse_option			PARAMS ((const char *));
117

118
/* Fourth argument to append_include_chain: chain to use */
119
enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
120

121 122 123
/* If we have designated initializers (GCC >2.7) this table can be
   initialized, constant data.  Otherwise, it has to be filled in at
   runtime.  */
124

125
#if (GCC_VERSION >= 2007)
126
#define init_IStable()  /* nothing */
127
#define ISTABLE __extension__ const unsigned char _cpp_IStable[256] = {
128
#define END };
129
#define s(p, v) [p] = v,
130
#else
131 132
#define ISTABLE unsigned char _cpp_IStable[256] = { 0 }; \
 static void init_IStable PARAMS ((void)) { \
133
 unsigned char *x = _cpp_IStable;
134
#define END }
135
#define s(p, v) x[p] = v;
136
#endif
137

138 139 140
#define A(x) s(x, ISidnum|ISidstart)
#define N(x) s(x, ISidnum|ISnumstart)
#define H(x) s(x, IShspace|ISspace)
141
#define V(x) s(x, ISvspace|ISspace)
142
#define S(x) s(x, ISspace)
143

144
ISTABLE
145
  A('_')
146

147 148 149
  A('a') A('b') A('c') A('d') A('e') A('f') A('g') A('h') A('i')
  A('j') A('k') A('l') A('m') A('n') A('o') A('p') A('q') A('r')
  A('s') A('t') A('u') A('v') A('w') A('x') A('y') A('z')
150

151 152 153
  A('A') A('B') A('C') A('D') A('E') A('F') A('G') A('H') A('I')
  A('J') A('K') A('L') A('M') A('N') A('O') A('P') A('Q') A('R')
  A('S') A('T') A('U') A('V') A('W') A('X') A('Y') A('Z')
154

155
  N('1') N('2') N('3') N('4') N('5') N('6') N('7') N('8') N('9') N('0')
156

157
  H(' ') H('\t')
158

159 160 161
  V('\n') V('\r')

  S('\0') S('\v') S('\f')
162 163 164 165 166
END

#undef A
#undef N
#undef H
167
#undef V
168 169
#undef S
#undef s
170 171
#undef ISTABLE
#undef END
172 173 174 175 176

/* Given a colon-separated list of file names PATH,
   add all the names to the search path for include files.  */

static void
177
path_include (pfile, pend, list, path)
178
     cpp_reader *pfile;
179 180 181
     struct cpp_pending *pend;
     char *list;
     int path;
182
{
183
  char *p, *q, *name;
184

185
  p = list;
186

187 188
  do
    {
189
      /* Find the end of this name.  */
190
      q = p;
191
      while (*q != 0 && *q != PATH_SEPARATOR) q++;
192 193 194 195 196 197 198 199 200 201 202 203 204 205
      if (q == p)
	{
	  /* An empty name in the path stands for the current directory.  */
	  name = (char *) xmalloc (2);
	  name[0] = '.';
	  name[1] = 0;
	}
      else
	{
	  /* Otherwise use the directory that is named.  */
	  name = (char *) xmalloc (q - p + 1);
	  memcpy (name, p, q - p);
	  name[q - p] = 0;
	}
206

207
      append_include_chain (pfile, pend, name, path, 0);
208 209

      /* Advance past this name.  */
210
      if (*q == 0)
211
	break;
212 213 214 215 216 217 218 219
      p = q + 1;
    }
  while (1);
}

/* Append DIR to include path PATH.  DIR must be permanently allocated
   and writable. */
static void
220
append_include_chain (pfile, pend, dir, path, cxx_aware)
221 222 223 224
     cpp_reader *pfile;
     struct cpp_pending *pend;
     char *dir;
     int path;
225
     int cxx_aware;
226 227 228 229 230
{
  struct file_name_list *new;
  struct stat st;
  unsigned int len;

231
  _cpp_simplify_pathname (dir);
232 233 234 235
  if (stat (dir, &st))
    {
      /* Dirs that don't exist are silently ignored. */
      if (errno != ENOENT)
236
	cpp_notice_from_errno (pfile, dir);
237
      else if (CPP_OPTION (pfile, verbose))
Zack Weinberg committed
238
	fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"), dir);
239 240 241 242 243
      return;
    }

  if (!S_ISDIR (st.st_mode))
    {
244
      cpp_notice (pfile, "%s: Not a directory", dir);
245 246 247 248 249 250
      return;
    }

  len = strlen (dir);
  if (len > pfile->max_include_len)
    pfile->max_include_len = len;
251

252
  new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
253 254 255 256
  new->name = dir;
  new->nlen = len;
  new->ino  = st.st_ino;
  new->dev  = st.st_dev;
257 258 259 260
  if (path == SYSTEM)
    new->sysp = cxx_aware ? 1 : 2;
  else
    new->sysp = 0;
261
  new->name_map = NULL;
262 263
  new->next = NULL;
  new->alloc = NULL;
264 265 266 267 268 269 270

  switch (path)
    {
    case QUOTE:		APPEND (pend, quote, new); break;
    case BRACKET:	APPEND (pend, brack, new); break;
    case SYSTEM:	APPEND (pend, systm, new); break;
    case AFTER:		APPEND (pend, after, new); break;
271 272 273
    }
}

274 275 276 277 278 279 280 281 282 283
/* Merge the four include chains together in the order quote, bracket,
   system, after.  Remove duplicate dirs (as determined by
   INO_T_EQ()).  The system_include and after_include chains are never
   referred to again after this function; all access is through the
   bracket_include path.

   For the future: Check if the directory is empty (but
   how?) and possibly preload the include hash. */

static void
284 285
merge_include_chains (pfile)
     cpp_reader *pfile;
286 287 288 289 290
{
  struct file_name_list *prev, *cur, *other;
  struct file_name_list *quote, *brack, *systm, *after;
  struct file_name_list *qtail, *btail, *stail, *atail;

291
  struct cpp_pending *pend = CPP_OPTION (pfile, pending);
292

293 294 295 296 297 298 299 300 301
  qtail = pend->quote_tail;
  btail = pend->brack_tail;
  stail = pend->systm_tail;
  atail = pend->after_tail;

  quote = pend->quote_head;
  brack = pend->brack_head;
  systm = pend->systm_head;
  after = pend->after_head;
302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

  /* Paste together bracket, system, and after include chains. */
  if (stail)
    stail->next = after;
  else
    systm = after;
  if (btail)
    btail->next = systm;
  else
    brack = systm;

  /* This is a bit tricky.
     First we drop dupes from the quote-include list.
     Then we drop dupes from the bracket-include list.
     Finally, if qtail and brack are the same directory,
     we cut out qtail.

     We can't just merge the lists and then uniquify them because
     then we may lose directories from the <> search path that should
     be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
     safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
     -Ibar -I- -Ifoo -Iquux.

     Note that this algorithm is quadratic in the number of -I switches,
     which is acceptable since there aren't usually that many of them.  */

  for (cur = quote, prev = NULL; cur; cur = cur->next)
    {
      for (other = quote; other != cur; other = other->next)
        if (INO_T_EQ (cur->ino, other->ino)
	    && cur->dev == other->dev)
          {
334
	    if (CPP_OPTION (pfile, verbose))
Zack Weinberg committed
335
	      fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"),
336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
		       cur->name);

	    prev->next = cur->next;
	    free (cur->name);
	    free (cur);
	    cur = prev;
	    break;
	  }
      prev = cur;
    }
  qtail = prev;

  for (cur = brack; cur; cur = cur->next)
    {
      for (other = brack; other != cur; other = other->next)
        if (INO_T_EQ (cur->ino, other->ino)
	    && cur->dev == other->dev)
          {
354
	    if (CPP_OPTION (pfile, verbose))
Zack Weinberg committed
355
	      fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"),
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
		       cur->name);

	    prev->next = cur->next;
	    free (cur->name);
	    free (cur);
	    cur = prev;
	    break;
	  }
      prev = cur;
    }

  if (quote)
    {
      if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
        {
	  if (quote == qtail)
	    {
373
	      if (CPP_OPTION (pfile, verbose))
Zack Weinberg committed
374
		fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"),
375 376 377 378 379 380 381 382 383 384 385 386
			 quote->name);

	      free (quote->name);
	      free (quote);
	      quote = brack;
	    }
	  else
	    {
	      cur = quote;
	      while (cur->next != qtail)
		  cur = cur->next;
	      cur->next = brack;
387
	      if (CPP_OPTION (pfile, verbose))
Zack Weinberg committed
388
		fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"),
389 390 391 392 393 394 395 396 397 398 399 400
			 qtail->name);

	      free (qtail->name);
	      free (qtail);
	    }
	}
      else
	  qtail->next = brack;
    }
  else
      quote = brack;

401 402
  CPP_OPTION (pfile, quote_include) = quote;
  CPP_OPTION (pfile, bracket_include) = brack;
403 404
}

405

406 407 408 409 410
/* Initialize a cpp_reader structure. */
void
cpp_reader_init (pfile)
     cpp_reader *pfile;
{
411 412 413 414
#ifdef HOST_EBCDIC
  sort_options ();
#endif

415
  memset ((char *) pfile, 0, sizeof (cpp_reader));
416

417 418 419
  CPP_OPTION (pfile, dollars_in_ident) = 1;
  CPP_OPTION (pfile, cplusplus_comments) = 1;
  CPP_OPTION (pfile, warn_import) = 1;
Zack Weinberg committed
420
  CPP_OPTION (pfile, warn_paste) = 1;
421
  CPP_OPTION (pfile, digraphs) = 1;
422 423
  CPP_OPTION (pfile, discard_comments) = 1;
  CPP_OPTION (pfile, show_column) = 1;
424
  CPP_OPTION (pfile, tabstop) = 8;
425 426 427 428

  CPP_OPTION (pfile, pending) =
    (struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));

429
  _cpp_init_macros (pfile);
430
  _cpp_init_stacks (pfile);
431
  _cpp_init_includes (pfile);
432
  _cpp_init_internal_pragmas (pfile);
433 434
}

435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
/* Initialize a cpp_printer structure.  As a side effect, open the
   output file.  */
cpp_printer *
cpp_printer_init (pfile, print)
     cpp_reader *pfile;
     cpp_printer *print;
{
  memset (print, '\0', sizeof (cpp_printer));
  if (CPP_OPTION (pfile, out_fname) == NULL)
    CPP_OPTION (pfile, out_fname) = "";
  
  if (CPP_OPTION (pfile, out_fname)[0] == '\0')
    print->outf = stdout;
  else
    {
      print->outf = fopen (CPP_OPTION (pfile, out_fname), "w");
      if (! print->outf)
	{
	  cpp_notice_from_errno (pfile, CPP_OPTION (pfile, out_fname));
	  return NULL;
	}
    }
  return print;
}

460 461 462 463 464 465
/* Free resources used by PFILE.
   This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology).  */
void
cpp_cleanup (pfile)
     cpp_reader *pfile;
{
466
  while (CPP_BUFFER (pfile) != NULL)
467 468
    cpp_pop_buffer (pfile);

469 470 471
  if (pfile->deps)
    deps_free (pfile->deps);

472 473 474 475 476
  if (pfile->spec_nodes)
    free (pfile->spec_nodes);

  _cpp_free_temp_tokens (pfile);
  _cpp_cleanup_includes (pfile);
477 478
  _cpp_cleanup_stacks (pfile);
  _cpp_cleanup_macros (pfile);
479 480 481
}


482 483
/* This structure defines one built-in macro.  A node of type TYPE will
   be entered in the macro hash table under the name NAME, with value
484 485 486
   VALUE (if any).  If TYPE is T_OPERATOR, the CODE field is used instead.

   Two values are not compile time constants, so we tag
Zack Weinberg committed
487
   them in the FLAGS field instead:
488 489
   VERS		value is the global version_string, quoted
   ULP		value is the global user_label_prefix
490 491

   Also, macros with CPLUS set in the flags field are entered only for C++.
492 493 494 495
 */

struct builtin
{
496
  const U_CHAR *name;
Zack Weinberg committed
497
  const char *value;
498 499
  unsigned char code;
  unsigned char type;
500
  unsigned short flags;
501
  unsigned int len;
502
};
503 504 505 506 507 508 509 510
#define VERS  0x01
#define ULP   0x02
#define CPLUS 0x04

#define B(n, t)       { U n, 0, 0, t,          0, sizeof n - 1 }
#define C(n, v)       { U n, v, 0, T_MACRO,    0, sizeof n - 1 }
#define X(n, f)       { U n, 0, 0, T_MACRO,    f, sizeof n - 1 }
#define O(n, c, f)    { U n, 0, c, T_OPERATOR, f, sizeof n - 1 }
511
static const struct builtin builtin_array[] =
512
{
513 514 515 516 517 518
  B("__TIME__",		 T_TIME),
  B("__DATE__",		 T_DATE),
  B("__FILE__",		 T_FILE),
  B("__BASE_FILE__",	 T_BASE_FILE),
  B("__LINE__",		 T_SPECLINE),
  B("__INCLUDE_LEVEL__", T_INCLUDE_LEVEL),
Zack Weinberg committed
519
  B("__STDC__",		 T_STDC),
520

Zack Weinberg committed
521 522
  X("__VERSION__",		VERS),
  X("__USER_LABEL_PREFIX__",	ULP),
523 524
  C("__REGISTER_PREFIX__",	REGISTER_PREFIX),
  C("__HAVE_BUILTIN_SETJMP__",	"1"),
525
#ifndef NO_BUILTIN_SIZE_TYPE
526
  C("__SIZE_TYPE__",		SIZE_TYPE),
527 528
#endif
#ifndef NO_BUILTIN_PTRDIFF_TYPE
529
  C("__PTRDIFF_TYPE__",		PTRDIFF_TYPE),
530
#endif
531
#ifndef NO_BUILTIN_WCHAR_TYPE
532
  C("__WCHAR_TYPE__",		WCHAR_TYPE),
533
#endif
534 535 536
#ifndef NO_BUILTIN_WINT_TYPE
  C("__WINT_TYPE__",		WINT_TYPE),
#endif
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553

  /* Named operators known to the preprocessor.  These cannot be #defined
     and always have their stated meaning.  They are treated like normal
     string tokens except for the type code and the meaning.  Most of them
     are only for C++ (but see iso646.h).  */
  O("defined",	CPP_DEFINED, 0),
  O("and",	CPP_AND_AND, CPLUS),
  O("and_eq",	CPP_AND_EQ,  CPLUS),
  O("bitand",	CPP_AND,     CPLUS),
  O("bitor",	CPP_OR,      CPLUS),
  O("compl",	CPP_COMPL,   CPLUS),
  O("not",	CPP_NOT,     CPLUS),
  O("not_eq",	CPP_NOT_EQ,  CPLUS),
  O("or",	CPP_OR_OR,   CPLUS),
  O("or_eq",	CPP_OR_EQ,   CPLUS),
  O("xor",	CPP_XOR,     CPLUS),
  O("xor_eq",	CPP_XOR_EQ,  CPLUS),
554
};
555 556 557
#undef B
#undef C
#undef X
558 559
#define builtin_array_end \
 builtin_array + sizeof(builtin_array)/sizeof(struct builtin)
560 561 562 563 564 565 566 567

/* Subroutine of cpp_start_read; reads the builtins table above and
   enters the macros into the hash table.  */
static void
initialize_builtins (pfile)
     cpp_reader *pfile;
{
  const struct builtin *b;
568
  for(b = builtin_array; b < builtin_array_end; b++)
569
    {
570 571 572
      if (b->flags & CPLUS && ! CPP_OPTION (pfile, cplusplus))
	continue;

Zack Weinberg committed
573
      if (b->type == T_MACRO)
574
	{
Zack Weinberg committed
575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595
	  const char *val;
	  char *str;

	  if (b->flags & VERS)
	    {
	      /* Allocate enough space for 'name="value"\0'.  */
	      str = xmalloc (b->len + strlen (version_string) + 4);
	      sprintf (str, "%s=\"%s\"", b->name, version_string);
	    }
	  else
	    {
	      if (b->flags & ULP)
		val = user_label_prefix;
	      else
		val = b->value;

	      /* Allocate enough space for "name=value\0".  */
	      str = xmalloc (b->len + strlen (val) + 2);
	      sprintf(str, "%s=%s", b->name, val);
	    }
	  cpp_define (pfile, str);
596
	}
597
      else
Zack Weinberg committed
598
	{
599
	  cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
Zack Weinberg committed
600
	  hp->type = b->type;
601 602
	  if (b->type == T_OPERATOR)
	    hp->value.code = b->code;
Zack Weinberg committed
603
	}
604 605
    }
}
606
#undef VERS
607
#undef ULP
Zack Weinberg committed
608
#undef builtin_array_end
609

610 611 612 613 614 615 616
/* Another subroutine of cpp_start_read.  This one sets up to do
   dependency-file output. */
static void
initialize_dependency_output (pfile)
     cpp_reader *pfile;
{
  char *spec, *s, *output_file;
617

618 619 620 621 622
  /* Either of two environment variables can specify output of deps.
     Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
     where OUTPUT_FILE is the file to write deps info to
     and DEPS_TARGET is the target to mention in the deps.  */

623
  if (CPP_OPTION (pfile, print_deps) == 0)
624 625 626
    {
      spec = getenv ("DEPENDENCIES_OUTPUT");
      if (spec)
627
	CPP_OPTION (pfile, print_deps) = 1;
628 629 630 631
      else
	{
	  spec = getenv ("SUNPRO_DEPENDENCIES");
	  if (spec)
632
	    CPP_OPTION (pfile, print_deps) = 2;
633 634 635 636 637 638 639 640
	  else
	    return;
	}

      /* Find the space before the DEPS_TARGET, if there is one.  */
      s = strchr (spec, ' ');
      if (s)
	{
641
	  CPP_OPTION (pfile, deps_target) = s + 1;
642 643 644 645 646 647
	  output_file = (char *) xmalloc (s - spec + 1);
	  memcpy (output_file, spec, s - spec);
	  output_file[s - spec] = 0;
	}
      else
	{
648
	  CPP_OPTION (pfile, deps_target) = 0;
649 650 651
	  output_file = spec;
	}

652 653
      CPP_OPTION (pfile, deps_file) = output_file;
      CPP_OPTION (pfile, print_deps_append) = 1;
654 655
    }

656
  pfile->deps = deps_init ();
657

658
  /* Print the expected object file name as the target of this Make-rule.  */
659 660 661
  if (CPP_OPTION (pfile, deps_target))
    deps_add_target (pfile->deps, CPP_OPTION (pfile, deps_target));
  else if (*CPP_OPTION (pfile, in_fname) == 0)
662
    deps_add_target (pfile->deps, "-");
663
  else
664
    deps_calc_target (pfile->deps, CPP_OPTION (pfile, in_fname));
665

666 667
  if (CPP_OPTION (pfile, in_fname))
    deps_add_dep (pfile->deps, CPP_OPTION (pfile, in_fname));
668 669
}

670 671 672 673 674 675
/* And another subroutine.  This one sets up the standard include path.  */
static void
initialize_standard_includes (pfile)
     cpp_reader *pfile;
{
  char *path;
676
  const struct default_include *p;
677
  const char *specd_prefix = CPP_OPTION (pfile, include_prefix);
678 679 680 681 682 683 684 685 686

  /* Several environment variables may add to the include search path.
     CPATH specifies an additional list of directories to be searched
     as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
     etc. specify an additional list of directories to be searched as
     if specified with -isystem, for the language indicated.  */

  GET_ENV_PATH_LIST (path, "CPATH");
  if (path != 0 && *path != 0)
687
    path_include (pfile, CPP_OPTION (pfile, pending), path, BRACKET);
688

689
  switch ((CPP_OPTION (pfile, objc) << 1) + CPP_OPTION (pfile, cplusplus))
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704
    {
    case 0:
      GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
      break;
    case 1:
      GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
      break;
    case 2:
      GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
      break;
    case 3:
      GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
      break;
    }
  if (path != 0 && *path != 0)
705
    path_include (pfile, CPP_OPTION (pfile, pending), path, SYSTEM);
706 707 708

  /* Search "translated" versions of GNU directories.
     These have /usr/local/lib/gcc... replaced by specd_prefix.  */
709
  if (specd_prefix != 0 && cpp_GCC_INCLUDE_DIR_len)
710 711 712
    {
      /* Remove the `include' from /usr/local/lib/gcc.../include.
	 GCC_INCLUDE_DIR will always end in /include. */
713 714
      int default_len = cpp_GCC_INCLUDE_DIR_len;
      char *default_prefix = (char *) alloca (default_len + 1);
715 716
      int specd_len = strlen (specd_prefix);

717
      memcpy (default_prefix, cpp_GCC_INCLUDE_DIR, default_len);
718 719
      default_prefix[default_len] = '\0';

720
      for (p = cpp_include_defaults; p->fname; p++)
721 722 723
	{
	  /* Some standard dirs are only for C++.  */
	  if (!p->cplusplus
724 725
	      || (CPP_OPTION (pfile, cplusplus)
		  && !CPP_OPTION (pfile, no_standard_cplusplus_includes)))
726 727 728 729 730 731 732 733 734 735 736 737 738
	    {
	      /* Does this dir start with the prefix?  */
	      if (!strncmp (p->fname, default_prefix, default_len))
		{
		  /* Yes; change prefix and add to search list.  */
		  int flen = strlen (p->fname);
		  int this_len = specd_len + flen - default_len;
		  char *str = (char *) xmalloc (this_len + 1);
		  memcpy (str, specd_prefix, specd_len);
		  memcpy (str + specd_len,
			  p->fname + default_len,
			  flen - default_len + 1);

739
		  append_include_chain (pfile, CPP_OPTION (pfile, pending),
740 741 742 743 744 745 746
					str, SYSTEM, p->cxx_aware);
		}
	    }
	}
    }

  /* Search ordinary names for GNU include directories.  */
747
  for (p = cpp_include_defaults; p->fname; p++)
748 749 750
    {
      /* Some standard dirs are only for C++.  */
      if (!p->cplusplus
751 752
	  || (CPP_OPTION (pfile, cplusplus)
	      && !CPP_OPTION (pfile, no_standard_cplusplus_includes)))
753 754 755
	{
	  /* XXX Potential memory leak! */
	  char *str = xstrdup (update_path (p->fname, p->component));
756 757
	  append_include_chain (pfile, CPP_OPTION (pfile, pending),
				str, SYSTEM, p->cxx_aware);
758 759 760 761
	}
    }
}

762 763 764 765 766 767 768
/* This is called after options have been processed.
 * Check options for consistency, and setup for processing input
 * from the file named FNAME.  (Use standard input if FNAME==NULL.)
 * Return 1 on success, 0 on failure.
 */

int
769
cpp_start_read (pfile, print, fname)
770
     cpp_reader *pfile;
771
     cpp_printer *print;
772
     const char *fname;
773
{
774
  struct pending_option *p, *q;
775

776 777 778
  /* -MG doesn't select the form of output and must be specified with one of
     -M or -MM.  -MG doesn't make sense with -MD or -MMD since they don't
     inhibit compilation.  */
779 780 781
  if (CPP_OPTION (pfile, print_deps_missing_files)
      && (CPP_OPTION (pfile, print_deps) == 0
	  || !CPP_OPTION (pfile, no_output)))
782 783 784 785
    {
      cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
      return 0;
    }
786

787 788 789 790
  /* -Wtraditional is not useful in C++ mode.  */
  if (CPP_OPTION (pfile, cplusplus))
    CPP_OPTION (pfile, warn_traditional) = 0;

791
  /* Do not warn about invalid token pasting if -lang-asm.  */
792
  if (CPP_OPTION (pfile, lang_asm))
Zack Weinberg committed
793 794
    CPP_OPTION (pfile, warn_paste) = 0;

795 796 797
  /* Set this if it hasn't been set already. */
  if (user_label_prefix == NULL)
    user_label_prefix = USER_LABEL_PREFIX;
798

Zack Weinberg committed
799 800 801 802 803 804 805 806 807 808
  /* Figure out if we need to save function macro parameter spellings.
     We don't use CPP_PEDANTIC() here because that depends on whether
     or not the current file is a system header, and there is no
     current file yet.  */
  pfile->save_parameter_spellings =
    CPP_OPTION (pfile, pedantic)
    || CPP_OPTION (pfile, debug_output)
    || CPP_OPTION (pfile, dump_macros) == dump_definitions
    || CPP_OPTION (pfile, dump_macros) == dump_only;

809 810
  /* Set up the IStable.  This doesn't do anything if we were compiled
     with a compiler that supports C99 designated initializers.  */
811
  init_IStable ();
812

813 814
  /* Set up the tables used by read_and_prescan.  */
  _cpp_init_input_buffer (pfile);
815

816
  /* Set up the include search path now.  */
817
  if (! CPP_OPTION (pfile, no_standard_includes))
818 819
    initialize_standard_includes (pfile);

820
  merge_include_chains (pfile);
821 822

  /* With -v, print the list of dirs to search.  */
823
  if (CPP_OPTION (pfile, verbose))
824 825 826
    {
      struct file_name_list *l;
      fprintf (stderr, _("#include \"...\" search starts here:\n"));
827
      for (l = CPP_OPTION (pfile, quote_include); l; l = l->next)
828
	{
829
	  if (l == CPP_OPTION (pfile, bracket_include))
830 831 832 833 834 835
	    fprintf (stderr, _("#include <...> search starts here:\n"));
	  fprintf (stderr, " %s\n", l->name);
	}
      fprintf (stderr, _("End of search list.\n"));
    }

836 837
  /* Open the main input file.  This must be done early, so we have a
     buffer to stand on.  */
838 839
  if (CPP_OPTION (pfile, in_fname) == NULL
      || *CPP_OPTION (pfile, in_fname) == 0)
840
    {
841 842 843
      CPP_OPTION (pfile, in_fname) = fname;
      if (CPP_OPTION (pfile, in_fname) == NULL)
	CPP_OPTION (pfile, in_fname) = "";
844
    }
845 846
  if (CPP_OPTION (pfile, out_fname) == NULL)
    CPP_OPTION (pfile, out_fname) = "";
847

848 849 850
  if (!cpp_read_file (pfile, fname))
    return 0;

851
  initialize_dependency_output (pfile);
852

853
  /* Install __LINE__, etc.  */
854 855 856
  initialize_builtins (pfile);

  /* Do -U's, -D's and -A's in the order they were seen.  */
857
  p = CPP_OPTION (pfile, pending)->directive_head;
858
  while (p)
859
    {
860
      (*p->handler) (pfile, p->arg);
861 862 863
      q = p->next;
      free (p);
      p = q;
864
    }
865
  pfile->done_initializing = 1;
Zack Weinberg committed
866

867 868 869 870 871 872
  /* We start at line 1 of the main input file.  */
  if (print)
    {
      print->last_fname = CPP_BUFFER (pfile)->nominal_fname;
      print->lineno = 1;
    }
873 874 875

  /* The -imacros files can be scanned now, but the -include files
     have to be pushed onto the include stack and processed later,
876
     in the main loop calling cpp_get_token.  */
877 878

  p = CPP_OPTION (pfile, pending)->imacros_head;
879
  while (p)
880
    {
881
      if (cpp_read_file (pfile, p->arg))
882
	cpp_scan_buffer_nooutput (pfile);
883 884 885
      q = p->next;
      free (p);
      p = q;
886
    }
887

888
  p = CPP_OPTION (pfile, pending)->include_head;
889
  while (p)
890
    {
891
      cpp_read_file (pfile, p->arg);
892 893 894
      q = p->next;
      free (p);
      p = q;
895 896
    }

897 898
  free (CPP_OPTION (pfile, pending));
  CPP_OPTION (pfile, pending) = NULL;
899 900 901 902 903 904 905 906 907

  return 1;
}

/* This is called at the end of preprocessing.  It pops the
   last buffer and writes dependency output.  It should also
   clear macro definitions, such that you could call cpp_start_read
   with a new filename to restart processing. */
void
908
cpp_finish (pfile, print)
909
     cpp_reader *pfile;
910
     cpp_printer *print;
911
{
912 913 914 915 916 917
  if (CPP_BUFFER (pfile))
    {
      cpp_ice (pfile, "buffers still stacked in cpp_finish");
      while (CPP_BUFFER (pfile))
	cpp_pop_buffer (pfile);
    }
918

919
  /* Don't write the deps file if preprocessing has failed.  */
920
  if (CPP_OPTION (pfile, print_deps) && pfile->errors == 0)
921 922
    {
      /* Stream on which to print the dependency information.  */
923
      FILE *deps_stream = 0;
924 925 926
      const char *deps_mode
	= CPP_OPTION (pfile, print_deps_append) ? "a" : "w";
      if (CPP_OPTION (pfile, deps_file) == 0)
927
	deps_stream = stdout;
928 929 930 931 932 933
      else
	{
	  deps_stream = fopen (CPP_OPTION (pfile, deps_file), deps_mode);
	  if (deps_stream == 0)
	    cpp_notice_from_errno (pfile, CPP_OPTION (pfile, deps_file));
	}
934 935 936
      if (deps_stream)
	{
	  deps_write (pfile->deps, deps_stream, 72);
937
	  if (CPP_OPTION (pfile, deps_file))
938
	    {
939 940
	      if (ferror (deps_stream) || fclose (deps_stream) != 0)
		cpp_fatal (pfile, "I/O error on output");
941 942 943
	    }
	}
    }
944

945 946 947
  /* Flush any pending output.  */
  if (print)
    {
948 949
      if (pfile->need_newline)
	putc ('\n', print->outf);
950 951 952
      if (ferror (print->outf) || fclose (print->outf))
	cpp_notice_from_errno (pfile, CPP_OPTION (pfile, out_fname));
    }
953 954 955

  /* Report on headers that could use multiple include guards.  */
  if (CPP_OPTION (pfile, print_include_names))
956
    _cpp_report_missing_guards (pfile);
957 958
}

959
static void
960 961
new_pending_directive (pend, text, handler)
     struct cpp_pending *pend;
962
     const char *text;
963
     cl_directive_handler handler;
964 965 966 967
{
  struct pending_option *o = (struct pending_option *)
    xmalloc (sizeof (struct pending_option));

968
  o->arg = text;
969
  o->next = NULL;
970
  o->handler = handler;
971
  APPEND (pend, directive, o);
972 973
}

974 975 976 977 978 979 980 981 982
/* Irix6 "cc -n32" and OSF4 cc have problems with char foo[] = ("string");
   I.e. a const string initializer with parens around it.  That is
   what N_("string") resolves to, so we make no_* be macros instead.  */
#define no_arg N_("Argument missing after %s")
#define no_ass N_("Assertion missing after %s")
#define no_dir N_("Directory name missing after %s")
#define no_fil N_("File name missing after %s")
#define no_mac N_("Macro name missing after %s")
#define no_pth N_("Path name missing after %s")
983
#define no_num N_("Number missing after %s")
984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012

/* This is the list of all command line options, with the leading
   "-" removed.  It must be sorted in ASCII collating order.  */
#define COMMAND_LINE_OPTIONS                                                  \
  DEF_OPT("",                         0,      OPT_stdin_stdout)               \
  DEF_OPT("$",                        0,      OPT_dollar)                     \
  DEF_OPT("+",                        0,      OPT_plus)                       \
  DEF_OPT("-help",                    0,      OPT__help)                      \
  DEF_OPT("-version",                 0,      OPT__version)                   \
  DEF_OPT("A",                        no_ass, OPT_A)                          \
  DEF_OPT("C",                        0,      OPT_C)                          \
  DEF_OPT("D",                        no_mac, OPT_D)                          \
  DEF_OPT("H",                        0,      OPT_H)                          \
  DEF_OPT("I",                        no_dir, OPT_I)                          \
  DEF_OPT("M",                        0,      OPT_M)                          \
  DEF_OPT("MD",                       no_fil, OPT_MD)                         \
  DEF_OPT("MG",                       0,      OPT_MG)                         \
  DEF_OPT("MM",                       0,      OPT_MM)                         \
  DEF_OPT("MMD",                      no_fil, OPT_MMD)                        \
  DEF_OPT("P",                        0,      OPT_P)                          \
  DEF_OPT("U",                        no_mac, OPT_U)                          \
  DEF_OPT("W",                        no_arg, OPT_W)  /* arg optional */      \
  DEF_OPT("d",                        no_arg, OPT_d)                          \
  DEF_OPT("fleading-underscore",      0,      OPT_fleading_underscore)        \
  DEF_OPT("fno-leading-underscore",   0,      OPT_fno_leading_underscore)     \
  DEF_OPT("fno-preprocessed",         0,      OPT_fno_preprocessed)           \
  DEF_OPT("fno-show-column",          0,      OPT_fno_show_column)            \
  DEF_OPT("fpreprocessed",            0,      OPT_fpreprocessed)              \
  DEF_OPT("fshow-column",             0,      OPT_fshow_column)               \
1013
  DEF_OPT("ftabstop=",                no_num, OPT_ftabstop)                   \
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
  DEF_OPT("g",                        no_arg, OPT_g)  /* arg optional */      \
  DEF_OPT("h",                        0,      OPT_h)                          \
  DEF_OPT("idirafter",                no_dir, OPT_idirafter)                  \
  DEF_OPT("imacros",                  no_fil, OPT_imacros)                    \
  DEF_OPT("include",                  no_fil, OPT_include)                    \
  DEF_OPT("iprefix",                  no_pth, OPT_iprefix)                    \
  DEF_OPT("isystem",                  no_dir, OPT_isystem)                    \
  DEF_OPT("iwithprefix",              no_dir, OPT_iwithprefix)                \
  DEF_OPT("iwithprefixbefore",        no_dir, OPT_iwithprefixbefore)          \
  DEF_OPT("lang-asm",                 0,      OPT_lang_asm)                   \
  DEF_OPT("lang-c",                   0,      OPT_lang_c)                     \
  DEF_OPT("lang-c++",                 0,      OPT_lang_cplusplus)             \
  DEF_OPT("lang-c89",                 0,      OPT_lang_c89)                   \
  DEF_OPT("lang-objc",                0,      OPT_lang_objc)                  \
  DEF_OPT("lang-objc++",              0,      OPT_lang_objcplusplus)          \
  DEF_OPT("nostdinc",                 0,      OPT_nostdinc)                   \
  DEF_OPT("nostdinc++",               0,      OPT_nostdincplusplus)           \
  DEF_OPT("o",                        no_fil, OPT_o)                          \
  DEF_OPT("pedantic",                 0,      OPT_pedantic)                   \
  DEF_OPT("pedantic-errors",          0,      OPT_pedantic_errors)            \
  DEF_OPT("remap",                    0,      OPT_remap)                      \
  DEF_OPT("std=c89",                  0,      OPT_std_c89)                    \
  DEF_OPT("std=c99",                  0,      OPT_std_c99)                    \
  DEF_OPT("std=c9x",                  0,      OPT_std_c9x)                    \
  DEF_OPT("std=gnu89",                0,      OPT_std_gnu89)                  \
  DEF_OPT("std=gnu99",                0,      OPT_std_gnu99)                  \
  DEF_OPT("std=gnu9x",                0,      OPT_std_gnu9x)                  \
  DEF_OPT("std=iso9899:1990",         0,      OPT_std_iso9899_1990)           \
  DEF_OPT("std=iso9899:199409",       0,      OPT_std_iso9899_199409)         \
  DEF_OPT("std=iso9899:1999",         0,      OPT_std_iso9899_1999)           \
  DEF_OPT("std=iso9899:199x",         0,      OPT_std_iso9899_199x)           \
  DEF_OPT("trigraphs",                0,      OPT_trigraphs)                  \
  DEF_OPT("v",                        0,      OPT_v)                          \
  DEF_OPT("w",                        0,      OPT_w)

#define DEF_OPT(text, msg, code) code,
Zack Weinberg committed
1050 1051
enum opt_code
{
1052
  COMMAND_LINE_OPTIONS
Zack Weinberg committed
1053 1054
  N_OPTS
};
1055
#undef DEF_OPT
Zack Weinberg committed
1056 1057 1058 1059 1060 1061 1062 1063 1064

struct cl_option
{
  const char *opt_text;
  const char *msg;
  size_t opt_len;
  enum opt_code opt_code;
};

1065
#define DEF_OPT(text, msg, code) { text, msg, sizeof(text) - 1, code },
Zack Weinberg committed
1066 1067 1068 1069 1070 1071
#ifdef HOST_EBCDIC
static struct cl_option cl_options[] =
#else
static const struct cl_option cl_options[] =
#endif
{
1072
  COMMAND_LINE_OPTIONS
Zack Weinberg committed
1073 1074
};
#undef DEF_OPT
1075
#undef COMMAND_LINE_OPTIONS
Zack Weinberg committed
1076

1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
#ifdef HOST_EBCDIC
static void
sort_options (void)
{
  static int opts_sorted = 0;

  if (!opts_sorted)
    {
      opts_sorted = 1;
      /* For non-ASCII hosts, the array needs to be sorted at runtime */
      qsort (cl_options, N_OPTS, sizeof (struct cl_option), opt_comp);
    }
}
#endif


Zack Weinberg committed
1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
/* Perform a binary search to find which, if any, option the given
   command-line matches.  Returns its index in the option array,
   negative on failure.  Complications arise since some options can be
   suffixed with an argument, and multiple complete matches can occur,
   e.g. -iwithprefix and -iwithprefixbefore.  Moreover, we want to
   accept options beginning with -g and -W that we do not recognise,
   but not to swallow any subsequent command line argument; these are
   handled as special cases in cpp_handle_option */
static int
parse_option (input)
     const char *input;
{
  unsigned int md, mn, mx;
  size_t opt_len;
  int comp;

  mn = 0;
  mx = N_OPTS;

  while (mx > mn)
    {
      md = (mn + mx) / 2;
1115

Zack Weinberg committed
1116 1117
      opt_len = cl_options[md].opt_len;
      comp = strncmp (input, cl_options[md].opt_text, opt_len);
1118

Zack Weinberg committed
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156
      if (comp > 0)
	mn = md + 1;
      else if (comp < 0)
	mx = md;
      else
	{
	  if (input[opt_len] == '\0')
	    return md;
	  /* We were passed more text.  If the option takes an argument,
	     we may match a later option or we may have been passed the
	     argument.  The longest possible option match succeeds.
	     If the option takes no arguments we have not matched and
	     continue the search (e.g. input="stdc++" match was "stdc") */
	  mn = md + 1;
	  if (cl_options[md].msg)
	    {
	      /* Scan forwards.  If we get an exact match, return it.
		 Otherwise, return the longest option-accepting match.
		 This loops no more than twice with current options */
	      mx = md;
	      for (; mn < N_OPTS; mn++)
		{
		  opt_len = cl_options[mn].opt_len;
		  if (strncmp (input, cl_options[mn].opt_text, opt_len))
		    break;
		  if (input[opt_len] == '\0')
		    return mn;
		  if (cl_options[mn].msg)
		    mx = mn;
		}
	      return mx;
	    }
	}
    }

  return -1;
}

1157 1158 1159
/* Handle one command-line option in (argc, argv).
   Can be called multiple times, to handle multiple sets of options.
   Returns number of strings consumed.  */
1160

1161 1162
int
cpp_handle_option (pfile, argc, argv)
1163 1164 1165 1166 1167
     cpp_reader *pfile;
     int argc;
     char **argv;
{
  int i = 0;
1168
  struct cpp_pending *pend = CPP_OPTION (pfile, pending);
1169

1170 1171
  if (argv[i][0] != '-')
    {
1172 1173 1174 1175 1176
      if (CPP_OPTION (pfile, out_fname) != NULL)
	cpp_fatal (pfile, "Too many arguments. Type %s --help for usage info",
		   progname);
      else if (CPP_OPTION (pfile, in_fname) != NULL)
	CPP_OPTION (pfile, out_fname) = argv[i];
1177
      else
1178
	CPP_OPTION (pfile, in_fname) = argv[i];
1179 1180
    }
  else
Zack Weinberg committed
1181 1182 1183
    {
      enum opt_code opt_code;
      int opt_index;
1184
      const char *arg = 0;
Zack Weinberg committed
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203

      /* Skip over '-' */
      opt_index = parse_option (&argv[i][1]);
      if (opt_index < 0)
	return i;

      opt_code = cl_options[opt_index].opt_code;
      if (cl_options[opt_index].msg)
	{
	  arg = &argv[i][cl_options[opt_index].opt_len + 1];

	  /* Yuk. Special case for -g and -W as they must not swallow
	     up any following argument.  If this becomes common, add
	     another field to the cl_options table */
	  if (arg[0] == '\0' && !(opt_code == OPT_g || opt_code == OPT_W))
	    {
	      arg = argv[++i];
	      if (!arg)
		{
1204
		  cpp_fatal (pfile, cl_options[opt_index].msg, argv[i - 1]);
Zack Weinberg committed
1205 1206 1207 1208
		  return argc;
		}
	    }
	}
1209

Zack Weinberg committed
1210 1211 1212 1213 1214
      switch (opt_code)
	{
	case N_OPTS: /* shut GCC up */
	  break;
	case OPT_fleading_underscore:
1215
	  user_label_prefix = "_";
Zack Weinberg committed
1216 1217
	  break;
	case OPT_fno_leading_underscore:
1218
	  user_label_prefix = "";
Zack Weinberg committed
1219 1220
	  break;
	case OPT_fpreprocessed:
1221
	  CPP_OPTION (pfile, preprocessed) = 1;
Zack Weinberg committed
1222 1223
	  break;
	case OPT_fno_preprocessed:
1224 1225 1226 1227 1228 1229 1230
	  CPP_OPTION (pfile, preprocessed) = 0;
	  break;
	case OPT_fshow_column:
	  CPP_OPTION (pfile, show_column) = 1;
	  break;
	case OPT_fno_show_column:
	  CPP_OPTION (pfile, show_column) = 0;
Zack Weinberg committed
1231
	  break;
1232 1233 1234 1235 1236 1237 1238 1239 1240 1241
	case OPT_ftabstop:
	  /* Silently ignore empty string, non-longs and silly values.  */
	  if (arg[0] != '\0')
	    {
	      char *endptr;
	      long tabstop = strtol (arg, &endptr, 10);
	      if (*endptr == '\0' && tabstop >= 1 && tabstop <= 100)
		CPP_OPTION (pfile, tabstop) = tabstop;
	    }
	  break;
Zack Weinberg committed
1242
	case OPT_w:
1243
	  CPP_OPTION (pfile, inhibit_warnings) = 1;
Zack Weinberg committed
1244 1245 1246
	  break;
	case OPT_g:  /* Silently ignore anything but -g3 */
	  if (!strcmp(&argv[i][2], "3"))
1247
	    CPP_OPTION (pfile, debug_output) = 1;
Zack Weinberg committed
1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258
	  break;
	case OPT_h:
	case OPT__help:
	  print_help ();
	  exit (0);  /* XXX */
	  break;
	case OPT__version:
	  fprintf (stderr, _("GNU CPP version %s (cpplib)\n"), version_string);
	  exit (0);  /* XXX */
	  break;
	case OPT_C:
1259
	  CPP_OPTION (pfile, discard_comments) = 0;
Zack Weinberg committed
1260 1261
	  break;
	case OPT_P:
1262
	  CPP_OPTION (pfile, no_line_commands) = 1;
Zack Weinberg committed
1263 1264
	  break;
	case OPT_dollar:		/* Don't include $ in identifiers.  */
1265
	  CPP_OPTION (pfile, dollars_in_ident) = 0;
Zack Weinberg committed
1266 1267
	  break;
	case OPT_H:
1268
	  CPP_OPTION (pfile, print_include_names) = 1;
Zack Weinberg committed
1269 1270
	  break;
	case OPT_D:
1271
	  new_pending_directive (pend, arg, cpp_define);
Zack Weinberg committed
1272 1273
	  break;
	case OPT_pedantic_errors:
1274
	  CPP_OPTION (pfile, pedantic_errors) = 1;
Zack Weinberg committed
1275 1276
	  /* fall through */
	case OPT_pedantic:
1277
 	  CPP_OPTION (pfile, pedantic) = 1;
Zack Weinberg committed
1278 1279
	  break;
	case OPT_trigraphs:
1280
 	  CPP_OPTION (pfile, trigraphs) = 1;
Zack Weinberg committed
1281 1282
	  break;
	case OPT_plus:
1283 1284
	  CPP_OPTION (pfile, cplusplus) = 1;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
Zack Weinberg committed
1285 1286
	  break;
	case OPT_remap:
1287
	  CPP_OPTION (pfile, remap) = 1;
Zack Weinberg committed
1288 1289
	  break;
	case OPT_iprefix:
1290 1291
	  CPP_OPTION (pfile, include_prefix) = arg;
	  CPP_OPTION (pfile, include_prefix_len) = strlen (arg);
Zack Weinberg committed
1292 1293
	  break;
	case OPT_lang_c:
1294 1295 1296 1297
	  CPP_OPTION (pfile, cplusplus) = 0;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 0;
	  CPP_OPTION (pfile, c99) = 1;
1298
	  CPP_OPTION (pfile, digraphs) = 1;
1299
	  CPP_OPTION (pfile, objc) = 0;
Zack Weinberg committed
1300 1301
	  break;
	case OPT_lang_cplusplus:
1302 1303 1304 1305 1306
	  CPP_OPTION (pfile, cplusplus) = 1;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 0;
	  CPP_OPTION (pfile, c99) = 0;
	  CPP_OPTION (pfile, objc) = 0;
1307
	  CPP_OPTION (pfile, digraphs) = 1;
1308
	  new_pending_directive (pend, "__cplusplus", cpp_define);
Zack Weinberg committed
1309 1310
	  break;
	case OPT_lang_objcplusplus:
1311 1312 1313 1314
	  CPP_OPTION (pfile, cplusplus) = 1;
	  new_pending_directive (pend, "__cplusplus", cpp_define);
	  /* fall through */
	case OPT_lang_objc:
1315 1316 1317 1318
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 0;
	  CPP_OPTION (pfile, c99) = 0;
	  CPP_OPTION (pfile, objc) = 1;
1319
	  new_pending_directive (pend, "__OBJC__", cpp_define);
Zack Weinberg committed
1320 1321
	  break;
	case OPT_lang_asm:
1322
 	  CPP_OPTION (pfile, lang_asm) = 1;
1323 1324
	  CPP_OPTION (pfile, dollars_in_ident) = 0;
	  new_pending_directive (pend, "__ASSEMBLER__", cpp_define);
Zack Weinberg committed
1325 1326 1327 1328
	  break;
	case OPT_nostdinc:
	  /* -nostdinc causes no default include directories.
	     You must specify all include-file directories with -I.  */
1329
	  CPP_OPTION (pfile, no_standard_includes) = 1;
Zack Weinberg committed
1330 1331 1332
	  break;
	case OPT_nostdincplusplus:
	  /* -nostdinc++ causes no default C++-specific include directories. */
1333
	  CPP_OPTION (pfile, no_standard_cplusplus_includes) = 1;
Zack Weinberg committed
1334 1335
	  break;
	case OPT_std_gnu89:
1336 1337 1338 1339 1340
	  CPP_OPTION (pfile, cplusplus) = 0;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 1;
	  CPP_OPTION (pfile, c99) = 0;
	  CPP_OPTION (pfile, objc) = 0;
1341
	  CPP_OPTION (pfile, digraphs) = 1;
Zack Weinberg committed
1342 1343 1344
	  break;
	case OPT_std_gnu9x:
	case OPT_std_gnu99:
1345 1346 1347 1348
	  CPP_OPTION (pfile, cplusplus) = 0;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 0;
	  CPP_OPTION (pfile, c99) = 1;
1349
	  CPP_OPTION (pfile, digraphs) = 1;
1350 1351 1352
	  CPP_OPTION (pfile, objc) = 0;
	  new_pending_directive (CPP_OPTION (pfile, pending),
				 "__STDC_VERSION__=199901L", cpp_define);
Zack Weinberg committed
1353 1354
	  break;
	case OPT_std_iso9899_199409:
1355 1356
	  new_pending_directive (CPP_OPTION (pfile, pending),
				 "__STDC_VERSION__=199409L", cpp_define);
Zack Weinberg committed
1357 1358 1359
	  /* Fall through */
	case OPT_std_iso9899_1990:
	case OPT_std_c89:
1360
	case OPT_lang_c89:
1361 1362 1363 1364 1365
	  CPP_OPTION (pfile, cplusplus) = 0;
	  CPP_OPTION (pfile, cplusplus_comments) = 0;
	  CPP_OPTION (pfile, c89) = 1;
	  CPP_OPTION (pfile, c99) = 0;
	  CPP_OPTION (pfile, objc) = 0;
1366
	  CPP_OPTION (pfile, digraphs) = opt_code == OPT_std_iso9899_199409;
1367
	  CPP_OPTION (pfile, trigraphs) = 1;
1368
	  new_pending_directive (pend, "__STRICT_ANSI__", cpp_define);
Zack Weinberg committed
1369 1370 1371 1372 1373
	  break;
	case OPT_std_iso9899_199x:
	case OPT_std_iso9899_1999:
	case OPT_std_c9x:
	case OPT_std_c99:
1374 1375 1376 1377 1378
	  CPP_OPTION (pfile, cplusplus) = 0;
	  CPP_OPTION (pfile, cplusplus_comments) = 1;
	  CPP_OPTION (pfile, c89) = 0;
	  CPP_OPTION (pfile, c99) = 1;
	  CPP_OPTION (pfile, objc) = 0;
1379
	  CPP_OPTION (pfile, digraphs) = 1;
1380 1381 1382 1383 1384
	  CPP_OPTION (pfile, trigraphs) = 1;
	  new_pending_directive (CPP_OPTION (pfile, pending),
				 "__STRICT_ANSI__", cpp_define);
	  new_pending_directive (CPP_OPTION (pfile, pending),
				 "__STDC_VERSION__=199901L", cpp_define);
Zack Weinberg committed
1385 1386
	  break;
	case OPT_o:
1387
	  if (CPP_OPTION (pfile, out_fname) != NULL)
1388
	    {
Zack Weinberg committed
1389 1390 1391
	      cpp_fatal (pfile, "Output filename specified twice");
	      return argc;
	    }
1392 1393 1394
	  CPP_OPTION (pfile, out_fname) = arg;
	  if (!strcmp (CPP_OPTION (pfile, out_fname), "-"))
	    CPP_OPTION (pfile, out_fname) = "";
Zack Weinberg committed
1395 1396 1397 1398 1399 1400 1401
	  break;
	case OPT_v:
	  fprintf (stderr, _("GNU CPP version %s (cpplib)\n"), version_string);
#ifdef TARGET_VERSION
	  TARGET_VERSION;
#endif
	  fputc ('\n', stderr);
1402
	  CPP_OPTION (pfile, verbose) = 1;
Zack Weinberg committed
1403 1404 1405
	  break;
	case OPT_stdin_stdout:
	  /* JF handle '-' as file name meaning stdin or stdout */
1406 1407 1408 1409
	  if (CPP_OPTION (pfile, in_fname) == NULL)
	    CPP_OPTION (pfile, in_fname) = "";
	  else if (CPP_OPTION (pfile, out_fname) == NULL)
	    CPP_OPTION (pfile, out_fname) = "";
Zack Weinberg committed
1410 1411 1412 1413 1414 1415 1416
	  break;
	case OPT_d:
	  /* Args to -d specify what parts of macros to dump.
	     Silently ignore unrecognised options; they may
	     be aimed at the compiler proper. */
 	  {
	    char c;
1417

Zack Weinberg committed
1418 1419 1420 1421
	    while ((c = *arg++) != '\0')
 	      switch (c)
 		{
 		case 'M':
1422 1423
		  CPP_OPTION (pfile, dump_macros) = dump_only;
		  CPP_OPTION (pfile, no_output) = 1;
1424 1425
		  break;
		case 'N':
1426
		  CPP_OPTION (pfile, dump_macros) = dump_names;
1427 1428
		  break;
		case 'D':
1429
		  CPP_OPTION (pfile, dump_macros) = dump_definitions;
1430 1431
		  break;
		case 'I':
1432
		  CPP_OPTION (pfile, dump_includes) = 1;
1433 1434
		  break;
		}
Zack Weinberg committed
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
	  }
	  break;
	  /* The style of the choices here is a bit mixed.
	     The chosen scheme is a hybrid of keeping all options in one string
	     and specifying each option in a separate argument:
	     -M|-MM|-MD file|-MMD file [-MG].  An alternative is:
	     -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
	     -M[M][G][D file].  This is awkward to handle in specs, and is not
	     as extensible.  */
	  /* ??? -MG must be specified in addition to one of -M or -MM.
	     This can be relaxed in the future without breaking anything.
	     The converse isn't true.  */
1447

Zack Weinberg committed
1448 1449
	  /* -MG isn't valid with -MD or -MMD.  This is checked for later.  */
	case OPT_MG:
1450
	  CPP_OPTION (pfile, print_deps_missing_files) = 1;
Zack Weinberg committed
1451 1452 1453 1454 1455 1456
	  break;
	case OPT_M:
	case OPT_MD:
	case OPT_MM:
	case OPT_MMD:
	  if (opt_code == OPT_M || opt_code == OPT_MD)
1457
	    CPP_OPTION (pfile, print_deps) = 2;
Zack Weinberg committed
1458
 	  else
1459
	    CPP_OPTION (pfile, print_deps) = 1;
Zack Weinberg committed
1460 1461 1462 1463 1464

	  /* For -MD and -MMD options, write deps on file named by next arg */
	  /* For -M and -MM, write deps on standard output
	     and suppress the usual output.  */
	  if (opt_code == OPT_MD || opt_code == OPT_MMD)
1465
	      CPP_OPTION (pfile, deps_file) = arg;
Zack Weinberg committed
1466
 	  else
1467
	      CPP_OPTION (pfile, no_output) = 1;
Zack Weinberg committed
1468 1469
	  break;
	case OPT_A:
1470
	  if (arg[0] == '-')
1471
	    {
1472 1473 1474 1475 1476 1477 1478 1479 1480
	      /* -A with an argument beginning with '-' acts as
		 #unassert on whatever immediately follows the '-'.
		 If "-" is the whole argument, we eliminate all
		 predefined macros and assertions, including those
		 that were specified earlier on the command line.
		 That way we can get rid of any that were passed
		 automatically in from GCC.  */

	      if (arg[1] == '\0')
1481
		{
1482 1483
		  struct pending_option *o1, *o2;

1484
		  o1 = CPP_OPTION (pfile, pending)->directive_head;
1485 1486 1487 1488 1489 1490
		  while (o1)
		    {
		      o2 = o1->next;
		      free (o1);
		      o1 = o2;
		    }
1491 1492
		  CPP_OPTION (pfile, pending)->directive_head = NULL;
		  CPP_OPTION (pfile, pending)->directive_tail = NULL;
1493
		}
1494
	      else
1495 1496
		new_pending_directive (CPP_OPTION (pfile, pending),
				       arg + 1, cpp_unassert);
1497
	    }
1498
	  else
1499 1500
	    new_pending_directive (CPP_OPTION (pfile, pending),
				   arg, cpp_assert);
Zack Weinberg committed
1501 1502
	  break;
	case OPT_U:
1503
	  new_pending_directive (CPP_OPTION (pfile, pending), arg, cpp_undef);
Zack Weinberg committed
1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
	  break;
	case OPT_I:           /* Add directory to path for includes.  */
	  if (!strcmp (arg, "-"))
 	    {
	      /* -I- means:
		 Use the preceding -I directories for #include "..."
		 but not #include <...>.
		 Don't search the directory of the present file
		 for #include "...".  (Note that -I. -I- is not the same as
		 the default setup; -I. uses the compiler's working dir.)  */
1514
	      if (! CPP_OPTION (pfile, ignore_srcdir))
Zack Weinberg committed
1515
		{
1516 1517 1518 1519 1520 1521
		  struct cpp_pending *pend = CPP_OPTION (pfile, pending);
		  pend->quote_head = pend->brack_head;
		  pend->quote_tail = pend->brack_tail;
		  pend->brack_head = 0;
		  pend->brack_tail = 0;
		  CPP_OPTION (pfile, ignore_srcdir) = 1;
Zack Weinberg committed
1522 1523 1524 1525 1526 1527 1528 1529
		}
	      else
		{
		  cpp_fatal (pfile, "-I- specified twice");
		  return argc;
		}
 	    }
 	  else
1530
	    append_include_chain (pfile, CPP_OPTION (pfile, pending),
Zack Weinberg committed
1531 1532 1533 1534 1535
				  xstrdup (arg), BRACKET, 0);
	  break;
	case OPT_isystem:
	  /* Add directory to beginning of system include path, as a system
	     include directory. */
1536
	  append_include_chain (pfile, CPP_OPTION (pfile, pending),
Zack Weinberg committed
1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
				xstrdup (arg), SYSTEM, 0);
	  break;
	case OPT_include:
	  {
	    struct pending_option *o = (struct pending_option *)
	      xmalloc (sizeof (struct pending_option));
	    o->arg = arg;

	    /* This list has to be built in reverse order so that
	       when cpp_start_read pushes all the -include files onto
	       the buffer stack, they will be scanned in forward order.  */
1548 1549
	    o->next = CPP_OPTION (pfile, pending)->include_head;
	    CPP_OPTION (pfile, pending)->include_head = o;
Zack Weinberg committed
1550 1551 1552 1553 1554 1555 1556 1557
	  }
	  break;
	case OPT_imacros:
	  {
	    struct pending_option *o = (struct pending_option *)
	      xmalloc (sizeof (struct pending_option));
	    o->arg = arg;
	    o->next = NULL;
1558 1559

	    APPEND (CPP_OPTION (pfile, pending), imacros, o);
Zack Weinberg committed
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571
	  }
	  break;
	case OPT_iwithprefix:
	  /* Add directory to end of path for includes,
	     with the default prefix at the front of its name.  */
	  /* fall through */
	case OPT_iwithprefixbefore:
	  /* Add directory to main path for includes,
	     with the default prefix at the front of its name.  */
	  {
	    char *fname;
	    int len;
1572

Zack Weinberg committed
1573
	    len = strlen (arg);
1574 1575

	    if (CPP_OPTION (pfile, include_prefix) != 0)
Zack Weinberg committed
1576
	      {
1577 1578 1579 1580
		size_t ipl = CPP_OPTION (pfile, include_prefix_len);
		fname = xmalloc (ipl + len + 1);
		memcpy (fname, CPP_OPTION (pfile, include_prefix), ipl);
		memcpy (fname + ipl, arg, len + 1);
Zack Weinberg committed
1581
	      }
1582
	    else if (cpp_GCC_INCLUDE_DIR_len)
Zack Weinberg committed
1583
	      {
1584 1585 1586
		fname = xmalloc (cpp_GCC_INCLUDE_DIR_len + len + 1);
		memcpy (fname, cpp_GCC_INCLUDE_DIR, cpp_GCC_INCLUDE_DIR_len);
		memcpy (fname + cpp_GCC_INCLUDE_DIR_len, arg, len + 1);
Zack Weinberg committed
1587
	      }
1588 1589
	    else
	      fname = xstrdup (arg);
1590 1591

	    append_include_chain (pfile, CPP_OPTION (pfile, pending), fname,
Zack Weinberg committed
1592 1593 1594 1595 1596
			  opt_code == OPT_iwithprefix ? SYSTEM: BRACKET, 0);
	  }
	  break;
	case OPT_idirafter:
	  /* Add directory to end of path for includes.  */
1597
	  append_include_chain (pfile, CPP_OPTION (pfile, pending),
Zack Weinberg committed
1598 1599 1600 1601 1602
				xstrdup (arg), AFTER, 0);
	  break;
	case OPT_W:
	  /* Silently ignore unrecognised options */
	  if (!strcmp (argv[i], "-Wall"))
1603
	    {
1604 1605
	      CPP_OPTION (pfile, warn_trigraphs) = 1;
	      CPP_OPTION (pfile, warn_comments) = 1;
1606
	    }
Zack Weinberg committed
1607
	  else if (!strcmp (argv[i], "-Wtraditional"))
1608
	    CPP_OPTION (pfile, warn_traditional) = 1;
Zack Weinberg committed
1609
	  else if (!strcmp (argv[i], "-Wtrigraphs"))
1610
	    CPP_OPTION (pfile, warn_trigraphs) = 1;
Zack Weinberg committed
1611
	  else if (!strcmp (argv[i], "-Wcomment"))
1612
	    CPP_OPTION (pfile, warn_comments) = 1;
Zack Weinberg committed
1613
	  else if (!strcmp (argv[i], "-Wcomments"))
1614
	    CPP_OPTION (pfile, warn_comments) = 1;
Zack Weinberg committed
1615
	  else if (!strcmp (argv[i], "-Wundef"))
1616
	    CPP_OPTION (pfile, warn_undef) = 1;
Zack Weinberg committed
1617
	  else if (!strcmp (argv[i], "-Wimport"))
1618
	    CPP_OPTION (pfile, warn_import) = 1;
Zack Weinberg committed
1619 1620
	  else if (!strcmp (argv[i], "-Wpaste"))
	    CPP_OPTION (pfile, warn_paste) = 1;
Zack Weinberg committed
1621
	  else if (!strcmp (argv[i], "-Werror"))
1622
	    CPP_OPTION (pfile, warnings_are_errors) = 1;
Zack Weinberg committed
1623
	  else if (!strcmp (argv[i], "-Wno-traditional"))
1624
	    CPP_OPTION (pfile, warn_traditional) = 0;
Zack Weinberg committed
1625
	  else if (!strcmp (argv[i], "-Wno-trigraphs"))
1626
	    CPP_OPTION (pfile, warn_trigraphs) = 0;
Zack Weinberg committed
1627
	  else if (!strcmp (argv[i], "-Wno-comment"))
1628
	    CPP_OPTION (pfile, warn_comments) = 0;
Zack Weinberg committed
1629
	  else if (!strcmp (argv[i], "-Wno-comments"))
1630
	    CPP_OPTION (pfile, warn_comments) = 0;
Zack Weinberg committed
1631
	  else if (!strcmp (argv[i], "-Wno-undef"))
1632
	    CPP_OPTION (pfile, warn_undef) = 0;
Zack Weinberg committed
1633
	  else if (!strcmp (argv[i], "-Wno-import"))
1634
	    CPP_OPTION (pfile, warn_import) = 0;
Zack Weinberg committed
1635 1636
	  else if (!strcmp (argv[i], "-Wno-paste"))
	    CPP_OPTION (pfile, warn_paste) = 0;
Zack Weinberg committed
1637
	  else if (!strcmp (argv[i], "-Wno-error"))
1638
	    CPP_OPTION (pfile, warnings_are_errors) = 0;
Zack Weinberg committed
1639 1640 1641
	  break;
 	}
    }
1642
  return i + 1;
Zack Weinberg committed
1643
}
1644

Zack Weinberg committed
1645 1646 1647 1648 1649 1650
#ifdef HOST_EBCDIC
static int
opt_comp (const void *p1, const void *p2)
{
  return strcmp (((struct cl_option *)p1)->opt_text,
		 ((struct cl_option *)p2)->opt_text);
1651
}
Zack Weinberg committed
1652
#endif
1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665

/* Handle command-line options in (argc, argv).
   Can be called multiple times, to handle multiple sets of options.
   Returns if an unrecognized option is seen.
   Returns number of strings consumed.  */
int
cpp_handle_options (pfile, argc, argv)
     cpp_reader *pfile;
     int argc;
     char **argv;
{
  int i;
  int strings_processed;
Zack Weinberg committed
1666

1667 1668
  for (i = 0; i < argc; i += strings_processed)
    {
1669
      strings_processed = cpp_handle_option (pfile, argc - i, argv + i);
1670 1671 1672 1673 1674 1675 1676 1677 1678
      if (strings_processed == 0)
	break;
    }
  return i;
}

static void
print_help ()
{
1679
  fprintf (stderr, _("Usage: %s [switches] input output\n"), progname);
1680 1681
  /* To keep the lines from getting too long for some compilers, limit
     to about 500 characters (6 lines) per chunk. */
1682 1683 1684 1685 1686 1687 1688 1689
  fputs (_("\
Switches:\n\
  -include <file>           Include the contents of <file> before other files\n\
  -imacros <file>           Accept definition of macros in <file>\n\
  -iprefix <path>           Specify <path> as a prefix for next two options\n\
  -iwithprefix <dir>        Add <dir> to the end of the system include path\n\
  -iwithprefixbefore <dir>  Add <dir> to the end of the main include path\n\
  -isystem <dir>            Add <dir> to the start of the system include path\n\
1690 1691
"), stdout);
  fputs (_("\
1692 1693
  -idirafter <dir>          Add <dir> to the end of the system include path\n\
  -I <dir>                  Add <dir> to the end of the main include path\n\
Zack Weinberg committed
1694
  -I-                       Fine-grained include path control; see info docs\n\
1695 1696 1697 1698
  -nostdinc                 Do not search system include directories\n\
                             (dirs specified with -isystem will still be used)\n\
  -nostdinc++               Do not search system include directories for C++\n\
  -o <file>                 Put output into <file>\n\
1699 1700
"), stdout);
  fputs (_("\
Zack Weinberg committed
1701
  -pedantic                 Issue all warnings demanded by strict ISO C\n\
Zack Weinberg committed
1702
  -pedantic-errors          Issue -pedantic warnings as errors instead\n\
Zack Weinberg committed
1703
  -trigraphs                Support ISO C trigraphs\n\
1704 1705
  -lang-c                   Assume that the input sources are in C\n\
  -lang-c89                 Assume that the input sources are in C89\n\
1706 1707
"), stdout);
  fputs (_("\
1708
  -lang-c++                 Assume that the input sources are in C++\n\
1709 1710 1711
  -lang-objc                Assume that the input sources are in ObjectiveC\n\
  -lang-objc++              Assume that the input sources are in ObjectiveC++\n\
  -lang-asm                 Assume that the input sources are in assembler\n\
1712 1713
"), stdout);
  fputs (_("\
1714
  -std=<std name>           Specify the conformance standard; one of:\n\
1715 1716
                            gnu89, gnu99, c89, c99, iso9899:1990,\n\
                            iso9899:199409, iso9899:1999\n\
1717 1718 1719 1720 1721
  -+                        Allow parsing of C++ style features\n\
  -w                        Inhibit warning messages\n\
  -Wtrigraphs               Warn if trigraphs are encountered\n\
  -Wno-trigraphs            Do not warn about trigraphs\n\
  -Wcomment{s}              Warn if one comment starts inside another\n\
1722 1723
"), stdout);
  fputs (_("\
1724
  -Wno-comment{s}           Do not warn about comments\n\
1725 1726
  -Wtraditional             Warn about features not present in traditional C\n\
  -Wno-traditional          Do not warn about traditional C\n\
1727 1728 1729
  -Wundef                   Warn if an undefined macro is used by #if\n\
  -Wno-undef                Do not warn about testing undefined macros\n\
  -Wimport                  Warn about the use of the #import directive\n\
1730 1731
"), stdout);
  fputs (_("\
1732 1733 1734 1735 1736 1737
  -Wno-import               Do not warn about the use of #import\n\
  -Werror                   Treat all warnings as errors\n\
  -Wno-error                Do not treat warnings as errors\n\
  -Wall                     Enable all preprocessor warnings\n\
  -M                        Generate make dependencies\n\
  -MM                       As -M, but ignore system header files\n\
1738 1739
"), stdout);
  fputs (_("\
1740 1741 1742
  -MD                       As -M, but put output in a .d file\n\
  -MMD                      As -MD, but ignore system header files\n\
  -MG                       Treat missing header file as generated files\n\
Zack Weinberg committed
1743
  -g3                       Include #define and #undef directives in the output\n\
1744 1745
  -D<macro>                 Define a <macro> with string '1' as its value\n\
  -D<macro>=<val>           Define a <macro> with <val> as its value\n\
1746 1747
"), stdout);
  fputs (_("\
1748
  -A<question> (<answer>)   Assert the <answer> to <question>\n\
1749
  -A-<question> (<answer>)  Disable the <answer> to <question>\n\
1750 1751 1752 1753
  -U<macro>                 Undefine <macro> \n\
  -v                        Display the version number\n\
  -H                        Print the name of header files as they are used\n\
  -C                        Do not discard comments\n\
1754 1755
"), stdout);
  fputs (_("\
1756 1757 1758 1759
  -dM                       Display a list of macro definitions active at end\n\
  -dD                       Preserve macro definitions in output\n\
  -dN                       As -dD except that only the names are preserved\n\
  -dI                       Include #include directives in the output\n\
1760
  -ftabstop=<number>        Distance between tab stops for column reporting\n\
1761 1762
  -P                        Do not generate #line directives\n\
  -$                        Do not allow '$' in identifiers\n\
1763 1764
"), stdout);
  fputs (_("\
1765
  -remap                    Remap file names when including files.\n\
Zack Weinberg committed
1766
  --version                 Display version information\n\
1767 1768 1769
  -h or --help              Display this information\n\
"), stdout);
}