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