]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cppinit.c
* tradcpp.c, tradcif.y: Update FSF mailing address, delete
[thirdparty/gcc.git] / gcc / cppinit.c
CommitLineData
a852e3b1 1/* CPP Library.
00059bc7 2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000 Free Software Foundation, Inc.
a852e3b1 4 Contributed by Per Bothner, 1994-95.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7
8This program is free software; you can redistribute it and/or modify it
9under the terms of the GNU General Public License as published by the
10Free Software Foundation; either version 2, or (at your option) any
11later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
a852e3b1 22#include "config.h"
23#include "system.h"
6d71dc85 24#include "cpplib.h"
25#include "cpphash.h"
26#include "output.h"
27#include "prefix.h"
28#include "intl.h"
56fc5f02 29#include "version.h"
62adb1fe 30#include "mkdeps.h"
472679ed 31#include "cppdefault.h"
6d71dc85 32
33/* Predefined symbols, built-in macros, and the default include path. */
34
35#ifndef GET_ENV_PATH_LIST
36#define GET_ENV_PATH_LIST(VAR,NAME) do { (VAR) = getenv (NAME); } while (0)
37#endif
38
1e8b9746 39/* Windows does not natively support inodes, and neither does MSDOS.
40 Cygwin's emulation can generate non-unique inodes, so don't use it.
41 VMS has non-numeric inodes. */
42#ifdef VMS
43#define INO_T_EQ(a, b) (!memcmp (&(a), &(b), sizeof (a)))
44#elif (defined _WIN32 && ! defined (_UWIN)) || defined __MSDOS__
45#define INO_T_EQ(a, b) 0
46#else
47#define INO_T_EQ(a, b) ((a) == (b))
48#endif
49
6d71dc85 50/* Internal structures and prototypes. */
51
9fa36617 52/* A `struct pending_option' remembers one -D, -A, -U, -include, or -imacros
53 switch. There are four lists: one for -D and -U, one for -A, one
54 for -include, one for -imacros. `undef' is set for -U, clear for
55 -D, ignored for the others.
56 (Future: add an equivalent of -U for -A) */
d73269b6 57
078aa0ff 58typedef void (* cl_directive_handler) PARAMS ((cpp_reader *, const char *));
9fa36617 59struct pending_option
6d71dc85 60{
9fa36617 61 struct pending_option *next;
8d7a2585 62 const char *arg;
d73269b6 63 cl_directive_handler handler;
6d71dc85 64};
9fa36617 65
1e8b9746 66/* The `pending' structure accumulates all the options that are not
67 actually processed until we hit cpp_start_read. It consists of
68 several lists, one for each type of option. We keep both head and
69 tail pointers for quick insertion. */
70struct cpp_pending
71{
d73269b6 72 struct pending_option *directive_head, *directive_tail;
1e8b9746 73
74 struct file_name_list *quote_head, *quote_tail;
75 struct file_name_list *brack_head, *brack_tail;
76 struct file_name_list *systm_head, *systm_tail;
77 struct file_name_list *after_head, *after_tail;
78
79 struct pending_option *imacros_head, *imacros_tail;
80 struct pending_option *include_head, *include_tail;
81};
82
9fa36617 83#ifdef __STDC__
84#define APPEND(pend, list, elt) \
85 do { if (!(pend)->list##_head) (pend)->list##_head = (elt); \
86 else (pend)->list##_tail->next = (elt); \
87 (pend)->list##_tail = (elt); \
88 } while (0)
89#else
90#define APPEND(pend, list, elt) \
91 do { if (!(pend)->list/**/_head) (pend)->list/**/_head = (elt); \
92 else (pend)->list/**/_tail->next = (elt); \
93 (pend)->list/**/_tail = (elt); \
94 } while (0)
95#endif
6d71dc85 96
6d71dc85 97static void print_help PARAMS ((void));
9fa36617 98static void path_include PARAMS ((cpp_reader *,
9fa36617 99 char *, int));
6d71dc85 100static void initialize_builtins PARAMS ((cpp_reader *));
9fa36617 101static void append_include_chain PARAMS ((cpp_reader *,
d2e850c1 102 char *, int, int));
d1ad3794 103struct file_name_list * remove_dup_dir PARAMS ((cpp_reader *,
104 struct file_name_list *));
105struct file_name_list * remove_dup_dirs PARAMS ((cpp_reader *,
106 struct file_name_list *));
2ff3ad1d 107static void merge_include_chains PARAMS ((cpp_reader *));
1e8b9746 108
47cefa47 109static void initialize_dependency_output PARAMS ((cpp_reader *));
d2e850c1 110static void initialize_standard_includes PARAMS ((cpp_reader *));
dfa5c7fa 111static void new_pending_directive PARAMS ((struct cpp_pending *,
d73269b6 112 const char *,
113 cl_directive_handler));
bcc40c63 114#ifdef HOST_EBCDIC
115static int opt_comp PARAMS ((const void *, const void *));
116#endif
117static int parse_option PARAMS ((const char *));
6d71dc85 118
d2e850c1 119/* Fourth argument to append_include_chain: chain to use */
9fa36617 120enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
6d71dc85 121
b3954366 122/* If we have designated initializers (GCC >2.7) these tables can be
123 initialized, constant data. Otherwise, they have to be filled in at
e057cf7c 124 runtime. */
b3954366 125#if HAVE_DESIGNATED_INITIALIZERS
5ba37007 126
4f98874d 127#define init_IStable() /* nothing */
b3954366 128#define ISTABLE __extension__ const U_CHAR _cpp_IStable[UCHAR_MAX + 1] = {
129
130#define init_trigraph_map() /* nothing */
131#define TRIGRAPH_MAP \
132__extension__ const U_CHAR _cpp_trigraph_map[UCHAR_MAX + 1] = {
133
5ba37007 134#define END };
4f98874d 135#define s(p, v) [p] = v,
b3954366 136
5ba37007 137#else
b3954366 138
139#define ISTABLE unsigned char _cpp_IStable[UCHAR_MAX + 1] = { 0 }; \
4f98874d 140 static void init_IStable PARAMS ((void)) { \
dfb7e57f 141 unsigned char *x = _cpp_IStable;
b3954366 142
143#define TRIGRAPH_MAP U_CHAR _cpp_trigraph_map[UCHAR_MAX + 1] = { 0 }; \
144 static void init_trigraph_map PARAMS ((void)) { \
145 unsigned char *x = _cpp_trigraph_map;
146
2ff3ad1d 147#define END }
4f98874d 148#define s(p, v) x[p] = v;
b3954366 149
5ba37007 150#endif
6d71dc85 151
5ba37007 152#define A(x) s(x, ISidnum|ISidstart)
153#define N(x) s(x, ISidnum|ISnumstart)
154#define H(x) s(x, IShspace|ISspace)
78719282 155#define V(x) s(x, ISvspace|ISspace)
5ba37007 156#define S(x) s(x, ISspace)
6d71dc85 157
4f98874d 158ISTABLE
5ba37007 159 A('_')
6d71dc85 160
5ba37007 161 A('a') A('b') A('c') A('d') A('e') A('f') A('g') A('h') A('i')
162 A('j') A('k') A('l') A('m') A('n') A('o') A('p') A('q') A('r')
163 A('s') A('t') A('u') A('v') A('w') A('x') A('y') A('z')
6d71dc85 164
5ba37007 165 A('A') A('B') A('C') A('D') A('E') A('F') A('G') A('H') A('I')
166 A('J') A('K') A('L') A('M') A('N') A('O') A('P') A('Q') A('R')
167 A('S') A('T') A('U') A('V') A('W') A('X') A('Y') A('Z')
6d71dc85 168
5ba37007 169 N('1') N('2') N('3') N('4') N('5') N('6') N('7') N('8') N('9') N('0')
a852e3b1 170
78719282 171 H(' ') H('\t')
6d71dc85 172
78719282 173 V('\n') V('\r')
174
175 S('\0') S('\v') S('\f')
5ba37007 176END
177
b3954366 178TRIGRAPH_MAP
179 s('=', '#') s(')', ']') s('!', '|')
180 s('(', '[') s('\'', '^') s('>', '}')
181 s('/', '\\') s('<', '{') s('-', '~')
182END
183
5ba37007 184#undef A
185#undef N
186#undef H
78719282 187#undef V
5ba37007 188#undef S
5ba37007 189#undef s
4f98874d 190#undef ISTABLE
191#undef END
b3954366 192#undef TRIGRAPH_MAP
6d71dc85 193
194/* Given a colon-separated list of file names PATH,
195 add all the names to the search path for include files. */
196
197static void
466b3f58 198path_include (pfile, list, path)
6d71dc85 199 cpp_reader *pfile;
9fa36617 200 char *list;
201 int path;
6d71dc85 202{
9fa36617 203 char *p, *q, *name;
6d71dc85 204
9fa36617 205 p = list;
6d71dc85 206
9fa36617 207 do
208 {
6d71dc85 209 /* Find the end of this name. */
9fa36617 210 q = p;
6d71dc85 211 while (*q != 0 && *q != PATH_SEPARATOR) q++;
9fa36617 212 if (q == p)
213 {
214 /* An empty name in the path stands for the current directory. */
215 name = (char *) xmalloc (2);
216 name[0] = '.';
217 name[1] = 0;
218 }
219 else
220 {
221 /* Otherwise use the directory that is named. */
222 name = (char *) xmalloc (q - p + 1);
223 memcpy (name, p, q - p);
224 name[q - p] = 0;
225 }
6d71dc85 226
466b3f58 227 append_include_chain (pfile, name, path, 0);
6d71dc85 228
229 /* Advance past this name. */
9fa36617 230 if (*q == 0)
6d71dc85 231 break;
9fa36617 232 p = q + 1;
233 }
234 while (1);
235}
236
9fa36617 237/* Append DIR to include path PATH. DIR must be permanently allocated
238 and writable. */
239static void
466b3f58 240append_include_chain (pfile, dir, path, cxx_aware)
9fa36617 241 cpp_reader *pfile;
9fa36617 242 char *dir;
243 int path;
d2e850c1 244 int cxx_aware;
9fa36617 245{
466b3f58 246 struct cpp_pending *pend = CPP_OPTION (pfile, pending);
9fa36617 247 struct file_name_list *new;
248 struct stat st;
249 unsigned int len;
250
94221a92 251 _cpp_simplify_pathname (dir);
9fa36617 252 if (stat (dir, &st))
253 {
254 /* Dirs that don't exist are silently ignored. */
255 if (errno != ENOENT)
9e87fa80 256 cpp_notice_from_errno (pfile, dir);
2ff3ad1d 257 else if (CPP_OPTION (pfile, verbose))
f80e83a9 258 fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"), dir);
9fa36617 259 return;
260 }
261
262 if (!S_ISDIR (st.st_mode))
263 {
9e87fa80 264 cpp_notice (pfile, "%s: Not a directory", dir);
9fa36617 265 return;
266 }
267
268 len = strlen (dir);
269 if (len > pfile->max_include_len)
270 pfile->max_include_len = len;
2ff3ad1d 271
8d7a2585 272 new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
9fa36617 273 new->name = dir;
274 new->nlen = len;
275 new->ino = st.st_ino;
276 new->dev = st.st_dev;
d2e850c1 277 if (path == SYSTEM)
278 new->sysp = cxx_aware ? 1 : 2;
279 else
280 new->sysp = 0;
9fa36617 281 new->name_map = NULL;
48f3f15c 282 new->next = NULL;
283 new->alloc = NULL;
9fa36617 284
285 switch (path)
286 {
287 case QUOTE: APPEND (pend, quote, new); break;
288 case BRACKET: APPEND (pend, brack, new); break;
289 case SYSTEM: APPEND (pend, systm, new); break;
290 case AFTER: APPEND (pend, after, new); break;
6d71dc85 291 }
292}
293
d1ad3794 294/* Handle a duplicated include path. PREV is the link in the chain
295 before the duplicate. The duplicate is removed from the chain and
296 freed. Returns PREV. */
297struct file_name_list *
298remove_dup_dir (pfile, prev)
299 cpp_reader *pfile;
300 struct file_name_list *prev;
301{
302 struct file_name_list *cur = prev->next;
303
304 if (CPP_OPTION (pfile, verbose))
305 fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), cur->name);
306
307 prev->next = cur->next;
308 free (cur->name);
309 free (cur);
310
311 return prev;
312}
313
314/* Remove duplicate directories from a chain. Returns the tail of the
315 chain, or NULL if the chain is empty. This algorithm is quadratic
316 in the number of -I switches, which is acceptable since there
317 aren't usually that many of them. */
318struct file_name_list *
319remove_dup_dirs (pfile, head)
320 cpp_reader *pfile;
321 struct file_name_list *head;
322{
323 struct file_name_list *prev = NULL, *cur, *other;
324
325 for (cur = head; cur; cur = cur->next)
326 {
327 for (other = head; other != cur; other = other->next)
328 if (INO_T_EQ (cur->ino, other->ino) && cur->dev == other->dev)
329 {
330 cur = remove_dup_dir (pfile, prev);
331 break;
332 }
333 prev = cur;
334 }
335
336 return prev;
337}
338
1e8b9746 339/* Merge the four include chains together in the order quote, bracket,
340 system, after. Remove duplicate dirs (as determined by
341 INO_T_EQ()). The system_include and after_include chains are never
342 referred to again after this function; all access is through the
343 bracket_include path.
344
345 For the future: Check if the directory is empty (but
346 how?) and possibly preload the include hash. */
347
348static void
2ff3ad1d 349merge_include_chains (pfile)
350 cpp_reader *pfile;
1e8b9746 351{
d1ad3794 352 struct file_name_list *quote, *brack, *systm, *qtail;
1e8b9746 353
2ff3ad1d 354 struct cpp_pending *pend = CPP_OPTION (pfile, pending);
1e8b9746 355
2ff3ad1d 356 quote = pend->quote_head;
357 brack = pend->brack_head;
358 systm = pend->systm_head;
d1ad3794 359 qtail = pend->quote_tail;
1e8b9746 360
d1ad3794 361 /* Paste together bracket, system, and after include chains. */
362 if (systm)
363 pend->systm_tail->next = pend->after_head;
1e8b9746 364 else
d1ad3794 365 systm = pend->after_head;
366
367 if (brack)
368 pend->brack_tail->next = systm;
1e8b9746 369 else
370 brack = systm;
371
d1ad3794 372 /* This is a bit tricky. First we drop dupes from the quote-include
373 list. Then we drop dupes from the bracket-include list.
374 Finally, if qtail and brack are the same directory, we cut out
375 brack.
1e8b9746 376
377 We can't just merge the lists and then uniquify them because
378 then we may lose directories from the <> search path that should
379 be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
380 safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
d1ad3794 381 -Ibar -I- -Ifoo -Iquux. */
1e8b9746 382
d1ad3794 383 remove_dup_dirs (pfile, brack);
384 qtail = remove_dup_dirs (pfile, quote);
1e8b9746 385
386 if (quote)
387 {
d1ad3794 388 qtail->next = brack;
389
390 /* If brack == qtail, remove brack as it's simpler. */
1e8b9746 391 if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
d1ad3794 392 brack = remove_dup_dir (pfile, qtail);
1e8b9746 393 }
394 else
395 quote = brack;
396
2ff3ad1d 397 CPP_OPTION (pfile, quote_include) = quote;
398 CPP_OPTION (pfile, bracket_include) = brack;
1e8b9746 399}
400
bad6bf53 401/* cpp_init initializes library global state. It might not need to do
402 anything depending on the platform and compiler, so we have a static
403 flag to make sure it gets called before cpp_reader_init. */
404
405static int cpp_init_completed = 0;
406
a622c29d 407void
6f579599 408cpp_init ()
a622c29d 409{
410#ifdef HOST_EBCDIC
bad6bf53 411 /* For non-ASCII hosts, the cl_options array needs to be sorted at
412 runtime. */
a622c29d 413 qsort (cl_options, N_OPTS, sizeof (struct cl_option), opt_comp);
414#endif
415
bad6bf53 416 /* Set up the trigraph map and the IStable. These don't need to do
417 anything if we were compiled with a compiler that supports C99
418 designated initializers. */
b3954366 419 init_trigraph_map ();
a622c29d 420 init_IStable ();
bad6bf53 421
422 cpp_init_completed = 1;
a622c29d 423}
9fa36617 424
6d71dc85 425/* Initialize a cpp_reader structure. */
426void
427cpp_reader_init (pfile)
428 cpp_reader *pfile;
429{
79bd622b 430 struct spec_nodes *s;
431
8d7a2585 432 memset ((char *) pfile, 0, sizeof (cpp_reader));
6d71dc85 433
79bd622b 434 /* If cpp_init hasn't been called, generate a fatal error (by hand)
435 and call it here. */
436 if (!cpp_init_completed)
437 {
438 fputs ("cpp_reader_init: internal error: cpp_init not called.\n", stderr);
439 pfile->errors = CPP_FATAL_LIMIT;
440 cpp_init ();
441 }
442
2ff3ad1d 443 CPP_OPTION (pfile, dollars_in_ident) = 1;
444 CPP_OPTION (pfile, cplusplus_comments) = 1;
445 CPP_OPTION (pfile, warn_import) = 1;
f80e83a9 446 CPP_OPTION (pfile, warn_paste) = 1;
27fdc0b6 447 CPP_OPTION (pfile, digraphs) = 1;
2ff3ad1d 448 CPP_OPTION (pfile, discard_comments) = 1;
449 CPP_OPTION (pfile, show_column) = 1;
3b304865 450 CPP_OPTION (pfile, tabstop) = 8;
2ff3ad1d 451
452 CPP_OPTION (pfile, pending) =
453 (struct cpp_pending *) xcalloc (1, sizeof (struct cpp_pending));
454
79bd622b 455 /* Initialize comment saving state. */
456 pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments);
457
458 /* Indicate date and time not yet calculated. */
459 pfile->date.type = CPP_EOF;
460
461 /* Initialise the base context. */
462 pfile->context = &pfile->base_context;
463 pfile->base_context.macro = 0;
464 pfile->base_context.prev = pfile->base_context.next = 0;
465
466 /* Identifier pool initially 8K. Unaligned, permanent pool. */
467 _cpp_init_pool (&pfile->ident_pool, 8 * 1024, 1, 0);
468
469 /* String and number pool initially 4K. Unaligned, temporary pool. */
470 _cpp_init_pool (&pfile->temp_string_pool, 4 * 1024, 1, 1);
471
472 /* Argument pool initially 8K. Aligned, temporary pool. */
473 _cpp_init_pool (&pfile->argument_pool, 8 * 1024, 0, 1);
474
475 /* Macro pool initially 8K. Aligned, permanent pool. */
476 _cpp_init_pool (&pfile->macro_pool, 8 * 1024, 0, 0);
bad6bf53 477
79bd622b 478 /* Start with temporary pool. */
479 pfile->string_pool = &pfile->temp_string_pool;
480
481 _cpp_init_hashtable (pfile);
76faa4c0 482 _cpp_init_stacks (pfile);
f51c2148 483 _cpp_init_includes (pfile);
6cae2504 484 _cpp_init_internal_pragmas (pfile);
6d71dc85 485
79bd622b 486 /* Initialize the special nodes. */
487 s = &pfile->spec_nodes;
488 s->n_L = cpp_lookup (pfile, DSC("L"));
489 s->n_defined = cpp_lookup (pfile, DSC("defined"));
396ffa86 490 s->n__Pragma = cpp_lookup (pfile, DSC("_Pragma"));
79bd622b 491 s->n__STRICT_ANSI__ = cpp_lookup (pfile, DSC("__STRICT_ANSI__"));
492 s->n__CHAR_UNSIGNED__ = cpp_lookup (pfile, DSC("__CHAR_UNSIGNED__"));
493 s->n__VA_ARGS__ = cpp_lookup (pfile, DSC("__VA_ARGS__"));
494 s->n__VA_ARGS__->flags |= NODE_DIAGNOSTIC;
e2f9a79f 495}
496
6d71dc85 497/* Free resources used by PFILE.
498 This is the cpp_reader 'finalizer' or 'destructor' (in C++ terminology). */
499void
500cpp_cleanup (pfile)
501 cpp_reader *pfile;
502{
79bd622b 503 struct file_name_list *dir, *dirn;
504 cpp_context *context, *contextn;
11d10d3f 505
5b201908 506 while (CPP_BUFFER (pfile) != NULL)
6d71dc85 507 cpp_pop_buffer (pfile);
508
79bd622b 509 if (pfile->macro_buffer)
510 free ((PTR) pfile->macro_buffer);
511
62adb1fe 512 if (pfile->deps)
513 deps_free (pfile->deps);
514
76faa4c0 515 _cpp_cleanup_includes (pfile);
f51c2148 516 _cpp_cleanup_stacks (pfile);
79bd622b 517 _cpp_cleanup_hashtable (pfile);
518
519 _cpp_free_lookaheads (pfile);
11d10d3f 520
79bd622b 521 _cpp_free_pool (&pfile->ident_pool);
522 _cpp_free_pool (&pfile->temp_string_pool);
523 _cpp_free_pool (&pfile->macro_pool);
524 _cpp_free_pool (&pfile->argument_pool);
525
526 for (dir = CPP_OPTION (pfile, quote_include); dir; dir = dirn)
11d10d3f 527 {
79bd622b 528 dirn = dir->next;
11d10d3f 529 free (dir->name);
530 free (dir);
531 }
79bd622b 532
533 for (context = pfile->base_context.next; context; context = contextn)
534 {
535 contextn = context->next;
536 free (context);
537 }
6d71dc85 538}
539
540
79bd622b 541/* This structure defines one built-in identifier. A node will be
542 entered in the hash table under the name NAME, with value VALUE (if
543 any). If flags has OPERATOR, the node's operator field is used; if
544 flags has BUILTIN the node's builtin field is used.
31674461 545
546 Two values are not compile time constants, so we tag
f80e83a9 547 them in the FLAGS field instead:
1e67c2e8 548 VERS value is the global version_string, quoted
549 ULP value is the global user_label_prefix
31674461 550
79bd622b 551 Also, macros with CPLUS set in the flags field are entered only for C++. */
5ba37007 552
553struct builtin
554{
e057cf7c 555 const U_CHAR *name;
f80e83a9 556 const char *value;
79bd622b 557 unsigned char builtin;
558 unsigned char operator;
5ba37007 559 unsigned short flags;
79bd622b 560 unsigned short len;
5ba37007 561};
79bd622b 562#define VERS 0x01
563#define ULP 0x02
564#define CPLUS 0x04
565#define BUILTIN 0x08
566#define OPERATOR 0x10
567
568#define B(n, t) { U n, 0, t, 0, BUILTIN, sizeof n - 1 }
569#define C(n, v) { U n, v, 0, 0, 0, sizeof n - 1 }
570#define X(n, f) { U n, 0, 0, 0, f, sizeof n - 1 }
571#define O(n, c, f) { U n, 0, 0, c, OPERATOR | f, sizeof n - 1 }
5ba37007 572static const struct builtin builtin_array[] =
6d71dc85 573{
79bd622b 574 B("__TIME__", BT_TIME),
575 B("__DATE__", BT_DATE),
576 B("__FILE__", BT_FILE),
577 B("__BASE_FILE__", BT_BASE_FILE),
578 B("__LINE__", BT_SPECLINE),
579 B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL),
580 B("__STDC__", BT_STDC),
e057cf7c 581
f80e83a9 582 X("__VERSION__", VERS),
583 X("__USER_LABEL_PREFIX__", ULP),
e057cf7c 584 C("__REGISTER_PREFIX__", REGISTER_PREFIX),
585 C("__HAVE_BUILTIN_SETJMP__", "1"),
6d71dc85 586#ifndef NO_BUILTIN_SIZE_TYPE
e057cf7c 587 C("__SIZE_TYPE__", SIZE_TYPE),
6d71dc85 588#endif
589#ifndef NO_BUILTIN_PTRDIFF_TYPE
e057cf7c 590 C("__PTRDIFF_TYPE__", PTRDIFF_TYPE),
6d71dc85 591#endif
7347d500 592#ifndef NO_BUILTIN_WCHAR_TYPE
e057cf7c 593 C("__WCHAR_TYPE__", WCHAR_TYPE),
7347d500 594#endif
1d3cade7 595#ifndef NO_BUILTIN_WINT_TYPE
596 C("__WINT_TYPE__", WINT_TYPE),
597#endif
31674461 598
599 /* Named operators known to the preprocessor. These cannot be #defined
600 and always have their stated meaning. They are treated like normal
79bd622b 601 identifiers except for the type code and the meaning. Most of them
31674461 602 are only for C++ (but see iso646.h). */
31674461 603 O("and", CPP_AND_AND, CPLUS),
604 O("and_eq", CPP_AND_EQ, CPLUS),
605 O("bitand", CPP_AND, CPLUS),
606 O("bitor", CPP_OR, CPLUS),
607 O("compl", CPP_COMPL, CPLUS),
608 O("not", CPP_NOT, CPLUS),
609 O("not_eq", CPP_NOT_EQ, CPLUS),
610 O("or", CPP_OR_OR, CPLUS),
611 O("or_eq", CPP_OR_EQ, CPLUS),
612 O("xor", CPP_XOR, CPLUS),
79bd622b 613 O("xor_eq", CPP_XOR_EQ, CPLUS)
5ba37007 614};
e057cf7c 615#undef B
616#undef C
617#undef X
1e67c2e8 618#define builtin_array_end \
619 builtin_array + sizeof(builtin_array)/sizeof(struct builtin)
5ba37007 620
621/* Subroutine of cpp_start_read; reads the builtins table above and
622 enters the macros into the hash table. */
5ba37007 623static void
624initialize_builtins (pfile)
625 cpp_reader *pfile;
626{
5ba37007 627 const struct builtin *b;
4e464091 628
1e67c2e8 629 for(b = builtin_array; b < builtin_array_end; b++)
6d71dc85 630 {
79bd622b 631 if ((b->flags & CPLUS) && ! CPP_OPTION (pfile, cplusplus))
31674461 632 continue;
633
79bd622b 634 if (b->flags & (OPERATOR | BUILTIN))
635 {
636 cpp_hashnode *hp = cpp_lookup (pfile, b->name, b->len);
637 if (b->flags & OPERATOR)
638 {
639 hp->flags |= NODE_OPERATOR;
640 hp->value.operator = b->operator;
641 }
642 else
643 {
644 hp->type = NT_MACRO;
645 hp->flags |= NODE_BUILTIN;
646 hp->value.builtin = b->builtin;
647 }
648 }
649 else /* A standard macro of some kind. */
1e67c2e8 650 {
f80e83a9 651 const char *val;
652 char *str;
653
654 if (b->flags & VERS)
655 {
a336277c 656 /* Allocate enough space for 'name "value"\n\0'. */
657 str = alloca (b->len + strlen (version_string) + 5);
658 sprintf (str, "%s \"%s\"\n", b->name, version_string);
f80e83a9 659 }
660 else
661 {
662 if (b->flags & ULP)
4e464091 663 val = CPP_OPTION (pfile, user_label_prefix);
f80e83a9 664 else
665 val = b->value;
666
a336277c 667 /* Allocate enough space for "name value\n\0". */
668 str = alloca (b->len + strlen (val) + 3);
669 sprintf(str, "%s %s\n", b->name, val);
f80e83a9 670 }
a622c29d 671
a336277c 672 _cpp_define_builtin (pfile, str);
1e67c2e8 673 }
6d71dc85 674 }
675}
79bd622b 676#undef BUILTIN
677#undef OPERATOR
608a2132 678#undef VERS
5ba37007 679#undef ULP
79bd622b 680#undef CPLUS
f80e83a9 681#undef builtin_array_end
6d71dc85 682
9fa36617 683/* Another subroutine of cpp_start_read. This one sets up to do
684 dependency-file output. */
685static void
686initialize_dependency_output (pfile)
687 cpp_reader *pfile;
688{
9fa36617 689 char *spec, *s, *output_file;
2ff3ad1d 690
9fa36617 691 /* Either of two environment variables can specify output of deps.
692 Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
693 where OUTPUT_FILE is the file to write deps info to
694 and DEPS_TARGET is the target to mention in the deps. */
695
2ff3ad1d 696 if (CPP_OPTION (pfile, print_deps) == 0)
9fa36617 697 {
698 spec = getenv ("DEPENDENCIES_OUTPUT");
699 if (spec)
2ff3ad1d 700 CPP_OPTION (pfile, print_deps) = 1;
9fa36617 701 else
702 {
703 spec = getenv ("SUNPRO_DEPENDENCIES");
704 if (spec)
2ff3ad1d 705 CPP_OPTION (pfile, print_deps) = 2;
9fa36617 706 else
707 return;
708 }
709
710 /* Find the space before the DEPS_TARGET, if there is one. */
711 s = strchr (spec, ' ');
712 if (s)
713 {
2ff3ad1d 714 CPP_OPTION (pfile, deps_target) = s + 1;
9fa36617 715 output_file = (char *) xmalloc (s - spec + 1);
716 memcpy (output_file, spec, s - spec);
717 output_file[s - spec] = 0;
718 }
719 else
720 {
2ff3ad1d 721 CPP_OPTION (pfile, deps_target) = 0;
9fa36617 722 output_file = spec;
723 }
724
2ff3ad1d 725 CPP_OPTION (pfile, deps_file) = output_file;
726 CPP_OPTION (pfile, print_deps_append) = 1;
9fa36617 727 }
728
62adb1fe 729 pfile->deps = deps_init ();
9fa36617 730
62adb1fe 731 /* Print the expected object file name as the target of this Make-rule. */
2ff3ad1d 732 if (CPP_OPTION (pfile, deps_target))
733 deps_add_target (pfile->deps, CPP_OPTION (pfile, deps_target));
734 else if (*CPP_OPTION (pfile, in_fname) == 0)
62adb1fe 735 deps_add_target (pfile->deps, "-");
9fa36617 736 else
2ff3ad1d 737 deps_calc_target (pfile->deps, CPP_OPTION (pfile, in_fname));
9fa36617 738
2ff3ad1d 739 if (CPP_OPTION (pfile, in_fname))
740 deps_add_dep (pfile->deps, CPP_OPTION (pfile, in_fname));
9fa36617 741}
742
d2e850c1 743/* And another subroutine. This one sets up the standard include path. */
744static void
745initialize_standard_includes (pfile)
746 cpp_reader *pfile;
747{
d2e850c1 748 char *path;
4f98874d 749 const struct default_include *p;
2ff3ad1d 750 const char *specd_prefix = CPP_OPTION (pfile, include_prefix);
d2e850c1 751
752 /* Several environment variables may add to the include search path.
753 CPATH specifies an additional list of directories to be searched
754 as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
755 etc. specify an additional list of directories to be searched as
756 if specified with -isystem, for the language indicated. */
757
758 GET_ENV_PATH_LIST (path, "CPATH");
759 if (path != 0 && *path != 0)
466b3f58 760 path_include (pfile, path, BRACKET);
d2e850c1 761
2ff3ad1d 762 switch ((CPP_OPTION (pfile, objc) << 1) + CPP_OPTION (pfile, cplusplus))
d2e850c1 763 {
764 case 0:
765 GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
766 break;
767 case 1:
768 GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
769 break;
770 case 2:
771 GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
772 break;
773 case 3:
774 GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
775 break;
776 }
777 if (path != 0 && *path != 0)
466b3f58 778 path_include (pfile, path, SYSTEM);
d2e850c1 779
780 /* Search "translated" versions of GNU directories.
781 These have /usr/local/lib/gcc... replaced by specd_prefix. */
472679ed 782 if (specd_prefix != 0 && cpp_GCC_INCLUDE_DIR_len)
d2e850c1 783 {
d2e850c1 784 /* Remove the `include' from /usr/local/lib/gcc.../include.
785 GCC_INCLUDE_DIR will always end in /include. */
472679ed 786 int default_len = cpp_GCC_INCLUDE_DIR_len;
787 char *default_prefix = (char *) alloca (default_len + 1);
d2e850c1 788 int specd_len = strlen (specd_prefix);
789
472679ed 790 memcpy (default_prefix, cpp_GCC_INCLUDE_DIR, default_len);
d2e850c1 791 default_prefix[default_len] = '\0';
792
472679ed 793 for (p = cpp_include_defaults; p->fname; p++)
d2e850c1 794 {
795 /* Some standard dirs are only for C++. */
796 if (!p->cplusplus
2ff3ad1d 797 || (CPP_OPTION (pfile, cplusplus)
798 && !CPP_OPTION (pfile, no_standard_cplusplus_includes)))
d2e850c1 799 {
800 /* Does this dir start with the prefix? */
b3954366 801 if (!memcmp (p->fname, default_prefix, default_len))
d2e850c1 802 {
803 /* Yes; change prefix and add to search list. */
804 int flen = strlen (p->fname);
805 int this_len = specd_len + flen - default_len;
806 char *str = (char *) xmalloc (this_len + 1);
807 memcpy (str, specd_prefix, specd_len);
808 memcpy (str + specd_len,
809 p->fname + default_len,
810 flen - default_len + 1);
811
466b3f58 812 append_include_chain (pfile, str, SYSTEM, p->cxx_aware);
d2e850c1 813 }
814 }
815 }
816 }
817
818 /* Search ordinary names for GNU include directories. */
472679ed 819 for (p = cpp_include_defaults; p->fname; p++)
d2e850c1 820 {
821 /* Some standard dirs are only for C++. */
822 if (!p->cplusplus
2ff3ad1d 823 || (CPP_OPTION (pfile, cplusplus)
824 && !CPP_OPTION (pfile, no_standard_cplusplus_includes)))
d2e850c1 825 {
826 /* XXX Potential memory leak! */
827 char *str = xstrdup (update_path (p->fname, p->component));
466b3f58 828 append_include_chain (pfile, str, SYSTEM, p->cxx_aware);
d2e850c1 829 }
830 }
831}
832
6d71dc85 833/* This is called after options have been processed.
834 * Check options for consistency, and setup for processing input
835 * from the file named FNAME. (Use standard input if FNAME==NULL.)
836 * Return 1 on success, 0 on failure.
837 */
838
839int
79bd622b 840cpp_start_read (pfile, fname)
6d71dc85 841 cpp_reader *pfile;
8d7a2585 842 const char *fname;
6d71dc85 843{
9fa36617 844 struct pending_option *p, *q;
6d71dc85 845
9fa36617 846 /* -MG doesn't select the form of output and must be specified with one of
847 -M or -MM. -MG doesn't make sense with -MD or -MMD since they don't
848 inhibit compilation. */
2ff3ad1d 849 if (CPP_OPTION (pfile, print_deps_missing_files)
850 && (CPP_OPTION (pfile, print_deps) == 0
851 || !CPP_OPTION (pfile, no_output)))
9fa36617 852 {
853 cpp_fatal (pfile, "-MG must be specified with one of -M or -MM");
854 return 0;
855 }
6d71dc85 856
b93c7be0 857 /* -Wtraditional is not useful in C++ mode. */
858 if (CPP_OPTION (pfile, cplusplus))
859 CPP_OPTION (pfile, warn_traditional) = 0;
860
e0a859f1 861 /* Do not warn about invalid token pasting if -lang-asm. */
241e762e 862 if (CPP_OPTION (pfile, lang_asm))
f80e83a9 863 CPP_OPTION (pfile, warn_paste) = 0;
864
9fa36617 865 /* Set this if it hasn't been set already. */
4e464091 866 if (CPP_OPTION (pfile, user_label_prefix) == NULL)
867 CPP_OPTION (pfile, user_label_prefix) = USER_LABEL_PREFIX;
d2e850c1 868
d2e850c1 869 /* Set up the include search path now. */
2ff3ad1d 870 if (! CPP_OPTION (pfile, no_standard_includes))
d2e850c1 871 initialize_standard_includes (pfile);
872
2ff3ad1d 873 merge_include_chains (pfile);
d2e850c1 874
875 /* With -v, print the list of dirs to search. */
2ff3ad1d 876 if (CPP_OPTION (pfile, verbose))
d2e850c1 877 {
878 struct file_name_list *l;
879 fprintf (stderr, _("#include \"...\" search starts here:\n"));
2ff3ad1d 880 for (l = CPP_OPTION (pfile, quote_include); l; l = l->next)
d2e850c1 881 {
2ff3ad1d 882 if (l == CPP_OPTION (pfile, bracket_include))
d2e850c1 883 fprintf (stderr, _("#include <...> search starts here:\n"));
884 fprintf (stderr, " %s\n", l->name);
885 }
886 fprintf (stderr, _("End of search list.\n"));
887 }
888
008de5f9 889 /* Open the main input file. This must be done early, so we have a
890 buffer to stand on. */
2ff3ad1d 891 if (CPP_OPTION (pfile, in_fname) == NULL
892 || *CPP_OPTION (pfile, in_fname) == 0)
6d71dc85 893 {
2ff3ad1d 894 CPP_OPTION (pfile, in_fname) = fname;
895 if (CPP_OPTION (pfile, in_fname) == NULL)
896 CPP_OPTION (pfile, in_fname) = "";
6d71dc85 897 }
2ff3ad1d 898 if (CPP_OPTION (pfile, out_fname) == NULL)
899 CPP_OPTION (pfile, out_fname) = "";
6d71dc85 900
d2e850c1 901 if (!cpp_read_file (pfile, fname))
902 return 0;
903
008de5f9 904 initialize_dependency_output (pfile);
2ff3ad1d 905
d2e850c1 906 /* Install __LINE__, etc. */
6d71dc85 907 initialize_builtins (pfile);
908
6d71dc85 909 /* Do -U's, -D's and -A's in the order they were seen. */
2ff3ad1d 910 p = CPP_OPTION (pfile, pending)->directive_head;
9fa36617 911 while (p)
6d71dc85 912 {
864b8294 913 (*p->handler) (pfile, p->arg);
9fa36617 914 q = p->next;
915 free (p);
916 p = q;
6d71dc85 917 }
2ff3ad1d 918 pfile->done_initializing = 1;
f80e83a9 919
6d71dc85 920 /* The -imacros files can be scanned now, but the -include files
921 have to be pushed onto the include stack and processed later,
9fa36617 922 in the main loop calling cpp_get_token. */
2ff3ad1d 923
2ff3ad1d 924 p = CPP_OPTION (pfile, pending)->imacros_head;
9fa36617 925 while (p)
6d71dc85 926 {
d2e850c1 927 if (cpp_read_file (pfile, p->arg))
e2f9a79f 928 cpp_scan_buffer_nooutput (pfile);
9fa36617 929 q = p->next;
930 free (p);
931 p = q;
6d71dc85 932 }
9fa36617 933
2ff3ad1d 934 p = CPP_OPTION (pfile, pending)->include_head;
9fa36617 935 while (p)
6d71dc85 936 {
6cae2504 937 cpp_read_file (pfile, p->arg);
9fa36617 938 q = p->next;
939 free (p);
940 p = q;
6d71dc85 941 }
6d71dc85 942
2ff3ad1d 943 free (CPP_OPTION (pfile, pending));
944 CPP_OPTION (pfile, pending) = NULL;
6d71dc85 945
946 return 1;
947}
948
949/* This is called at the end of preprocessing. It pops the
950 last buffer and writes dependency output. It should also
951 clear macro definitions, such that you could call cpp_start_read
952 with a new filename to restart processing. */
953void
79bd622b 954cpp_finish (pfile)
6d71dc85 955 cpp_reader *pfile;
956{
e2f9a79f 957 if (CPP_BUFFER (pfile))
958 {
959 cpp_ice (pfile, "buffers still stacked in cpp_finish");
960 while (CPP_BUFFER (pfile))
961 cpp_pop_buffer (pfile);
962 }
9e87fa80 963
62adb1fe 964 /* Don't write the deps file if preprocessing has failed. */
2ff3ad1d 965 if (CPP_OPTION (pfile, print_deps) && pfile->errors == 0)
6d71dc85 966 {
967 /* Stream on which to print the dependency information. */
9e87fa80 968 FILE *deps_stream = 0;
2ff3ad1d 969 const char *deps_mode
970 = CPP_OPTION (pfile, print_deps_append) ? "a" : "w";
971 if (CPP_OPTION (pfile, deps_file) == 0)
62adb1fe 972 deps_stream = stdout;
2ff3ad1d 973 else
974 {
975 deps_stream = fopen (CPP_OPTION (pfile, deps_file), deps_mode);
976 if (deps_stream == 0)
977 cpp_notice_from_errno (pfile, CPP_OPTION (pfile, deps_file));
978 }
62adb1fe 979 if (deps_stream)
980 {
981 deps_write (pfile->deps, deps_stream, 72);
2ff3ad1d 982 if (CPP_OPTION (pfile, deps_file))
6d71dc85 983 {
62adb1fe 984 if (ferror (deps_stream) || fclose (deps_stream) != 0)
985 cpp_fatal (pfile, "I/O error on output");
6d71dc85 986 }
987 }
988 }
d453a374 989
34627970 990 /* Report on headers that could use multiple include guards. */
991 if (CPP_OPTION (pfile, print_include_names))
f51c2148 992 _cpp_report_missing_guards (pfile);
6d71dc85 993}
994
dd48bf24 995static void
2ff3ad1d 996new_pending_directive (pend, text, handler)
997 struct cpp_pending *pend;
dd48bf24 998 const char *text;
d73269b6 999 cl_directive_handler handler;
dd48bf24 1000{
1001 struct pending_option *o = (struct pending_option *)
1002 xmalloc (sizeof (struct pending_option));
1003
8d7a2585 1004 o->arg = text;
dd48bf24 1005 o->next = NULL;
d73269b6 1006 o->handler = handler;
2ff3ad1d 1007 APPEND (pend, directive, o);
dd48bf24 1008}
1009
2ff3ad1d 1010/* Irix6 "cc -n32" and OSF4 cc have problems with char foo[] = ("string");
1011 I.e. a const string initializer with parens around it. That is
1012 what N_("string") resolves to, so we make no_* be macros instead. */
1013#define no_arg N_("Argument missing after %s")
1014#define no_ass N_("Assertion missing after %s")
1015#define no_dir N_("Directory name missing after %s")
1016#define no_fil N_("File name missing after %s")
1017#define no_mac N_("Macro name missing after %s")
1018#define no_pth N_("Path name missing after %s")
3b304865 1019#define no_num N_("Number missing after %s")
2ff3ad1d 1020
1021/* This is the list of all command line options, with the leading
1022 "-" removed. It must be sorted in ASCII collating order. */
1023#define COMMAND_LINE_OPTIONS \
1024 DEF_OPT("", 0, OPT_stdin_stdout) \
1025 DEF_OPT("$", 0, OPT_dollar) \
1026 DEF_OPT("+", 0, OPT_plus) \
1027 DEF_OPT("-help", 0, OPT__help) \
1028 DEF_OPT("-version", 0, OPT__version) \
1029 DEF_OPT("A", no_ass, OPT_A) \
1030 DEF_OPT("C", 0, OPT_C) \
1031 DEF_OPT("D", no_mac, OPT_D) \
1032 DEF_OPT("H", 0, OPT_H) \
1033 DEF_OPT("I", no_dir, OPT_I) \
1034 DEF_OPT("M", 0, OPT_M) \
1035 DEF_OPT("MD", no_fil, OPT_MD) \
1036 DEF_OPT("MG", 0, OPT_MG) \
1037 DEF_OPT("MM", 0, OPT_MM) \
1038 DEF_OPT("MMD", no_fil, OPT_MMD) \
1039 DEF_OPT("P", 0, OPT_P) \
1040 DEF_OPT("U", no_mac, OPT_U) \
1041 DEF_OPT("W", no_arg, OPT_W) /* arg optional */ \
1042 DEF_OPT("d", no_arg, OPT_d) \
1043 DEF_OPT("fleading-underscore", 0, OPT_fleading_underscore) \
1044 DEF_OPT("fno-leading-underscore", 0, OPT_fno_leading_underscore) \
1045 DEF_OPT("fno-preprocessed", 0, OPT_fno_preprocessed) \
1046 DEF_OPT("fno-show-column", 0, OPT_fno_show_column) \
1047 DEF_OPT("fpreprocessed", 0, OPT_fpreprocessed) \
1048 DEF_OPT("fshow-column", 0, OPT_fshow_column) \
3b304865 1049 DEF_OPT("ftabstop=", no_num, OPT_ftabstop) \
2ff3ad1d 1050 DEF_OPT("g", no_arg, OPT_g) /* arg optional */ \
1051 DEF_OPT("h", 0, OPT_h) \
1052 DEF_OPT("idirafter", no_dir, OPT_idirafter) \
1053 DEF_OPT("imacros", no_fil, OPT_imacros) \
1054 DEF_OPT("include", no_fil, OPT_include) \
1055 DEF_OPT("iprefix", no_pth, OPT_iprefix) \
1056 DEF_OPT("isystem", no_dir, OPT_isystem) \
1057 DEF_OPT("iwithprefix", no_dir, OPT_iwithprefix) \
1058 DEF_OPT("iwithprefixbefore", no_dir, OPT_iwithprefixbefore) \
1059 DEF_OPT("lang-asm", 0, OPT_lang_asm) \
1060 DEF_OPT("lang-c", 0, OPT_lang_c) \
1061 DEF_OPT("lang-c++", 0, OPT_lang_cplusplus) \
1062 DEF_OPT("lang-c89", 0, OPT_lang_c89) \
2ff3ad1d 1063 DEF_OPT("lang-objc", 0, OPT_lang_objc) \
1064 DEF_OPT("lang-objc++", 0, OPT_lang_objcplusplus) \
1065 DEF_OPT("nostdinc", 0, OPT_nostdinc) \
1066 DEF_OPT("nostdinc++", 0, OPT_nostdincplusplus) \
1067 DEF_OPT("o", no_fil, OPT_o) \
1068 DEF_OPT("pedantic", 0, OPT_pedantic) \
1069 DEF_OPT("pedantic-errors", 0, OPT_pedantic_errors) \
1070 DEF_OPT("remap", 0, OPT_remap) \
1071 DEF_OPT("std=c89", 0, OPT_std_c89) \
1072 DEF_OPT("std=c99", 0, OPT_std_c99) \
1073 DEF_OPT("std=c9x", 0, OPT_std_c9x) \
1074 DEF_OPT("std=gnu89", 0, OPT_std_gnu89) \
1075 DEF_OPT("std=gnu99", 0, OPT_std_gnu99) \
1076 DEF_OPT("std=gnu9x", 0, OPT_std_gnu9x) \
1077 DEF_OPT("std=iso9899:1990", 0, OPT_std_iso9899_1990) \
1078 DEF_OPT("std=iso9899:199409", 0, OPT_std_iso9899_199409) \
1079 DEF_OPT("std=iso9899:1999", 0, OPT_std_iso9899_1999) \
1080 DEF_OPT("std=iso9899:199x", 0, OPT_std_iso9899_199x) \
2ff3ad1d 1081 DEF_OPT("trigraphs", 0, OPT_trigraphs) \
1082 DEF_OPT("v", 0, OPT_v) \
1083 DEF_OPT("w", 0, OPT_w)
1084
1085#define DEF_OPT(text, msg, code) code,
bcc40c63 1086enum opt_code
1087{
2ff3ad1d 1088 COMMAND_LINE_OPTIONS
bcc40c63 1089 N_OPTS
1090};
2ff3ad1d 1091#undef DEF_OPT
bcc40c63 1092
1093struct cl_option
1094{
1095 const char *opt_text;
1096 const char *msg;
1097 size_t opt_len;
1098 enum opt_code opt_code;
1099};
1100
2ff3ad1d 1101#define DEF_OPT(text, msg, code) { text, msg, sizeof(text) - 1, code },
bcc40c63 1102#ifdef HOST_EBCDIC
1103static struct cl_option cl_options[] =
1104#else
1105static const struct cl_option cl_options[] =
1106#endif
1107{
2ff3ad1d 1108 COMMAND_LINE_OPTIONS
bcc40c63 1109};
1110#undef DEF_OPT
2ff3ad1d 1111#undef COMMAND_LINE_OPTIONS
bcc40c63 1112
1113/* Perform a binary search to find which, if any, option the given
1114 command-line matches. Returns its index in the option array,
1115 negative on failure. Complications arise since some options can be
1116 suffixed with an argument, and multiple complete matches can occur,
1117 e.g. -iwithprefix and -iwithprefixbefore. Moreover, we want to
1118 accept options beginning with -g and -W that we do not recognise,
1119 but not to swallow any subsequent command line argument; these are
1120 handled as special cases in cpp_handle_option */
1121static int
1122parse_option (input)
1123 const char *input;
1124{
1125 unsigned int md, mn, mx;
1126 size_t opt_len;
1127 int comp;
1128
1129 mn = 0;
1130 mx = N_OPTS;
1131
1132 while (mx > mn)
1133 {
1134 md = (mn + mx) / 2;
2ff3ad1d 1135
bcc40c63 1136 opt_len = cl_options[md].opt_len;
b3954366 1137 comp = memcmp (input, cl_options[md].opt_text, opt_len);
2ff3ad1d 1138
bcc40c63 1139 if (comp > 0)
1140 mn = md + 1;
1141 else if (comp < 0)
1142 mx = md;
1143 else
1144 {
1145 if (input[opt_len] == '\0')
1146 return md;
1147 /* We were passed more text. If the option takes an argument,
1148 we may match a later option or we may have been passed the
1149 argument. The longest possible option match succeeds.
1150 If the option takes no arguments we have not matched and
1151 continue the search (e.g. input="stdc++" match was "stdc") */
1152 mn = md + 1;
1153 if (cl_options[md].msg)
1154 {
1155 /* Scan forwards. If we get an exact match, return it.
1156 Otherwise, return the longest option-accepting match.
1157 This loops no more than twice with current options */
1158 mx = md;
1159 for (; mn < N_OPTS; mn++)
1160 {
1161 opt_len = cl_options[mn].opt_len;
b3954366 1162 if (memcmp (input, cl_options[mn].opt_text, opt_len))
bcc40c63 1163 break;
1164 if (input[opt_len] == '\0')
1165 return mn;
1166 if (cl_options[mn].msg)
1167 mx = mn;
1168 }
1169 return mx;
1170 }
1171 }
1172 }
1173
1174 return -1;
1175}
1176
6d71dc85 1177/* Handle one command-line option in (argc, argv).
1178 Can be called multiple times, to handle multiple sets of options.
1179 Returns number of strings consumed. */
29768226 1180
dfa5c7fa 1181int
1182cpp_handle_option (pfile, argc, argv)
6d71dc85 1183 cpp_reader *pfile;
1184 int argc;
1185 char **argv;
1186{
6d71dc85 1187 int i = 0;
c4abf88d 1188 struct cpp_pending *pend = CPP_OPTION (pfile, pending);
6d71dc85 1189
9fa36617 1190 if (argv[i][0] != '-')
1191 {
2ff3ad1d 1192 if (CPP_OPTION (pfile, out_fname) != NULL)
1193 cpp_fatal (pfile, "Too many arguments. Type %s --help for usage info",
1194 progname);
1195 else if (CPP_OPTION (pfile, in_fname) != NULL)
1196 CPP_OPTION (pfile, out_fname) = argv[i];
9fa36617 1197 else
2ff3ad1d 1198 CPP_OPTION (pfile, in_fname) = argv[i];
9fa36617 1199 }
1200 else
bcc40c63 1201 {
1202 enum opt_code opt_code;
1203 int opt_index;
8d7a2585 1204 const char *arg = 0;
bcc40c63 1205
1206 /* Skip over '-' */
1207 opt_index = parse_option (&argv[i][1]);
1208 if (opt_index < 0)
1209 return i;
1210
1211 opt_code = cl_options[opt_index].opt_code;
1212 if (cl_options[opt_index].msg)
1213 {
1214 arg = &argv[i][cl_options[opt_index].opt_len + 1];
1215
1216 /* Yuk. Special case for -g and -W as they must not swallow
1217 up any following argument. If this becomes common, add
1218 another field to the cl_options table */
1219 if (arg[0] == '\0' && !(opt_code == OPT_g || opt_code == OPT_W))
1220 {
1221 arg = argv[++i];
1222 if (!arg)
1223 {
780662e7 1224 cpp_fatal (pfile, cl_options[opt_index].msg, argv[i - 1]);
bcc40c63 1225 return argc;
1226 }
1227 }
1228 }
2ff3ad1d 1229
bcc40c63 1230 switch (opt_code)
1231 {
1232 case N_OPTS: /* shut GCC up */
1233 break;
1234 case OPT_fleading_underscore:
4e464091 1235 CPP_OPTION (pfile, user_label_prefix) = "_";
bcc40c63 1236 break;
1237 case OPT_fno_leading_underscore:
4e464091 1238 CPP_OPTION (pfile, user_label_prefix) = "";
bcc40c63 1239 break;
1240 case OPT_fpreprocessed:
2ff3ad1d 1241 CPP_OPTION (pfile, preprocessed) = 1;
bcc40c63 1242 break;
1243 case OPT_fno_preprocessed:
2ff3ad1d 1244 CPP_OPTION (pfile, preprocessed) = 0;
1245 break;
1246 case OPT_fshow_column:
1247 CPP_OPTION (pfile, show_column) = 1;
1248 break;
1249 case OPT_fno_show_column:
1250 CPP_OPTION (pfile, show_column) = 0;
bcc40c63 1251 break;
3b304865 1252 case OPT_ftabstop:
1253 /* Silently ignore empty string, non-longs and silly values. */
1254 if (arg[0] != '\0')
1255 {
1256 char *endptr;
1257 long tabstop = strtol (arg, &endptr, 10);
1258 if (*endptr == '\0' && tabstop >= 1 && tabstop <= 100)
1259 CPP_OPTION (pfile, tabstop) = tabstop;
1260 }
1261 break;
bcc40c63 1262 case OPT_w:
2ff3ad1d 1263 CPP_OPTION (pfile, inhibit_warnings) = 1;
bcc40c63 1264 break;
1265 case OPT_g: /* Silently ignore anything but -g3 */
1266 if (!strcmp(&argv[i][2], "3"))
2ff3ad1d 1267 CPP_OPTION (pfile, debug_output) = 1;
bcc40c63 1268 break;
1269 case OPT_h:
1270 case OPT__help:
1271 print_help ();
1272 exit (0); /* XXX */
1273 break;
1274 case OPT__version:
1275 fprintf (stderr, _("GNU CPP version %s (cpplib)\n"), version_string);
1276 exit (0); /* XXX */
1277 break;
1278 case OPT_C:
2ff3ad1d 1279 CPP_OPTION (pfile, discard_comments) = 0;
bcc40c63 1280 break;
1281 case OPT_P:
2ff3ad1d 1282 CPP_OPTION (pfile, no_line_commands) = 1;
bcc40c63 1283 break;
1284 case OPT_dollar: /* Don't include $ in identifiers. */
2ff3ad1d 1285 CPP_OPTION (pfile, dollars_in_ident) = 0;
bcc40c63 1286 break;
1287 case OPT_H:
2ff3ad1d 1288 CPP_OPTION (pfile, print_include_names) = 1;
bcc40c63 1289 break;
1290 case OPT_D:
c4abf88d 1291 new_pending_directive (pend, arg, cpp_define);
bcc40c63 1292 break;
1293 case OPT_pedantic_errors:
2ff3ad1d 1294 CPP_OPTION (pfile, pedantic_errors) = 1;
bcc40c63 1295 /* fall through */
1296 case OPT_pedantic:
2ff3ad1d 1297 CPP_OPTION (pfile, pedantic) = 1;
bcc40c63 1298 break;
bcc40c63 1299 case OPT_trigraphs:
2ff3ad1d 1300 CPP_OPTION (pfile, trigraphs) = 1;
bcc40c63 1301 break;
1302 case OPT_plus:
2ff3ad1d 1303 CPP_OPTION (pfile, cplusplus) = 1;
1304 CPP_OPTION (pfile, cplusplus_comments) = 1;
bcc40c63 1305 break;
1306 case OPT_remap:
2ff3ad1d 1307 CPP_OPTION (pfile, remap) = 1;
bcc40c63 1308 break;
1309 case OPT_iprefix:
2ff3ad1d 1310 CPP_OPTION (pfile, include_prefix) = arg;
1311 CPP_OPTION (pfile, include_prefix_len) = strlen (arg);
bcc40c63 1312 break;
1313 case OPT_lang_c:
2ff3ad1d 1314 CPP_OPTION (pfile, cplusplus) = 0;
1315 CPP_OPTION (pfile, cplusplus_comments) = 1;
1316 CPP_OPTION (pfile, c89) = 0;
1317 CPP_OPTION (pfile, c99) = 1;
27fdc0b6 1318 CPP_OPTION (pfile, digraphs) = 1;
2ff3ad1d 1319 CPP_OPTION (pfile, objc) = 0;
bcc40c63 1320 break;
bcc40c63 1321 case OPT_lang_cplusplus:
2ff3ad1d 1322 CPP_OPTION (pfile, cplusplus) = 1;
1323 CPP_OPTION (pfile, cplusplus_comments) = 1;
1324 CPP_OPTION (pfile, c89) = 0;
1325 CPP_OPTION (pfile, c99) = 0;
1326 CPP_OPTION (pfile, objc) = 0;
27fdc0b6 1327 CPP_OPTION (pfile, digraphs) = 1;
c4abf88d 1328 new_pending_directive (pend, "__cplusplus", cpp_define);
bcc40c63 1329 break;
bcc40c63 1330 case OPT_lang_objcplusplus:
c4abf88d 1331 CPP_OPTION (pfile, cplusplus) = 1;
1332 new_pending_directive (pend, "__cplusplus", cpp_define);
1333 /* fall through */
1334 case OPT_lang_objc:
2ff3ad1d 1335 CPP_OPTION (pfile, cplusplus_comments) = 1;
1336 CPP_OPTION (pfile, c89) = 0;
1337 CPP_OPTION (pfile, c99) = 0;
1338 CPP_OPTION (pfile, objc) = 1;
c4abf88d 1339 new_pending_directive (pend, "__OBJC__", cpp_define);
bcc40c63 1340 break;
1341 case OPT_lang_asm:
2ff3ad1d 1342 CPP_OPTION (pfile, lang_asm) = 1;
c4abf88d 1343 CPP_OPTION (pfile, dollars_in_ident) = 0;
1344 new_pending_directive (pend, "__ASSEMBLER__", cpp_define);
bcc40c63 1345 break;
bcc40c63 1346 case OPT_nostdinc:
1347 /* -nostdinc causes no default include directories.
1348 You must specify all include-file directories with -I. */
2ff3ad1d 1349 CPP_OPTION (pfile, no_standard_includes) = 1;
bcc40c63 1350 break;
1351 case OPT_nostdincplusplus:
1352 /* -nostdinc++ causes no default C++-specific include directories. */
2ff3ad1d 1353 CPP_OPTION (pfile, no_standard_cplusplus_includes) = 1;
bcc40c63 1354 break;
1355 case OPT_std_gnu89:
2ff3ad1d 1356 CPP_OPTION (pfile, cplusplus) = 0;
1357 CPP_OPTION (pfile, cplusplus_comments) = 1;
1358 CPP_OPTION (pfile, c89) = 1;
1359 CPP_OPTION (pfile, c99) = 0;
1360 CPP_OPTION (pfile, objc) = 0;
27fdc0b6 1361 CPP_OPTION (pfile, digraphs) = 1;
bcc40c63 1362 break;
1363 case OPT_std_gnu9x:
1364 case OPT_std_gnu99:
2ff3ad1d 1365 CPP_OPTION (pfile, cplusplus) = 0;
1366 CPP_OPTION (pfile, cplusplus_comments) = 1;
1367 CPP_OPTION (pfile, c89) = 0;
1368 CPP_OPTION (pfile, c99) = 1;
27fdc0b6 1369 CPP_OPTION (pfile, digraphs) = 1;
2ff3ad1d 1370 CPP_OPTION (pfile, objc) = 0;
466b3f58 1371 new_pending_directive (pend, "__STDC_VERSION__=199901L", cpp_define);
bcc40c63 1372 break;
1373 case OPT_std_iso9899_199409:
466b3f58 1374 new_pending_directive (pend, "__STDC_VERSION__=199409L", cpp_define);
bcc40c63 1375 /* Fall through */
1376 case OPT_std_iso9899_1990:
1377 case OPT_std_c89:
27fdc0b6 1378 case OPT_lang_c89:
2ff3ad1d 1379 CPP_OPTION (pfile, cplusplus) = 0;
1380 CPP_OPTION (pfile, cplusplus_comments) = 0;
1381 CPP_OPTION (pfile, c89) = 1;
1382 CPP_OPTION (pfile, c99) = 0;
1383 CPP_OPTION (pfile, objc) = 0;
27fdc0b6 1384 CPP_OPTION (pfile, digraphs) = opt_code == OPT_std_iso9899_199409;
2ff3ad1d 1385 CPP_OPTION (pfile, trigraphs) = 1;
27fdc0b6 1386 new_pending_directive (pend, "__STRICT_ANSI__", cpp_define);
bcc40c63 1387 break;
1388 case OPT_std_iso9899_199x:
1389 case OPT_std_iso9899_1999:
1390 case OPT_std_c9x:
1391 case OPT_std_c99:
2ff3ad1d 1392 CPP_OPTION (pfile, cplusplus) = 0;
1393 CPP_OPTION (pfile, cplusplus_comments) = 1;
1394 CPP_OPTION (pfile, c89) = 0;
1395 CPP_OPTION (pfile, c99) = 1;
1396 CPP_OPTION (pfile, objc) = 0;
27fdc0b6 1397 CPP_OPTION (pfile, digraphs) = 1;
2ff3ad1d 1398 CPP_OPTION (pfile, trigraphs) = 1;
466b3f58 1399 new_pending_directive (pend, "__STRICT_ANSI__", cpp_define);
1400 new_pending_directive (pend, "__STDC_VERSION__=199901L", cpp_define);
bcc40c63 1401 break;
1402 case OPT_o:
2ff3ad1d 1403 if (CPP_OPTION (pfile, out_fname) != NULL)
9fa36617 1404 {
bcc40c63 1405 cpp_fatal (pfile, "Output filename specified twice");
1406 return argc;
1407 }
2ff3ad1d 1408 CPP_OPTION (pfile, out_fname) = arg;
1409 if (!strcmp (CPP_OPTION (pfile, out_fname), "-"))
1410 CPP_OPTION (pfile, out_fname) = "";
bcc40c63 1411 break;
1412 case OPT_v:
63e1abce 1413 fprintf (stderr, _("GNU CPP version %s (cpplib)"), version_string);
bcc40c63 1414#ifdef TARGET_VERSION
1415 TARGET_VERSION;
1416#endif
1417 fputc ('\n', stderr);
2ff3ad1d 1418 CPP_OPTION (pfile, verbose) = 1;
bcc40c63 1419 break;
1420 case OPT_stdin_stdout:
1421 /* JF handle '-' as file name meaning stdin or stdout */
2ff3ad1d 1422 if (CPP_OPTION (pfile, in_fname) == NULL)
1423 CPP_OPTION (pfile, in_fname) = "";
1424 else if (CPP_OPTION (pfile, out_fname) == NULL)
1425 CPP_OPTION (pfile, out_fname) = "";
bcc40c63 1426 break;
1427 case OPT_d:
1428 /* Args to -d specify what parts of macros to dump.
1429 Silently ignore unrecognised options; they may
1430 be aimed at the compiler proper. */
1431 {
1432 char c;
2ff3ad1d 1433
bcc40c63 1434 while ((c = *arg++) != '\0')
1435 switch (c)
1436 {
1437 case 'M':
2ff3ad1d 1438 CPP_OPTION (pfile, dump_macros) = dump_only;
1439 CPP_OPTION (pfile, no_output) = 1;
9fa36617 1440 break;
1441 case 'N':
2ff3ad1d 1442 CPP_OPTION (pfile, dump_macros) = dump_names;
9fa36617 1443 break;
1444 case 'D':
2ff3ad1d 1445 CPP_OPTION (pfile, dump_macros) = dump_definitions;
9fa36617 1446 break;
1447 case 'I':
2ff3ad1d 1448 CPP_OPTION (pfile, dump_includes) = 1;
9fa36617 1449 break;
1450 }
bcc40c63 1451 }
1452 break;
1453 /* The style of the choices here is a bit mixed.
1454 The chosen scheme is a hybrid of keeping all options in one string
1455 and specifying each option in a separate argument:
1456 -M|-MM|-MD file|-MMD file [-MG]. An alternative is:
1457 -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
1458 -M[M][G][D file]. This is awkward to handle in specs, and is not
1459 as extensible. */
1460 /* ??? -MG must be specified in addition to one of -M or -MM.
1461 This can be relaxed in the future without breaking anything.
1462 The converse isn't true. */
2ff3ad1d 1463
bcc40c63 1464 /* -MG isn't valid with -MD or -MMD. This is checked for later. */
1465 case OPT_MG:
2ff3ad1d 1466 CPP_OPTION (pfile, print_deps_missing_files) = 1;
bcc40c63 1467 break;
1468 case OPT_M:
1469 case OPT_MD:
1470 case OPT_MM:
1471 case OPT_MMD:
1472 if (opt_code == OPT_M || opt_code == OPT_MD)
2ff3ad1d 1473 CPP_OPTION (pfile, print_deps) = 2;
bcc40c63 1474 else
2ff3ad1d 1475 CPP_OPTION (pfile, print_deps) = 1;
bcc40c63 1476
1477 /* For -MD and -MMD options, write deps on file named by next arg */
1478 /* For -M and -MM, write deps on standard output
1479 and suppress the usual output. */
1480 if (opt_code == OPT_MD || opt_code == OPT_MMD)
2ff3ad1d 1481 CPP_OPTION (pfile, deps_file) = arg;
bcc40c63 1482 else
2ff3ad1d 1483 CPP_OPTION (pfile, no_output) = 1;
bcc40c63 1484 break;
1485 case OPT_A:
77ee202d 1486 if (arg[0] == '-')
9fa36617 1487 {
77ee202d 1488 /* -A with an argument beginning with '-' acts as
1489 #unassert on whatever immediately follows the '-'.
1490 If "-" is the whole argument, we eliminate all
1491 predefined macros and assertions, including those
1492 that were specified earlier on the command line.
1493 That way we can get rid of any that were passed
1494 automatically in from GCC. */
1495
1496 if (arg[1] == '\0')
9fa36617 1497 {
77ee202d 1498 struct pending_option *o1, *o2;
1499
466b3f58 1500 o1 = pend->directive_head;
77ee202d 1501 while (o1)
1502 {
1503 o2 = o1->next;
1504 free (o1);
1505 o1 = o2;
1506 }
466b3f58 1507 pend->directive_head = NULL;
1508 pend->directive_tail = NULL;
9fa36617 1509 }
77ee202d 1510 else
466b3f58 1511 new_pending_directive (pend, arg + 1, cpp_unassert);
6d71dc85 1512 }
77ee202d 1513 else
466b3f58 1514 new_pending_directive (pend, arg, cpp_assert);
bcc40c63 1515 break;
1516 case OPT_U:
466b3f58 1517 new_pending_directive (pend, arg, cpp_undef);
bcc40c63 1518 break;
1519 case OPT_I: /* Add directory to path for includes. */
1520 if (!strcmp (arg, "-"))
1521 {
1522 /* -I- means:
1523 Use the preceding -I directories for #include "..."
1524 but not #include <...>.
1525 Don't search the directory of the present file
1526 for #include "...". (Note that -I. -I- is not the same as
1527 the default setup; -I. uses the compiler's working dir.) */
2ff3ad1d 1528 if (! CPP_OPTION (pfile, ignore_srcdir))
bcc40c63 1529 {
2ff3ad1d 1530 pend->quote_head = pend->brack_head;
1531 pend->quote_tail = pend->brack_tail;
1532 pend->brack_head = 0;
1533 pend->brack_tail = 0;
1534 CPP_OPTION (pfile, ignore_srcdir) = 1;
bcc40c63 1535 }
1536 else
1537 {
1538 cpp_fatal (pfile, "-I- specified twice");
1539 return argc;
1540 }
1541 }
1542 else
466b3f58 1543 append_include_chain (pfile, xstrdup (arg), BRACKET, 0);
bcc40c63 1544 break;
1545 case OPT_isystem:
1546 /* Add directory to beginning of system include path, as a system
1547 include directory. */
466b3f58 1548 append_include_chain (pfile, xstrdup (arg), SYSTEM, 0);
bcc40c63 1549 break;
1550 case OPT_include:
1551 {
1552 struct pending_option *o = (struct pending_option *)
1553 xmalloc (sizeof (struct pending_option));
1554 o->arg = arg;
1555
1556 /* This list has to be built in reverse order so that
1557 when cpp_start_read pushes all the -include files onto
1558 the buffer stack, they will be scanned in forward order. */
466b3f58 1559 o->next = pend->include_head;
1560 pend->include_head = o;
bcc40c63 1561 }
1562 break;
1563 case OPT_imacros:
1564 {
1565 struct pending_option *o = (struct pending_option *)
1566 xmalloc (sizeof (struct pending_option));
1567 o->arg = arg;
1568 o->next = NULL;
2ff3ad1d 1569
466b3f58 1570 APPEND (pend, imacros, o);
bcc40c63 1571 }
1572 break;
1573 case OPT_iwithprefix:
1574 /* Add directory to end of path for includes,
1575 with the default prefix at the front of its name. */
1576 /* fall through */
1577 case OPT_iwithprefixbefore:
1578 /* Add directory to main path for includes,
1579 with the default prefix at the front of its name. */
1580 {
1581 char *fname;
1582 int len;
2ff3ad1d 1583
bcc40c63 1584 len = strlen (arg);
2ff3ad1d 1585
1586 if (CPP_OPTION (pfile, include_prefix) != 0)
bcc40c63 1587 {
2ff3ad1d 1588 size_t ipl = CPP_OPTION (pfile, include_prefix_len);
1589 fname = xmalloc (ipl + len + 1);
1590 memcpy (fname, CPP_OPTION (pfile, include_prefix), ipl);
1591 memcpy (fname + ipl, arg, len + 1);
bcc40c63 1592 }
472679ed 1593 else if (cpp_GCC_INCLUDE_DIR_len)
bcc40c63 1594 {
472679ed 1595 fname = xmalloc (cpp_GCC_INCLUDE_DIR_len + len + 1);
1596 memcpy (fname, cpp_GCC_INCLUDE_DIR, cpp_GCC_INCLUDE_DIR_len);
1597 memcpy (fname + cpp_GCC_INCLUDE_DIR_len, arg, len + 1);
bcc40c63 1598 }
472679ed 1599 else
1600 fname = xstrdup (arg);
2ff3ad1d 1601
466b3f58 1602 append_include_chain (pfile, fname,
bcc40c63 1603 opt_code == OPT_iwithprefix ? SYSTEM: BRACKET, 0);
1604 }
1605 break;
1606 case OPT_idirafter:
1607 /* Add directory to end of path for includes. */
466b3f58 1608 append_include_chain (pfile, xstrdup (arg), AFTER, 0);
bcc40c63 1609 break;
1610 case OPT_W:
1611 /* Silently ignore unrecognised options */
1612 if (!strcmp (argv[i], "-Wall"))
9fa36617 1613 {
2ff3ad1d 1614 CPP_OPTION (pfile, warn_trigraphs) = 1;
1615 CPP_OPTION (pfile, warn_comments) = 1;
9fa36617 1616 }
bcc40c63 1617 else if (!strcmp (argv[i], "-Wtraditional"))
ef33b55c 1618 CPP_OPTION (pfile, warn_traditional) = 1;
bcc40c63 1619 else if (!strcmp (argv[i], "-Wtrigraphs"))
2ff3ad1d 1620 CPP_OPTION (pfile, warn_trigraphs) = 1;
bcc40c63 1621 else if (!strcmp (argv[i], "-Wcomment"))
2ff3ad1d 1622 CPP_OPTION (pfile, warn_comments) = 1;
bcc40c63 1623 else if (!strcmp (argv[i], "-Wcomments"))
2ff3ad1d 1624 CPP_OPTION (pfile, warn_comments) = 1;
bcc40c63 1625 else if (!strcmp (argv[i], "-Wundef"))
2ff3ad1d 1626 CPP_OPTION (pfile, warn_undef) = 1;
bcc40c63 1627 else if (!strcmp (argv[i], "-Wimport"))
2ff3ad1d 1628 CPP_OPTION (pfile, warn_import) = 1;
f80e83a9 1629 else if (!strcmp (argv[i], "-Wpaste"))
1630 CPP_OPTION (pfile, warn_paste) = 1;
bcc40c63 1631 else if (!strcmp (argv[i], "-Werror"))
2ff3ad1d 1632 CPP_OPTION (pfile, warnings_are_errors) = 1;
02c09dab 1633 else if (!strcmp (argv[i], "-Wsystem-headers"))
1634 CPP_OPTION (pfile, warn_system_headers) = 1;
bcc40c63 1635 else if (!strcmp (argv[i], "-Wno-traditional"))
ef33b55c 1636 CPP_OPTION (pfile, warn_traditional) = 0;
bcc40c63 1637 else if (!strcmp (argv[i], "-Wno-trigraphs"))
2ff3ad1d 1638 CPP_OPTION (pfile, warn_trigraphs) = 0;
bcc40c63 1639 else if (!strcmp (argv[i], "-Wno-comment"))
2ff3ad1d 1640 CPP_OPTION (pfile, warn_comments) = 0;
bcc40c63 1641 else if (!strcmp (argv[i], "-Wno-comments"))
2ff3ad1d 1642 CPP_OPTION (pfile, warn_comments) = 0;
bcc40c63 1643 else if (!strcmp (argv[i], "-Wno-undef"))
2ff3ad1d 1644 CPP_OPTION (pfile, warn_undef) = 0;
bcc40c63 1645 else if (!strcmp (argv[i], "-Wno-import"))
2ff3ad1d 1646 CPP_OPTION (pfile, warn_import) = 0;
f80e83a9 1647 else if (!strcmp (argv[i], "-Wno-paste"))
1648 CPP_OPTION (pfile, warn_paste) = 0;
bcc40c63 1649 else if (!strcmp (argv[i], "-Wno-error"))
2ff3ad1d 1650 CPP_OPTION (pfile, warnings_are_errors) = 0;
02c09dab 1651 else if (!strcmp (argv[i], "-Wno-system-headers"))
1652 CPP_OPTION (pfile, warn_system_headers) = 0;
bcc40c63 1653 break;
1654 }
1655 }
6d71dc85 1656 return i + 1;
bcc40c63 1657}
9fa36617 1658
bcc40c63 1659#ifdef HOST_EBCDIC
1660static int
1661opt_comp (const void *p1, const void *p2)
1662{
1663 return strcmp (((struct cl_option *)p1)->opt_text,
1664 ((struct cl_option *)p2)->opt_text);
6d71dc85 1665}
bcc40c63 1666#endif
6d71dc85 1667
1668/* Handle command-line options in (argc, argv).
1669 Can be called multiple times, to handle multiple sets of options.
1670 Returns if an unrecognized option is seen.
1671 Returns number of strings consumed. */
6d71dc85 1672int
1673cpp_handle_options (pfile, argc, argv)
1674 cpp_reader *pfile;
1675 int argc;
1676 char **argv;
1677{
1678 int i;
1679 int strings_processed;
bcc40c63 1680
6d71dc85 1681 for (i = 0; i < argc; i += strings_processed)
1682 {
dfa5c7fa 1683 strings_processed = cpp_handle_option (pfile, argc - i, argv + i);
6d71dc85 1684 if (strings_processed == 0)
1685 break;
1686 }
1687 return i;
1688}
1689
1690static void
1691print_help ()
1692{
9e87fa80 1693 fprintf (stderr, _("Usage: %s [switches] input output\n"), progname);
6219c3ed 1694 /* To keep the lines from getting too long for some compilers, limit
1695 to about 500 characters (6 lines) per chunk. */
6d71dc85 1696 fputs (_("\
1697Switches:\n\
1698 -include <file> Include the contents of <file> before other files\n\
1699 -imacros <file> Accept definition of macros in <file>\n\
1700 -iprefix <path> Specify <path> as a prefix for next two options\n\
1701 -iwithprefix <dir> Add <dir> to the end of the system include path\n\
1702 -iwithprefixbefore <dir> Add <dir> to the end of the main include path\n\
1703 -isystem <dir> Add <dir> to the start of the system include path\n\
6219c3ed 1704"), stdout);
1705 fputs (_("\
6d71dc85 1706 -idirafter <dir> Add <dir> to the end of the system include path\n\
1707 -I <dir> Add <dir> to the end of the main include path\n\
bcc40c63 1708 -I- Fine-grained include path control; see info docs\n\
6d71dc85 1709 -nostdinc Do not search system include directories\n\
1710 (dirs specified with -isystem will still be used)\n\
1711 -nostdinc++ Do not search system include directories for C++\n\
1712 -o <file> Put output into <file>\n\
6219c3ed 1713"), stdout);
1714 fputs (_("\
f80e83a9 1715 -pedantic Issue all warnings demanded by strict ISO C\n\
bcc40c63 1716 -pedantic-errors Issue -pedantic warnings as errors instead\n\
f80e83a9 1717 -trigraphs Support ISO C trigraphs\n\
6d71dc85 1718 -lang-c Assume that the input sources are in C\n\
1719 -lang-c89 Assume that the input sources are in C89\n\
6219c3ed 1720"), stdout);
1721 fputs (_("\
241e762e 1722 -lang-c++ Assume that the input sources are in C++\n\
6d71dc85 1723 -lang-objc Assume that the input sources are in ObjectiveC\n\
1724 -lang-objc++ Assume that the input sources are in ObjectiveC++\n\
1725 -lang-asm Assume that the input sources are in assembler\n\
6219c3ed 1726"), stdout);
1727 fputs (_("\
6d71dc85 1728 -std=<std name> Specify the conformance standard; one of:\n\
4960a83f 1729 gnu89, gnu99, c89, c99, iso9899:1990,\n\
1730 iso9899:199409, iso9899:1999\n\
6d71dc85 1731 -+ Allow parsing of C++ style features\n\
1732 -w Inhibit warning messages\n\
1733 -Wtrigraphs Warn if trigraphs are encountered\n\
1734 -Wno-trigraphs Do not warn about trigraphs\n\
1735 -Wcomment{s} Warn if one comment starts inside another\n\
6219c3ed 1736"), stdout);
1737 fputs (_("\
6d71dc85 1738 -Wno-comment{s} Do not warn about comments\n\
241e762e 1739 -Wtraditional Warn about features not present in traditional C\n\
1740 -Wno-traditional Do not warn about traditional C\n\
6d71dc85 1741 -Wundef Warn if an undefined macro is used by #if\n\
1742 -Wno-undef Do not warn about testing undefined macros\n\
1743 -Wimport Warn about the use of the #import directive\n\
6219c3ed 1744"), stdout);
1745 fputs (_("\
6d71dc85 1746 -Wno-import Do not warn about the use of #import\n\
1747 -Werror Treat all warnings as errors\n\
1748 -Wno-error Do not treat warnings as errors\n\
02c09dab 1749 -Wsystem-headers Do not suppress warnings from system headers\n\
1750 -Wno-system-headers Suppress warnings from system headers\n\
6d71dc85 1751 -Wall Enable all preprocessor warnings\n\
6219c3ed 1752"), stdout);
1753 fputs (_("\
02c09dab 1754 -M Generate make dependencies\n\
1755 -MM As -M, but ignore system header files\n\
6d71dc85 1756 -MD As -M, but put output in a .d file\n\
1757 -MMD As -MD, but ignore system header files\n\
1758 -MG Treat missing header file as generated files\n\
bcc40c63 1759 -g3 Include #define and #undef directives in the output\n\
6219c3ed 1760"), stdout);
1761 fputs (_("\
02c09dab 1762 -D<macro> Define a <macro> with string '1' as its value\n\
1763 -D<macro>=<val> Define a <macro> with <val> as its value\n\
6d71dc85 1764 -A<question> (<answer>) Assert the <answer> to <question>\n\
77ee202d 1765 -A-<question> (<answer>) Disable the <answer> to <question>\n\
6d71dc85 1766 -U<macro> Undefine <macro> \n\
6d71dc85 1767 -v Display the version number\n\
6219c3ed 1768"), stdout);
1769 fputs (_("\
02c09dab 1770 -H Print the name of header files as they are used\n\
1771 -C Do not discard comments\n\
6d71dc85 1772 -dM Display a list of macro definitions active at end\n\
1773 -dD Preserve macro definitions in output\n\
1774 -dN As -dD except that only the names are preserved\n\
1775 -dI Include #include directives in the output\n\
02c09dab 1776"), stdout);
1777 fputs (_("\
3b304865 1778 -ftabstop=<number> Distance between tab stops for column reporting\n\
6d71dc85 1779 -P Do not generate #line directives\n\
1780 -$ Do not allow '$' in identifiers\n\
1781 -remap Remap file names when including files.\n\
bcc40c63 1782 --version Display version information\n\
6d71dc85 1783 -h or --help Display this information\n\
1784"), stdout);
1785}