OSDN Git Service

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