Annotation of gcc/cpplib.c, revision 1.1.1.1

1.1       root        1: /* CPP Library.
                      2:    Copyright (C) 1986, 87, 89, 92, 93, 94, 1995 Free Software Foundation, Inc.
                      3:    Written by Per Bothner, 1994-95.
                      4:    Based on CCCP program by by Paul Rubin, June 1986
                      5:    Adapted to ANSI C, Richard Stallman, Jan 1987
                      6: 
                      7: This program is free software; you can redistribute it and/or modify it
                      8: under the terms of the GNU General Public License as published by the
                      9: Free Software Foundation; either version 2, or (at your option) any
                     10: later version.
                     11: 
                     12: This program is distributed in the hope that it will be useful,
                     13: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: GNU General Public License for more details.
                     16: 
                     17: You should have received a copy of the GNU General Public License
                     18: along with this program; if not, write to the Free Software
                     19: Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                     20: 
                     21:  In other words, you are welcome to use, share and improve this program.
                     22:  You are forbidden to forbid anyone else to use, share and improve
                     23:  what you give them.   Help stamp out software-hoarding!  */
                     24: 
                     25: #ifdef EMACS
                     26: #define NO_SHORTNAMES
                     27: #include "../src/config.h"
                     28: #ifdef open
                     29: #undef open
                     30: #undef read
                     31: #undef write
                     32: #endif /* open */
                     33: #endif /* EMACS */
                     34: 
                     35: /* The macro EMACS is defined when cpp is distributed as part of Emacs,
                     36:    for the sake of machines with limited C compilers.  */
                     37: #ifndef EMACS
                     38: #include "config.h"
                     39: #endif /* not EMACS */
                     40: 
                     41: #ifndef STANDARD_INCLUDE_DIR
                     42: #define STANDARD_INCLUDE_DIR "/usr/include"
                     43: #endif
                     44: 
                     45: #ifndef LOCAL_INCLUDE_DIR
                     46: #define LOCAL_INCLUDE_DIR "/usr/local/include"
                     47: #endif
                     48: 
                     49: #if 0 /* We can't get ptrdiff_t, so I arranged not to need PTR_INT_TYPE.  */
                     50: #ifdef __STDC__
                     51: #define PTR_INT_TYPE ptrdiff_t
                     52: #else
                     53: #define PTR_INT_TYPE long
                     54: #endif
                     55: #endif /* 0 */
                     56: 
                     57: #include "cpplib.h"
                     58: #include "cpphash.h"
                     59: 
                     60: #ifndef STDC_VALUE
                     61: #define STDC_VALUE 1
                     62: #endif
                     63: 
                     64: /* By default, colon separates directories in a path.  */
                     65: #ifndef PATH_SEPARATOR
                     66: #define PATH_SEPARATOR ':'
                     67: #endif
                     68: 
                     69: #include <ctype.h>
                     70: #include <stdio.h>
                     71: #include <signal.h>
                     72: #ifdef __STDC__
                     73: #include <stdlib.h>
                     74: #endif
                     75: 
                     76: #ifndef VMS
                     77: #ifndef USG
                     78: #include <sys/time.h>          /* for __DATE__ and __TIME__ */
                     79: #include <sys/resource.h>
                     80: #else
                     81: #include <sys/param.h>                 /* CYGNUS LOCAL: shebs -noquiet */
                     82: #include <sys/times.h>
                     83: #include <time.h>
                     84: #include <fcntl.h>
                     85: #endif /* USG */
                     86: #endif /* not VMS */
                     87: 
                     88: /* This defines "errno" properly for VMS, and gives us EACCES. */
                     89: #include <errno.h>
                     90: 
                     91: extern char *index ();
                     92: extern char *rindex ();
                     93: 
                     94: #ifndef O_RDONLY
                     95: #define O_RDONLY 0
                     96: #endif
                     97: 
                     98: #undef MIN
                     99: #undef MAX
                    100: #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
                    101: #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
                    102: 
                    103: /* Find the largest host integer type and set its size and type.  */
                    104: 
                    105: #ifndef HOST_BITS_PER_WIDE_INT
                    106: 
                    107: #if HOST_BITS_PER_LONG > HOST_BITS_PER_INT
                    108: #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG
                    109: #define HOST_WIDE_INT long
                    110: #else
                    111: #define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_INT
                    112: #define HOST_WIDE_INT int
                    113: #endif
                    114: 
                    115: #endif
                    116: 
                    117: #ifndef S_ISREG
                    118: #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
                    119: #endif
                    120: 
                    121: #ifndef S_ISDIR
                    122: #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
                    123: #endif
                    124: 
                    125: /* Define a generic NULL if one hasn't already been defined.  */
                    126: 
                    127: #ifndef NULL
                    128: #define NULL 0
                    129: #endif
                    130: 
                    131: #ifndef GENERIC_PTR
                    132: #if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
                    133: #define GENERIC_PTR void *
                    134: #else
                    135: #define GENERIC_PTR char *
                    136: #endif
                    137: #endif
                    138: 
                    139: #ifndef NULL_PTR
                    140: #define NULL_PTR ((GENERIC_PTR)0)
                    141: #endif
                    142: 
                    143: #ifndef INCLUDE_LEN_FUDGE
                    144: #define INCLUDE_LEN_FUDGE 0
                    145: #endif
                    146: 
                    147: /* Symbols to predefine.  */
                    148: 
                    149: #ifdef CPP_PREDEFINES
                    150: static char *predefs = CPP_PREDEFINES;
                    151: #else
                    152: static char *predefs = "";
                    153: #endif
                    154: 
                    155: /* We let tm.h override the types used here, to handle trivial differences
                    156:    such as the choice of unsigned int or long unsigned int for size_t.
                    157:    When machines start needing nontrivial differences in the size type,
                    158:    it would be best to do something here to figure out automatically
                    159:    from other information what type to use.  */
                    160: 
                    161: /* The string value for __SIZE_TYPE__.  */
                    162: 
                    163: #ifndef SIZE_TYPE
                    164: #define SIZE_TYPE "long unsigned int"
                    165: #endif
                    166: 
                    167: /* The string value for __PTRDIFF_TYPE__.  */
                    168: 
                    169: #ifndef PTRDIFF_TYPE
                    170: #define PTRDIFF_TYPE "long int"
                    171: #endif
                    172: 
                    173: /* The string value for __WCHAR_TYPE__.  */
                    174: 
                    175: #ifndef WCHAR_TYPE
                    176: #define WCHAR_TYPE "int"
                    177: #endif
                    178: #define CPP_WCHAR_TYPE(PFILE) \
                    179:        (CPP_OPTIONS (PFILE)->cplusplus ? "__wchar_t" : WCHAR_TYPE)
                    180: 
                    181: /* The string value for __USER_LABEL_PREFIX__ */
                    182: 
                    183: #ifndef USER_LABEL_PREFIX
                    184: #define USER_LABEL_PREFIX ""
                    185: #endif
                    186: 
                    187: /* The string value for __REGISTER_PREFIX__ */
                    188: 
                    189: #ifndef REGISTER_PREFIX
                    190: #define REGISTER_PREFIX ""
                    191: #endif
                    192: 
                    193: /* In the definition of a #assert name, this structure forms
                    194:    a list of the individual values asserted.
                    195:    Each value is itself a list of "tokens".
                    196:    These are strings that are compared by name.  */
                    197: 
                    198: struct tokenlist_list {
                    199:   struct tokenlist_list *next;
                    200:   struct arglist *tokens;
                    201: };
                    202: 
                    203: struct assertion_hashnode {
                    204:   struct assertion_hashnode *next;     /* double links for easy deletion */
                    205:   struct assertion_hashnode *prev;
                    206:   /* also, a back pointer to this node's hash
                    207:      chain is kept, in case the node is the head
                    208:      of the chain and gets deleted. */
                    209:   struct assertion_hashnode **bucket_hdr;
                    210:   int length;                  /* length of token, for quick comparison */
                    211:   U_CHAR *name;                        /* the actual name */
                    212:   /* List of token-sequences.  */
                    213:   struct tokenlist_list *value;
                    214: };
                    215: 
                    216: #define SKIP_WHITE_SPACE(p) do { while (is_hor_space[*p]) p++; } while (0)
                    217: #define SKIP_ALL_WHITE_SPACE(p) do { while (is_space[*p]) p++; } while (0)
                    218: 
                    219: #define PEEKN(N) (CPP_BUFFER (pfile)->rlimit - CPP_BUFFER (pfile)->cur >= (N) ? CPP_BUFFER (pfile)->cur[N] : EOF)
                    220: #define FORWARD(N) CPP_FORWARD (CPP_BUFFER (pfile), (N))
                    221: #define GETC() CPP_BUF_GET (CPP_BUFFER (pfile))
                    222: #define PEEKC() CPP_BUF_PEEK (CPP_BUFFER (pfile))
                    223: /* CPP_IS_MACRO_BUFFER is true if the buffer contains macro expansion.
                    224:    (Note that it is false while we're expanding marco *arguments*.) */
                    225: #define CPP_IS_MACRO_BUFFER(PBUF) ((PBUF)->cleanup == macro_cleanup)
                    226: 
                    227: /* Move all backslash-newline pairs out of embarrassing places.
                    228:    Exchange all such pairs following BP
                    229:    with any potentially-embarrassing characters that follow them.
                    230:    Potentially-embarrassing characters are / and *
                    231:    (because a backslash-newline inside a comment delimiter
                    232:    would cause it not to be recognized).  */
                    233: 
                    234: #define NEWLINE_FIX \
                    235:   do {while (PEEKC() == '\\' && PEEKN(1) == '\n') FORWARD(2); } while(0)
                    236: 
                    237: /* Same, but assume we've already read the potential '\\' into C. */
                    238: #define NEWLINE_FIX1(C) do { \
                    239:     while ((C) == '\\' && PEEKC() == '\n') { FORWARD(1); (C) = GETC(); }\
                    240:   } while(0)
                    241: 
                    242: struct cpp_pending {
                    243:   struct cpp_pending *next;
                    244:   char *cmd;
                    245:   char *arg;
                    246: };
                    247: 
                    248: /* Forward declarations.  */
                    249: 
                    250: extern char *xmalloc ();
                    251: 
                    252: static void add_import ();
                    253: static void append_include_chain ();
                    254: static void make_undef ();
                    255: static void make_assertion ();
                    256: static void path_include ();
                    257: static void initialize_builtins ();
                    258: static void initialize_char_syntax ();
                    259: static void dump_arg_n ();
                    260: static void dump_defn_1 ();
                    261: extern void delete_macro ();
                    262: static void trigraph_pcp ();
                    263: static int finclude ();
                    264: static void validate_else ();
                    265: static int comp_def_part ();
                    266: extern void fancy_abort ();
                    267: static void pipe_closed ();
                    268: static void print_containing_files ();
                    269: static int lookup_import ();
                    270: static int redundant_include_p ();
                    271: static is_system_include ();
                    272: static struct file_name_map *read_name_map ();
                    273: static char *read_filename_string ();
                    274: static int open_include_file ();
                    275: static int check_preconditions ();
                    276: static void pcfinclude ();
                    277: static void pcstring_used ();
                    278: static int check_macro_name ();
                    279: static int compare_defs ();
                    280: static int compare_token_lists ();
                    281: static HOST_WIDE_INT eval_if_expression ();
                    282: static int change_newlines ();
                    283: extern int hashf ();
                    284: static int file_size_and_mode ();
                    285: static struct arglist *read_token_list ();
                    286: static void free_token_list ();
                    287: static int safe_read ();
                    288: static void push_macro_expansion PARAMS ((cpp_reader *,
                    289:                                          U_CHAR*, int, HASHNODE*));
                    290: static struct cpp_pending *nreverse_pending PARAMS ((struct cpp_pending*));
                    291: extern char *xrealloc ();
                    292: extern char *xcalloc ();
                    293: static char *savestring ();
                    294: 
                    295: static void conditional_skip ();
                    296: static void skip_if_group ();
                    297: 
                    298: /* Last arg to output_line_command.  */
                    299: enum file_change_code {same_file, enter_file, leave_file};
                    300: 
                    301: /* External declarations.  */
                    302: 
                    303: extern HOST_WIDE_INT cpp_parse_expr PARAMS ((cpp_reader*));
                    304: 
                    305: extern char *getenv ();
                    306: extern FILE *fdopen ();
                    307: extern char *version_string;
                    308: extern struct tm *localtime ();
                    309: 
                    310: /* These functions are declared to return int instead of void since they
                    311:    are going to be placed in a table and some old compilers have trouble with
                    312:    pointers to functions returning void.  */
                    313: 
                    314: static int do_define ();
                    315: static int do_line ();
                    316: static int do_include ();
                    317: static int do_undef ();
                    318: static int do_error ();
                    319: static int do_pragma ();
                    320: static int do_ident ();
                    321: static int do_if ();
                    322: static int do_xifdef ();
                    323: static int do_else ();
                    324: static int do_elif ();
                    325: static int do_endif ();
                    326: static int do_sccs ();
                    327: static int do_once ();
                    328: static int do_assert ();
                    329: static int do_unassert ();
                    330: static int do_warning ();
                    331: 
                    332: struct file_name_list
                    333:   {
                    334:     struct file_name_list *next;
                    335:     char *fname;
                    336:     /* If the following is nonzero, it is a macro name.
                    337:        Don't include the file again if that macro is defined.  */
                    338:     U_CHAR *control_macro;
                    339:     /* If the following is nonzero, it is a C-language system include
                    340:        directory.  */
                    341:     int c_system_include_path;
                    342:     /* Mapping of file names for this directory.  */
                    343:     struct file_name_map *name_map;
                    344:     /* Non-zero if name_map is valid.  */
                    345:     int got_name_map;
                    346:   };
                    347: 
                    348: /* If a buffer's dir field is SELF_DIR_DUMMY, it means the file was found
                    349:    via the same directory as the file that #included it. */
                    350: #define SELF_DIR_DUMMY ((struct file_name_list*)(~0))
                    351: 
                    352: /* #include "file" looks in source file dir, then stack. */
                    353: /* #include <file> just looks in the stack. */
                    354: /* -I directories are added to the end, then the defaults are added. */
                    355: /* The */
                    356: static struct default_include {
                    357:   char *fname;                 /* The name of the directory.  */
                    358:   int cplusplus;               /* Only look here if we're compiling C++.  */
                    359:   int cxx_aware;               /* Includes in this directory don't need to
                    360:                                   be wrapped in extern "C" when compiling
                    361:                                   C++.  */
                    362: } include_defaults_array[]
                    363: #ifdef INCLUDE_DEFAULTS
                    364:   = INCLUDE_DEFAULTS;
                    365: #else
                    366:   = {
                    367:     /* Pick up GNU C++ specific include files.  */
                    368:     { GPLUSPLUS_INCLUDE_DIR, 1, 1 },
                    369: #ifdef CROSS_COMPILE
                    370:     /* This is the dir for fixincludes.  Put it just before
                    371:        the files that we fix.  */
                    372:     { GCC_INCLUDE_DIR, 0, 0 },
                    373:     /* For cross-compilation, this dir name is generated
                    374:        automatically in Makefile.in.  */
                    375:     { CROSS_INCLUDE_DIR, 0, 0 },
                    376:     /* This is another place that the target system's headers might be.  */
                    377:     { TOOL_INCLUDE_DIR, 0, 1 },
                    378: #else /* not CROSS_COMPILE */
                    379:     /* This should be /usr/local/include and should come before
                    380:        the fixincludes-fixed header files.  */
                    381:     { LOCAL_INCLUDE_DIR, 0, 1 },
                    382:     /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
                    383:        Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h.  */
                    384:     { TOOL_INCLUDE_DIR, 0, 1 },
                    385:     /* This is the dir for fixincludes.  Put it just before
                    386:        the files that we fix.  */
                    387:     { GCC_INCLUDE_DIR, 0, 0 },
                    388:     /* Some systems have an extra dir of include files.  */
                    389: #ifdef SYSTEM_INCLUDE_DIR
                    390:     { SYSTEM_INCLUDE_DIR, 0, 0 },
                    391: #endif
                    392:     { STANDARD_INCLUDE_DIR, 0, 0 },
                    393: #endif /* not CROSS_COMPILE */
                    394:     { 0, 0, 0 }
                    395:     };
                    396: #endif /* no INCLUDE_DEFAULTS */
                    397: 
                    398: /* `struct directive' defines one #-directive, including how to handle it.  */
                    399: 
                    400: struct directive {
                    401:   int length;                  /* Length of name */
                    402:   int (*func)();               /* Function to handle directive */
                    403:   char *name;                  /* Name of directive */
                    404:   enum node_type type;         /* Code which describes which directive. */
                    405:   char command_reads_line;      /* One if rest of line is read by func. */
                    406:   char traditional_comments;   /* Nonzero: keep comments if -traditional.  */
                    407:   char pass_thru;              /* Copy preprocessed directive to output file.*/
                    408: };
                    409: 
                    410: /* Here is the actual list of #-directives, most-often-used first.
                    411:    The initialize_builtins function assumes #define is the very first.  */
                    412: 
                    413: static struct directive directive_table[] = {
                    414:   {  6, do_define, "define", T_DEFINE, 0, 1},
                    415:   {  5, do_xifdef, "ifdef", T_IFDEF, 1},
                    416:   {  6, do_xifdef, "ifndef", T_IFNDEF, 1},
                    417:   {  7, do_include, "include", T_INCLUDE, 1},
                    418:   { 12, do_include, "include_next", T_INCLUDE_NEXT, 1},
                    419:   {  6, do_include, "import", T_IMPORT, 1},
                    420:   {  5, do_endif, "endif", T_ENDIF, 1},
                    421:   {  4, do_else, "else", T_ELSE, 1},
                    422:   {  2, do_if, "if", T_IF, 1},
                    423:   {  4, do_elif, "elif", T_ELIF, 1},
                    424:   {  5, do_undef, "undef", T_UNDEF},
                    425:   {  5, do_error, "error", T_ERROR},
                    426:   {  7, do_warning, "warning", T_WARNING},
                    427:   {  6, do_pragma, "pragma", T_PRAGMA, 0, 0, 1},
                    428:   {  4, do_line, "line", T_LINE, 1},
                    429:   {  5, do_ident, "ident", T_IDENT, 1, 0, 1},
                    430: #ifdef SCCS_DIRECTIVE
                    431:   {  4, do_sccs, "sccs", T_SCCS},
                    432: #endif
                    433:   {  6, do_assert, "assert", T_ASSERT, 1},
                    434:   {  8, do_unassert, "unassert", T_UNASSERT, 1},
                    435:   {  -1, 0, "", T_UNUSED},
                    436: };
                    437: 
                    438: /* table to tell if char can be part of a C identifier. */
                    439: U_CHAR is_idchar[256];
                    440: /* table to tell if char can be first char of a c identifier. */
                    441: U_CHAR is_idstart[256];
                    442: /* table to tell if c is horizontal space.  */
                    443: U_CHAR is_hor_space[256];
                    444: /* table to tell if c is horizontal or vertical space.  */
                    445: static U_CHAR is_space[256];
                    446: 
                    447: /* Initialize syntactic classifications of characters.  */
                    448: 
                    449: static void
                    450: initialize_char_syntax (opts)
                    451:      struct cpp_options *opts;
                    452: {
                    453:   register int i;
                    454: 
                    455:   /*
                    456:    * Set up is_idchar and is_idstart tables.  These should be
                    457:    * faster than saying (is_alpha (c) || c == '_'), etc.
                    458:    * Set up these things before calling any routines tthat
                    459:    * refer to them.
                    460:    */
                    461:   for (i = 'a'; i <= 'z'; i++) {
                    462:     is_idchar[i - 'a' + 'A'] = 1;
                    463:     is_idchar[i] = 1;
                    464:     is_idstart[i - 'a' + 'A'] = 1;
                    465:     is_idstart[i] = 1;
                    466:   }
                    467:   for (i = '0'; i <= '9'; i++)
                    468:     is_idchar[i] = 1;
                    469:   is_idchar['_'] = 1;
                    470:   is_idstart['_'] = 1;
                    471:   is_idchar['$'] = opts->dollars_in_ident;
                    472:   is_idstart['$'] = opts->dollars_in_ident;
                    473: 
                    474:   /* horizontal space table */
                    475:   is_hor_space[' '] = 1;
                    476:   is_hor_space['\t'] = 1;
                    477:   is_hor_space['\v'] = 1;
                    478:   is_hor_space['\f'] = 1;
                    479:   is_hor_space['\r'] = 1;
                    480: 
                    481:   is_space[' '] = 1;
                    482:   is_space['\t'] = 1;
                    483:   is_space['\v'] = 1;
                    484:   is_space['\f'] = 1;
                    485:   is_space['\n'] = 1;
                    486:   is_space['\r'] = 1;
                    487: }
                    488: 
                    489: 
                    490: /* Place into PFILE a quoted string representing the string SRC.
                    491:    Caller must reserve enough space in pfile->token_buffer. */
                    492: static void
                    493: quote_string (pfile, src)
                    494:      cpp_reader *pfile;
                    495:      char *src;
                    496: {
                    497:   U_CHAR c;
                    498: 
                    499:   CPP_PUTC_Q (pfile, '\"');
                    500:   for (;;)
                    501:     switch ((c = *src++))
                    502:       {
                    503:       default:
                    504:         if (isprint (c))
                    505:          CPP_PUTC_Q (pfile, c);
                    506:        else
                    507:          {
                    508:            sprintf (CPP_PWRITTEN (pfile), "\\%03o", c);
                    509:            CPP_ADJUST_WRITTEN (pfile, 4);
                    510:          }
                    511:        break;
                    512: 
                    513:       case '\"':
                    514:       case '\\':
                    515:        CPP_PUTC_Q (pfile, '\\');
                    516:        CPP_PUTC_Q (pfile, c);
                    517:        break;
                    518:       
                    519:       case '\0':
                    520:        CPP_PUTC_Q (pfile, '\"');
                    521:        CPP_NUL_TERMINATE_Q (pfile);
                    522:        return;
                    523:       }
                    524: }
                    525: 
                    526: /* Make sure PFILE->token_buffer will hold at least N more chars. */
                    527: 
                    528: void
                    529: cpp_grow_buffer (pfile, n)
                    530:      cpp_reader *pfile;
                    531:      long n;
                    532: {
                    533:   long old_written = CPP_WRITTEN (pfile);
                    534:   pfile->token_buffer_size = n + 2 * pfile->token_buffer_size;
                    535:   pfile->token_buffer = (U_CHAR*)
                    536:     xrealloc(pfile->token_buffer, pfile->token_buffer_size);
                    537:   CPP_SET_WRITTEN (pfile, old_written);
                    538: }
                    539: 
                    540: 
                    541: /*
                    542:  * process a given definition string, for initialization
                    543:  * If STR is just an identifier, define it with value 1.
                    544:  * If STR has anything after the identifier, then it should
                    545:  * be identifier=definition.
                    546:  */
                    547: 
                    548: void
                    549: cpp_define (pfile, str)
                    550:      cpp_reader *pfile;
                    551:      U_CHAR *str;
                    552: {
                    553:   U_CHAR *buf, *p;
                    554: 
                    555:   buf = str;
                    556:   p = str;
                    557:   if (!is_idstart[*p])
                    558:     {
                    559:       cpp_error (pfile, "malformed option `-D %s'", str);
                    560:       return;
                    561:     }
                    562:   while (is_idchar[*++p])
                    563:     ;
                    564:   if (*p == 0)
                    565:     {
                    566:       buf = (U_CHAR *) alloca (p - buf + 4);
                    567:       strcpy ((char *)buf, str);
                    568:       strcat ((char *)buf, " 1");
                    569:     }
                    570:   else if (*p != '=')
                    571:     {
                    572:       cpp_error (pfile, "malformed option `-D %s'", str);
                    573:       return;
                    574:     }
                    575:   else
                    576:     {
                    577:       U_CHAR *q;
                    578:       /* Copy the entire option so we can modify it.  */
                    579:       buf = (U_CHAR *) alloca (2 * strlen (str) + 1);
                    580:       strncpy (buf, str, p - str);
                    581:       /* Change the = to a space.  */
                    582:       buf[p - str] = ' ';
                    583:       /* Scan for any backslash-newline and remove it.  */
                    584:       p++;
                    585:       q = &buf[p - str];
                    586:       while (*p)
                    587:        {
                    588:       if (*p == '\\' && p[1] == '\n')
                    589:        p += 2;
                    590:       else
                    591:        *q++ = *p++;
                    592:     }
                    593:     *q = 0;
                    594:   }
                    595:   
                    596:   do_define (pfile, NULL, buf, buf + strlen (buf));
                    597: }
                    598: 
                    599: /* Process the string STR as if it appeared as the body of a #assert.
                    600:    OPTION is the option name for which STR was the argument.  */
                    601: 
                    602: static void
                    603: make_assertion (pfile, option, str)
                    604:      cpp_reader *pfile;
                    605:      char *option;
                    606:      U_CHAR *str;
                    607: {
                    608:   cpp_buffer *ip;
                    609:   struct directive *kt;
                    610:   U_CHAR *buf, *p, *q;
                    611: 
                    612:   /* Copy the entire option so we can modify it.  */
                    613:   buf = (U_CHAR *) alloca (strlen (str) + 1);
                    614:   strcpy ((char *) buf, str);
                    615:   /* Scan for any backslash-newline and remove it.  */
                    616:   p = q = buf;
                    617:   while (*p) {
                    618: #if 0
                    619:     if (*p == '\\' && p[1] == '\n')
                    620:       p += 2;
                    621:     else
                    622: #endif
                    623:       *q++ = *p++;
                    624:   }
                    625:   *q = 0;
                    626: 
                    627:   p = buf;
                    628:   if (!is_idstart[*p]) {
                    629:     cpp_error (pfile, "malformed option `%s %s'", option, str);
                    630:     return;
                    631:   }
                    632:   while (is_idchar[*++p])
                    633:     ;
                    634:   while (*p == ' ' || *p == '\t') p++;
                    635:   if (! (*p == 0 || *p == '(')) {
                    636:     cpp_error (pfile, "malformed option `%s %s'", option, str);
                    637:     return;
                    638:   }
                    639:   
                    640:   ip = cpp_push_buffer (pfile, buf, strlen (buf));
                    641:   do_assert (pfile, NULL, NULL, NULL);
                    642:   cpp_pop_buffer (pfile);
                    643: }
                    644: 
                    645: /* Append a chain of `struct file_name_list's
                    646:    to the end of the main include chain.
                    647:    FIRST is the beginning of the chain to append, and LAST is the end.  */
                    648: 
                    649: static void
                    650: append_include_chain (pfile, first, last)
                    651:      cpp_reader *pfile;
                    652:      struct file_name_list *first, *last;
                    653: {
                    654:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                    655:   struct file_name_list *dir;
                    656: 
                    657:   if (!first || !last)
                    658:     return;
                    659: 
                    660:   if (opts->include == 0)
                    661:     opts->include = first;
                    662:   else
                    663:     opts->last_include->next = first;
                    664: 
                    665:   if (opts->first_bracket_include == 0)
                    666:     opts->first_bracket_include = first;
                    667: 
                    668:   for (dir = first; ; dir = dir->next) {
                    669:     int len = strlen (dir->fname) + INCLUDE_LEN_FUDGE;
                    670:     if (len > pfile->max_include_len)
                    671:       pfile->max_include_len = len;
                    672:     if (dir == last)
                    673:       break;
                    674:   }
                    675: 
                    676:   last->next = NULL;
                    677:   opts->last_include = last;
                    678: }
                    679: 
                    680: /* Add output to `deps_buffer' for the -M switch.
                    681:    STRING points to the text to be output.
                    682:    SPACER is ':' for targets, ' ' for dependencies, zero for text
                    683:    to be inserted literally.  */
                    684: 
                    685: static void
                    686: deps_output (pfile, string, spacer)
                    687:      cpp_reader *pfile;
                    688:      char *string;
                    689:      int spacer;
                    690: {
                    691:   int size = strlen (string);
                    692: 
                    693:   if (size == 0)
                    694:     return;
                    695: 
                    696: #ifndef MAX_OUTPUT_COLUMNS
                    697: #define MAX_OUTPUT_COLUMNS 72
                    698: #endif
                    699:   if (spacer
                    700:       && pfile->deps_column > 0
                    701:       && (pfile->deps_column + size) > MAX_OUTPUT_COLUMNS)
                    702:     {
                    703:       deps_output (pfile, " \\\n  ", 0);
                    704:       pfile->deps_column = 0;
                    705:     }
                    706: 
                    707:   if (pfile->deps_size + size + 8 > pfile->deps_allocated_size)
                    708:     {
                    709:       pfile->deps_allocated_size = (pfile->deps_size + size + 50) * 2;
                    710:       pfile->deps_buffer = (char *) xrealloc (pfile->deps_buffer,
                    711:                                              pfile->deps_allocated_size);
                    712:     }
                    713:   if (spacer == ' ' && pfile->deps_column > 0)
                    714:     pfile->deps_buffer[pfile->deps_size++] = ' ';
                    715:   bcopy (string, &pfile->deps_buffer[pfile->deps_size], size);
                    716:   pfile->deps_size += size;
                    717:   pfile->deps_column += size;
                    718:   if (spacer == ':')
                    719:     pfile->deps_buffer[pfile->deps_size++] = ':';
                    720:   pfile->deps_buffer[pfile->deps_size] = 0;
                    721: }
                    722: 
                    723: /* Given a colon-separated list of file names PATH,
                    724:    add all the names to the search path for include files.  */
                    725: 
                    726: static void
                    727: path_include (pfile, path)
                    728:      cpp_reader *pfile;
                    729:      char *path;
                    730: {
                    731:   char *p;
                    732: 
                    733:   p = path;
                    734: 
                    735:   if (*p)
                    736:     while (1) {
                    737:       char *q = p;
                    738:       char *name;
                    739:       struct file_name_list *dirtmp;
                    740: 
                    741:       /* Find the end of this name.  */
                    742:       while (*q != 0 && *q != PATH_SEPARATOR) q++;
                    743:       if (p == q) {
                    744:        /* An empty name in the path stands for the current directory.  */
                    745:        name = (char *) xmalloc (2);
                    746:        name[0] = '.';
                    747:        name[1] = 0;
                    748:       } else {
                    749:        /* Otherwise use the directory that is named.  */
                    750:        name = (char *) xmalloc (q - p + 1);
                    751:        bcopy (p, name, q - p);
                    752:        name[q - p] = 0;
                    753:       }
                    754: 
                    755:       dirtmp = (struct file_name_list *)
                    756:        xmalloc (sizeof (struct file_name_list));
                    757:       dirtmp->next = 0;                /* New one goes on the end */
                    758:       dirtmp->control_macro = 0;
                    759:       dirtmp->c_system_include_path = 0;
                    760:       dirtmp->fname = name;
                    761:       dirtmp->got_name_map = 0;
                    762:       append_include_chain (pfile, dirtmp, dirtmp);
                    763: 
                    764:       /* Advance past this name.  */
                    765:       p = q;
                    766:       if (*p == 0)
                    767:        break;
                    768:       /* Skip the colon.  */
                    769:       p++;
                    770:     }
                    771: }
                    772: 
                    773: void
                    774: init_parse_options (opts)
                    775:      struct cpp_options *opts;
                    776: {
                    777:   bzero ((char *) opts, sizeof *opts);
                    778:   opts->in_fname = NULL;
                    779:   opts->out_fname = NULL;
                    780: 
                    781:   /* Initialize is_idchar to allow $.  */
                    782:   opts->dollars_in_ident = 1;
                    783:   initialize_char_syntax (opts);
                    784:   opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS > 0;
                    785: 
                    786:   opts->no_line_commands = 0;
                    787:   opts->no_trigraphs = 1;
                    788:   opts->put_out_comments = 0;
                    789:   opts->print_include_names = 0;
                    790:   opts->dump_macros = dump_none;
                    791:   opts->no_output = 0;
                    792:   opts->cplusplus = 0;
                    793:   opts->cplusplus_comments = 0;
                    794: 
                    795:   opts->verbose = 0;
                    796:   opts->objc = 0;
                    797:   opts->lang_asm = 0;
                    798:   opts->for_lint = 0;
                    799:   opts->chill = 0;
                    800:   opts->pedantic_errors = 0;
                    801:   opts->inhibit_warnings = 0;
                    802:   opts->warn_comments = 0;
                    803:   opts->warn_import = 1;
                    804:   opts->warnings_are_errors = 0;
                    805: }
                    806: 
                    807: enum cpp_token
                    808: null_underflow (pfile)
                    809:      cpp_reader *pfile;
                    810: {
                    811:   return CPP_EOF;
                    812: }
                    813: 
                    814: int
                    815: null_cleanup (pbuf, pfile)
                    816:      cpp_buffer *pbuf;
                    817:      cpp_reader *pfile;
                    818: {
                    819:   return 0;
                    820: }
                    821: 
                    822: int
                    823: macro_cleanup (pbuf, pfile)
                    824:      cpp_buffer *pbuf;
                    825:      cpp_reader *pfile;
                    826: {
                    827:   HASHNODE *macro = (HASHNODE*)pbuf->data;
                    828:   if (macro->type == T_DISABLED)
                    829:     macro->type = T_MACRO;
                    830:   if (macro->type != T_MACRO || pbuf->buf != macro->value.defn->expansion)
                    831:     free (pbuf->buf);
                    832:   return 0;
                    833: }
                    834: 
                    835: int
                    836: file_cleanup (pbuf, pfile)
                    837:      cpp_buffer *pbuf;
                    838:      cpp_reader *pfile;
                    839: {
                    840:   if (pbuf->buf)
                    841:     {
                    842:       free (pbuf->buf);
                    843:       pbuf->buf = 0;
                    844:     }
                    845:   return 0;
                    846: }
                    847: 
                    848: static void
                    849: newline_fix (pfile)
                    850:      cpp_reader *pfile;
                    851: {
                    852: #if 1
                    853:   NEWLINE_FIX;
                    854: #else
                    855:   register U_CHAR *p = bp;
                    856: 
                    857:   /* First count the backslash-newline pairs here.  */
                    858: 
                    859:   while (p[0] == '\\' && p[1] == '\n')
                    860:     p += 2;
                    861: 
                    862:   /* What follows the backslash-newlines is not embarrassing.  */
                    863: 
                    864:   if (*p != '/' && *p != '*')
                    865:     return;
                    866: 
                    867:   /* Copy all potentially embarrassing characters
                    868:      that follow the backslash-newline pairs
                    869:      down to where the pairs originally started.  */
                    870: 
                    871:   while (*p == '*' || *p == '/')
                    872:     *bp++ = *p++;
                    873: 
                    874:   /* Now write the same number of pairs after the embarrassing chars.  */
                    875:   while (bp < p) {
                    876:     *bp++ = '\\';
                    877:     *bp++ = '\n';
                    878:   }
                    879: #endif
                    880: }
                    881: 
                    882: /* Assuming we have read '/'.
                    883:    If this is the start of a comment (followed by '*' or '/'),
                    884:    skip to the end of the comment, and return ' '.
                    885:    Return EOF if we reached the end of file before the end of the comment.
                    886:    If not the start of a comment, return '/'. */
                    887: 
                    888: static int
                    889: skip_comment (pfile, linep)
                    890:      cpp_reader *pfile;
                    891:      long *linep;
                    892: {
                    893:   int c;
                    894:   while (PEEKC() == '\\' && PEEKN(1) == '\n')
                    895:     {
                    896:       if (linep)
                    897:        (*linep)++;
                    898:       FORWARD(2);
                    899:     }
                    900:   if (PEEKC() == '*')
                    901:     {
                    902:       FORWARD(1);
                    903:       for (;;)
                    904:        {
                    905:          int prev_c = c;
                    906:          c = GETC ();
                    907:          if (c == EOF)
                    908:            return EOF;
                    909:          while (c == '\\' && PEEKC() == '\n')
                    910:            {
                    911:              if (linep)
                    912:                (*linep)++;
                    913:              FORWARD(1), c = GETC();
                    914:            }
                    915:          if (prev_c == '*' && c == '/')
                    916:            return ' ';
                    917:          if (c == '\n' && linep)
                    918:            (*linep)++;
                    919:        }
                    920:     }
                    921:   else if (PEEKC() == '/' && CPP_OPTIONS (pfile)->cplusplus_comments)
                    922:     {
                    923:       FORWARD(1);
                    924:       for (;;)
                    925:        {
                    926:          c = GETC ();
                    927:          if (c == EOF)
                    928:            return ' '; /* Allow // to be terminated by EOF. */
                    929:          while (c == '\\' && PEEKC() == '\n')
                    930:            {
                    931:              FORWARD(1);
                    932:              c = GETC();
                    933:              if (linep)
                    934:                (*linep)++;
                    935:            }
                    936:          if (c == '\n')
                    937:            {
                    938:              /* Don't consider final '\n' to be part of comment. */
                    939:              FORWARD(-1);
                    940:              return ' ';
                    941:            }
                    942:        }
                    943:     }
                    944:   else
                    945:     return '/';
                    946: }     
                    947: 
                    948: /* Skip whitespace \-newline and comments.  Does not macro-expand.  */
                    949: void
                    950: cpp_skip_hspace (pfile)
                    951:      cpp_reader *pfile;
                    952: {
                    953:   while (1)
                    954:     {
                    955:       int c = PEEKC();
                    956:       if (c == EOF)
                    957:        return; /* FIXME */
                    958:       if (is_hor_space[c])
                    959:        {
                    960:          if ((c == '\f' || c == '\v') && CPP_PEDANTIC (pfile))
                    961:            cpp_pedwarn (pfile, "%s in preprocessing directive",
                    962:                         c == '\f' ? "formfeed" : "vertical tab");
                    963:          FORWARD(1);
                    964:        }
                    965:       else if (c == '/')
                    966:        {
                    967:          FORWARD (1);
                    968:          c = skip_comment (pfile, NULL);
                    969:          if (c == '/')
                    970:            FORWARD(-1);
                    971:          if (c == EOF || c == '/')
                    972:            return;
                    973:        }
                    974:       else if (c == '\\' && PEEKN(1) == '\n') {
                    975:        FORWARD(2);
                    976:       }
                    977:       else if (c == '@' && CPP_BUFFER (pfile)->has_escapes
                    978:               && is_hor_space[PEEKN(1)])
                    979:        FORWARD(2);
                    980:       else return;
                    981:     }
                    982: }
                    983: 
                    984: /* Read the rest of the current line.
                    985:    The line is appended to PFILE's output buffer. */
                    986: 
                    987: void
                    988: copy_rest_of_line (pfile)
                    989:      cpp_reader *pfile;
                    990: {
                    991:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                    992:   for (;;)
                    993:     {
                    994:       int c = GETC();
                    995:       int nextc;
                    996:       switch (c)
                    997:        {
                    998:        case EOF:
                    999:          goto end_directive;
                   1000:        case '\\':
                   1001:          if (PEEKC() == '\n')
                   1002:            {
                   1003:              FORWARD (1);
                   1004:              continue;
                   1005:            }
                   1006:        case '\'':
                   1007:        case '\"':
                   1008:          goto scan_directive_token;
                   1009:          break;
                   1010:        case '/':
                   1011:          nextc = PEEKC();
                   1012:          if (nextc == '*' || (opts->cplusplus_comments && nextc == '*'))
                   1013:            goto scan_directive_token;
                   1014:          break;
                   1015:        case '\f':
                   1016:        case '\v':
                   1017:          if (CPP_PEDANTIC (pfile))
                   1018:            cpp_pedwarn (pfile, "%s in preprocessing directive",
                   1019:                         c == '\f' ? "formfeed" : "vertical tab");
                   1020:          break;
                   1021: 
                   1022:        case '\n':
                   1023:          FORWARD(-1);
                   1024:          goto end_directive;
                   1025:        scan_directive_token:
                   1026:          FORWARD(-1);
                   1027:          cpp_get_token (pfile);
                   1028:          continue;
                   1029:        }
                   1030:       CPP_PUTC (pfile, c);
                   1031:     }
                   1032:  end_directive: ;
                   1033:   CPP_NUL_TERMINATE (pfile);
                   1034: }
                   1035: 
                   1036: void
                   1037: skip_rest_of_line (pfile)
                   1038:      cpp_reader *pfile;
                   1039: {
                   1040:   long old = CPP_WRITTEN (pfile);
                   1041:   copy_rest_of_line (pfile);
                   1042:   CPP_SET_WRITTEN (pfile, old);
                   1043: }
                   1044: 
                   1045: /* Handle a possible # directive.
                   1046:    '#' has already been read.  */
                   1047: 
                   1048: int
                   1049: handle_directive (pfile)
                   1050:      cpp_reader *pfile;
                   1051: { int c;
                   1052:   register struct directive *kt;
                   1053:   int ident_length;
                   1054:   long after_ident;
                   1055:   U_CHAR *ident, *line_end;
                   1056:   long old_written = CPP_WRITTEN (pfile);
                   1057: 
                   1058:   cpp_skip_hspace (pfile);
                   1059: 
                   1060:   c = PEEKC ();
                   1061:   if (c >= '0' && c <= '9')
                   1062:     {
                   1063:       /* Handle # followed by a line number.  */
                   1064:       if (CPP_PEDANTIC (pfile))
                   1065:        cpp_pedwarn (pfile, "`#' followed by integer");
                   1066:       do_line (pfile, NULL);
                   1067:       goto done_a_directive;
                   1068:     }
                   1069: 
                   1070:   /* Now find the directive name. */
                   1071:   CPP_PUTC (pfile, '#');
                   1072:   parse_name (pfile, GETC());
                   1073:   ident = pfile->token_buffer + old_written + 1;
                   1074:   ident_length = CPP_PWRITTEN (pfile) - ident;
                   1075:   if (ident_length == 0 && PEEKC() == '\n')
                   1076:     {
                   1077:       /* A line of just `#' becomes blank.  */
                   1078:       goto done_a_directive;
                   1079:     }
                   1080: 
                   1081: #if 0
                   1082:   if (ident_length == 0 || !is_idstart[*ident]) {
                   1083:     U_CHAR *p = ident;
                   1084:     while (is_idchar[*p]) {
                   1085:       if (*p < '0' || *p > '9')
                   1086:        break;
                   1087:       p++;
                   1088:     }
                   1089:     /* Avoid error for `###' and similar cases unless -pedantic.  */
                   1090:     if (p == ident) {
                   1091:       while (*p == '#' || is_hor_space[*p]) p++;
                   1092:       if (*p == '\n') {
                   1093:        if (pedantic && !lang_asm)
                   1094:          cpp_warning (pfile, "invalid preprocessor directive");
                   1095:        return 0;
                   1096:       }
                   1097:     }
                   1098: 
                   1099:     if (!lang_asm)
                   1100:       cpp_error (pfile, "invalid preprocessor directive name");
                   1101: 
                   1102:     return 0;
                   1103:   }
                   1104: #endif
                   1105:   /*
                   1106:    * Decode the keyword and call the appropriate expansion
                   1107:    * routine, after moving the input pointer up to the next line.
                   1108:    */
                   1109:   for (kt = directive_table; ; kt++) {
                   1110:     if (kt->length <= 0)
                   1111:       goto not_a_directive;
                   1112:     if (kt->length == ident_length && !strncmp (kt->name, ident, ident_length)) 
                   1113:       break;
                   1114:   }
                   1115: 
                   1116:   if (! kt->command_reads_line)
                   1117:     {
                   1118:       /* Nonzero means do not delete comments within the directive.
                   1119:          #define needs this when -traditional.  */
                   1120:        int comments = CPP_TRADITIONAL (pfile) && kt->traditional_comments; 
                   1121:        int save_put_out_comments = CPP_OPTIONS (pfile)->put_out_comments;
                   1122:        CPP_OPTIONS (pfile)->put_out_comments = comments;
                   1123:        after_ident = CPP_WRITTEN (pfile);
                   1124:        copy_rest_of_line (pfile);
                   1125:        CPP_OPTIONS (pfile)->put_out_comments = save_put_out_comments;
                   1126:     }
                   1127: 
                   1128:   /* For #pragma and #define, we may want to pass through the directive.
                   1129:      Other directives may create output, but we don't want the directive
                   1130:      itself out, so we pop it now.  For example #include may write a #line
                   1131:      command (see comment in do_include), and conditionals may emit
                   1132:      #failed ... #endfailed stuff.  But note that popping the buffer
                   1133:      means the parameters to kt->func may point after pfile->limit
                   1134:      so these parameters are invalid as soon as something gets appended
                   1135:      to the token_buffer.  */
                   1136: 
                   1137:   line_end = CPP_PWRITTEN (pfile);
                   1138:   if (!kt->pass_thru && kt->type != T_DEFINE)
                   1139:     CPP_SET_WRITTEN (pfile, old_written);
                   1140: 
                   1141:   (*kt->func) (pfile, kt, pfile->token_buffer + after_ident, line_end);
                   1142:   if (kt->pass_thru
                   1143:       || (kt->type == T_DEFINE
                   1144:          && CPP_OPTIONS (pfile)->dump_macros == dump_definitions))
                   1145:     {
                   1146:       /* Just leave the entire #define in the output stack. */
                   1147:     }
                   1148:   else if (kt->type == T_DEFINE
                   1149:           && CPP_OPTIONS (pfile)->dump_macros == dump_names)
                   1150:     {
                   1151:       U_CHAR *p = pfile->token_buffer + old_written + 7;  /* Skip "#define". */
                   1152:       SKIP_WHITE_SPACE (p);
                   1153:       while (is_idchar[*p]) p++;
                   1154:       pfile->limit = p;
                   1155:       CPP_PUTC (pfile, '\n');
                   1156:     }
                   1157:   else if (kt->type == T_DEFINE)
                   1158:     CPP_SET_WRITTEN (pfile, old_written);
                   1159:  done_a_directive:
                   1160:   return 1;
                   1161: 
                   1162:  not_a_directive:
                   1163:   return 0;
                   1164: }
                   1165: 
                   1166: /* Pass a directive through to the output file.
                   1167:    BUF points to the contents of the directive, as a contiguous string.
                   1168:    LIMIT points to the first character past the end of the directive.
                   1169:    KEYWORD is the keyword-table entry for the directive.  */
                   1170: 
                   1171: static void
                   1172: pass_thru_directive (buf, limit, pfile, keyword)
                   1173:      U_CHAR *buf, *limit;
                   1174:      cpp_reader *pfile;
                   1175:      struct directive *keyword;
                   1176: {
                   1177:   register unsigned keyword_length = keyword->length;
                   1178: 
                   1179:   CPP_RESERVE (pfile, 1 + keyword_length + (limit - buf));
                   1180:   CPP_PUTC_Q (pfile, '#');
                   1181:   CPP_PUTS_Q (pfile, keyword->name, keyword_length);
                   1182:   if (limit != buf && buf[0] != ' ')
                   1183:     CPP_PUTC_Q (pfile, ' ');
                   1184:   CPP_PUTS_Q (pfile, buf, limit - buf);
                   1185: #if 0
                   1186:   CPP_PUTS_Q (pfile, '\n');
                   1187:   /* Count the line we have just made in the output,
                   1188:      to get in sync properly.  */
                   1189:   pfile->lineno++;
                   1190: #endif
                   1191: }
                   1192: 
                   1193: /* The arglist structure is built by do_define to tell
                   1194:    collect_definition where the argument names begin.  That
                   1195:    is, for a define like "#define f(x,y,z) foo+x-bar*y", the arglist
                   1196:    would contain pointers to the strings x, y, and z.
                   1197:    Collect_definition would then build a DEFINITION node,
                   1198:    with reflist nodes pointing to the places x, y, and z had
                   1199:    appeared.  So the arglist is just convenience data passed
                   1200:    between these two routines.  It is not kept around after
                   1201:    the current #define has been processed and entered into the
                   1202:    hash table. */
                   1203: 
                   1204: struct arglist {
                   1205:   struct arglist *next;
                   1206:   U_CHAR *name;
                   1207:   int length;
                   1208:   int argno;
                   1209:   char rest_args;
                   1210: };
                   1211: 
                   1212: /* Read a replacement list for a macro with parameters.
                   1213:    Build the DEFINITION structure.
                   1214:    Reads characters of text starting at BUF until END.
                   1215:    ARGLIST specifies the formal parameters to look for
                   1216:    in the text of the definition; NARGS is the number of args
                   1217:    in that list, or -1 for a macro name that wants no argument list.
                   1218:    MACRONAME is the macro name itself (so we can avoid recursive expansion)
                   1219:    and NAMELEN is its length in characters.
                   1220:    
                   1221:    Note that comments, backslash-newlines, and leading white space
                   1222:    have already been deleted from the argument.  */
                   1223: 
                   1224: static DEFINITION *
                   1225: collect_expansion (pfile, buf, limit, nargs, arglist)
                   1226:      cpp_reader *pfile;
                   1227:      U_CHAR *buf, *limit;
                   1228:      int nargs;
                   1229:      struct arglist *arglist;
                   1230: {
                   1231:   DEFINITION *defn;
                   1232:   register U_CHAR *p, *lastp, *exp_p;
                   1233:   struct reflist *endpat = NULL;
                   1234:   /* Pointer to first nonspace after last ## seen.  */
                   1235:   U_CHAR *concat = 0;
                   1236:   /* Pointer to first nonspace after last single-# seen.  */
                   1237:   U_CHAR *stringify = 0;
                   1238:   int maxsize;
                   1239:   int expected_delimiter = '\0';
                   1240: 
                   1241:   /* Scan thru the replacement list, ignoring comments and quoted
                   1242:      strings, picking up on the macro calls.  It does a linear search
                   1243:      thru the arg list on every potential symbol.  Profiling might say
                   1244:      that something smarter should happen. */
                   1245: 
                   1246:   if (limit < buf)
                   1247:     abort ();
                   1248: 
                   1249:   /* Find the beginning of the trailing whitespace.  */
                   1250:   p = buf;
                   1251:   while (p < limit && is_space[limit[-1]]) limit--;
                   1252: 
                   1253:   /* Allocate space for the text in the macro definition.
                   1254:      Leading and trailing whitespace chars need 2 bytes each.
                   1255:      Each other input char may or may not need 1 byte,
                   1256:      so this is an upper bound.  The extra 5 are for invented
                   1257:      leading and trailing newline-marker and final null.  */
                   1258:   maxsize = (sizeof (DEFINITION)
                   1259:             + (limit - p) + 5);
                   1260:   /* Occurrences of '@' get doubled, so allocate extra space for them. */
                   1261:   while (p < limit)
                   1262:     if (*p++ == '@')
                   1263:       maxsize++;
                   1264:   defn = (DEFINITION *) xcalloc (1, maxsize);
                   1265: 
                   1266:   defn->nargs = nargs;
                   1267:   exp_p = defn->expansion = (U_CHAR *) defn + sizeof (DEFINITION);
                   1268:   lastp = exp_p;
                   1269: 
                   1270:   p = buf;
                   1271: 
                   1272:   /* Add one initial space escape-marker to prevent accidental
                   1273:      token-pasting (often removed by macroexpand). */
                   1274:   *exp_p++ = '@';
                   1275:   *exp_p++ = ' ';
                   1276: 
                   1277:   if (limit - p >= 2 && p[0] == '#' && p[1] == '#') {
                   1278:     cpp_error (pfile, "`##' at start of macro definition");
                   1279:     p += 2;
                   1280:   }
                   1281: 
                   1282:   /* Process the main body of the definition.  */
                   1283:   while (p < limit) {
                   1284:     int skipped_arg = 0;
                   1285:     register U_CHAR c = *p++;
                   1286: 
                   1287:     *exp_p++ = c;
                   1288: 
                   1289:     if (!CPP_TRADITIONAL (pfile)) {
                   1290:       switch (c) {
                   1291:       case '\'':
                   1292:       case '\"':
                   1293:         if (expected_delimiter != '\0') {
                   1294:           if (c == expected_delimiter)
                   1295:             expected_delimiter = '\0';
                   1296:         } else
                   1297:           expected_delimiter = c;
                   1298:        break;
                   1299: 
                   1300:       case '\\':
                   1301:        if (p < limit && expected_delimiter) {
                   1302:          /* In a string, backslash goes through
                   1303:             and makes next char ordinary.  */
                   1304:          *exp_p++ = *p++;
                   1305:        }
                   1306:        break;
                   1307: 
                   1308:       case '@':
                   1309:        /* An '@' in a string or character constant stands for itself,
                   1310:           and does not need to be escaped. */
                   1311:        if (!expected_delimiter)
                   1312:          *exp_p++ = c;
                   1313:        break;
                   1314: 
                   1315:       case '#':
                   1316:        /* # is ordinary inside a string.  */
                   1317:        if (expected_delimiter)
                   1318:          break;
                   1319:        if (p < limit && *p == '#') {
                   1320:          /* ##: concatenate preceding and following tokens.  */
                   1321:          /* Take out the first #, discard preceding whitespace.  */
                   1322:          exp_p--;
                   1323:          while (exp_p > lastp && is_hor_space[exp_p[-1]])
                   1324:            --exp_p;
                   1325:          /* Skip the second #.  */
                   1326:          p++;
                   1327:          /* Discard following whitespace.  */
                   1328:          SKIP_WHITE_SPACE (p);
                   1329:          concat = p;
                   1330:          if (p == limit)
                   1331:            cpp_error (pfile, "`##' at end of macro definition");
                   1332:        } else if (nargs >= 0) {
                   1333:          /* Single #: stringify following argument ref.
                   1334:             Don't leave the # in the expansion.  */
                   1335:          exp_p--;
                   1336:          SKIP_WHITE_SPACE (p);
                   1337:          if (p == limit || ! is_idstart[*p])
                   1338:            cpp_error (pfile,
                   1339:                     "`#' operator is not followed by a macro argument name");
                   1340:          else
                   1341:            stringify = p;
                   1342:        }
                   1343:        break;
                   1344:       }
                   1345:     } else {
                   1346:       /* In -traditional mode, recognize arguments inside strings and
                   1347:         and character constants, and ignore special properties of #.
                   1348:         Arguments inside strings are considered "stringified", but no
                   1349:         extra quote marks are supplied.  */
                   1350:       switch (c) {
                   1351:       case '\'':
                   1352:       case '\"':
                   1353:        if (expected_delimiter != '\0') {
                   1354:          if (c == expected_delimiter)
                   1355:            expected_delimiter = '\0';
                   1356:        } else
                   1357:          expected_delimiter = c;
                   1358:        break;
                   1359: 
                   1360:       case '\\':
                   1361:        /* Backslash quotes delimiters and itself, but not macro args.  */
                   1362:        if (expected_delimiter != 0 && p < limit
                   1363:            && (*p == expected_delimiter || *p == '\\')) {
                   1364:          *exp_p++ = *p++;
                   1365:          continue;
                   1366:        }
                   1367:        break;
                   1368: 
                   1369:       case '/':
                   1370:        if (expected_delimiter != '\0') /* No comments inside strings.  */
                   1371:          break;
                   1372:        if (*p == '*') {
                   1373:          /* If we find a comment that wasn't removed by handle_directive,
                   1374:             this must be -traditional.  So replace the comment with
                   1375:             nothing at all.  */
                   1376:          exp_p--;
                   1377:          p += 1;
                   1378:          while (p < limit && !(p[-2] == '*' && p[-1] == '/'))
                   1379:            p++;
                   1380: #if 0
                   1381:          /* Mark this as a concatenation-point, as if it had been ##.  */
                   1382:          concat = p;
                   1383: #endif
                   1384:        }
                   1385:        break;
                   1386:       }
                   1387:     }
                   1388: 
                   1389:     /* Handle the start of a symbol.  */
                   1390:     if (is_idchar[c] && nargs > 0) {
                   1391:       U_CHAR *id_beg = p - 1;
                   1392:       int id_len;
                   1393: 
                   1394:       --exp_p;
                   1395:       while (p != limit && is_idchar[*p]) p++;
                   1396:       id_len = p - id_beg;
                   1397: 
                   1398:       if (is_idstart[c]) {
                   1399:        register struct arglist *arg;
                   1400: 
                   1401:        for (arg = arglist; arg != NULL; arg = arg->next) {
                   1402:          struct reflist *tpat;
                   1403: 
                   1404:          if (arg->name[0] == c
                   1405:              && arg->length == id_len
                   1406:              && strncmp (arg->name, id_beg, id_len) == 0) {
                   1407:            if (expected_delimiter && CPP_OPTIONS (pfile)->warn_stringify) {
                   1408:              if (CPP_TRADITIONAL (pfile)) {
                   1409:                cpp_warning (pfile, "macro argument `%.*s' is stringified.",
                   1410:                             id_len, arg->name);
                   1411:              } else {
                   1412:                cpp_warning (pfile,
                   1413:                    "macro arg `%.*s' would be stringified with -traditional.",
                   1414:                             id_len, arg->name);
                   1415:              }
                   1416:            }
                   1417:            /* If ANSI, don't actually substitute inside a string.  */
                   1418:            if (!CPP_TRADITIONAL (pfile) && expected_delimiter)
                   1419:              break;
                   1420:            /* make a pat node for this arg and append it to the end of
                   1421:               the pat list */
                   1422:            tpat = (struct reflist *) xmalloc (sizeof (struct reflist));
                   1423:            tpat->next = NULL;
                   1424:            tpat->raw_before = concat == id_beg;
                   1425:            tpat->raw_after = 0;
                   1426:            tpat->rest_args = arg->rest_args;
                   1427:            tpat->stringify = (CPP_TRADITIONAL (pfile)
                   1428:                               ? expected_delimiter != '\0'
                   1429:                               : stringify == id_beg);
                   1430: 
                   1431:            if (endpat == NULL)
                   1432:              defn->pattern = tpat;
                   1433:            else
                   1434:              endpat->next = tpat;
                   1435:            endpat = tpat;
                   1436: 
                   1437:            tpat->argno = arg->argno;
                   1438:            tpat->nchars = exp_p - lastp;
                   1439:            {
                   1440:              register U_CHAR *p1 = p;
                   1441:              SKIP_WHITE_SPACE (p1);
                   1442:              if (p1 + 2 <= limit && p1[0] == '#' && p1[1] == '#')
                   1443:                tpat->raw_after = 1;
                   1444:            }
                   1445:            lastp = exp_p;      /* place to start copying from next time */
                   1446:            skipped_arg = 1;
                   1447:            break;
                   1448:          }
                   1449:        }
                   1450:       }
                   1451: 
                   1452:       /* If this was not a macro arg, copy it into the expansion.  */
                   1453:       if (! skipped_arg) {
                   1454:        register U_CHAR *lim1 = p;
                   1455:        p = id_beg;
                   1456:        while (p != lim1)
                   1457:          *exp_p++ = *p++;
                   1458:        if (stringify == id_beg)
                   1459:          cpp_error (pfile,
                   1460:                   "`#' operator should be followed by a macro argument name");
                   1461:       }
                   1462:     }
                   1463:   }
                   1464: 
                   1465:   if (!CPP_TRADITIONAL (pfile) && expected_delimiter == 0)
                   1466:     {
                   1467:       /* If ANSI, put in a "@ " marker to prevent token pasting.
                   1468:          But not if "inside a string" (which in ANSI mode
                   1469:          happens only for -D option).  */
                   1470:       *exp_p++ = '@';
                   1471:       *exp_p++ = ' ';
                   1472:     }
                   1473: 
                   1474:   *exp_p = '\0';
                   1475: 
                   1476:   defn->length = exp_p - defn->expansion;
                   1477: 
                   1478:   /* Crash now if we overrun the allocated size.  */
                   1479:   if (defn->length + 1 > maxsize)
                   1480:     abort ();
                   1481: 
                   1482: #if 0
                   1483: /* This isn't worth the time it takes.  */
                   1484:   /* give back excess storage */
                   1485:   defn->expansion = (U_CHAR *) xrealloc (defn->expansion, defn->length + 1);
                   1486: #endif
                   1487: 
                   1488:   return defn;
                   1489: }
                   1490: 
                   1491: /*
                   1492:  * special extension string that can be added to the last macro argument to 
                   1493:  * allow it to absorb the "rest" of the arguments when expanded.  Ex:
                   1494:  *             #define wow(a, b...)            process (b, a, b)
                   1495:  *             { wow (1, 2, 3); }      ->      { process (2, 3, 1, 2, 3); }
                   1496:  *             { wow (one, two); }     ->      { process (two, one, two); }
                   1497:  * if this "rest_arg" is used with the concat token '##' and if it is not
                   1498:  * supplied then the token attached to with ## will not be outputted.  Ex:
                   1499:  *             #define wow (a, b...)           process (b ## , a, ## b)
                   1500:  *             { wow (1, 2); }         ->      { process (2, 1, 2); }
                   1501:  *             { wow (one); }          ->      { process (one); {
                   1502:  */
                   1503: static char rest_extension[] = "...";
                   1504: #define REST_EXTENSION_LENGTH  (sizeof (rest_extension) - 1)
                   1505: 
                   1506: /* Create a DEFINITION node from a #define directive.  Arguments are 
                   1507:    as for do_define. */
                   1508: static MACRODEF
                   1509: create_definition (buf, limit, pfile, predefinition)
                   1510:      U_CHAR *buf, *limit;
                   1511:      cpp_reader *pfile;
                   1512:      int predefinition;
                   1513: {
                   1514:   U_CHAR *bp;                  /* temp ptr into input buffer */
                   1515:   U_CHAR *symname;             /* remember where symbol name starts */
                   1516:   int sym_length;              /* and how long it is */
                   1517:   int rest_args = 0;
                   1518:   long line, col;
                   1519:   char *file = CPP_BUFFER (pfile) ? CPP_BUFFER (pfile)->nominal_fname : "";
                   1520:   DEFINITION *defn;
                   1521:   int arglengths = 0;          /* Accumulate lengths of arg names
                   1522:                                   plus number of args.  */
                   1523:   MACRODEF mdef;
                   1524:   cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, &col);
                   1525: 
                   1526:   bp = buf;
                   1527: 
                   1528:   while (is_hor_space[*bp])
                   1529:     bp++;
                   1530: 
                   1531:   symname = bp;                        /* remember where it starts */
                   1532: 
                   1533:   sym_length = check_macro_name (pfile, bp, "macro");
                   1534:   bp += sym_length;
                   1535: 
                   1536:   /* Lossage will occur if identifiers or control keywords are broken
                   1537:      across lines using backslash.  This is not the right place to take
                   1538:      care of that. */
                   1539: 
                   1540:   if (*bp == '(') {
                   1541:     struct arglist *arg_ptrs = NULL;
                   1542:     int argno = 0;
                   1543: 
                   1544:     bp++;                      /* skip '(' */
                   1545:     SKIP_WHITE_SPACE (bp);
                   1546: 
                   1547:     /* Loop over macro argument names.  */
                   1548:     while (*bp != ')') {
                   1549:       struct arglist *temp;
                   1550: 
                   1551:       temp = (struct arglist *) alloca (sizeof (struct arglist));
                   1552:       temp->name = bp;
                   1553:       temp->next = arg_ptrs;
                   1554:       temp->argno = argno++;
                   1555:       temp->rest_args = 0;
                   1556:       arg_ptrs = temp;
                   1557: 
                   1558:       if (rest_args)
                   1559:        cpp_pedwarn (pfile, "another parameter follows `%s'", rest_extension);
                   1560: 
                   1561:       if (!is_idstart[*bp])
                   1562:        cpp_pedwarn (pfile, "invalid character in macro parameter name");
                   1563:       
                   1564:       /* Find the end of the arg name.  */
                   1565:       while (is_idchar[*bp]) {
                   1566:        bp++;
                   1567:        /* do we have a "special" rest-args extension here? */
                   1568:        if (limit - bp > REST_EXTENSION_LENGTH &&
                   1569:            strncmp (rest_extension, bp, REST_EXTENSION_LENGTH) == 0) {
                   1570:          rest_args = 1;
                   1571:          temp->rest_args = 1;
                   1572:          break;
                   1573:        }
                   1574:       }
                   1575:       temp->length = bp - temp->name;
                   1576:       if (rest_args == 1)
                   1577:        bp += REST_EXTENSION_LENGTH;
                   1578:       arglengths += temp->length + 2;
                   1579:       SKIP_WHITE_SPACE (bp);
                   1580:       if (temp->length == 0 || (*bp != ',' && *bp != ')')) {
                   1581:        cpp_error (pfile, "badly punctuated parameter list in `#define'");
                   1582:        goto nope;
                   1583:       }
                   1584:       if (*bp == ',') {
                   1585:        bp++;
                   1586:        SKIP_WHITE_SPACE (bp);
                   1587:       }
                   1588:       if (bp >= limit) {
                   1589:        cpp_error (pfile, "unterminated parameter list in `#define'");
                   1590:        goto nope;
                   1591:       }
                   1592:       {
                   1593:        struct arglist *otemp;
                   1594: 
                   1595:        for (otemp = temp->next; otemp != NULL; otemp = otemp->next)
                   1596:          if (temp->length == otemp->length &&
                   1597:            strncmp (temp->name, otemp->name, temp->length) == 0) {
                   1598:              U_CHAR *name;
                   1599: 
                   1600:              name = (U_CHAR *) alloca (temp->length + 1);
                   1601:              (void) strncpy (name, temp->name, temp->length);
                   1602:              name[temp->length] = '\0';
                   1603:              cpp_error (pfile,
                   1604:                         "duplicate argument name `%s' in `#define'", name);
                   1605:              goto nope;
                   1606:          }
                   1607:       }
                   1608:     }
                   1609: 
                   1610:     ++bp;                      /* skip paren */
                   1611:     SKIP_WHITE_SPACE (bp);
                   1612:     /* now everything from bp before limit is the definition. */
                   1613:     defn = collect_expansion (pfile, bp, limit, argno, arg_ptrs);
                   1614:     defn->rest_args = rest_args;
                   1615: 
                   1616:     /* Now set defn->args.argnames to the result of concatenating
                   1617:        the argument names in reverse order
                   1618:        with comma-space between them.  */
                   1619:     defn->args.argnames = (U_CHAR *) xmalloc (arglengths + 1);
                   1620:     {
                   1621:       struct arglist *temp;
                   1622:       int i = 0;
                   1623:       for (temp = arg_ptrs; temp; temp = temp->next) {
                   1624:        bcopy (temp->name, &defn->args.argnames[i], temp->length);
                   1625:        i += temp->length;
                   1626:        if (temp->next != 0) {
                   1627:          defn->args.argnames[i++] = ',';
                   1628:          defn->args.argnames[i++] = ' ';
                   1629:        }
                   1630:       }
                   1631:       defn->args.argnames[i] = 0;
                   1632:     }
                   1633:   } else {
                   1634:     /* Simple expansion or empty definition.  */
                   1635: 
                   1636:     if (bp < limit)
                   1637:       {
                   1638:        if (is_hor_space[*bp]) {
                   1639:          bp++;
                   1640:          SKIP_WHITE_SPACE (bp);
                   1641:        } else {
                   1642:          switch (*bp) {
                   1643:            case '!':  case '"':  case '#':  case '%':  case '&':  case '\'':
                   1644:            case ')':  case '*':  case '+':  case ',':  case '-':  case '.':
                   1645:            case '/':  case ':':  case ';':  case '<':  case '=':  case '>':
                   1646:            case '?':  case '[':  case '\\': case ']':  case '^':  case '{':
                   1647:            case '|':  case '}':  case '~':
                   1648:              cpp_warning (pfile, "missing white space after `#define %.*s'",
                   1649:                           sym_length, symname);
                   1650:              break;
                   1651: 
                   1652:            default:
                   1653:              cpp_pedwarn (pfile, "missing white space after `#define %.*s'",
                   1654:                           sym_length, symname);
                   1655:              break;
                   1656:          }
                   1657:        }
                   1658:       }
                   1659:     /* now everything from bp before limit is the definition. */
                   1660:     defn = collect_expansion (pfile, bp, limit, -1, NULL_PTR);
                   1661:     defn->args.argnames = (U_CHAR *) "";
                   1662:   }
                   1663: 
                   1664:   defn->line = line;
                   1665:   defn->file = file;
                   1666: 
                   1667:   /* OP is null if this is a predefinition */
                   1668:   defn->predefined = predefinition;
                   1669:   mdef.defn = defn;
                   1670:   mdef.symnam = symname;
                   1671:   mdef.symlen = sym_length;
                   1672: 
                   1673:   return mdef;
                   1674: 
                   1675:  nope:
                   1676:   mdef.defn = 0;
                   1677:   return mdef;
                   1678: }
                   1679: 
                   1680: /* Check a purported macro name SYMNAME, and yield its length.
                   1681:    USAGE is the kind of name this is intended for.  */
                   1682: 
                   1683: static int
                   1684: check_macro_name (pfile, symname, usage)
                   1685:      cpp_reader *pfile;
                   1686:      U_CHAR *symname;
                   1687:      char *usage;
                   1688: {
                   1689:   U_CHAR *p;
                   1690:   int sym_length;
                   1691: 
                   1692:   for (p = symname; is_idchar[*p]; p++)
                   1693:     ;
                   1694:   sym_length = p - symname;
                   1695:   if (sym_length == 0)
                   1696:     cpp_error (pfile, "invalid %s name", usage);
                   1697:   else if (!is_idstart[*symname]) {
                   1698:     U_CHAR *msg;                       /* what pain... */
                   1699:     msg = (U_CHAR *) alloca (sym_length + 1);
                   1700:     bcopy (symname, msg, sym_length);
                   1701:     msg[sym_length] = 0;
                   1702:     cpp_error (pfile, "invalid %s name `%s'", usage, msg);
                   1703:   } else {
                   1704:     if (! strncmp (symname, "defined", 7) && sym_length == 7)
                   1705:       cpp_error (pfile, "invalid %s name `defined'", usage);
                   1706:   }
                   1707:   return sym_length;
                   1708: }
                   1709: 
                   1710: /*
                   1711:  * return zero if two DEFINITIONs are isomorphic
                   1712:  */
                   1713: static int
                   1714: compare_defs (d1, d2)
                   1715:      DEFINITION *d1, *d2;
                   1716: {
                   1717:   register struct reflist *a1, *a2;
                   1718:   register U_CHAR *p1 = d1->expansion;
                   1719:   register U_CHAR *p2 = d2->expansion;
                   1720:   int first = 1;
                   1721: 
                   1722:   if (d1->nargs != d2->nargs)
                   1723:     return 1;
                   1724:   if (strcmp ((char *)d1->args.argnames, (char *)d2->args.argnames))
                   1725:     return 1;
                   1726:   for (a1 = d1->pattern, a2 = d2->pattern; a1 && a2;
                   1727:        a1 = a1->next, a2 = a2->next) {
                   1728:     if (!((a1->nchars == a2->nchars && ! strncmp (p1, p2, a1->nchars))
                   1729:          || ! comp_def_part (first, p1, a1->nchars, p2, a2->nchars, 0))
                   1730:        || a1->argno != a2->argno
                   1731:        || a1->stringify != a2->stringify
                   1732:        || a1->raw_before != a2->raw_before
                   1733:        || a1->raw_after != a2->raw_after)
                   1734:       return 1;
                   1735:     first = 0;
                   1736:     p1 += a1->nchars;
                   1737:     p2 += a2->nchars;
                   1738:   }
                   1739:   if (a1 != a2)
                   1740:     return 1;
                   1741:   if (comp_def_part (first, p1, d1->length - (p1 - d1->expansion),
                   1742:                     p2, d2->length - (p2 - d2->expansion), 1))
                   1743:     return 1;
                   1744:   return 0;
                   1745: }
                   1746: 
                   1747: /* Return 1 if two parts of two macro definitions are effectively different.
                   1748:    One of the parts starts at BEG1 and has LEN1 chars;
                   1749:    the other has LEN2 chars at BEG2.
                   1750:    Any sequence of whitespace matches any other sequence of whitespace.
                   1751:    FIRST means these parts are the first of a macro definition;
                   1752:     so ignore leading whitespace entirely.
                   1753:    LAST means these parts are the last of a macro definition;
                   1754:     so ignore trailing whitespace entirely.  */
                   1755: 
                   1756: static int
                   1757: comp_def_part (first, beg1, len1, beg2, len2, last)
                   1758:      int first;
                   1759:      U_CHAR *beg1, *beg2;
                   1760:      int len1, len2;
                   1761:      int last;
                   1762: {
                   1763:   register U_CHAR *end1 = beg1 + len1;
                   1764:   register U_CHAR *end2 = beg2 + len2;
                   1765:   if (first) {
                   1766:     while (beg1 != end1 && is_space[*beg1]) beg1++;
                   1767:     while (beg2 != end2 && is_space[*beg2]) beg2++;
                   1768:   }
                   1769:   if (last) {
                   1770:     while (beg1 != end1 && is_space[end1[-1]]) end1--;
                   1771:     while (beg2 != end2 && is_space[end2[-1]]) end2--;
                   1772:   }
                   1773:   while (beg1 != end1 && beg2 != end2) {
                   1774:     if (is_space[*beg1] && is_space[*beg2]) {
                   1775:       while (beg1 != end1 && is_space[*beg1]) beg1++;
                   1776:       while (beg2 != end2 && is_space[*beg2]) beg2++;
                   1777:     } else if (*beg1 == *beg2) {
                   1778:       beg1++; beg2++;
                   1779:     } else break;
                   1780:   }
                   1781:   return (beg1 != end1) || (beg2 != end2);
                   1782: }
                   1783: 
                   1784: /* Process a #define command.
                   1785: BUF points to the contents of the #define command, as a contiguous string.
                   1786: LIMIT points to the first character past the end of the definition.
                   1787: KEYWORD is the keyword-table entry for #define,
                   1788: or NULL for a "predefined" macro.  */
                   1789: 
                   1790: static int
                   1791: do_define (pfile, keyword, buf, limit)
                   1792:      cpp_reader *pfile;
                   1793:      struct directive *keyword;
                   1794:      U_CHAR *buf, *limit;
                   1795: {
                   1796:   int hashcode;
                   1797:   MACRODEF mdef;
                   1798:   HASHNODE *hp;
                   1799: 
                   1800: #if 0
                   1801:   /* If this is a precompiler run (with -pcp) pass thru #define commands.  */
                   1802:   if (pcp_outfile && keyword)
                   1803:     pass_thru_directive (buf, limit, pfile, keyword);
                   1804: #endif
                   1805: 
                   1806:   mdef = create_definition (buf, limit, pfile, keyword == NULL);
                   1807:   if (mdef.defn == 0)
                   1808:     goto nope;
                   1809: 
                   1810:   hashcode = hashf (mdef.symnam, mdef.symlen, HASHSIZE);
                   1811: 
                   1812:   if ((hp = cpp_lookup (pfile, mdef.symnam, mdef.symlen, hashcode)) != NULL)
                   1813:     {
                   1814:       int ok = 0;
                   1815:       /* Redefining a precompiled key is ok.  */
                   1816:       if (hp->type == T_PCSTRING)
                   1817:        ok = 1;
                   1818:       /* Redefining a macro is ok if the definitions are the same.  */
                   1819:       else if (hp->type == T_MACRO)
                   1820:        ok = ! compare_defs (mdef.defn, hp->value.defn);
                   1821:       /* Redefining a constant is ok with -D.  */
                   1822:       else if (hp->type == T_CONST)
                   1823:         ok = ! CPP_OPTIONS (pfile)->done_initializing;
                   1824:       /* Print the warning if it's not ok.  */
                   1825:       if (!ok)
                   1826:        {
                   1827:          U_CHAR *msg;          /* what pain... */
                   1828: 
                   1829:          /* If we are passing through #define and #undef directives, do
                   1830:             that for this re-definition now.  */
                   1831:          if (CPP_OPTIONS (pfile)->debug_output && keyword)
                   1832:            pass_thru_directive (buf, limit, pfile, keyword);
                   1833: 
                   1834:          msg = (U_CHAR *) alloca (mdef.symlen + 22);
                   1835:          *msg = '`';
                   1836:          bcopy (mdef.symnam, msg + 1, mdef.symlen);
                   1837:          strcpy ((char *) (msg + mdef.symlen + 1), "' redefined");
                   1838:          cpp_pedwarn (pfile, msg);
                   1839:          if (hp->type == T_MACRO)
                   1840:            cpp_pedwarn_with_file_and_line (pfile, hp->value.defn->file, hp->value.defn->line,
                   1841:                                      "this is the location of the previous definition");
                   1842:        }
                   1843:       /* Replace the old definition.  */
                   1844:       hp->type = T_MACRO;
                   1845:       hp->value.defn = mdef.defn;
                   1846:     }
                   1847:   else
                   1848:     {
                   1849:       /* If we are passing through #define and #undef directives, do
                   1850:         that for this new definition now.  */
                   1851:       if (CPP_OPTIONS (pfile)->debug_output && keyword)
                   1852:        pass_thru_directive (buf, limit, pfile, keyword);
                   1853:       install (mdef.symnam, mdef.symlen, T_MACRO, 0,
                   1854:               (char *) mdef.defn, hashcode);
                   1855:     }
                   1856: 
                   1857:   return 0;
                   1858: 
                   1859: nope:
                   1860: 
                   1861:   return 1;
                   1862: }
                   1863: 
                   1864: /* This structure represents one parsed argument in a macro call.
                   1865:    `raw' points to the argument text as written (`raw_length' is its length).
                   1866:    `expanded' points to the argument's macro-expansion
                   1867:    (its length is `expand_length').
                   1868:    `stringified_length' is the length the argument would have
                   1869:    if stringified.
                   1870:    `use_count' is the number of times this macro arg is substituted
                   1871:    into the macro.  If the actual use count exceeds 10, 
                   1872:    the value stored is 10. */
                   1873: 
                   1874: /* raw and expanded are relative to ARG_BASE */
                   1875: #define ARG_BASE ((pfile)->token_buffer)
                   1876: 
                   1877: struct argdata {
                   1878:   /* Strings relative to pfile->token_buffer */
                   1879:   long raw, expanded, stringified;
                   1880:   int raw_length, expand_length;
                   1881:   int stringified_length;
                   1882:   char newlines;
                   1883:   char use_count;
                   1884: };
                   1885: 
                   1886: 
                   1887: cpp_buffer*
                   1888: cpp_push_buffer (pfile, buffer, length)
                   1889:      cpp_reader *pfile;
                   1890:      U_CHAR *buffer;
                   1891:      long length;
                   1892: {
                   1893: #ifdef STATIC_BUFFERS
                   1894:   register cpp_buffer *buf = CPP_BUFFER (pfile);
                   1895:   if (buf == pfile->buffer_stack)
                   1896:     fatal ("%s: macro or `#include' recursion too deep", buf->fname);
                   1897:   buf--;
                   1898:   bzero ((char *) buf, sizeof (cpp_buffer));
                   1899:   CPP_BUFFER (pfile) = buf;
                   1900: #else
                   1901:   register cpp_buffer *buf = (cpp_buffer*) xmalloc (sizeof(cpp_buffer));
                   1902:   bzero ((char *) buf, sizeof (cpp_buffer));
                   1903:   CPP_PREV_BUFFER (buf) = CPP_BUFFER (pfile);
                   1904:   CPP_BUFFER (pfile) = buf;
                   1905: #endif
                   1906:   buf->if_stack = pfile->if_stack;
                   1907:   buf->cleanup = null_cleanup;
                   1908:   buf->underflow = null_underflow;
                   1909:   buf->buf = buf->cur = buffer;
                   1910:   buf->alimit = buf->rlimit = buffer + length;
                   1911:   
                   1912:   return buf;
                   1913: }
                   1914: 
                   1915: cpp_buffer*
                   1916: cpp_pop_buffer (pfile)
                   1917:      cpp_reader *pfile;
                   1918: {
                   1919:   cpp_buffer *buf = CPP_BUFFER (pfile);
                   1920: #ifdef STATIC_BUFFERS
                   1921:   (*buf->cleanup) (buf, pfile);
                   1922:   return ++CPP_BUFFER (pfile);
                   1923: #else
                   1924:   cpp_buffer *next_buf = CPP_PREV_BUFFER (buf);
                   1925:   (*buf->cleanup) (buf, pfile);
                   1926:   CPP_BUFFER (pfile) = next_buf;
                   1927:   free (buf);
                   1928:   return next_buf;
                   1929: #endif
                   1930: }
                   1931: 
                   1932: /* Scan until CPP_BUFFER (PFILE) is exhausted into PFILE->token_buffer.
                   1933:    Pop the buffer when done. */
                   1934: 
                   1935: void
                   1936: cpp_scan_buffer (pfile)
                   1937:      cpp_reader *pfile;
                   1938: {
                   1939:   cpp_buffer *buffer = CPP_BUFFER (pfile);
                   1940:   for (;;)
                   1941:     {
                   1942:       enum cpp_token token = cpp_get_token (pfile);
                   1943:       if (token == CPP_EOF) /* Should not happen ... */
                   1944:        break;
                   1945:       if (token == CPP_POP && CPP_BUFFER (pfile) == buffer)
                   1946:        {
                   1947:          cpp_pop_buffer (pfile);
                   1948:          break;
                   1949:        }
                   1950:     }
                   1951: }
                   1952: 
                   1953: /*
                   1954:  * Rescan a string (which may have escape marks) into pfile's buffer.
                   1955:  * Place the result in pfile->token_buffer.
                   1956:  *
                   1957:  * The input is copied before it is scanned, so it is safe to pass
                   1958:  * it something from the token_buffer that will get overwritten
                   1959:  * (because it follows CPP_WRITTEN).  This is used by do_include.
                   1960:  */
                   1961: 
                   1962: static void
                   1963: cpp_expand_to_buffer (pfile, buf, length)
                   1964:      cpp_reader *pfile;
                   1965:      U_CHAR *buf;
                   1966:      int length;
                   1967: {
                   1968:   register cpp_buffer *ip;
                   1969:   cpp_buffer obuf;
                   1970:   U_CHAR *limit = buf + length;
                   1971:   U_CHAR *buf1;
                   1972: #if 0
                   1973:   int odepth = indepth;
                   1974: #endif
                   1975: 
                   1976:   if (length < 0)
                   1977:     abort ();
                   1978: 
                   1979:   /* Set up the input on the input stack.  */
                   1980: 
                   1981:   buf1 = (U_CHAR *) alloca (length + 1);
                   1982:   {
                   1983:     register U_CHAR *p1 = buf;
                   1984:     register U_CHAR *p2 = buf1;
                   1985: 
                   1986:     while (p1 != limit)
                   1987:       *p2++ = *p1++;
                   1988:   }
                   1989:   buf1[length] = 0;
                   1990: 
                   1991:   ip = cpp_push_buffer (pfile, buf1, length);
                   1992:   ip->has_escapes = 1;
                   1993: #if 0
                   1994:   ip->lineno = obuf.lineno = 1;
                   1995: #endif
                   1996: 
                   1997:   /* Scan the input, create the output.  */
                   1998:   cpp_scan_buffer (pfile);
                   1999: 
                   2000: #if 0
                   2001:   if (indepth != odepth)
                   2002:     abort ();
                   2003: #endif
                   2004: 
                   2005:   CPP_NUL_TERMINATE (pfile);
                   2006: }
                   2007: 
                   2008: 
                   2009: static void
                   2010: adjust_position (buf, limit, linep, colp)
                   2011:      U_CHAR *buf;
                   2012:      U_CHAR *limit;
                   2013:      long *linep;
                   2014:      long *colp;
                   2015: {
                   2016:   while (buf < limit)
                   2017:     {
                   2018:       U_CHAR ch = *buf++;
                   2019:       if (ch == '\n')
                   2020:        (*linep)++, (*colp) = 1;
                   2021:       else
                   2022:        (*colp)++;
                   2023:     }
                   2024: }
                   2025: 
                   2026: /* Move line_base forward, updating lineno and colno. */
                   2027: 
                   2028: static void
                   2029: update_position (pbuf)
                   2030:      register cpp_buffer *pbuf;
                   2031: {
                   2032:   unsigned char *old_pos = pbuf->buf + pbuf->line_base;
                   2033:   unsigned char *new_pos = pbuf->cur;
                   2034:   register struct parse_marker *mark;
                   2035:   for (mark = pbuf->marks;  mark != NULL; mark = mark->next)
                   2036:     {
                   2037:       if (pbuf->buf + mark->position < new_pos)
                   2038:        new_pos = pbuf->buf + mark->position;
                   2039:     }
                   2040:   pbuf->line_base += new_pos - old_pos;
                   2041:   adjust_position (old_pos, new_pos, &pbuf->lineno, &pbuf->colno);
                   2042: }
                   2043: 
                   2044: void
                   2045: cpp_buf_line_and_col (pbuf, linep, colp)
                   2046:      register cpp_buffer *pbuf;
                   2047:      long *linep, *colp;
                   2048: {
                   2049:   long dummy;
                   2050:   if (colp == NULL)
                   2051:     colp = &dummy;
                   2052:   if (pbuf)
                   2053:     {
                   2054:       *linep = pbuf->lineno;
                   2055:       *colp = pbuf->colno;
                   2056:       adjust_position (pbuf->buf + pbuf->line_base, pbuf->cur, linep, colp);
                   2057:     }
                   2058:   else
                   2059:     {
                   2060:       *linep = 0;
                   2061:       *colp = 0;
                   2062:     }
                   2063: }
                   2064: 
                   2065: /* Return the cpp_buffer that corresponds to a file (not a macro). */
                   2066: 
                   2067: cpp_buffer*
                   2068: cpp_file_buffer (pfile)
                   2069:      cpp_reader *pfile;
                   2070: {
                   2071:   cpp_buffer *ip = CPP_BUFFER (pfile);
                   2072: 
                   2073:   for ( ; ip != CPP_NULL_BUFFER (pfile); ip = CPP_PREV_BUFFER (ip))
                   2074:     if (ip->fname != NULL)
                   2075:       return ip;
                   2076:   return NULL;
                   2077: }
                   2078: 
                   2079: static long
                   2080: count_newlines (buf, limit)
                   2081:      register U_CHAR *buf;
                   2082:      register U_CHAR *limit;
                   2083: {
                   2084:   register long count = 0;
                   2085:   while (buf < limit)
                   2086:     {
                   2087:       U_CHAR ch = *buf++;
                   2088:       if (ch == '\n')
                   2089:        count++;
                   2090:     }
                   2091:   return count;
                   2092: }
                   2093: 
                   2094: /*
                   2095:  * write out a #line command, for instance, after an #include file.
                   2096:  * If CONDITIONAL is nonzero, we can omit the #line if it would
                   2097:  * appear to be a no-op, and we can output a few newlines instead
                   2098:  * if we want to increase the line number by a small amount.
                   2099:  * FILE_CHANGE says whether we are entering a file, leaving, or neither.
                   2100:  */
                   2101: 
                   2102: static void
                   2103: output_line_command (pfile, conditional, file_change)
                   2104:      cpp_reader *pfile;
                   2105:      int conditional;
                   2106:      enum file_change_code file_change;
                   2107: {
                   2108:   int len;
                   2109:   char *line_cmd_buf, *line_end;
                   2110:   long line, col;
                   2111:   cpp_buffer *ip = CPP_BUFFER (pfile);
                   2112: 
                   2113:   if (ip->fname == NULL || CPP_OPTIONS (pfile)->no_output) {
                   2114:     return;
                   2115:   }
                   2116: 
                   2117:   update_position (ip);
                   2118:   line = CPP_BUFFER (pfile)->lineno;
                   2119:   col = CPP_BUFFER (pfile)->colno;
                   2120:   adjust_position (CPP_LINE_BASE (ip), ip->cur, &line, &col);
                   2121: 
                   2122:   if (CPP_OPTIONS (pfile)->no_line_commands)
                   2123:     return;
                   2124: 
                   2125:   if (conditional) {
                   2126:     if (line == pfile->lineno)
                   2127:       return;
                   2128: 
                   2129:     /* If the inherited line number is a little too small,
                   2130:        output some newlines instead of a #line command.  */
                   2131:     if (line > pfile->lineno && line < pfile->lineno + 8) {
                   2132:       CPP_RESERVE (pfile, 20);
                   2133:       while (line > pfile->lineno) {
                   2134:        CPP_PUTC_Q (pfile, '\n');
                   2135:        pfile->lineno++;
                   2136:       }
                   2137:       return;
                   2138:     }
                   2139:   }
                   2140: 
                   2141: #if 0
                   2142:   /* Don't output a line number of 0 if we can help it.  */
                   2143:   if (ip->lineno == 0 && ip->bufp - ip->buf < ip->length
                   2144:       && *ip->bufp == '\n') {
                   2145:     ip->lineno++;
                   2146:     ip->bufp++;
                   2147:   }
                   2148: #endif
                   2149: 
                   2150:   CPP_RESERVE (pfile, 4 * strlen (ip->nominal_fname) + 50);
                   2151:   {
                   2152: #ifdef OUTPUT_LINE_COMMANDS
                   2153:     static char sharp_line[] = "#line ";
                   2154: #else
                   2155:     static char sharp_line[] = "# ";
                   2156: #endif
                   2157:     CPP_PUTS_Q (pfile, sharp_line, sizeof(sharp_line)-1);
                   2158:   }
                   2159: 
                   2160:   sprintf (CPP_PWRITTEN (pfile), "%d ", line);
                   2161:   CPP_ADJUST_WRITTEN (pfile, strlen (CPP_PWRITTEN (pfile)));
                   2162: 
                   2163:   quote_string (pfile, ip->nominal_fname); 
                   2164:   if (file_change != same_file) {
                   2165:     CPP_PUTC_Q (pfile, ' ');
                   2166:     CPP_PUTC_Q (pfile, file_change == enter_file ? '1' : '2');
                   2167:   }
                   2168:   /* Tell cc1 if following text comes from a system header file.  */
                   2169:   if (ip->system_header_p) {
                   2170:     CPP_PUTC_Q (pfile, ' ');
                   2171:     CPP_PUTC_Q (pfile, '3');
                   2172:   }
                   2173: #ifndef NO_IMPLICIT_EXTERN_C
                   2174:   /* Tell cc1plus if following text should be treated as C.  */
                   2175:   if (ip->system_header_p == 2 && CPP_OPTIONS (pfile)->cplusplus) {
                   2176:     CPP_PUTC_Q (pfile, ' ');
                   2177:     CPP_PUTC_Q (pfile, '4');
                   2178:   }
                   2179: #endif
                   2180:   CPP_PUTC_Q (pfile, '\n');
                   2181:   pfile->lineno = line;
                   2182: }
                   2183: 
                   2184: /*
                   2185:  * Parse a macro argument and append the info on PFILE's token_buffer.
                   2186:  * REST_ARGS means to absorb the rest of the args.
                   2187:  * Return nonzero to indicate a syntax error.
                   2188:  */
                   2189: 
                   2190: static enum cpp_token
                   2191: macarg (pfile, rest_args)
                   2192:      cpp_reader *pfile;
                   2193:      int rest_args;
                   2194: {
                   2195:   int paren = 0;
                   2196:   enum cpp_token token;
                   2197:   long arg_start = CPP_WRITTEN (pfile);
                   2198:   char save_put_out_comments = CPP_OPTIONS (pfile)->put_out_comments;
                   2199:   CPP_OPTIONS (pfile)->put_out_comments = 0;
                   2200: 
                   2201:   /* Try to parse as much of the argument as exists at this
                   2202:      input stack level.  */
                   2203:   pfile->no_macro_expand++;
                   2204:   for (;;)
                   2205:     {
                   2206:       token = cpp_get_token (pfile);
                   2207:       switch (token)
                   2208:        {
                   2209:        case CPP_EOF:
                   2210:          goto done;
                   2211:        case CPP_POP:
                   2212:          /* If we've hit end of file, it's an error (reported by caller).
                   2213:             Ditto if it's the end of cpp_expand_to_buffer text.
                   2214:             If we've hit end of macro, just continue.  */
                   2215:          if (! CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
                   2216:            goto done;
                   2217:          break;
                   2218:        case CPP_LPAREN:
                   2219:          paren++;
                   2220:          break;
                   2221:        case CPP_RPAREN:
                   2222:          if (--paren < 0)
                   2223:            goto found;
                   2224:          break;
                   2225:        case CPP_COMMA:
                   2226:          /* if we've returned to lowest level and
                   2227:             we aren't absorbing all args */
                   2228:          if (paren == 0 && rest_args == 0)
                   2229:            goto found;
                   2230:          break;
                   2231:        found:
                   2232:          /* Remove ',' or ')' from argument buffer. */
                   2233:          CPP_ADJUST_WRITTEN (pfile, -1);
                   2234:          goto done;
                   2235:       default: ;
                   2236:        }
                   2237:     }
                   2238: 
                   2239:  done:
                   2240:   CPP_OPTIONS (pfile)->put_out_comments = save_put_out_comments;
                   2241:   pfile->no_macro_expand--;
                   2242: 
                   2243:   return token;
                   2244: }
                   2245: 
                   2246: /* Turn newlines to spaces in the string of length LENGTH at START,
                   2247:    except inside of string constants.
                   2248:    The string is copied into itself with its beginning staying fixed.  */
                   2249: 
                   2250: static int
                   2251: change_newlines (start, length)
                   2252:      U_CHAR *start;
                   2253:      int length;
                   2254: {
                   2255:   register U_CHAR *ibp;
                   2256:   register U_CHAR *obp;
                   2257:   register U_CHAR *limit;
                   2258:   register int c;
                   2259: 
                   2260:   ibp = start;
                   2261:   limit = start + length;
                   2262:   obp = start;
                   2263: 
                   2264:   while (ibp < limit) {
                   2265:     *obp++ = c = *ibp++;
                   2266:     switch (c) {
                   2267: 
                   2268:     case '\'':
                   2269:     case '\"':
                   2270:       /* Notice and skip strings, so that we don't delete newlines in them.  */
                   2271:       {
                   2272:        int quotec = c;
                   2273:        while (ibp < limit) {
                   2274:          *obp++ = c = *ibp++;
                   2275:          if (c == quotec)
                   2276:            break;
                   2277:          if (c == '\n' && quotec == '\'')
                   2278:            break;
                   2279:        }
                   2280:       }
                   2281:       break;
                   2282:     }
                   2283:   }
                   2284: 
                   2285:   return obp - start;
                   2286: }
                   2287: 
                   2288: 
                   2289: static struct tm *
                   2290: timestamp (pfile)
                   2291:      cpp_reader *pfile;
                   2292: {
                   2293:   if (!pfile->timebuf) {
                   2294:     time_t t = time ((time_t *)0);
                   2295:     pfile->timebuf = localtime (&t);
                   2296:   }
                   2297:   return pfile->timebuf;
                   2298: }
                   2299: 
                   2300: static char *monthnames[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
                   2301:                             "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
                   2302:                            };
                   2303: 
                   2304: /*
                   2305:  * expand things like __FILE__.  Place the expansion into the output
                   2306:  * buffer *without* rescanning.
                   2307:  */
                   2308: 
                   2309: static void
                   2310: special_symbol (hp, pfile)
                   2311:      HASHNODE *hp;
                   2312:      cpp_reader *pfile;
                   2313: {
                   2314:   char *buf;
                   2315:   int i, len;
                   2316:   int true_indepth;
                   2317:   cpp_buffer *ip = NULL;
                   2318:   struct tm *timebuf;
                   2319: 
                   2320:   int paren = 0;               /* For special `defined' keyword */
                   2321: 
                   2322: #if 0
                   2323:   if (pcp_outfile && pcp_inside_if
                   2324:       && hp->type != T_SPEC_DEFINED && hp->type != T_CONST)
                   2325:     cpp_error (pfile,
                   2326:               "Predefined macro `%s' used inside `#if' during precompilation",
                   2327:               hp->name);
                   2328: #endif
                   2329:     
                   2330:   for (ip = CPP_BUFFER (pfile); ; ip = CPP_PREV_BUFFER (ip))
                   2331:     {
                   2332:       if (ip == NULL)
                   2333:        {
                   2334:          cpp_error (pfile, "cccp error: not in any file?!");
                   2335:          return;                       /* the show must go on */
                   2336:        }
                   2337:       if (ip->fname != NULL)
                   2338:        break;
                   2339:     }
                   2340: 
                   2341:   switch (hp->type)
                   2342:     {
                   2343:     case T_FILE:
                   2344:     case T_BASE_FILE:
                   2345:       {
                   2346:        char *string;
                   2347:        if (hp->type == T_BASE_FILE)
                   2348:          {
                   2349:            while (CPP_PREV_BUFFER (ip))
                   2350:              ip = CPP_PREV_BUFFER (ip);
                   2351:          }
                   2352:        string = ip->nominal_fname;
                   2353: 
                   2354:        if (!string)
                   2355:          string = "";
                   2356:        CPP_RESERVE (pfile, 3 + 4 * strlen (string));
                   2357:        quote_string (pfile, string);
                   2358:        return;
                   2359:       }
                   2360: 
                   2361:     case T_INCLUDE_LEVEL:
                   2362:       true_indepth = 0;
                   2363:       for (ip = CPP_BUFFER (pfile);  ip != NULL; ip = CPP_PREV_BUFFER (ip))
                   2364:        if (ip->fname != NULL)
                   2365:          true_indepth++;
                   2366: 
                   2367:       buf = (char *) alloca (8); /* Eight bytes ought to be more than enough */
                   2368:       sprintf (buf, "%d", true_indepth - 1);
                   2369:       break;
                   2370: 
                   2371:   case T_VERSION:
                   2372:       buf = (char *) alloca (3 + strlen (version_string));
                   2373:       sprintf (buf, "\"%s\"", version_string);
                   2374:       break;
                   2375: 
                   2376: #ifndef NO_BUILTIN_SIZE_TYPE
                   2377:     case T_SIZE_TYPE:
                   2378:       buf = SIZE_TYPE;
                   2379:       break;
                   2380: #endif
                   2381: 
                   2382: #ifndef NO_BUILTIN_PTRDIFF_TYPE
                   2383:     case T_PTRDIFF_TYPE:
                   2384:       buf = PTRDIFF_TYPE;
                   2385:       break;
                   2386: #endif
                   2387: 
                   2388:     case T_WCHAR_TYPE:
                   2389:       buf = CPP_WCHAR_TYPE (pfile);
                   2390:     break;
                   2391: 
                   2392:     case T_USER_LABEL_PREFIX_TYPE:
                   2393:       buf = USER_LABEL_PREFIX;
                   2394:       break;
                   2395: 
                   2396:     case T_REGISTER_PREFIX_TYPE:
                   2397:       buf = REGISTER_PREFIX;
                   2398:       break;
                   2399: 
                   2400:   case T_CONST:
                   2401:       buf = (char *) alloca (4 * sizeof (int));
                   2402:       sprintf (buf, "%d", hp->value.ival);
                   2403: #if 0
                   2404:       if (pcp_inside_if && pcp_outfile)
                   2405:        /* Output a precondition for this macro use */
                   2406:        fprintf (pcp_outfile, "#define %s %d\n", hp->name, hp->value.ival);
                   2407: #endif
                   2408:       break;
                   2409: 
                   2410:     case T_SPECLINE:
                   2411:       {
                   2412:        long line = ip->lineno;
                   2413:        long col = ip->colno;
                   2414:        adjust_position (CPP_LINE_BASE (ip), ip->cur, &line, &col);
                   2415: 
                   2416:        buf = (char *) alloca (10);
                   2417:        sprintf (buf, "%d", line);
                   2418:       }
                   2419:       break;
                   2420: 
                   2421:     case T_DATE:
                   2422:     case T_TIME:
                   2423:       buf = (char *) alloca (20);
                   2424:       timebuf = timestamp (pfile);
                   2425:       if (hp->type == T_DATE)
                   2426:        sprintf (buf, "\"%s %2d %4d\"", monthnames[timebuf->tm_mon],
                   2427:                 timebuf->tm_mday, timebuf->tm_year + 1900);
                   2428:       else
                   2429:        sprintf (buf, "\"%02d:%02d:%02d\"", timebuf->tm_hour, timebuf->tm_min,
                   2430:                 timebuf->tm_sec);
                   2431:       break;
                   2432: 
                   2433:     case T_SPEC_DEFINED:
                   2434:       buf = " 0 ";             /* Assume symbol is not defined */
                   2435:       ip = CPP_BUFFER (pfile);
                   2436:       SKIP_WHITE_SPACE (ip->cur);
                   2437:       if (*ip->cur == '(')
                   2438:        {
                   2439:          paren++;
                   2440:          ip->cur++;                    /* Skip over the paren */
                   2441:          SKIP_WHITE_SPACE (ip->cur);
                   2442:        }
                   2443: 
                   2444:       if (!is_idstart[*ip->cur])
                   2445:        goto oops;
                   2446:       if (hp = cpp_lookup (pfile, ip->cur, -1, -1))
                   2447:        {
                   2448: #if 0
                   2449:          if (pcp_outfile && pcp_inside_if
                   2450:              && (hp->type == T_CONST
                   2451:                  || (hp->type == T_MACRO && hp->value.defn->predefined)))
                   2452:            /* Output a precondition for this macro use. */
                   2453:            fprintf (pcp_outfile, "#define %s\n", hp->name);
                   2454: #endif
                   2455:          buf = " 1 ";
                   2456:        }
                   2457: #if 0
                   2458:       else
                   2459:        if (pcp_outfile && pcp_inside_if)
                   2460:          {
                   2461:            /* Output a precondition for this macro use */
                   2462:            U_CHAR *cp = ip->bufp;
                   2463:            fprintf (pcp_outfile, "#undef ");
                   2464:            while (is_idchar[*cp]) /* Ick! */
                   2465:              fputc (*cp++, pcp_outfile);
                   2466:            putc ('\n', pcp_outfile);
                   2467:          }
                   2468: #endif
                   2469:       while (is_idchar[*ip->cur])
                   2470:        ++ip->cur;
                   2471:       SKIP_WHITE_SPACE (ip->cur);
                   2472:       if (paren)
                   2473:        {
                   2474:          if (*ip->cur != ')')
                   2475:            goto oops;
                   2476:          ++ip->cur;
                   2477:        }
                   2478:       break;
                   2479: 
                   2480:     oops:
                   2481: 
                   2482:       cpp_error (pfile, "`defined' without an identifier");
                   2483:       break;
                   2484: 
                   2485:     default:
                   2486:       cpp_error (pfile, "cccp error: invalid special hash type"); /* time for gdb */
                   2487:       abort ();
                   2488:     }
                   2489:   len = strlen (buf);
                   2490:   CPP_RESERVE (pfile, len + 1);
                   2491:   CPP_PUTS_Q (pfile, buf, len);
                   2492:   CPP_NUL_TERMINATE_Q (pfile);
                   2493: 
                   2494:   return;
                   2495: }
                   2496: 
                   2497: /* Initialize the built-in macros.  */
                   2498: 
                   2499: static void
                   2500: initialize_builtins (pfile)
                   2501:      cpp_reader *pfile;
                   2502: {
                   2503:   install ("__LINE__", -1, T_SPECLINE, 0, 0, -1);
                   2504:   install ("__DATE__", -1, T_DATE, 0, 0, -1);
                   2505:   install ("__FILE__", -1, T_FILE, 0, 0, -1);
                   2506:   install ("__BASE_FILE__", -1, T_BASE_FILE, 0, 0, -1);
                   2507:   install ("__INCLUDE_LEVEL__", -1, T_INCLUDE_LEVEL, 0, 0, -1);
                   2508:   install ("__VERSION__", -1, T_VERSION, 0, 0, -1);
                   2509: #ifndef NO_BUILTIN_SIZE_TYPE
                   2510:   install ("__SIZE_TYPE__", -1, T_SIZE_TYPE, 0, 0, -1);
                   2511: #endif
                   2512: #ifndef NO_BUILTIN_PTRDIFF_TYPE
                   2513:   install ("__PTRDIFF_TYPE__ ", -1, T_PTRDIFF_TYPE, 0, 0, -1);
                   2514: #endif
                   2515:   install ("__WCHAR_TYPE__", -1, T_WCHAR_TYPE, 0, 0, -1);
                   2516:   install ("__USER_LABEL_PREFIX__", -1, T_USER_LABEL_PREFIX_TYPE, 0, 0, -1);
                   2517:   install ("__REGISTER_PREFIX__", -1, T_REGISTER_PREFIX_TYPE, 0, 0, -1);
                   2518:   install ("__TIME__", -1, T_TIME, 0, 0, -1);
                   2519:   if (!CPP_TRADITIONAL (pfile))
                   2520:     install ("__STDC__", -1, T_CONST, STDC_VALUE, 0, -1);
                   2521:   if (CPP_OPTIONS (pfile)->objc)
                   2522:     install ("__OBJC__", -1, T_CONST, 1, 0, -1);
                   2523: /*  This is supplied using a -D by the compiler driver
                   2524:     so that it is present only when truly compiling with GNU C.  */
                   2525: /*  install ("__GNUC__", -1, T_CONST, 2, 0, -1);  */
                   2526: 
                   2527:   if (CPP_OPTIONS (pfile)->debug_output)
                   2528:     {
                   2529:       char directive[2048];
                   2530:       register struct directive *dp = &directive_table[0];
                   2531:       struct tm *timebuf = timestamp (pfile);
                   2532:       cpp_buffer *pbuffer = CPP_BUFFER (pfile);
                   2533: 
                   2534:       while (CPP_PREV_BUFFER (pbuffer))
                   2535:        pbuffer = CPP_PREV_BUFFER (pbuffer);
                   2536:       sprintf (directive, " __BASE_FILE__ \"%s\"\n",
                   2537:               pbuffer->nominal_fname);
                   2538:       output_line_command (pfile, 0, same_file);
                   2539:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2540: 
                   2541:       sprintf (directive, " __VERSION__ \"%s\"\n", version_string);
                   2542:       output_line_command (pfile, 0, same_file);
                   2543:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2544: 
                   2545: #ifndef NO_BUILTIN_SIZE_TYPE
                   2546:       sprintf (directive, " __SIZE_TYPE__ %s\n", SIZE_TYPE);
                   2547:       output_line_command (pfile, 0, same_file);
                   2548:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2549: #endif
                   2550: 
                   2551: #ifndef NO_BUILTIN_PTRDIFF_TYPE
                   2552:       sprintf (directive, " __PTRDIFF_TYPE__ %s\n", PTRDIFF_TYPE);
                   2553:       output_line_command (pfile, 0, same_file);
                   2554:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2555: #endif
                   2556: 
                   2557:       sprintf (directive, " __WCHAR_TYPE__ %s\n", CPP_WCHAR_TYPE (pfile));
                   2558:       output_line_command (pfile, 0, same_file);
                   2559:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2560: 
                   2561:       sprintf (directive, " __DATE__ \"%s %2d %4d\"\n",
                   2562:               monthnames[timebuf->tm_mon],
                   2563:               timebuf->tm_mday, timebuf->tm_year + 1900);
                   2564:       output_line_command (pfile, 0, same_file);
                   2565:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2566: 
                   2567:       sprintf (directive, " __TIME__ \"%02d:%02d:%02d\"\n",
                   2568:               timebuf->tm_hour, timebuf->tm_min, timebuf->tm_sec);
                   2569:       output_line_command (pfile, 0, same_file);
                   2570:       pass_thru_directive (directive, &directive[strlen (directive)], pfile, dp);
                   2571: 
                   2572:       if (!CPP_TRADITIONAL (pfile))
                   2573:        {
                   2574:           sprintf (directive, " __STDC__ 1");
                   2575:           output_line_command (pfile, 0, same_file);
                   2576:           pass_thru_directive (directive, &directive[strlen (directive)],
                   2577:                               pfile, dp);
                   2578:        }
                   2579:       if (CPP_OPTIONS (pfile)->objc)
                   2580:        {
                   2581:           sprintf (directive, " __OBJC__ 1");
                   2582:           output_line_command (pfile, 0, same_file);
                   2583:           pass_thru_directive (directive, &directive[strlen (directive)],
                   2584:                               pfile, dp);
                   2585:        }
                   2586:     }
                   2587: }
                   2588: 
                   2589: /* Return 1 iff a token ending in C1 followed directly by a token C2
                   2590:    could cause mis-tokenization. */
                   2591: 
                   2592: static int
                   2593: unsafe_chars (c1, c2)
                   2594:      int c1, c2;
                   2595: {
                   2596:   switch (c1)
                   2597:     {
                   2598:     case '+': case '-':
                   2599:       if (c2 == c1 || c2 == '=')
                   2600:        return 1;
                   2601:       goto letter;
                   2602:     case '.':
                   2603:     case '0': case '1': case '2': case '3': case '4':
                   2604:     case '5': case '6': case '7': case '8': case '9':
                   2605:     case 'e': case 'E':
                   2606:       if (c2 == '-' || c2 == '+')
                   2607:        return 1; /* could extend a pre-processing number */
                   2608:       goto letter;
                   2609:     case 'L':
                   2610:       if (c2 == '\'' || c2 == '\"')
                   2611:        return 1;   /* Could turn into L"xxx" or L'xxx'. */
                   2612:       goto letter;
                   2613:     letter:
                   2614:     case '_':
                   2615:     case 'a': case 'b': case 'c': case 'd':           case 'f':
                   2616:     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
                   2617:     case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
                   2618:     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
                   2619:     case 'y': case 'z':
                   2620:     case 'A': case 'B': case 'C': case 'D':           case 'F':
                   2621:     case 'G': case 'H': case 'I': case 'J': case 'K':
                   2622:     case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
                   2623:     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
                   2624:     case 'Y': case 'Z':
                   2625:       /* We're in the middle of either a name or a pre-processing number. */
                   2626:       return (is_idchar[c2] || c2 == '.');
                   2627:     case '<': case '>': case '!': case '%': case '#': case ':':
                   2628:     case '^': case '&': case '|': case '*': case '/': case '=':
                   2629:       return (c2 == c1 || c2 == '=');
                   2630:     }
                   2631:   return 0;
                   2632: }
                   2633: 
                   2634: /* Expand a macro call.
                   2635:    HP points to the symbol that is the macro being called.
                   2636:    Put the result of expansion onto the input stack
                   2637:    so that subsequent input by our caller will use it.
                   2638: 
                   2639:    If macro wants arguments, caller has already verified that
                   2640:    an argument list follows; arguments come from the input stack.  */
                   2641: 
                   2642: static void
                   2643: macroexpand (pfile, hp)
                   2644:      cpp_reader *pfile;
                   2645:      HASHNODE *hp;
                   2646: {
                   2647:   int nargs;
                   2648:   DEFINITION *defn = hp->value.defn;
                   2649:   register U_CHAR *xbuf;
                   2650:   long start_line, start_column;
                   2651:   int xbuf_len;
                   2652:   struct argdata *args;
                   2653:   long old_written = CPP_WRITTEN (pfile);
                   2654: #if 0
                   2655:   int start_line = instack[indepth].lineno;
                   2656: #endif
                   2657:   int rest_args, rest_zero;
                   2658:       register int i;
                   2659: 
                   2660: #if 0
                   2661:   CHECK_DEPTH (return;);
                   2662: #endif
                   2663: 
                   2664: #if 0
                   2665:   /* This macro is being used inside a #if, which means it must be */
                   2666:   /* recorded as a precondition.  */
                   2667:   if (pcp_inside_if && pcp_outfile && defn->predefined)
                   2668:     dump_single_macro (hp, pcp_outfile);
                   2669: #endif
                   2670: 
                   2671:   pfile->output_escapes++;
                   2672:   cpp_buf_line_and_col (cpp_file_buffer (pfile), &start_line, &start_column);
                   2673: 
                   2674:   nargs = defn->nargs;
                   2675: 
                   2676:   if (nargs >= 0)
                   2677:     {
                   2678:       enum cpp_token token;
                   2679: 
                   2680:       args = (struct argdata *) alloca ((nargs + 1) * sizeof (struct argdata));
                   2681: 
                   2682:       for (i = 0; i < nargs; i++)
                   2683:        {
                   2684:          args[i].raw = args[i].expanded = 0;
                   2685:          args[i].raw_length = 0; 
                   2686:          args[i].expand_length = args[i].stringified_length = -1;
                   2687:          args[i].use_count = 0;
                   2688:        }
                   2689: 
                   2690:       /* Parse all the macro args that are supplied.  I counts them.
                   2691:         The first NARGS args are stored in ARGS.
                   2692:         The rest are discarded.  If rest_args is set then we assume
                   2693:         macarg absorbed the rest of the args. */
                   2694:       i = 0;
                   2695:       rest_args = 0;
                   2696:       rest_args = 0;
                   2697:       FORWARD(1); /* Discard the open-parenthesis before the first arg.  */
                   2698:       do
                   2699:        {
                   2700:          if (rest_args)
                   2701:            continue;
                   2702:          if (i < nargs || (nargs == 0 && i == 0))
                   2703:            {
                   2704:              /* if we are working on last arg which absorbs rest of args... */
                   2705:              if (i == nargs - 1 && defn->rest_args)
                   2706:                rest_args = 1;
                   2707:              args[i].raw = CPP_WRITTEN (pfile);
                   2708:              token = macarg (pfile, rest_args);
                   2709:              args[i].raw_length = CPP_WRITTEN (pfile) - args[i].raw;
                   2710:              args[i].newlines = 0; /* FIXME */
                   2711:            }
                   2712:          else
                   2713:            token = macarg (pfile, 0);
                   2714:          if (token == CPP_EOF || token == CPP_POP)
                   2715:            {
                   2716:              cpp_error_with_line (pfile, start_line, start_column,
                   2717:                                   "unterminated macro call");
                   2718:              return;
                   2719:            }
                   2720:          i++;
                   2721:        } while (token == CPP_COMMA);
                   2722: 
                   2723:       /* If we got one arg but it was just whitespace, call that 0 args.  */
                   2724:       if (i == 1)
                   2725:        {
                   2726:          register U_CHAR *bp = ARG_BASE + args[0].raw;
                   2727:          register U_CHAR *lim = bp + args[0].raw_length;
                   2728:          /* cpp.texi says for foo ( ) we provide one argument.
                   2729:             However, if foo wants just 0 arguments, treat this as 0.  */
                   2730:          if (nargs == 0)
                   2731:            while (bp != lim && is_space[*bp]) bp++;
                   2732:          if (bp == lim)
                   2733:            i = 0;
                   2734:        }
                   2735: 
                   2736:       /* Don't output an error message if we have already output one for
                   2737:         a parse error above.  */
                   2738:       rest_zero = 0;
                   2739:       if (nargs == 0 && i > 0)
                   2740:        {
                   2741:          cpp_error (pfile, "arguments given to macro `%s'", hp->name);
                   2742:        }
                   2743:       else if (i < nargs)
                   2744:        {
                   2745:          /* traditional C allows foo() if foo wants one argument.  */
                   2746:          if (nargs == 1 && i == 0 && CPP_TRADITIONAL (pfile))
                   2747:            ;
                   2748:          /* the rest args token is allowed to absorb 0 tokens */
                   2749:          else if (i == nargs - 1 && defn->rest_args)
                   2750:            rest_zero = 1;
                   2751:          else if (i == 0)
                   2752:            cpp_error (pfile, "macro `%s' used without args", hp->name);
                   2753:          else if (i == 1)
                   2754:            cpp_error (pfile, "macro `%s' used with just one arg", hp->name);
                   2755:          else
                   2756:            cpp_error (pfile, "macro `%s' used with only %d args",
                   2757:                       hp->name, i);
                   2758:       }
                   2759:       else if (i > nargs)
                   2760:        {
                   2761:          cpp_error (pfile,
                   2762:                     "macro `%s' used with too many (%d) args", hp->name, i);
                   2763:        }
                   2764:     }
                   2765: 
                   2766:   /* If macro wants zero args, we parsed the arglist for checking only.
                   2767:      Read directly from the macro definition.  */
                   2768:   if (nargs <= 0)
                   2769:     {
                   2770:       xbuf = defn->expansion;
                   2771:       xbuf_len = defn->length;
                   2772:     }
                   2773:   else
                   2774:     {
                   2775:       register U_CHAR *exp = defn->expansion;
                   2776:       register int offset;     /* offset in expansion,
                   2777:                                   copied a piece at a time */
                   2778:       register int totlen;     /* total amount of exp buffer filled so far */
                   2779: 
                   2780:       register struct reflist *ap, *last_ap;
                   2781: 
                   2782:       /* Macro really takes args.  Compute the expansion of this call.  */
                   2783: 
                   2784:       /* Compute length in characters of the macro's expansion.
                   2785:         Also count number of times each arg is used.  */
                   2786:       xbuf_len = defn->length;
                   2787:       for (ap = defn->pattern; ap != NULL; ap = ap->next)
                   2788:        {
                   2789:          if (ap->stringify)
                   2790:            {
                   2791:              register struct argdata *arg = &args[ap->argno];
                   2792:              /* Stringify it it hasn't already been */
                   2793:              if (arg->stringified_length < 0)
                   2794:                {
                   2795:                  int arglen = arg->raw_length;
                   2796:                  int escaped = 0;
                   2797:                  int in_string = 0;
                   2798:                  int c;
                   2799:                  /* Initially need_space is -1.  Otherwise, 1 means the
                   2800:                     previous character was a space, but we suppressed it;
                   2801:                     0 means the previous character was a non-space. */
                   2802:                  int need_space = -1;
                   2803:                  i = 0;
                   2804:                  arg->stringified = CPP_WRITTEN (pfile);
                   2805:                  if (!CPP_TRADITIONAL (pfile))
                   2806:                    CPP_PUTC (pfile, '\"'); /* insert beginning quote */
                   2807:                  for (; i < arglen; i++)
                   2808:                    {
                   2809:                      c = (ARG_BASE + arg->raw)[i];
                   2810: 
                   2811:                      if (! in_string)
                   2812:                        {
                   2813:                          /* Internal sequences of whitespace are replaced by
                   2814:                             one space except within an string or char token.*/
                   2815:                          if (is_space[c])
                   2816:                            {
                   2817:                              if (CPP_WRITTEN (pfile) > arg->stringified
                   2818:                                  && (CPP_PWRITTEN (pfile))[-1] == '@')
                   2819:                                {
                   2820:                                  /* "@ " escape markers are removed */
                   2821:                                  CPP_ADJUST_WRITTEN (pfile, -1);
                   2822:                                  continue;
                   2823:                                }
                   2824:                              if (need_space == 0)
                   2825:                                need_space = 1;
                   2826:                              continue;
                   2827:                            }
                   2828:                          else if (need_space > 0)
                   2829:                            CPP_PUTC (pfile, ' ');
                   2830:                          need_space = 0;
                   2831:                        }
                   2832: 
                   2833:                      if (escaped)
                   2834:                        escaped = 0;
                   2835:                      else
                   2836:                        {
                   2837:                          if (c == '\\')
                   2838:                            escaped = 1;
                   2839:                          if (in_string)
                   2840:                            {
                   2841:                              if (c == in_string)
                   2842:                                in_string = 0;
                   2843:                            }
                   2844:                          else if (c == '\"' || c == '\'')
                   2845:                            in_string = c;
                   2846:                        }
                   2847: 
                   2848:                      /* Escape these chars */
                   2849:                      if (c == '\"' || (in_string && c == '\\'))
                   2850:                        CPP_PUTC (pfile, '\\');
                   2851:                      if (isprint (c))
                   2852:                        CPP_PUTC (pfile, c);
                   2853:                      else
                   2854:                        {
                   2855:                          CPP_RESERVE (pfile, 4);
                   2856:                          sprintf (CPP_PWRITTEN (pfile), "\\%03o",
                   2857:                                   (unsigned int) c);
                   2858:                          CPP_ADJUST_WRITTEN (pfile, 4);
                   2859:                        }
                   2860:                    }
                   2861:                  if (!CPP_TRADITIONAL (pfile))
                   2862:                    CPP_PUTC (pfile, '\"'); /* insert ending quote */
                   2863:                  arg->stringified_length
                   2864:                    = CPP_WRITTEN (pfile) - arg->stringified;
                   2865:                }
                   2866:              xbuf_len += args[ap->argno].stringified_length;
                   2867:            }
                   2868:          else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
                   2869:            /* Add 4 for two newline-space markers to prevent
                   2870:               token concatenation.  */
                   2871:            xbuf_len += args[ap->argno].raw_length + 4;
                   2872:          else
                   2873:            {
                   2874:              /* We have an ordinary (expanded) occurrence of the arg.
                   2875:                 So compute its expansion, if we have not already.  */
                   2876:              if (args[ap->argno].expand_length < 0)
                   2877:                {
                   2878:                  args[ap->argno].expanded = CPP_WRITTEN (pfile);
                   2879:                  cpp_expand_to_buffer (pfile,
                   2880:                                        ARG_BASE + args[ap->argno].raw,
                   2881:                                        args[ap->argno].raw_length);
                   2882: 
                   2883:                  args[ap->argno].expand_length
                   2884:                    = CPP_WRITTEN (pfile) - args[ap->argno].expanded;
                   2885:                }
                   2886: 
                   2887:              /* Add 4 for two newline-space markers to prevent
                   2888:                 token concatenation.  */
                   2889:              xbuf_len += args[ap->argno].expand_length + 4;
                   2890:            }
                   2891:          if (args[ap->argno].use_count < 10)
                   2892:            args[ap->argno].use_count++;
                   2893:        }
                   2894: 
                   2895:       xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
                   2896: 
                   2897:       /* Generate in XBUF the complete expansion
                   2898:         with arguments substituted in.
                   2899:         TOTLEN is the total size generated so far.
                   2900:         OFFSET is the index in the definition
                   2901:         of where we are copying from.  */
                   2902:       offset = totlen = 0;
                   2903:       for (last_ap = NULL, ap = defn->pattern; ap != NULL;
                   2904:           last_ap = ap, ap = ap->next)
                   2905:        {
                   2906:          register struct argdata *arg = &args[ap->argno];
                   2907:          int count_before = totlen;
                   2908: 
                   2909:          /* Add chars to XBUF.  */
                   2910:          for (i = 0; i < ap->nchars; i++, offset++)
                   2911:            xbuf[totlen++] = exp[offset];
                   2912: 
                   2913:          /* If followed by an empty rest arg with concatenation,
                   2914:             delete the last run of nonwhite chars.  */
                   2915:          if (rest_zero && totlen > count_before
                   2916:              && ((ap->rest_args && ap->raw_before)
                   2917:                  || (last_ap != NULL && last_ap->rest_args
                   2918:                      && last_ap->raw_after)))
                   2919:            {
                   2920:              /* Delete final whitespace.  */
                   2921:              while (totlen > count_before && is_space[xbuf[totlen - 1]])
                   2922:                totlen--;
                   2923: 
                   2924:              /* Delete the nonwhites before them.  */
                   2925:              while (totlen > count_before && ! is_space[xbuf[totlen - 1]])
                   2926:                totlen--;
                   2927:            }
                   2928: 
                   2929:          if (ap->stringify != 0)
                   2930:            {
                   2931:              bcopy (ARG_BASE + arg->stringified,
                   2932:                     xbuf + totlen, arg->stringified_length);
                   2933:              totlen += arg->stringified_length;
                   2934:            }
                   2935:          else if (ap->raw_before || ap->raw_after || CPP_TRADITIONAL (pfile))
                   2936:            {
                   2937:              U_CHAR *p1 = ARG_BASE + arg->raw;
                   2938:              U_CHAR *l1 = p1 + arg->raw_length;
                   2939:              if (ap->raw_before)
                   2940:                {
                   2941:                  while (p1 != l1 && is_space[*p1]) p1++;
                   2942:                  while (p1 != l1 && is_idchar[*p1])
                   2943:                    xbuf[totlen++] = *p1++;
                   2944:                }
                   2945:              if (ap->raw_after)
                   2946:                {
                   2947:                  /* Arg is concatenated after: delete trailing whitespace,
                   2948:                     whitespace markers, and no-reexpansion markers.  */
                   2949:                  while (p1 != l1)
                   2950:                    {
                   2951:                      if (is_space[l1[-1]]) l1--;
                   2952:                      else if (l1[-1] == '-')
                   2953:                        {
                   2954:                          U_CHAR *p2 = l1 - 1;
                   2955:                          /* If a `-' is preceded by an odd number of newlines then it
                   2956:                             and the last newline are a no-reexpansion marker.  */
                   2957:                          while (p2 != p1 && p2[-1] == '\n') p2--;
                   2958:                          if ((l1 - 1 - p2) & 1) {
                   2959:                            l1 -= 2;
                   2960:                          }
                   2961:                          else break;
                   2962:                        }
                   2963:                      else break;
                   2964:                    }
                   2965:                }
                   2966: 
                   2967:              bcopy (p1, xbuf + totlen, l1 - p1);
                   2968:              totlen += l1 - p1;
                   2969:            }
                   2970:          else
                   2971:            {
                   2972:              U_CHAR *expanded = ARG_BASE + arg->expanded;
                   2973:              if (!ap->raw_before && totlen > 0 && arg->expand_length
                   2974:                  && !CPP_TRADITIONAL(pfile)
                   2975:                  && unsafe_chars (xbuf[totlen-1], expanded[0]))
                   2976:                {
                   2977:                  xbuf[totlen++] = '@';
                   2978:                  xbuf[totlen++] = ' ';
                   2979:                }
                   2980: 
                   2981:              bcopy (expanded, xbuf + totlen, arg->expand_length);
                   2982:              totlen += arg->expand_length;
                   2983: 
                   2984:              if (!ap->raw_after && totlen > 0 && offset < defn->length
                   2985:                  && !CPP_TRADITIONAL(pfile)
                   2986:                  && unsafe_chars (xbuf[totlen-1], exp[offset]))
                   2987:                {
                   2988:                  xbuf[totlen++] = '@';
                   2989:                  xbuf[totlen++] = ' ';
                   2990:                }
                   2991: 
                   2992:              /* If a macro argument with newlines is used multiple times,
                   2993:                 then only expand the newlines once.  This avoids creating
                   2994:                 output lines which don't correspond to any input line,
                   2995:                 which confuses gdb and gcov.  */
                   2996:              if (arg->use_count > 1 && arg->newlines > 0)
                   2997:                {
                   2998:                  /* Don't bother doing change_newlines for subsequent
                   2999:                     uses of arg.  */
                   3000:                  arg->use_count = 1;
                   3001:                  arg->expand_length
                   3002:                    = change_newlines (expanded, arg->expand_length);
                   3003:                }
                   3004:            }
                   3005: 
                   3006:          if (totlen > xbuf_len)
                   3007:            abort ();
                   3008:       }
                   3009: 
                   3010:       /* if there is anything left of the definition
                   3011:         after handling the arg list, copy that in too. */
                   3012: 
                   3013:       for (i = offset; i < defn->length; i++)
                   3014:        {
                   3015:          /* if we've reached the end of the macro */
                   3016:          if (exp[i] == ')')
                   3017:            rest_zero = 0;
                   3018:          if (! (rest_zero && last_ap != NULL && last_ap->rest_args
                   3019:                 && last_ap->raw_after))
                   3020:            xbuf[totlen++] = exp[i];
                   3021:        }
                   3022: 
                   3023:       xbuf[totlen] = 0;
                   3024:       xbuf_len = totlen;
                   3025: 
                   3026:     }
                   3027: 
                   3028:   pfile->output_escapes--;
                   3029: 
                   3030:   /* Now put the expansion on the input stack
                   3031:      so our caller will commence reading from it.  */
                   3032:   push_macro_expansion (pfile, xbuf, xbuf_len, hp);
                   3033:   CPP_BUFFER (pfile)->has_escapes = 1;
                   3034: 
                   3035:   /* Pop the space we've used in the token_buffer for argument expansion. */
                   3036:   CPP_SET_WRITTEN (pfile, old_written);
                   3037:     
                   3038:   /* Recursive macro use sometimes works traditionally.
                   3039:      #define foo(x,y) bar (x (y,0), y)
                   3040:      foo (foo, baz)  */
                   3041:   
                   3042:   if (!CPP_TRADITIONAL (pfile))
                   3043:     hp->type = T_DISABLED;
                   3044: }
                   3045: 
                   3046: static void
                   3047: push_macro_expansion (pfile, xbuf, xbuf_len, hp)
                   3048:      cpp_reader *pfile;
                   3049:      register U_CHAR *xbuf;
                   3050:      int xbuf_len;
                   3051:      HASHNODE *hp;
                   3052: {
                   3053:   register cpp_buffer *mbuf = cpp_push_buffer (pfile, xbuf, xbuf_len);
                   3054:   mbuf->cleanup = macro_cleanup;
                   3055:   mbuf->data = hp;
                   3056: 
                   3057:   /* The first chars of the expansion should be a "@ " added by
                   3058:      collect_expansion.  This is to prevent accidental token-pasting
                   3059:      between the text preceding the macro invocation, and the macro
                   3060:      expansion text.
                   3061: 
                   3062:      We would like to avoid adding unneeded spaces (for the sake of
                   3063:      tools that use cpp, such as imake).  In some common cases we can
                   3064:      tell that it is safe to omit the space.
                   3065: 
                   3066:      The character before the macro invocation cannot have been an
                   3067:      idchar (or else it would have been pasted with the idchars of
                   3068:      the macro name).  Therefore, if the first non-space character
                   3069:      of the expansion is an idchar, we do not need the extra space
                   3070:      to prevent token pasting.
                   3071: 
                   3072:      Also, we don't need the extra space if the first char is '(',
                   3073:      or some other (less common) characters.  */
                   3074: 
                   3075:   if (xbuf[0] == '@' && xbuf[1] == ' '
                   3076:       && (is_idchar[xbuf[2]] || xbuf[2] == '(' || xbuf[2] == '\''
                   3077:          || xbuf[2] == '\"'))
                   3078:     mbuf->cur += 2;
                   3079: }
                   3080: 
                   3081: /* Like cpp_get_token, except that it does not read past end-of-line.
                   3082:    Also, horizontal space is skipped, and macros are popped.  */
                   3083: 
                   3084: static enum cpp_token
                   3085: get_directive_token (pfile)
                   3086:      cpp_reader *pfile;
                   3087: {
                   3088:   for (;;)
                   3089:     {
                   3090:       long old_written = CPP_WRITTEN (pfile);
                   3091:       enum cpp_token token;
                   3092:       cpp_skip_hspace (pfile);
                   3093:       if (PEEKC () == '\n')
                   3094:          return CPP_VSPACE;
                   3095:       token = cpp_get_token (pfile);
                   3096:       switch (token)
                   3097:       {
                   3098:       case CPP_POP:
                   3099:          if (! CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
                   3100:              return token;
                   3101:          /* ... else fall though ... */
                   3102:       case CPP_HSPACE:  case CPP_COMMENT:
                   3103:          CPP_SET_WRITTEN (pfile, old_written);
                   3104:          break;
                   3105:       default:
                   3106:          return token;
                   3107:       }
                   3108:     }
                   3109: }
                   3110: 
                   3111: /* Handle #include and #import.
                   3112:    This function expects to see "fname" or <fname> on the input.
                   3113: 
                   3114:    The input is normally in part of the output_buffer following
                   3115:    CPP_WRITTEN, and will get overwritten by output_line_command.
                   3116:    I.e. in input file specification has been popped by handle_directive.
                   3117:    This is safe. */
                   3118: 
                   3119: static int
                   3120: do_include (pfile, keyword, unused1, unused2)
                   3121:      cpp_reader *pfile;
                   3122:      struct directive *keyword;
                   3123:      U_CHAR *unused1, *unused2;
                   3124: {
                   3125:   int importing = (keyword->type == T_IMPORT);
                   3126:   int skip_dirs = (keyword->type == T_INCLUDE_NEXT);
                   3127:   char *fname;         /* Dynamically allocated fname buffer */
                   3128:   char *pcftry;
                   3129:   char *pcfname;
                   3130:   U_CHAR *fbeg, *fend;         /* Beginning and end of fname */
                   3131:   enum cpp_token token;
                   3132: 
                   3133:   /* Chain of dirs to search */
                   3134:   struct file_name_list *search_start = CPP_OPTIONS (pfile)->include;
                   3135:   struct file_name_list dsp[1];        /* First in chain, if #include "..." */
                   3136:   struct file_name_list *searchptr = 0;
                   3137:   long old_written = CPP_WRITTEN (pfile);
                   3138: 
                   3139:   int flen;
                   3140: 
                   3141:   int f;                       /* file number */
                   3142: 
                   3143:   int retried = 0;             /* Have already tried macro
                   3144:                                   expanding the include line*/
                   3145:   int angle_brackets = 0;      /* 0 for "...", 1 for <...> */
                   3146:   int pcf = -1;
                   3147:   char *pcfbuf;
                   3148:   char *pcfbuflimit;
                   3149:   int pcfnum;
                   3150:   f= -1;                       /* JF we iz paranoid! */
                   3151: 
                   3152:   if (importing && CPP_OPTIONS (pfile)->warn_import
                   3153:       && !CPP_OPTIONS (pfile)->inhibit_warnings
                   3154:       && !CPP_BUFFER (pfile)->system_header_p && !pfile->import_warning)
                   3155:     {
                   3156:       pfile->import_warning = 1;
                   3157:       cpp_warning (pfile, "using `#import' is not recommended");
                   3158:       fprintf (stderr, "The fact that a certain header file need not be processed more than once\n");
                   3159:       fprintf (stderr, "should be indicated in the header file, not where it is used.\n");
                   3160:       fprintf (stderr, "The best way to do this is with a conditional of this form:\n\n");
                   3161:       fprintf (stderr, "  #ifndef _FOO_H_INCLUDED\n");
                   3162:       fprintf (stderr, "  #define _FOO_H_INCLUDED\n");
                   3163:       fprintf (stderr, "  ... <real contents of file> ...\n");
                   3164:       fprintf (stderr, "  #endif /* Not _FOO_H_INCLUDED */\n\n");
                   3165:       fprintf (stderr, "Then users can use `#include' any number of times.\n");
                   3166:       fprintf (stderr, "GNU C automatically avoids processing the file more than once\n");
                   3167:       fprintf (stderr, "when it is equipped with such a conditional.\n");
                   3168:     }
                   3169: 
                   3170:   pfile->parsing_include_directive++;
                   3171:   token = get_directive_token (pfile);
                   3172:   pfile->parsing_include_directive--;
                   3173: 
                   3174:   if (token == CPP_STRING)
                   3175:     {
                   3176:       /* FIXME - check no trailing garbage */
                   3177:       fbeg = pfile->token_buffer + old_written + 1;
                   3178:       fend = CPP_PWRITTEN (pfile) - 1;
                   3179:       if (fbeg[-1] == '<')
                   3180:        {
                   3181:          angle_brackets = 1;
                   3182:          /* If -I-, start with the first -I dir after the -I-.  */
                   3183:          if (CPP_OPTIONS (pfile)->first_bracket_include)
                   3184:            search_start = CPP_OPTIONS (pfile)->first_bracket_include;
                   3185:        }
                   3186:       /* If -I- was specified, don't search current dir, only spec'd ones. */
                   3187:       else if (! CPP_OPTIONS (pfile)->ignore_srcdir)
                   3188:        {
                   3189:          cpp_buffer *fp;
                   3190:          /* We have "filename".  Figure out directory this source
                   3191:             file is coming from and put it on the front of the list. */
                   3192: 
                   3193:          for (fp = CPP_BUFFER (pfile); fp != NULL; fp = CPP_PREV_BUFFER (fp))
                   3194:            {
                   3195:              int n;
                   3196:              char *ep,*nam;
                   3197: 
                   3198:              if ((nam = fp->nominal_fname) != NULL)
                   3199:                {
                   3200:                  /* Found a named file.  Figure out dir of the file,
                   3201:                     and put it in front of the search list.  */
                   3202:                  dsp[0].next = search_start;
                   3203:                  search_start = dsp;
                   3204: #ifndef VMS
                   3205:                  ep = rindex (nam, '/');
                   3206: #else                          /* VMS */
                   3207:                  ep = rindex (nam, ']');
                   3208:                  if (ep == NULL) ep = rindex (nam, '>');
                   3209:                  if (ep == NULL) ep = rindex (nam, ':');
                   3210:                  if (ep != NULL) ep++;
                   3211: #endif                         /* VMS */
                   3212:                  if (ep != NULL)
                   3213:                    {
                   3214:                      n = ep - nam;
                   3215:                      dsp[0].fname = (char *) alloca (n + 1);
                   3216:                      strncpy (dsp[0].fname, nam, n);
                   3217:                      dsp[0].fname[n] = '\0';
                   3218:                      if (n + INCLUDE_LEN_FUDGE > pfile->max_include_len)
                   3219:                        pfile->max_include_len = n + INCLUDE_LEN_FUDGE;
                   3220:                    }
                   3221:                  else
                   3222:                    {
                   3223:                      dsp[0].fname = 0; /* Current directory */
                   3224:                    }
                   3225:                  dsp[0].got_name_map = 0;
                   3226:                  break;
                   3227:                }
                   3228:            }
                   3229:        }
                   3230:     }
                   3231: #ifdef VMS
                   3232:   else if (token == CPP_NAME)
                   3233:     {
                   3234:       /*
                   3235:        * Support '#include xyz' like VAX-C to allow for easy use of all the
                   3236:        * decwindow include files. It defaults to '#include <xyz.h>' (so the
                   3237:        * code from case '<' is repeated here) and generates a warning.
                   3238:        */
                   3239:       cpp_warning (pfile,
                   3240:                   "VAX-C-style include specification found, use '#include <filename.h>' !");
                   3241:       angle_brackets = 1;
                   3242:       /* If -I-, start with the first -I dir after the -I-.  */
                   3243:       if (CPP_OPTIONS (pfile)->first_bracket_include)
                   3244:        search_start = CPP_OPTIONS (pfile)->first_bracket_include;
                   3245:       fbeg = pfile->token_buffer + old_written;
                   3246:       fend = CPP_PWRITTEN (pfile);
                   3247:     }
                   3248: #endif
                   3249:   else
                   3250:     {
                   3251:       cpp_error (pfile,
                   3252:                 "`#%s' expects \"FILENAME\" or <FILENAME>", keyword->name);
                   3253:       CPP_SET_WRITTEN (pfile, old_written);
                   3254:       skip_rest_of_line (pfile);
                   3255:       return 0;
                   3256:     }
                   3257: 
                   3258:   *fend = 0;
                   3259: 
                   3260:   token = get_directive_token (pfile);
                   3261:   if (token != CPP_VSPACE)
                   3262:     {
                   3263:       cpp_error (pfile, "junk at end of `#include'");
                   3264:       while (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP)
                   3265:        token = get_directive_token (pfile);
                   3266:     }
                   3267: 
                   3268:   /* For #include_next, skip in the search path
                   3269:      past the dir in which the containing file was found.  */
                   3270:   if (skip_dirs)
                   3271:     {
                   3272:       cpp_buffer *fp;
                   3273:       for (fp = CPP_BUFFER (pfile); fp != NULL; fp = CPP_PREV_BUFFER (fp))
                   3274:        if (fp->fname != NULL)
                   3275:          {
                   3276:            /* fp->dir is null if the containing file was specified with
                   3277:               an absolute file name.  In that case, don't skip anything.  */
                   3278:            if (fp->dir == SELF_DIR_DUMMY)
                   3279:              search_start = CPP_OPTIONS (pfile)->include;
                   3280:            else if (fp->dir)
                   3281:              search_start = fp->dir->next;
                   3282:            break;
                   3283:          }
                   3284:     }
                   3285: 
                   3286:   CPP_SET_WRITTEN (pfile, old_written);
                   3287: 
                   3288:   flen = fend - fbeg;
                   3289: 
                   3290:   if (flen == 0)
                   3291:     {
                   3292:       cpp_error (pfile, "empty file name in `#%s'", keyword->name);
                   3293:       return 0;
                   3294:     }
                   3295: 
                   3296:   /* Allocate this permanently, because it gets stored in the definitions
                   3297:      of macros.  */
                   3298:   fname = (char *) xmalloc (pfile->max_include_len + flen + 4);
                   3299:   /* + 2 above for slash and terminating null.  */
                   3300:   /* + 2 added for '.h' on VMS (to support '#include filename') */
                   3301: 
                   3302:   /* If specified file name is absolute, just open it.  */
                   3303: 
                   3304:   if (*fbeg == '/') {
                   3305:     strncpy (fname, fbeg, flen);
                   3306:     fname[flen] = 0;
                   3307:     if (redundant_include_p (pfile, fname))
                   3308:       return 0;
                   3309:     if (importing)
                   3310:       f = lookup_import (pfile, fname, NULL_PTR);
                   3311:     else
                   3312:       f = open_include_file (pfile, fname, NULL_PTR);
                   3313:     if (f == -2)
                   3314:       return 0;                /* Already included this file */
                   3315:   } else {
                   3316:     /* Search directory path, trying to open the file.
                   3317:        Copy each filename tried into FNAME.  */
                   3318: 
                   3319:     for (searchptr = search_start; searchptr; searchptr = searchptr->next) {
                   3320:       if (searchptr->fname) {
                   3321:        /* The empty string in a search path is ignored.
                   3322:           This makes it possible to turn off entirely
                   3323:           a standard piece of the list.  */
                   3324:        if (searchptr->fname[0] == 0)
                   3325:          continue;
                   3326:        strcpy (fname, searchptr->fname);
                   3327:        strcat (fname, "/");
                   3328:        fname[strlen (fname) + flen] = 0;
                   3329:       } else {
                   3330:        fname[0] = 0;
                   3331:       }
                   3332:       strncat (fname, fbeg, flen);
                   3333: #ifdef VMS
                   3334:       /* Change this 1/2 Unix 1/2 VMS file specification into a
                   3335:          full VMS file specification */
                   3336:       if (searchptr->fname && (searchptr->fname[0] != 0)) {
                   3337:        /* Fix up the filename */
                   3338:        hack_vms_include_specification (fname);
                   3339:       } else {
                   3340:        /* This is a normal VMS filespec, so use it unchanged.  */
                   3341:        strncpy (fname, fbeg, flen);
                   3342:        fname[flen] = 0;
                   3343:        /* if it's '#include filename', add the missing .h */
                   3344:        if (index(fname,'.')==NULL) {
                   3345:          strcat (fname, ".h");
                   3346:        }
                   3347:       }
                   3348: #endif /* VMS */
                   3349:       /* ??? There are currently 3 separate mechanisms for avoiding processing
                   3350:         of redundant include files: #import, #pragma once, and
                   3351:         redundant_include_p.  It would be nice if they were unified.  */
                   3352:       if (redundant_include_p (pfile, fname))
                   3353:        return 0;
                   3354:       if (importing)
                   3355:        f = lookup_import (pfile, fname, searchptr);
                   3356:       else
                   3357:        f = open_include_file (pfile, fname, searchptr);
                   3358:       if (f == -2)
                   3359:        return 0;                       /* Already included this file */
                   3360: #ifdef EACCES
                   3361:       else if (f == -1 && errno == EACCES)
                   3362:        cpp_warning (pfile, "Header file %s exists, but is not readable",
                   3363:                     fname);
                   3364: #endif
                   3365:       if (f >= 0)
                   3366:        break;
                   3367:     }
                   3368:   }
                   3369: 
                   3370:   if (f < 0)
                   3371:     {
                   3372:       /* A file that was not found.  */
                   3373:       strncpy (fname, fbeg, flen);
                   3374:       fname[flen] = 0;
                   3375:       /* If generating dependencies and -MG was specified, we assume missing
                   3376:         files are leaf files, living in the same directory as the source file
                   3377:         or other similar place; these missing files may be generated from
                   3378:         other files and may not exist yet (eg: y.tab.h).  */
                   3379: 
                   3380:       if (CPP_OPTIONS(pfile)->print_deps_missing_files
                   3381:          && CPP_PRINT_DEPS (pfile)
                   3382:          > (angle_brackets || (pfile->system_include_depth > 0)))
                   3383:        {
                   3384:          /* If it was requested as a system header file,
                   3385:             then assume it belongs in the first place to look for such.  */
                   3386:          if (angle_brackets)
                   3387:            {
                   3388:              for (searchptr = search_start; searchptr;
                   3389:                   searchptr = searchptr->next)
                   3390:                {
                   3391:                  if (searchptr->fname)
                   3392:                    {
                   3393:                      char *p;
                   3394: 
                   3395:                      if (searchptr->fname[0] == 0)
                   3396:                        continue;
                   3397:                      p = (char *) alloca (strlen (searchptr->fname)
                   3398:                                           + strlen (fname) + 2);
                   3399:                      strcpy (p, searchptr->fname);
                   3400:                      strcat (p, "/");
                   3401:                      strcat (p, fname);
                   3402:                      deps_output (pfile, p, ' ');
                   3403:                      break;
                   3404:                    }
                   3405:                }
                   3406:            }
                   3407:          else
                   3408:            {
                   3409:              /* Otherwise, omit the directory, as if the file existed
                   3410:                 in the directory with the source.  */
                   3411:              deps_output (pfile, fname, ' ');
                   3412:            }
                   3413:        }
                   3414:       /* If -M was specified, and this header file won't be added to the
                   3415:         dependency list, then don't count this as an error, because we can
                   3416:         still produce correct output.  Otherwise, we can't produce correct
                   3417:         output, because there may be dependencies we need inside the missing
                   3418:         file, and we don't know what directory this missing file exists in.*/
                   3419:       else if (CPP_PRINT_DEPS (pfile)
                   3420:               && (CPP_PRINT_DEPS (pfile)
                   3421:                   <= (angle_brackets || (pfile->system_include_depth > 0))))
                   3422:        cpp_warning (pfile, "No include path in which to find %s", fname);
                   3423:       else if (search_start)
                   3424:        cpp_error_from_errno (pfile, fname);
                   3425:       else
                   3426:        cpp_error (pfile, "No include path in which to find %s", fname);
                   3427:     }
                   3428:   else {
                   3429:     /* Check to see if this include file is a once-only include file.
                   3430:        If so, give up.  */
                   3431: 
                   3432:     struct file_name_list* ptr;
                   3433: 
                   3434:     for (ptr = pfile->dont_repeat_files; ptr; ptr = ptr->next) {
                   3435:       if (!strcmp (ptr->fname, fname)) {
                   3436:        close (f);
                   3437:         return 0;                              /* This file was once'd. */
                   3438:       }
                   3439:     }
                   3440: 
                   3441:     for (ptr = pfile->all_include_files; ptr; ptr = ptr->next) {
                   3442:       if (!strcmp (ptr->fname, fname))
                   3443:         break;                         /* This file was included before. */
                   3444:     }
                   3445: 
                   3446:     if (ptr == 0) {
                   3447:       /* This is the first time for this file.  */
                   3448:       /* Add it to list of files included.  */
                   3449: 
                   3450:       ptr = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
                   3451:       ptr->control_macro = 0;
                   3452:       ptr->c_system_include_path = 0;
                   3453:       ptr->next = pfile->all_include_files;
                   3454:       pfile->all_include_files = ptr;
                   3455:       ptr->fname = savestring (fname);
                   3456:       ptr->got_name_map = 0;
                   3457: 
                   3458:       /* For -M, add this file to the dependencies.  */
                   3459:       if (CPP_PRINT_DEPS (pfile)
                   3460:          > (angle_brackets || (pfile->system_include_depth > 0)))
                   3461:        deps_output (pfile, fname, ' ');
                   3462:     }   
                   3463: 
                   3464:     /* Handle -H option.  */
                   3465:     if (CPP_OPTIONS(pfile)->print_include_names)
                   3466:       {
                   3467:        cpp_buffer *buf = CPP_BUFFER (pfile);
                   3468:        while ((buf = CPP_PREV_BUFFER (buf)) != NULL)
                   3469:          putc ('.', stderr);
                   3470:        fprintf (stderr, "%s\n", fname);
                   3471:       }
                   3472: 
                   3473:     if (angle_brackets)
                   3474:       pfile->system_include_depth++;
                   3475: 
                   3476:     /* Actually process the file.  */
                   3477: 
                   3478:     /* Record file on "seen" list for #import. */
                   3479:     add_import (pfile, f, fname);
                   3480: 
                   3481:     pcftry = (char *) alloca (strlen (fname) + 30);
                   3482:     pcfbuf = 0;
                   3483:     pcfnum = 0;
                   3484: 
                   3485: #if 0
                   3486:     if (!no_precomp)
                   3487:       {
                   3488:        struct stat stat_f;
                   3489: 
                   3490:        fstat (f, &stat_f);
                   3491: 
                   3492:        do {
                   3493:          sprintf (pcftry, "%s%d", fname, pcfnum++);
                   3494: 
                   3495:          pcf = open (pcftry, O_RDONLY, 0666);
                   3496:          if (pcf != -1)
                   3497:            {
                   3498:              struct stat s;
                   3499: 
                   3500:              fstat (pcf, &s);
                   3501:              if (bcmp ((char *) &stat_f.st_ino, (char *) &s.st_ino,
                   3502:                        sizeof (s.st_ino))
                   3503:                  || stat_f.st_dev != s.st_dev)
                   3504:                {
                   3505:                  pcfbuf = check_precompiled (pcf, fname, &pcfbuflimit);
                   3506:                  /* Don't need it any more.  */
                   3507:                  close (pcf);
                   3508:                }
                   3509:              else
                   3510:                {
                   3511:                  /* Don't need it at all.  */
                   3512:                  close (pcf);
                   3513:                  break;
                   3514:                }
                   3515:            }
                   3516:        } while (pcf != -1 && !pcfbuf);
                   3517:       }
                   3518: #endif
                   3519:     
                   3520:     /* Actually process the file */
                   3521:     cpp_push_buffer (pfile, NULL, 0);
                   3522:     if (finclude (pfile, f, fname, is_system_include (pfile, fname),
                   3523:                  searchptr != dsp ? searchptr : SELF_DIR_DUMMY))
                   3524:       {
                   3525:        output_line_command (pfile, 0, enter_file);
                   3526:        pfile->only_seen_white = 2;
                   3527:       }
                   3528: 
                   3529:     if (angle_brackets)
                   3530:       pfile->system_include_depth--;
                   3531:   }
                   3532:   return 0;
                   3533: }
                   3534: 
                   3535: /* Return nonzero if there is no need to include file NAME
                   3536:    because it has already been included and it contains a conditional
                   3537:    to make a repeated include do nothing.  */
                   3538: 
                   3539: static int
                   3540: redundant_include_p (pfile, name)
                   3541:      cpp_reader *pfile;
                   3542:      char *name;
                   3543: {
                   3544:   struct file_name_list *l = pfile->all_include_files;
                   3545:   for (; l; l = l->next)
                   3546:     if (! strcmp (name, l->fname)
                   3547:        && l->control_macro
                   3548:        && cpp_lookup (pfile, l->control_macro, -1, -1))
                   3549:       return 1;
                   3550:   return 0;
                   3551: }
                   3552: 
                   3553: /* Return nonzero if the given FILENAME is an absolute pathname which
                   3554:    designates a file within one of the known "system" include file
                   3555:    directories.  We assume here that if the given FILENAME looks like
                   3556:    it is the name of a file which resides either directly in a "system"
                   3557:    include file directory, or within any subdirectory thereof, then the
                   3558:    given file must be a "system" include file.  This function tells us
                   3559:    if we should suppress pedantic errors/warnings for the given FILENAME.
                   3560: 
                   3561:    The value is 2 if the file is a C-language system header file
                   3562:    for which C++ should (on most systems) assume `extern "C"'.  */
                   3563: 
                   3564: static int
                   3565: is_system_include (pfile, filename)
                   3566:      cpp_reader *pfile;
                   3567:      register char *filename;
                   3568: {
                   3569:   struct file_name_list *searchptr;
                   3570: 
                   3571:   for (searchptr = CPP_OPTIONS (pfile)->first_system_include; searchptr;
                   3572:        searchptr = searchptr->next)
                   3573:     if (searchptr->fname) {
                   3574:       register char *sys_dir = searchptr->fname;
                   3575:       register unsigned length = strlen (sys_dir);
                   3576: 
                   3577:       if (! strncmp (sys_dir, filename, length) && filename[length] == '/')
                   3578:        {
                   3579:          if (searchptr->c_system_include_path)
                   3580:            return 2;
                   3581:          else
                   3582:            return 1;
                   3583:        }
                   3584:     }
                   3585:   return 0;
                   3586: }
                   3587: 
                   3588: 
                   3589: /*
                   3590:  * Install a name in the assertion hash table.
                   3591:  *
                   3592:  * If LEN is >= 0, it is the length of the name.
                   3593:  * Otherwise, compute the length by scanning the entire name.
                   3594:  *
                   3595:  * If HASH is >= 0, it is the precomputed hash code.
                   3596:  * Otherwise, compute the hash code.
                   3597:  */
                   3598: static ASSERTION_HASHNODE *
                   3599: assertion_install (pfile, name, len, hash)
                   3600:      cpp_reader *pfile;
                   3601:      U_CHAR *name;
                   3602:      int len;
                   3603:      int hash;
                   3604: {
                   3605:   register ASSERTION_HASHNODE *hp;
                   3606:   register int i, bucket;
                   3607:   register U_CHAR *p, *q;
                   3608: 
                   3609:   i = sizeof (ASSERTION_HASHNODE) + len + 1;
                   3610:   hp = (ASSERTION_HASHNODE *) xmalloc (i);
                   3611:   bucket = hash;
                   3612:   hp->bucket_hdr = &pfile->assertion_hashtab[bucket];
                   3613:   hp->next = pfile->assertion_hashtab[bucket];
                   3614:   pfile->assertion_hashtab[bucket] = hp;
                   3615:   hp->prev = NULL;
                   3616:   if (hp->next != NULL)
                   3617:     hp->next->prev = hp;
                   3618:   hp->length = len;
                   3619:   hp->value = 0;
                   3620:   hp->name = ((U_CHAR *) hp) + sizeof (ASSERTION_HASHNODE);
                   3621:   p = hp->name;
                   3622:   q = name;
                   3623:   for (i = 0; i < len; i++)
                   3624:     *p++ = *q++;
                   3625:   hp->name[len] = 0;
                   3626:   return hp;
                   3627: }
                   3628: /*
                   3629:  * find the most recent hash node for name name (ending with first
                   3630:  * non-identifier char) installed by install
                   3631:  *
                   3632:  * If LEN is >= 0, it is the length of the name.
                   3633:  * Otherwise, compute the length by scanning the entire name.
                   3634:  *
                   3635:  * If HASH is >= 0, it is the precomputed hash code.
                   3636:  * Otherwise, compute the hash code.
                   3637:  */
                   3638: 
                   3639: static ASSERTION_HASHNODE *
                   3640: assertion_lookup (pfile, name, len, hash)
                   3641:      cpp_reader *pfile;
                   3642:      U_CHAR *name;
                   3643:      int len;
                   3644:      int hash;
                   3645: {
                   3646:   register ASSERTION_HASHNODE *bucket;
                   3647: 
                   3648:   bucket = pfile->assertion_hashtab[hash];
                   3649:   while (bucket) {
                   3650:     if (bucket->length == len && strncmp (bucket->name, name, len) == 0)
                   3651:       return bucket;
                   3652:     bucket = bucket->next;
                   3653:   }
                   3654:   return NULL;
                   3655: }
                   3656: 
                   3657: static void
                   3658: delete_assertion (hp)
                   3659:      ASSERTION_HASHNODE *hp;
                   3660: {
                   3661:   struct tokenlist_list *tail;
                   3662:   if (hp->prev != NULL)
                   3663:     hp->prev->next = hp->next;
                   3664:   if (hp->next != NULL)
                   3665:     hp->next->prev = hp->prev;
                   3666: 
                   3667:   for (tail = hp->value; tail; )
                   3668:     {
                   3669:       struct tokenlist_list *next = tail->next;
                   3670:       free_token_list (tail->tokens);
                   3671:       free (tail);
                   3672:       tail = next;
                   3673:     }
                   3674: 
                   3675:   /* make sure that the bucket chain header that
                   3676:      the deleted guy was on points to the right thing afterwards. */
                   3677:   if (hp == *hp->bucket_hdr)
                   3678:     *hp->bucket_hdr = hp->next;
                   3679: 
                   3680:   free (hp);
                   3681: }
                   3682: 
                   3683: /* Convert a character string literal into a nul-terminated string.
                   3684:    The input string is [IN ... LIMIT).
                   3685:    The result is placed in RESULT.  RESULT can be the same as IN.
                   3686:    The value returned in the end of the string written to RESULT,
                   3687:    or NULL on error.  */
                   3688: 
                   3689: static U_CHAR*
                   3690: convert_string (pfile, result, in, limit, handle_escapes)
                   3691:      cpp_reader *pfile;
                   3692:      register U_CHAR *result, *in, *limit;
                   3693:      int handle_escapes;
                   3694: {
                   3695:   U_CHAR c;
                   3696:   c = *in++;
                   3697:   if (c != '\"')
                   3698:     return NULL;
                   3699:   while (in < limit)
                   3700:     {
                   3701:       U_CHAR c = *in++;
                   3702:       switch (c)
                   3703:        {
                   3704:        case '\0':
                   3705:          return NULL;
                   3706:        case '\"':
                   3707:          limit = in;
                   3708:          break;
                   3709:        case '\\':
                   3710:          if (handle_escapes)
                   3711:            {
                   3712:              char *bpc = (char *) in;
                   3713:              int i = (U_CHAR) cpp_parse_escape (pfile, &bpc);
                   3714:              in = (U_CHAR *) bpc;
                   3715:              if (i >= 0)
                   3716:                *result++ = (U_CHAR)c;
                   3717:              break;
                   3718:            }
                   3719:          /* else fall through */
                   3720:        default:
                   3721:          *result++ = c;
                   3722:        }
                   3723:     }
                   3724:   *result = 0;
                   3725:   return result;
                   3726: }
                   3727: 
                   3728: /*
                   3729:  * interpret #line command.  Remembers previously seen fnames
                   3730:  * in its very own hash table.
                   3731:  */
                   3732: #define FNAME_HASHSIZE 37
                   3733: 
                   3734: static int
                   3735: do_line (pfile, keyword)
                   3736:      cpp_reader *pfile;
                   3737:      struct directive *keyword;
                   3738: {
                   3739:   cpp_buffer *ip = CPP_BUFFER (pfile);
                   3740:   int new_lineno;
                   3741:   long old_written = CPP_WRITTEN (pfile);
                   3742:   enum file_change_code file_change = same_file;
                   3743:   enum cpp_token token;
                   3744:   int i;
                   3745: 
                   3746:   token = get_directive_token (pfile);
                   3747: 
                   3748:   if (token != CPP_NUMBER
                   3749:       || !isdigit(pfile->token_buffer[old_written]))
                   3750:     {
                   3751:       cpp_error (pfile, "invalid format `#line' command");
                   3752:       goto bad_line_directive;
                   3753:     }
                   3754: 
                   3755:   /* The Newline at the end of this line remains to be processed.
                   3756:      To put the next line at the specified line number,
                   3757:      we must store a line number now that is one less.  */
                   3758:   new_lineno = atoi (pfile->token_buffer + old_written) - 1;
                   3759:   CPP_SET_WRITTEN (pfile, old_written);
                   3760: 
                   3761:   /* NEW_LINENO is one less than the actual line number here.  */
                   3762:   if (CPP_PEDANTIC (pfile) && new_lineno < 0)
                   3763:     cpp_pedwarn (pfile, "line number out of range in `#line' command");
                   3764: 
                   3765: #if 0 /* #line 10"foo.c" is supposed to be allowed.  */
                   3766:   if (PEEKC() && !is_space[PEEKC()]) {
                   3767:     cpp_error (pfile, "invalid format `#line' command");
                   3768:     goto bad_line_directive;
                   3769:   }
                   3770: #endif
                   3771: 
                   3772:   token = get_directive_token (pfile);
                   3773: 
                   3774:   if (token == CPP_STRING) {
                   3775:     U_CHAR *fname = pfile->token_buffer + old_written;
                   3776:     U_CHAR *end_name;
                   3777:     static HASHNODE *fname_table[FNAME_HASHSIZE];
                   3778:     HASHNODE *hp, **hash_bucket;
                   3779:     U_CHAR *p;
                   3780:     long num_start;
                   3781:     int fname_length;
                   3782: 
                   3783:     /* Turn the file name, which is a character string literal,
                   3784:        into a null-terminated string.  Do this in place.  */
                   3785:     end_name = convert_string (pfile, fname, fname, CPP_PWRITTEN (pfile), 1);
                   3786:     if (end_name == NULL)
                   3787:     {
                   3788:        cpp_error (pfile, "invalid format `#line' command");
                   3789:        goto bad_line_directive;
                   3790:     }
                   3791: 
                   3792:     fname_length = end_name - fname;
                   3793: 
                   3794:     num_start = CPP_WRITTEN (pfile);
                   3795:     token = get_directive_token (pfile);
                   3796:     if (token != CPP_VSPACE && token != CPP_EOF && token != CPP_POP) {
                   3797:       p = pfile->token_buffer + num_start;
                   3798:       if (CPP_PEDANTIC (pfile))
                   3799:        cpp_pedwarn (pfile, "garbage at end of `#line' command");
                   3800: 
                   3801:       if (token != CPP_NUMBER || *p < '0' || *p > '4' || p[1] != '\0')
                   3802:       {
                   3803:        cpp_error (pfile, "invalid format `#line' command");
                   3804:        goto bad_line_directive;
                   3805:       }
                   3806:       if (*p == '1')
                   3807:        file_change = enter_file;
                   3808:       else if (*p == 2)
                   3809:        file_change = leave_file;
                   3810:       else if (*p == 3)
                   3811:        ip->system_header_p = 1;
                   3812:       else /* if (*p == 4) */
                   3813:        ip->system_header_p = 2;
                   3814: 
                   3815:       CPP_SET_WRITTEN (pfile, num_start);
                   3816:       token = get_directive_token (pfile);
                   3817:       p = pfile->token_buffer + num_start;
                   3818:       if (token == CPP_NUMBER && p[1] == '\0' && (*p == '3' || *p== '4')) {
                   3819:        ip->system_header_p = *p == 3 ? 1 : 2;
                   3820:        token = get_directive_token (pfile);
                   3821:       }
                   3822:       if (token != CPP_VSPACE) {
                   3823:        cpp_error (pfile, "invalid format `#line' command");
                   3824:        goto bad_line_directive;
                   3825:       }
                   3826:     }
                   3827: 
                   3828:     hash_bucket =
                   3829:       &fname_table[hashf (fname, fname_length, FNAME_HASHSIZE)];
                   3830:     for (hp = *hash_bucket; hp != NULL; hp = hp->next)
                   3831:       if (hp->length == fname_length &&
                   3832:          strncmp (hp->value.cpval, fname, fname_length) == 0) {
                   3833:        ip->nominal_fname = hp->value.cpval;
                   3834:        break;
                   3835:       }
                   3836:     if (hp == 0) {
                   3837:       /* Didn't find it; cons up a new one.  */
                   3838:       hp = (HASHNODE *) xcalloc (1, sizeof (HASHNODE) + fname_length + 1);
                   3839:       hp->next = *hash_bucket;
                   3840:       *hash_bucket = hp;
                   3841: 
                   3842:       hp->length = fname_length;
                   3843:       ip->nominal_fname = hp->value.cpval = ((char *) hp) + sizeof (HASHNODE);
                   3844:       bcopy (fname, hp->value.cpval, fname_length);
                   3845:     }
                   3846:   }
                   3847:   else if (token != CPP_VSPACE && token != CPP_EOF) {
                   3848:     cpp_error (pfile, "invalid format `#line' command");
                   3849:     goto bad_line_directive;
                   3850:   }
                   3851: 
                   3852:   ip->lineno = new_lineno;
                   3853:  bad_line_directive:
                   3854:   skip_rest_of_line (pfile);
                   3855:   CPP_SET_WRITTEN (pfile, old_written);
                   3856:   output_line_command (pfile, 0, file_change);
                   3857:   return 0;
                   3858: }
                   3859: 
                   3860: /*
                   3861:  * remove the definition of a symbol from the symbol table.
                   3862:  * according to un*x /lib/cpp, it is not an error to undef
                   3863:  * something that has no definitions, so it isn't one here either.
                   3864:  */
                   3865: 
                   3866: static int
                   3867: do_undef (pfile, keyword, buf, limit)
                   3868:      cpp_reader *pfile;
                   3869:      struct directive *keyword;
                   3870:      U_CHAR *buf, *limit;
                   3871: {
                   3872:   int sym_length;
                   3873:   HASHNODE *hp;
                   3874:   U_CHAR *orig_buf = buf;
                   3875: 
                   3876: #if 0
                   3877:   /* If this is a precompiler run (with -pcp) pass thru #undef commands.  */
                   3878:   if (pcp_outfile && keyword)
                   3879:     pass_thru_directive (buf, limit, pfile, keyword);
                   3880: #endif
                   3881: 
                   3882:   SKIP_WHITE_SPACE (buf);
                   3883:   sym_length = check_macro_name (pfile, buf, "macro");
                   3884: 
                   3885:   while ((hp = cpp_lookup (pfile, buf, sym_length, -1)) != NULL)
                   3886:     {
                   3887:       /* If we are generating additional info for debugging (with -g) we
                   3888:         need to pass through all effective #undef commands.  */
                   3889:       if (CPP_OPTIONS (pfile)->debug_output && keyword)
                   3890:        pass_thru_directive (orig_buf, limit, pfile, keyword);
                   3891:       if (hp->type != T_MACRO)
                   3892:        cpp_warning (pfile, "undefining `%s'", hp->name);
                   3893:       delete_macro (hp);
                   3894:     }
                   3895: 
                   3896:   if (CPP_PEDANTIC (pfile)) {
                   3897:     buf += sym_length;
                   3898:     SKIP_WHITE_SPACE (buf);
                   3899:     if (buf != limit)
                   3900:       cpp_pedwarn (pfile, "garbage after `#undef' directive");
                   3901:   }
                   3902:   return 0;
                   3903: }
                   3904: 
                   3905: /*
                   3906:  * Report an error detected by the program we are processing.
                   3907:  * Use the text of the line in the error message.
                   3908:  * (We use error because it prints the filename & line#.)
                   3909:  */
                   3910: 
                   3911: static int
                   3912: do_error (pfile, keyword, buf, limit)
                   3913:      cpp_reader *pfile;
                   3914:      struct directive *keyword;
                   3915:      U_CHAR *buf, *limit;
                   3916: {
                   3917:   int length = limit - buf;
                   3918:   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
                   3919:   bcopy (buf, copy, length);
                   3920:   copy[length] = 0;
                   3921:   SKIP_WHITE_SPACE (copy);
                   3922:   cpp_error (pfile, "#error %s", copy);
                   3923:   return 0;
                   3924: }
                   3925: 
                   3926: /*
                   3927:  * Report a warning detected by the program we are processing.
                   3928:  * Use the text of the line in the warning message, then continue.
                   3929:  * (We use error because it prints the filename & line#.)
                   3930:  */
                   3931: 
                   3932: static int
                   3933: do_warning (pfile, keyword, buf, limit)
                   3934:      cpp_reader *pfile;
                   3935:      struct directive *keyword;
                   3936:      U_CHAR *buf, *limit;
                   3937: {
                   3938:   int length = limit - buf;
                   3939:   U_CHAR *copy = (U_CHAR *) xmalloc (length + 1);
                   3940:   bcopy (buf, copy, length);
                   3941:   copy[length] = 0;
                   3942:   SKIP_WHITE_SPACE (copy);
                   3943:   cpp_warning (pfile, "#warning %s", copy);
                   3944:   return 0;
                   3945: }
                   3946: 
                   3947: /* Remember the name of the current file being read from so that we can
                   3948:    avoid ever including it again.  */
                   3949: 
                   3950: static int
                   3951: do_once (pfile)
                   3952:      cpp_reader *pfile;
                   3953: {
                   3954:   cpp_buffer *ip = NULL;
                   3955:   struct file_name_list *new;
                   3956: 
                   3957:   for (ip = CPP_BUFFER (pfile); ; ip = CPP_PREV_BUFFER (ip))
                   3958:     {
                   3959:       if (ip == NULL)
                   3960:        return 0;
                   3961:       if (ip->fname != NULL)
                   3962:        break;
                   3963:     }
                   3964: 
                   3965:     
                   3966:   new = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
                   3967:   new->next = pfile->dont_repeat_files;
                   3968:   pfile->dont_repeat_files = new;
                   3969:   new->fname = savestring (ip->fname);
                   3970:   new->control_macro = 0;
                   3971:   new->got_name_map = 0;
                   3972:   new->c_system_include_path = 0;
                   3973: 
                   3974:   return 0;
                   3975: }
                   3976: 
                   3977: /* #ident has already been copied to the output file, so just ignore it.  */
                   3978: 
                   3979: static int
                   3980: do_ident (pfile, keyword, buf, limit)
                   3981:      cpp_reader *pfile;
                   3982:      struct directive *keyword;
                   3983:      U_CHAR *buf, *limit;
                   3984: {
                   3985: /*  long old_written = CPP_WRITTEN (pfile);*/
                   3986:   int len;
                   3987: 
                   3988:   /* Allow #ident in system headers, since that's not user's fault.  */
                   3989:   if (CPP_PEDANTIC (pfile) && !CPP_BUFFER (pfile)->system_header_p)
                   3990:     cpp_pedwarn (pfile, "ANSI C does not allow `#ident'");
                   3991: 
                   3992:   /* Leave rest of line to be read by later calls to cpp_get_token. */
                   3993: 
                   3994:   return 0;
                   3995: }
                   3996: 
                   3997: /* #pragma and its argument line have already been copied to the output file.
                   3998:    Just check for some recognized pragmas that need validation here.  */
                   3999: 
                   4000: static int
                   4001: do_pragma (pfile, keyword, buf, limit)
                   4002:      cpp_reader *pfile;
                   4003:      struct directive *keyword;
                   4004:      U_CHAR *buf, *limit;
                   4005: {
                   4006:   while (*buf == ' ' || *buf == '\t')
                   4007:     buf++;
                   4008:   if (!strncmp (buf, "once", 4)) {
                   4009:     /* Allow #pragma once in system headers, since that's not the user's
                   4010:        fault.  */
                   4011:     if (!CPP_BUFFER (pfile)->system_header_p)
                   4012:       cpp_warning (pfile, "`#pragma once' is obsolete");
                   4013:     do_once (pfile);
                   4014:   }
                   4015: 
                   4016:   if (!strncmp (buf, "implementation", 14)) {
                   4017:     /* Be quiet about `#pragma implementation' for a file only if it hasn't
                   4018:        been included yet.  */
                   4019:     struct file_name_list *ptr;
                   4020:     U_CHAR *p = buf + 14, *fname, *inc_fname;
                   4021:     int fname_len;
                   4022:     SKIP_WHITE_SPACE (p);
                   4023:     if (*p == '\n' || *p != '\"')
                   4024:       return 0;
                   4025: 
                   4026:     fname = p + 1;
                   4027:     p = (U_CHAR *) index (fname, '\"');
                   4028:     fname_len = p != NULL ? p - fname : strlen (fname);
                   4029:     
                   4030:     for (ptr = pfile->all_include_files; ptr; ptr = ptr->next) {
                   4031:       inc_fname = (U_CHAR *) rindex (ptr->fname, '/');
                   4032:       inc_fname = inc_fname ? inc_fname + 1 : (U_CHAR *) ptr->fname;
                   4033:       if (inc_fname && !strncmp (inc_fname, fname, fname_len))
                   4034:        cpp_warning (pfile,
                   4035:           "`#pragma implementation' for `%s' appears after file is included",
                   4036:                     fname);
                   4037:     }
                   4038:   }
                   4039: 
                   4040:   return 0;
                   4041: }
                   4042: 
                   4043: #if 0
                   4044: /* This was a fun hack, but #pragma seems to start to be useful.
                   4045:    By failing to recognize it, we pass it through unchanged to cc1.  */
                   4046: 
                   4047: /*
                   4048:  * the behavior of the #pragma directive is implementation defined.
                   4049:  * this implementation defines it as follows.
                   4050:  */
                   4051: 
                   4052: static int
                   4053: do_pragma ()
                   4054: {
                   4055:   close (0);
                   4056:   if (open ("/dev/tty", O_RDONLY, 0666) != 0)
                   4057:     goto nope;
                   4058:   close (1);
                   4059:   if (open ("/dev/tty", O_WRONLY, 0666) != 1)
                   4060:     goto nope;
                   4061:   execl ("/usr/games/hack", "#pragma", 0);
                   4062:   execl ("/usr/games/rogue", "#pragma", 0);
                   4063:   execl ("/usr/new/emacs", "-f", "hanoi", "9", "-kill", 0);
                   4064:   execl ("/usr/local/emacs", "-f", "hanoi", "9", "-kill", 0);
                   4065: nope:
                   4066:   fatal ("You are in a maze of twisty compiler features, all different");
                   4067: }
                   4068: #endif
                   4069: 
                   4070: /* Just ignore #sccs, on systems where we define it at all.  */
                   4071: 
                   4072: static int
                   4073: do_sccs (pfile, keyword, buf, limit)
                   4074:      cpp_reader *pfile;
                   4075:      struct directive *keyword;
                   4076:      U_CHAR *buf, *limit;
                   4077: {
                   4078:   if (CPP_PEDANTIC (pfile))
                   4079:     cpp_pedwarn (pfile, "ANSI C does not allow `#sccs'");
                   4080:   return 0;
                   4081: }
                   4082: 
                   4083: /*
                   4084:  * handle #if command by
                   4085:  *   1) inserting special `defined' keyword into the hash table
                   4086:  *     that gets turned into 0 or 1 by special_symbol (thus,
                   4087:  *     if the luser has a symbol called `defined' already, it won't
                   4088:  *      work inside the #if command)
                   4089:  *   2) rescan the input into a temporary output buffer
                   4090:  *   3) pass the output buffer to the yacc parser and collect a value
                   4091:  *   4) clean up the mess left from steps 1 and 2.
                   4092:  *   5) call conditional_skip to skip til the next #endif (etc.),
                   4093:  *      or not, depending on the value from step 3.
                   4094:  */
                   4095: 
                   4096: static int
                   4097: do_if (pfile, keyword, buf, limit)
                   4098:      cpp_reader *pfile;
                   4099:      struct directive *keyword;
                   4100:      U_CHAR *buf, *limit;
                   4101: {
                   4102:   HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf);
                   4103:   conditional_skip (pfile, value == 0, T_IF, NULL_PTR);
                   4104:   return 0;
                   4105: }
                   4106: 
                   4107: /*
                   4108:  * handle a #elif directive by not changing  if_stack  either.
                   4109:  * see the comment above do_else.
                   4110:  */
                   4111: 
                   4112: static int
                   4113: do_elif (pfile, keyword, buf, limit)
                   4114:      cpp_reader *pfile;
                   4115:      struct directive *keyword;
                   4116:      U_CHAR *buf, *limit;
                   4117: {
                   4118:   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack) {
                   4119:     cpp_error (pfile, "`#elif' not within a conditional");
                   4120:     return 0;
                   4121:   } else {
                   4122:     if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
                   4123:       cpp_error (pfile, "`#elif' after `#else'");
                   4124: #if 0
                   4125:       fprintf (stderr, " (matches line %d", pfile->if_stack->lineno);
                   4126: #endif
                   4127:       if (pfile->if_stack->fname != NULL && CPP_BUFFER (pfile)->fname != NULL
                   4128:          && strcmp (pfile->if_stack->fname,
                   4129:                     CPP_BUFFER (pfile)->nominal_fname) != 0)
                   4130:        fprintf (stderr, ", file %s", pfile->if_stack->fname);
                   4131:       fprintf (stderr, ")\n");
                   4132:     }
                   4133:     pfile->if_stack->type = T_ELIF;
                   4134:   }
                   4135: 
                   4136:   if (pfile->if_stack->if_succeeded)
                   4137:     skip_if_group (pfile, 0);
                   4138:   else {
                   4139:     HOST_WIDE_INT value = eval_if_expression (pfile, buf, limit - buf);
                   4140:     if (value == 0)
                   4141:       skip_if_group (pfile, 0);
                   4142:     else {
                   4143:       ++pfile->if_stack->if_succeeded; /* continue processing input */
                   4144:       output_line_command (pfile, 1, same_file);
                   4145:     }
                   4146:   }
                   4147:   return 0;
                   4148: }
                   4149: 
                   4150: /*
                   4151:  * evaluate a #if expression in BUF, of length LENGTH,
                   4152:  * then parse the result as a C expression and return the value as an int.
                   4153:  */
                   4154: static HOST_WIDE_INT
                   4155: eval_if_expression (pfile, buf, length)
                   4156:      cpp_reader *pfile;
                   4157:      U_CHAR *buf;
                   4158:      int length;
                   4159: {
                   4160:   HASHNODE *save_defined;
                   4161:   HOST_WIDE_INT value;
                   4162:   long old_written = CPP_WRITTEN (pfile);
                   4163: 
                   4164:   save_defined = install ("defined", -1, T_SPEC_DEFINED, 0, 0, -1);
                   4165:   pfile->pcp_inside_if = 1;
                   4166: 
                   4167:   value = cpp_parse_expr (pfile);
                   4168:   pfile->pcp_inside_if = 0;
                   4169:   delete_macro (save_defined); /* clean up special symbol */
                   4170: 
                   4171:   CPP_SET_WRITTEN (pfile, old_written); /* Pop */
                   4172: 
                   4173:   return value;
                   4174: }
                   4175: 
                   4176: /*
                   4177:  * routine to handle ifdef/ifndef.  Try to look up the symbol,
                   4178:  * then do or don't skip to the #endif/#else/#elif depending
                   4179:  * on what directive is actually being processed.
                   4180:  */
                   4181: 
                   4182: static int
                   4183: do_xifdef (pfile, keyword, unused1, unused2)
                   4184:      cpp_reader *pfile;
                   4185:      struct directive *keyword;
                   4186:      U_CHAR *unused1, *unused2;
                   4187: {
                   4188:   int skip;
                   4189:   cpp_buffer *ip = CPP_BUFFER (pfile);
                   4190:   U_CHAR* ident;
                   4191:   int ident_length;
                   4192:   enum cpp_token token;
                   4193:   int start_of_file = 0;
                   4194:   U_CHAR *control_macro = 0;
                   4195:   int old_written = CPP_WRITTEN (pfile);
                   4196: 
                   4197:   /* Detect a #ifndef at start of file (not counting comments).  */
                   4198:   if (ip->fname != 0 && keyword->type == T_IFNDEF)
                   4199:     start_of_file = pfile->only_seen_white == 2;
                   4200: 
                   4201:   pfile->no_macro_expand++;
                   4202:   token = get_directive_token (pfile);
                   4203:   pfile->no_macro_expand--;
                   4204: 
                   4205:   ident = pfile->token_buffer + old_written;
                   4206:   ident_length = CPP_WRITTEN (pfile) - old_written;
                   4207:   CPP_SET_WRITTEN (pfile, old_written); /* Pop */
                   4208: 
                   4209:   if (token == CPP_VSPACE || token == CPP_POP || token == CPP_EOF)
                   4210:     {
                   4211:       skip = (keyword->type == T_IFDEF);
                   4212:       if (! CPP_TRADITIONAL (pfile))
                   4213:        cpp_pedwarn (pfile, "`#%s' with no argument", keyword->name);
                   4214:     }
                   4215:   else if (token == CPP_NAME)
                   4216:     {
                   4217:       HASHNODE *hp = cpp_lookup (pfile, ident, ident_length, -1);
                   4218:       skip = (hp == NULL) ^ (keyword->type == T_IFNDEF);
                   4219:       if (start_of_file && !skip)
                   4220:        {
                   4221:          control_macro = (U_CHAR *) xmalloc (ident_length + 1);
                   4222:          bcopy (ident, control_macro, ident_length + 1);
                   4223:        }
                   4224:     }
                   4225:   else
                   4226:     {
                   4227:       skip = (keyword->type == T_IFDEF);
                   4228:       if (! CPP_TRADITIONAL (pfile))
                   4229:        cpp_error (pfile, "`#%s' with invalid argument", keyword->name);
                   4230:     }
                   4231: 
                   4232:   if (!CPP_TRADITIONAL (pfile))
                   4233:     { int c;
                   4234:       cpp_skip_hspace (pfile);
                   4235:       c = PEEKC ();
                   4236:       if (c != EOF && c != '\n')
                   4237:        cpp_pedwarn (pfile, "garbage at end of `#%s' argument", keyword->name);
                   4238:     }
                   4239:   skip_rest_of_line (pfile);
                   4240: 
                   4241: #if 0
                   4242:     if (pcp_outfile) {
                   4243:       /* Output a precondition for this macro.  */
                   4244:       if (hp && hp->value.defn->predefined)
                   4245:        fprintf (pcp_outfile, "#define %s\n", hp->name);
                   4246:       else {
                   4247:        U_CHAR *cp = buf;
                   4248:        fprintf (pcp_outfile, "#undef ");
                   4249:        while (is_idchar[*cp]) /* Ick! */
                   4250:          fputc (*cp++, pcp_outfile);
                   4251:        putc ('\n', pcp_outfile);
                   4252:       }
                   4253: #endif
                   4254: 
                   4255:   conditional_skip (pfile, skip, T_IF, control_macro);
                   4256:   return 0;
                   4257: }
                   4258: 
                   4259: /* Push TYPE on stack; then, if SKIP is nonzero, skip ahead.
                   4260:    If this is a #ifndef starting at the beginning of a file,
                   4261:    CONTROL_MACRO is the macro name tested by the #ifndef.
                   4262:    Otherwise, CONTROL_MACRO is 0.  */
                   4263: 
                   4264: static void
                   4265: conditional_skip (pfile, skip, type, control_macro)
                   4266:      cpp_reader *pfile;
                   4267:      int skip;
                   4268:      enum node_type type;
                   4269:      U_CHAR *control_macro;
                   4270: {
                   4271:   IF_STACK_FRAME *temp;
                   4272: 
                   4273:   temp = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
                   4274:   temp->fname = CPP_BUFFER (pfile)->nominal_fname;
                   4275: #if 0
                   4276:   temp->lineno = CPP_BUFFER (pfile)->lineno;
                   4277: #endif
                   4278:   temp->next = pfile->if_stack;
                   4279:   temp->control_macro = control_macro;
                   4280:   pfile->if_stack = temp;
                   4281: 
                   4282:   pfile->if_stack->type = type;
                   4283: 
                   4284:   if (skip != 0) {
                   4285:     skip_if_group (pfile, 0);
                   4286:     return;
                   4287:   } else {
                   4288:     ++pfile->if_stack->if_succeeded;
                   4289:     output_line_command (pfile, 1, same_file);
                   4290:   }
                   4291: }
                   4292: 
                   4293: /*
                   4294:  * skip to #endif, #else, or #elif.  adjust line numbers, etc.
                   4295:  * leaves input ptr at the sharp sign found.
                   4296:  * If ANY is nonzero, return at next directive of any sort.
                   4297:  */
                   4298: static void
                   4299: skip_if_group (pfile, any)
                   4300:      cpp_reader *pfile;
                   4301:      int any;
                   4302: {
                   4303:   int c;
                   4304:   int at_beg_of_line = 1;
                   4305:   struct directive *kt;
                   4306:   IF_STACK_FRAME *save_if_stack = pfile->if_stack; /* don't pop past here */
                   4307: #if 0
                   4308:   U_CHAR *beg_of_line = bp;
                   4309: #endif
                   4310:   register int ident_length;
                   4311:   U_CHAR *ident, *after_ident;
                   4312:   struct parse_marker line_start_mark;
                   4313: 
                   4314:   parse_set_mark (&line_start_mark, pfile);
                   4315: 
                   4316:   if (CPP_OPTIONS (pfile)->output_conditionals) {
                   4317:     static char failed[] = "#failed\n";
                   4318:     CPP_PUTS (pfile, failed, sizeof(failed)-1);
                   4319:     pfile->lineno++;
                   4320:     output_line_command (pfile, 1, same_file);
                   4321:   }
                   4322: 
                   4323:  beg_of_line:
                   4324:   if (CPP_OPTIONS (pfile)->output_conditionals)
                   4325:     {
                   4326:       cpp_buffer *pbuf = CPP_BUFFER (pfile);
                   4327:       U_CHAR *start_line = pbuf->buf + line_start_mark.position;
                   4328:       CPP_PUTS (pfile, start_line, pbuf->cur - start_line);
                   4329:     }
                   4330:   parse_move_mark (&line_start_mark, pfile);
                   4331:   if (!CPP_TRADITIONAL (pfile))
                   4332:       cpp_skip_hspace (pfile);
                   4333:   c  = GETC();
                   4334:   if (c == '#')
                   4335:     {
                   4336:       int old_written = CPP_WRITTEN (pfile);
                   4337:       cpp_skip_hspace (pfile);
                   4338: 
                   4339:       parse_name (pfile, GETC());
                   4340:       ident_length = CPP_WRITTEN (pfile) - old_written;
                   4341:       ident = pfile->token_buffer + old_written;
                   4342:       pfile->limit = ident;
                   4343: #if 0
                   4344:       if (ident_length == 0)
                   4345:        goto not_a_directive;
                   4346: 
                   4347:       /* Handle # followed by a line number.  */
                   4348: 
                   4349:       /* Avoid error for `###' and similar cases unless -pedantic.  */
                   4350: #endif
                   4351: 
                   4352:       for (kt = directive_table; kt->length >= 0; kt++)
                   4353:        {
                   4354:          IF_STACK_FRAME *temp;
                   4355:          if (ident_length == kt->length
                   4356:              && strncmp (ident, kt->name, kt->length) == 0)
                   4357:            {
                   4358:              /* If we are asked to return on next directive, do so now.  */
                   4359:              if (any)
                   4360:                goto done;
                   4361: 
                   4362:              switch (kt->type)
                   4363:                {
                   4364:                case T_IF:
                   4365:                case T_IFDEF:
                   4366:                case T_IFNDEF:
                   4367:                  temp
                   4368:                    = (IF_STACK_FRAME *) xcalloc (1, sizeof (IF_STACK_FRAME));
                   4369:                  temp->next = pfile->if_stack;
                   4370:                  pfile->if_stack = temp;
                   4371: #if 0
                   4372:                  temp->lineno = CPP_BUFFER(pfile)->lineno;
                   4373: #endif
                   4374:                  temp->fname = CPP_BUFFER(pfile)->nominal_fname;
                   4375:                  temp->type = kt->type;
                   4376:                  break;
                   4377:                case T_ELSE:
                   4378:                case T_ENDIF:
                   4379:                  if (CPP_PEDANTIC (pfile) && pfile->if_stack != save_if_stack)
                   4380:                    validate_else (pfile,
                   4381:                                   kt->type == T_ELSE ? "#else" : "#endif");
                   4382:                case T_ELIF:
                   4383:                  if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack)
                   4384:                    {
                   4385:                      cpp_error (pfile,
                   4386:                                 "`#%s' not within a conditional", kt->name);
                   4387:                      break;
                   4388:                    }
                   4389:                  else if (pfile->if_stack == save_if_stack)
                   4390:                    goto done;          /* found what we came for */
                   4391: 
                   4392:                  if (kt->type != T_ENDIF)
                   4393:                    {
                   4394:                      if (pfile->if_stack->type == T_ELSE)
                   4395:                        cpp_error (pfile, "`#else' or `#elif' after `#else'");
                   4396:                      pfile->if_stack->type = kt->type;
                   4397:                      break;
                   4398:                    }
                   4399: 
                   4400:                  temp = pfile->if_stack;
                   4401:                  pfile->if_stack = temp->next;
                   4402:                  free (temp);
                   4403:                  break;
                   4404:              default: ;
                   4405:                }
                   4406:              break;
                   4407:            }
                   4408:          /* Don't let erroneous code go by.  */
                   4409:          if (kt->length < 0 && !CPP_OPTIONS (pfile)->lang_asm
                   4410:              && CPP_PEDANTIC (pfile))
                   4411:            cpp_pedwarn (pfile, "invalid preprocessor directive name");
                   4412:        }
                   4413:       c = GETC ();
                   4414:     }
                   4415:   /* We're in the middle of a line.  Skip the rest of it. */
                   4416:   for (;;) {
                   4417:     switch (c)
                   4418:       {
                   4419:        long old;
                   4420:       case EOF:
                   4421:        goto done;
                   4422:       case '/':                        /* possible comment */
                   4423:        c = skip_comment (pfile, NULL);
                   4424:        if (c == EOF)
                   4425:          goto done;
                   4426:        break;
                   4427:       case '\"':
                   4428:       case '\'':
                   4429:        FORWARD(-1);
                   4430:        old = CPP_WRITTEN (pfile);
                   4431:        cpp_get_token (pfile);
                   4432:        CPP_SET_WRITTEN (pfile, old);
                   4433:        break;
                   4434:       case '\\':
                   4435:        /* Char after backslash loses its special meaning.  */
                   4436:        if (PEEKC() == '\n')
                   4437:          FORWARD (1);
                   4438:        break;
                   4439:       case '\n':
                   4440:        goto beg_of_line;
                   4441:        break;
                   4442:       }
                   4443:     c = GETC ();
                   4444:   }
                   4445:  done:
                   4446:   if (CPP_OPTIONS (pfile)->output_conditionals) {
                   4447:     static char end_failed[] = "#endfailed\n";
                   4448:     CPP_PUTS (pfile, end_failed, sizeof(end_failed)-1);
                   4449:     pfile->lineno++;
                   4450:   }
                   4451:   pfile->only_seen_white = 1;
                   4452:   parse_goto_mark (&line_start_mark, pfile);
                   4453:   parse_clear_mark (&line_start_mark);
                   4454: }
                   4455: 
                   4456: /*
                   4457:  * handle a #else directive.  Do this by just continuing processing
                   4458:  * without changing  if_stack ;  this is so that the error message
                   4459:  * for missing #endif's etc. will point to the original #if.  It
                   4460:  * is possible that something different would be better.
                   4461:  */
                   4462: 
                   4463: static int
                   4464: do_else (pfile, keyword, buf, limit)
                   4465:      cpp_reader *pfile;
                   4466:      struct directive *keyword;
                   4467:      U_CHAR *buf, *limit;
                   4468: {
                   4469:   cpp_buffer *ip = CPP_BUFFER (pfile);
                   4470: 
                   4471:   if (CPP_PEDANTIC (pfile))
                   4472:     validate_else (pfile, "#else");
                   4473:   skip_rest_of_line (pfile);
                   4474: 
                   4475:   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack) {
                   4476:     cpp_error (pfile, "`#else' not within a conditional");
                   4477:     return 0;
                   4478:   } else {
                   4479:     /* #ifndef can't have its special treatment for containing the whole file
                   4480:        if it has a #else clause.  */
                   4481:     pfile->if_stack->control_macro = 0;
                   4482: 
                   4483:     if (pfile->if_stack->type != T_IF && pfile->if_stack->type != T_ELIF) {
                   4484:       cpp_error (pfile, "`#else' after `#else'");
                   4485:       fprintf (stderr, " (matches line %d", pfile->if_stack->lineno);
                   4486:       if (strcmp (pfile->if_stack->fname, ip->nominal_fname) != 0)
                   4487:        fprintf (stderr, ", file %s", pfile->if_stack->fname);
                   4488:       fprintf (stderr, ")\n");
                   4489:     }
                   4490:     pfile->if_stack->type = T_ELSE;
                   4491:   }
                   4492: 
                   4493:   if (pfile->if_stack->if_succeeded)
                   4494:     skip_if_group (pfile, 0);
                   4495:   else {
                   4496:     ++pfile->if_stack->if_succeeded;   /* continue processing input */
                   4497:     output_line_command (pfile, 1, same_file);
                   4498:   }
                   4499:   return 0;
                   4500: }
                   4501: 
                   4502: /*
                   4503:  * unstack after #endif command
                   4504:  */
                   4505: 
                   4506: static int
                   4507: do_endif (pfile, keyword, buf, limit)
                   4508:      cpp_reader *pfile;
                   4509:      struct directive *keyword;
                   4510:      U_CHAR *buf, *limit;
                   4511: {
                   4512:   if (CPP_PEDANTIC (pfile))
                   4513:     validate_else (pfile, "#endif");
                   4514:   skip_rest_of_line (pfile);
                   4515: 
                   4516:   if (pfile->if_stack == CPP_BUFFER (pfile)->if_stack)
                   4517:     cpp_error (pfile, "unbalanced `#endif'");
                   4518:   else
                   4519:     {
                   4520:       IF_STACK_FRAME *temp = pfile->if_stack;
                   4521:       pfile->if_stack = temp->next;
                   4522:       if (temp->control_macro != 0)
                   4523:        {
                   4524:          /* This #endif matched a #ifndef at the start of the file.
                   4525:             See if it is at the end of the file.  */
                   4526:          struct parse_marker start_mark;
                   4527:          int c;
                   4528: 
                   4529:          parse_set_mark (&start_mark, pfile);
                   4530: 
                   4531:          for (;;)
                   4532:            {
                   4533:              cpp_skip_hspace (pfile);
                   4534:              c = GETC ();
                   4535:              if (c != '\n')
                   4536:                break;
                   4537:            }
                   4538:          parse_goto_mark (&start_mark, pfile);
                   4539:          parse_clear_mark (&start_mark);
                   4540: 
                   4541:          if (c == EOF)
                   4542:            {
                   4543:              /* If we get here, this #endif ends a #ifndef
                   4544:                 that contains all of the file (aside from whitespace).
                   4545:                 Arrange not to include the file again
                   4546:                 if the macro that was tested is defined.
                   4547: 
                   4548:                 Do not do this for the top-level file in a -include or any
                   4549:                 file in a -imacros.  */
                   4550: #if 0
                   4551: FIXME!
                   4552:              if (indepth != 0
                   4553:                  && ! (indepth == 1 && pfile->no_record_file)
                   4554:                  && ! (pfile->no_record_file && no_output))
                   4555: #endif
                   4556:                {
                   4557:                  struct file_name_list *ifile = pfile->all_include_files;
                   4558:                  
                   4559:                  for ( ; ifile != NULL; ifile = ifile->next)
                   4560:                    {
                   4561:                      if (!strcmp (ifile->fname, CPP_BUFFER (pfile)->fname))
                   4562:                        {
                   4563:                          ifile->control_macro = temp->control_macro;
                   4564:                          break;
                   4565:                        }
                   4566:                    }
                   4567:                }
                   4568:            }
                   4569:         }
                   4570:       free (temp);
                   4571:       output_line_command (pfile, 1, same_file);
                   4572:     }
                   4573:   return 0;
                   4574: }
                   4575: 
                   4576: /* When an #else or #endif is found while skipping failed conditional,
                   4577:    if -pedantic was specified, this is called to warn about text after
                   4578:    the command name.  P points to the first char after the command name.  */
                   4579: 
                   4580: static void
                   4581: validate_else (pfile, directive)
                   4582:      cpp_reader *pfile;
                   4583:      char *directive;
                   4584: {
                   4585:   int c;
                   4586:   cpp_skip_hspace (pfile);
                   4587:   c = PEEKC ();
                   4588:   if (c != EOF && c != '\n')
                   4589:     cpp_pedwarn (pfile,
                   4590:                 "text following `%s' violates ANSI standard", directive);
                   4591: }
                   4592: 
                   4593: /* Get the next token, and add it to the text in pfile->token_buffer.
                   4594:    Return the kind of token we got. */
                   4595:   
                   4596: 
                   4597: enum cpp_token
                   4598: cpp_get_token (pfile)
                   4599:      cpp_reader *pfile;
                   4600: {
                   4601:   register int c, c2, c3;
                   4602:   long old_written;
                   4603:   long start_line, start_column;
                   4604:   enum cpp_token token;
                   4605:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                   4606:   CPP_BUFFER (pfile)->prev = CPP_BUFFER (pfile)->cur;
                   4607:  get_next:
                   4608:   c = GETC();
                   4609:   if (c == EOF)
                   4610:     {
                   4611:     handle_eof:
                   4612:       if (CPP_BUFFER (pfile)->seen_eof)
                   4613:        {
                   4614:          if (cpp_pop_buffer (pfile) != CPP_NULL_BUFFER (pfile))
                   4615:            goto get_next;
                   4616:          else
                   4617:            return CPP_EOF;
                   4618:        }
                   4619:       else
                   4620:        {
                   4621:          cpp_buffer *next_buf
                   4622:            = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
                   4623:          CPP_BUFFER (pfile)->seen_eof = 1;
                   4624:          if (CPP_BUFFER (pfile)->nominal_fname && next_buf != 0)
                   4625:            {
                   4626:              /* We're about to return from an #include file.
                   4627:                 Emit #line information now (as part of the CPP_POP) result.
                   4628:                 But the #line refers to the file we will pop to. */
                   4629:              cpp_buffer *cur_buffer = CPP_BUFFER (pfile);
                   4630:              CPP_BUFFER (pfile) = next_buf;
                   4631:              pfile->input_stack_listing_current = 0;
                   4632:              output_line_command (pfile, 0, leave_file);
                   4633:              CPP_BUFFER (pfile) = cur_buffer;
                   4634:            }
                   4635:          return CPP_POP;
                   4636:        }
                   4637:     }
                   4638:   else
                   4639:     {
                   4640:       switch (c)
                   4641:        {
                   4642:          long newlines;
                   4643:          struct parse_marker start_mark;
                   4644:        case '/':
                   4645:          if (PEEKC () == '=')
                   4646:            goto op2;
                   4647:          if (opts->put_out_comments)
                   4648:            parse_set_mark (&start_mark, pfile);
                   4649:          newlines = 0;
                   4650:          cpp_buf_line_and_col (cpp_file_buffer (pfile),
                   4651:                                &start_line, &start_column);
                   4652:          c = skip_comment (pfile, &newlines);
                   4653:          if (opts->put_out_comments && (c == '/' || c == EOF))
                   4654:            parse_clear_mark (&start_mark);
                   4655:          if (c == '/')
                   4656:            goto randomchar;
                   4657:          if (c == EOF)
                   4658:            {
                   4659:              cpp_error_with_line (pfile, start_line, start_column,
                   4660:                                   "unterminated comment");
                   4661:              goto handle_eof;
                   4662:            }
                   4663:          c = '/';  /* Initial letter of comment. */
                   4664:        return_comment:
                   4665:          /* Comments are equivalent to spaces.
                   4666:             For -traditional, a comment is equivalent to nothing.  */
                   4667:          if (opts->put_out_comments)
                   4668:            {
                   4669:              cpp_buffer *pbuf = CPP_BUFFER (pfile);
                   4670:              long dummy;
                   4671:              U_CHAR *start = pbuf->buf + start_mark.position;
                   4672:              int len = pbuf->cur - start;
                   4673:              CPP_RESERVE(pfile, 1 + len);
                   4674:              CPP_PUTC_Q (pfile, c);
                   4675:              CPP_PUTS_Q (pfile, start, len);
                   4676:              pfile->lineno += newlines;
                   4677:              parse_clear_mark (&start_mark);
                   4678:              return CPP_COMMENT;
                   4679:            }
                   4680:          else if (CPP_TRADITIONAL (pfile))
                   4681:            {
                   4682:              return CPP_COMMENT;
                   4683:            }
                   4684:          else
                   4685:            {
                   4686: #if 0
                   4687:              /* This may not work if cpp_get_token is called recursively,
                   4688:                 since many places look for horizontal space. */
                   4689:              if (newlines)
                   4690:                {
                   4691:                  /* Copy the newlines into the output buffer, in order to
                   4692:                     avoid the pain of a #line every time a multiline comment
                   4693:                     is seen.  */
                   4694:                  CPP_RESERVE(pfile, newlines);
                   4695:                  while (--newlines >= 0)
                   4696:                    {
                   4697:                      CPP_PUTC_Q (pfile, '\n');
                   4698:                      pfile->lineno++;
                   4699:                    }
                   4700:                  return CPP_VSPACE;
                   4701:                }
                   4702: #endif
                   4703:              CPP_RESERVE(pfile, 1);
                   4704:              CPP_PUTC_Q (pfile, ' ');
                   4705:              return CPP_HSPACE;
                   4706:            }
                   4707: #if 0
                   4708:          if (opts->for_lint) {
                   4709:            U_CHAR *argbp;
                   4710:            int cmdlen, arglen;
                   4711:            char *lintcmd = get_lintcmd (ibp, limit, &argbp, &arglen, &cmdlen);
                   4712:            
                   4713:            if (lintcmd != NULL) {
                   4714:              /* I believe it is always safe to emit this newline: */
                   4715:              obp[-1] = '\n';
                   4716:              bcopy ("#pragma lint ", (char *) obp, 13);
                   4717:              obp += 13;
                   4718:              bcopy (lintcmd, (char *) obp, cmdlen);
                   4719:              obp += cmdlen;
                   4720: 
                   4721:              if (arglen != 0) {
                   4722:                *(obp++) = ' ';
                   4723:                bcopy (argbp, (char *) obp, arglen);
                   4724:                obp += arglen;
                   4725:              }
                   4726: 
                   4727:              /* OK, now bring us back to the state we were in before we entered
                   4728:                 this branch.  We need #line b/c the newline for the pragma
                   4729:                 could fuck things up. */
                   4730:              output_line_command (pfile, 0, same_file);
                   4731:              *(obp++) = ' ';   /* just in case, if comments are copied thru */
                   4732:              *(obp++) = '/';
                   4733:            }
                   4734:          }
                   4735: #endif
                   4736: 
                   4737:        case '#':
                   4738: #if 0
                   4739:          /* If this is expanding a macro definition, don't recognize
                   4740:             preprocessor directives.  */
                   4741:          if (ip->macro != 0)
                   4742:            goto randomchar;
                   4743:          /* If this is expand_into_temp_buffer, recognize them
                   4744:             only after an actual newline at this level,
                   4745:             not at the beginning of the input level.  */
                   4746:          if (ip->fname == 0 && beg_of_line == ip->buf)
                   4747:            goto randomchar;
                   4748:          if (ident_length)
                   4749:            goto specialchar;
                   4750: #endif
                   4751: 
                   4752:          if (!pfile->only_seen_white)
                   4753:            goto randomchar;
                   4754:          if (handle_directive (pfile))
                   4755:            return CPP_DIRECTIVE;
                   4756:          pfile->only_seen_white = 0;
                   4757:          return CPP_OTHER;
                   4758: 
                   4759:        case '\"':
                   4760:        case '\'':
                   4761:          /* A single quoted string is treated like a double -- some
                   4762:             programs (e.g., troff) are perverse this way */
                   4763:          cpp_buf_line_and_col (cpp_file_buffer (pfile),
                   4764:                                &start_line, &start_column);
                   4765:          old_written = CPP_WRITTEN (pfile);
                   4766:        string:
                   4767:          CPP_PUTC (pfile, c);
                   4768:          while (1)
                   4769:            {
                   4770:              int cc = GETC();
                   4771:              if (cc == EOF)
                   4772:                {
                   4773:                  if (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
                   4774:                    {
                   4775:                      /* try harder: this string crosses a macro expansion
                   4776:                         boundary.  This can happen naturally if -traditional.
                   4777:                         Otherwise, only -D can make a macro with an unmatched
                   4778:                         quote.  */
                   4779:                        cpp_buffer *next_buf
                   4780:                            = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
                   4781:                        (*CPP_BUFFER (pfile)->cleanup)
                   4782:                            (CPP_BUFFER (pfile), pfile);
                   4783:                        CPP_BUFFER (pfile) = next_buf;
                   4784:                        continue;
                   4785:                    }
                   4786:                  if (!CPP_TRADITIONAL (pfile))
                   4787:                    {
                   4788:                      cpp_error_with_line (pfile, start_line, start_column,
                   4789:                              "unterminated string or character constant");
                   4790:                      if (pfile->multiline_string_line != start_line
                   4791:                          && pfile->multiline_string_line != 0)
                   4792:                        cpp_error_with_line (pfile,
                   4793:                                             pfile->multiline_string_line, -1,
                   4794:                               "possible real start of unterminated constant");
                   4795:                      pfile->multiline_string_line = 0;
                   4796:                    }
                   4797:                  break;
                   4798:                }
                   4799:              CPP_PUTC (pfile, cc);
                   4800:              switch (cc)
                   4801:                {
                   4802:                case '\n':
                   4803:                  /* Traditionally, end of line ends a string constant with
                   4804:                 no error.  So exit the loop and record the new line.  */
                   4805:                  if (CPP_TRADITIONAL (pfile))
                   4806:                    goto while2end;
                   4807:                  if (c == '\'')
                   4808:                    {
                   4809:                      cpp_error_with_line (pfile, start_line, start_column,
                   4810:                                           "unterminated character constant");
                   4811:                      goto while2end;
                   4812:                    }
                   4813:                  if (CPP_PEDANTIC (pfile)
                   4814:                      && pfile->multiline_string_line == 0)
                   4815:                    {
                   4816:                      cpp_pedwarn_with_line (pfile, start_line, start_column,
                   4817:                               "string constant runs past end of line");
                   4818:                    }
                   4819:                  if (pfile->multiline_string_line == 0)
                   4820:                    pfile->multiline_string_line = start_line;
                   4821:                  break;
                   4822:                
                   4823:                case '\\':
                   4824:                  cc = GETC();
                   4825:                  if (cc == '\n')
                   4826:                    {
                   4827:                      /* Backslash newline is replaced by nothing at all. */
                   4828:                      CPP_ADJUST_WRITTEN (pfile, -1);
                   4829:                      pfile->lineno++;
                   4830:                    }
                   4831:                  else
                   4832:                    {
                   4833:                      /* ANSI stupidly requires that in \\ the second \
                   4834:                         is *not* prevented from combining with a newline.  */
                   4835:                      NEWLINE_FIX1(cc);
                   4836:                      if (cc != EOF)
                   4837:                        CPP_PUTC (pfile, cc);
                   4838:                    }
                   4839:                  break;
                   4840: 
                   4841:                case '\"':
                   4842:                case '\'':
                   4843:                  if (cc == c)
                   4844:                    goto while2end;
                   4845:                  break;
                   4846:                }
                   4847:            }
                   4848:        while2end:
                   4849:          pfile->lineno += count_newlines (pfile->token_buffer + old_written,
                   4850:                                           CPP_PWRITTEN (pfile));
                   4851:          pfile->only_seen_white = 0;
                   4852:          return c == '\'' ? CPP_CHAR : CPP_STRING;
                   4853: 
                   4854:        case '$':
                   4855:          if (!opts->dollars_in_ident)
                   4856:            goto randomchar;
                   4857:          goto letter;
                   4858: 
                   4859:        case ':':
                   4860:          if (opts->cplusplus && PEEKC () == ':')
                   4861:            goto op2;
                   4862:          goto randomchar;
                   4863: 
                   4864:        case '&':
                   4865:        case '+':
                   4866:        case '|':
                   4867:          NEWLINE_FIX;
                   4868:          c2 = PEEKC ();
                   4869:          if (c2 == c || c2 == '=')
                   4870:            goto op2;
                   4871:          goto randomchar;
                   4872: 
                   4873:        case '*':
                   4874:        case '!':
                   4875:        case '%':
                   4876:        case '=':
                   4877:        case '^':
                   4878:          NEWLINE_FIX;
                   4879:          if (PEEKC () == '=')
                   4880:            goto op2;
                   4881:          goto randomchar;
                   4882: 
                   4883:        case '-':
                   4884:          NEWLINE_FIX;
                   4885:          c2 = PEEKC ();
                   4886:          if (c2 == '-' && opts->chill)
                   4887:            {
                   4888:              /* Chill style comment */
                   4889:              if (opts->put_out_comments)
                   4890:                parse_set_mark (&start_mark, pfile);
                   4891:              FORWARD(1);  /* Skip second '-'. */
                   4892:              for (;;)
                   4893:                {
                   4894:                  c = GETC ();
                   4895:                  if (c == EOF)
                   4896:                    break;
                   4897:                  if (c == '\n')
                   4898:                    {
                   4899:                      /* Don't consider final '\n' to be part of comment. */
                   4900:                      FORWARD(-1);
                   4901:                      break;
                   4902:                    }
                   4903:                }
                   4904:              c = '-';
                   4905:              goto return_comment;
                   4906:            }
                   4907:          if (c2 == '-' || c2 == '=' || c2 == '>')
                   4908:            goto op2;
                   4909:          goto randomchar;
                   4910: 
                   4911:        case '<':
                   4912:          if (pfile->parsing_include_directive)
                   4913:            {
                   4914:              for (;;)
                   4915:                {
                   4916:                  CPP_PUTC (pfile, c);
                   4917:                  if (c == '>')
                   4918:                    break;
                   4919:                  c = GETC ();
                   4920:                  NEWLINE_FIX1 (c);
                   4921:                  if (c == '\n' || c == EOF)
                   4922:                    {
                   4923:                      cpp_error (pfile,
                   4924:                                 "missing '>' in `#include <FILENAME>'");
                   4925:                      break;
                   4926:                    }
                   4927:                }
                   4928:              return CPP_STRING;
                   4929:            }
                   4930:          /* else fall through */
                   4931:        case '>':
                   4932:          NEWLINE_FIX;
                   4933:          c2 = PEEKC ();
                   4934:          if (c2 == '=')
                   4935:            goto op2;
                   4936:          if (c2 != c)
                   4937:            goto randomchar;
                   4938:          FORWARD(1);
                   4939:          CPP_RESERVE (pfile, 4);
                   4940:          CPP_PUTC (pfile, c);
                   4941:          CPP_PUTC (pfile, c2);
                   4942:          NEWLINE_FIX;
                   4943:          c3 = PEEKC ();
                   4944:          if (c3 == '=')
                   4945:            CPP_PUTC_Q (pfile, GETC ());
                   4946:          CPP_NUL_TERMINATE_Q (pfile);
                   4947:          pfile->only_seen_white = 0;
                   4948:          return CPP_OTHER;
                   4949: 
                   4950:        case '@':
                   4951:          if (CPP_BUFFER (pfile)->has_escapes)
                   4952:            {
                   4953:              c = GETC ();
                   4954:              if (c == '-')
                   4955:                {
                   4956:                  if (pfile->output_escapes)
                   4957:                    CPP_PUTS (pfile, "@-", 2);
                   4958:                  parse_name (pfile, GETC ());
                   4959:                  return CPP_NAME;
                   4960:                }
                   4961:              else if (is_space [c])
                   4962:                {
                   4963:                  CPP_RESERVE (pfile, 2);
                   4964:                  if (pfile->output_escapes)
                   4965:                    CPP_PUTC_Q (pfile, '@');
                   4966:                  CPP_PUTC_Q (pfile, c);
                   4967:                  return CPP_HSPACE;
                   4968:                }
                   4969:            }
                   4970:          if (pfile->output_escapes)
                   4971:            {
                   4972:              CPP_PUTS (pfile, "@@", 2);
                   4973:              return CPP_OTHER;
                   4974:            }
                   4975:          goto randomchar;
                   4976: 
                   4977:        case '.':
                   4978:          NEWLINE_FIX;
                   4979:          c2 = PEEKC ();
                   4980:          if (isdigit(c2))
                   4981:            {
                   4982:              CPP_RESERVE(pfile, 2);
                   4983:              CPP_PUTC_Q (pfile, '.');
                   4984:              c = GETC ();
                   4985:              goto number;
                   4986:            }
                   4987:          /* FIXME - misses the case "..\\\n." */
                   4988:          if (c2 == '.' && PEEKN(1) == '.')
                   4989:            {
                   4990:              CPP_RESERVE(pfile, 4);
                   4991:              CPP_PUTC_Q (pfile, '.');
                   4992:              CPP_PUTC_Q (pfile, '.');
                   4993:              CPP_PUTC_Q (pfile, '.');
                   4994:              FORWARD (2);
                   4995:              CPP_NUL_TERMINATE_Q (pfile);
                   4996:              pfile->only_seen_white = 0;
                   4997:              return CPP_3DOTS;
                   4998:            }
                   4999:          goto randomchar;
                   5000: 
                   5001:        op2:
                   5002:          token = CPP_OTHER;
                   5003:          pfile->only_seen_white = 0;
                   5004:         op2any:
                   5005:          CPP_RESERVE(pfile, 3);
                   5006:          CPP_PUTC_Q (pfile, c);
                   5007:          CPP_PUTC_Q (pfile, GETC ());
                   5008:          CPP_NUL_TERMINATE_Q (pfile);
                   5009:          return token;
                   5010: 
                   5011:        case 'L':
                   5012:          NEWLINE_FIX;
                   5013:          c2 = PEEKC ();
                   5014:          if ((c2 == '\'' || c2 == '\"') && !CPP_TRADITIONAL (pfile))
                   5015:            {
                   5016:              CPP_PUTC (pfile, c);
                   5017:              c = GETC ();
                   5018:              goto string;
                   5019:            }
                   5020:          goto letter;
                   5021: 
                   5022:        case '0': case '1': case '2': case '3': case '4':
                   5023:        case '5': case '6': case '7': case '8': case '9':
                   5024:        number:
                   5025:          c2  = '.';
                   5026:          for (;;)
                   5027:            {
                   5028:              CPP_RESERVE (pfile, 2);
                   5029:              CPP_PUTC_Q (pfile, c);
                   5030:              NEWLINE_FIX;
                   5031:              c = PEEKC ();
                   5032:              if (c == EOF)
                   5033:                break;
                   5034:              if (!is_idchar[c] && c != '.'
                   5035:                  && ((c2 != 'e' && c2 != 'E') || (c != '+' && c != '-')))
                   5036:                break;
                   5037:              FORWARD(1);
                   5038:              c2= c;
                   5039:            }
                   5040:          CPP_NUL_TERMINATE_Q (pfile);
                   5041:          pfile->only_seen_white = 0;
                   5042:          return CPP_NUMBER;
                   5043:        case 'b': case 'c': case 'd': case 'h': case 'o':
                   5044:        case 'B': case 'C': case 'D': case 'H': case 'O':
                   5045:          if (opts->chill && PEEKC () == '\'')
                   5046:            {
                   5047:              pfile->only_seen_white = 0;
                   5048:              CPP_RESERVE (pfile, 2);
                   5049:              CPP_PUTC_Q (pfile, c);
                   5050:              CPP_PUTC_Q (pfile, '\'');
                   5051:              FORWARD(1);
                   5052:              for (;;)
                   5053:                {
                   5054:                  c = GETC();
                   5055:                  if (c == EOF)
                   5056:                    goto chill_number_eof;
                   5057:                  if (!is_idchar[c])
                   5058:                    {
                   5059:                      if (c == '\\' && PEEKC() == '\n')
                   5060:                        {
                   5061:                          FORWARD(2);
                   5062:                          continue;
                   5063:                        }
                   5064:                      break;
                   5065:                    }
                   5066:                  CPP_PUTC (pfile, c);
                   5067:                }
                   5068:              if (c == '\'')
                   5069:                {
                   5070:                  CPP_RESERVE (pfile, 2);
                   5071:                  CPP_PUTC_Q (pfile, c);
                   5072:                  CPP_NUL_TERMINATE_Q (pfile);
                   5073:                  return CPP_STRING;
                   5074:                }
                   5075:              else
                   5076:                {
                   5077:                  FORWARD(-1);
                   5078:                chill_number_eof:
                   5079:                  CPP_NUL_TERMINATE (pfile);
                   5080:                  return CPP_NUMBER;
                   5081:                }
                   5082:            }
                   5083:          else
                   5084:            goto letter;
                   5085:        case '_':
                   5086:        case 'a': case 'e': case 'f': case 'g': case 'i': case 'j':
                   5087:        case 'k': case 'l': case 'm': case 'n': case 'p': case 'q':
                   5088:        case 'r': case 's': case 't': case 'u': case 'v': case 'w':
                   5089:        case 'x': case 'y': case 'z':
                   5090:        case 'A': case 'E': case 'F': case 'G': case 'I': case 'J':
                   5091:        case 'K': case 'M': case 'N': case 'P': case 'Q': case 'R':
                   5092:        case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
                   5093:        case 'Y': case 'Z':
                   5094:         letter:
                   5095:           {
                   5096:            HASHNODE *hp;
                   5097:            unsigned char *ident;
                   5098:            int before_name_written = CPP_WRITTEN (pfile);
                   5099:            int ident_len;
                   5100:            parse_name (pfile, c);
                   5101:            pfile->only_seen_white = 0;
                   5102:            if (pfile->no_macro_expand)
                   5103:              return CPP_NAME;
                   5104:            ident = pfile->token_buffer + before_name_written;
                   5105:            ident_len = CPP_PWRITTEN (pfile) - ident;
                   5106:            hp = cpp_lookup (pfile, ident, ident_len, -1);
                   5107:            if (!hp)
                   5108:              return CPP_NAME;
                   5109:            if (hp->type == T_DISABLED)
                   5110:              {
                   5111:                if (pfile->output_escapes)
                   5112:                  { /* Return "@-IDENT", followed by '\0'. */
                   5113:                    int i;
                   5114:                    CPP_RESERVE (pfile, 3);
                   5115:                    ident = pfile->token_buffer + before_name_written;
                   5116:                    CPP_ADJUST_WRITTEN (pfile, 2);
                   5117:                    for (i = ident_len; i >= 0; i--) ident[i+2] = ident[i];
                   5118:                    ident[0] = '@';
                   5119:                    ident[1] = '-';
                   5120:                  }
                   5121:                return CPP_NAME;
                   5122:              }
                   5123: 
                   5124:            /* If macro wants an arglist, verify that a '(' follows.
                   5125:               first skip all whitespace, copying it to the output
                   5126:               after the macro name.  Then, if there is no '(',
                   5127:               decide this is not a macro call and leave things that way.  */
                   5128:            if (hp->type == T_MACRO && hp->value.defn->nargs >= 0)
                   5129:            {
                   5130:              struct parse_marker macro_mark;
                   5131:              int is_macro_call;
                   5132:              while (CPP_IS_MACRO_BUFFER (CPP_BUFFER (pfile)))
                   5133:                {
                   5134:                  cpp_buffer *next_buf;
                   5135:                  cpp_skip_hspace (pfile);
                   5136:                  if (PEEKC () != EOF)
                   5137:                    break;
                   5138:                  next_buf = CPP_PREV_BUFFER (CPP_BUFFER (pfile));
                   5139:                  (*CPP_BUFFER (pfile)->cleanup) (CPP_BUFFER (pfile), pfile);
                   5140:                  CPP_BUFFER (pfile) = next_buf;
                   5141:                }
                   5142:              parse_set_mark (&macro_mark, pfile);
                   5143:              for (;;)
                   5144:                {
                   5145:                  cpp_skip_hspace (pfile);
                   5146:                  c = PEEKC ();
                   5147:                  is_macro_call = c == '(';
                   5148:                  if (c != '\n')
                   5149:                    break;
                   5150:                  FORWARD (1);
                   5151:                }
                   5152:              if (!is_macro_call)
                   5153:                parse_goto_mark (&macro_mark, pfile);
                   5154:              parse_clear_mark (&macro_mark);
                   5155:              if (!is_macro_call)
                   5156:                return CPP_NAME;
                   5157:            }
                   5158:            /* This is now known to be a macro call. */
                   5159: 
                   5160:            /* it might not actually be a macro.  */
                   5161:            if (hp->type != T_MACRO) {
                   5162:              int xbuf_len;  U_CHAR *xbuf;
                   5163:              CPP_SET_WRITTEN (pfile, before_name_written);
                   5164:              special_symbol (hp, pfile);
                   5165:              xbuf_len = CPP_WRITTEN (pfile) - before_name_written;
                   5166:              xbuf = (U_CHAR *) xmalloc (xbuf_len + 1);
                   5167:              CPP_SET_WRITTEN (pfile, before_name_written);
                   5168:              bcopy (CPP_PWRITTEN (pfile), xbuf, xbuf_len + 1);
                   5169:              push_macro_expansion (pfile, xbuf, xbuf_len, hp);
                   5170:            }
                   5171:            else
                   5172:              {
                   5173:                /* Expand the macro, reading arguments as needed,
                   5174:                   and push the expansion on the input stack.  */
                   5175:                macroexpand (pfile, hp);
                   5176:                CPP_SET_WRITTEN (pfile, before_name_written);
                   5177:              }
                   5178: 
                   5179:            /* An extra "@ " is added to the end of a macro expansion
                   5180:               to prevent accidental token pasting.  We prefer to avoid
                   5181:               unneeded extra spaces (for the sake of cpp-using tools like
                   5182:               imake).  Here we remove the space if it is safe to do so. */
                   5183:            if (pfile->buffer->rlimit - pfile->buffer->cur >= 3
                   5184:                && pfile->buffer->rlimit[-2] == '@'
                   5185:                && pfile->buffer->rlimit[-1] == ' ')
                   5186:              {
                   5187:                int c1 = pfile->buffer->rlimit[-3];
                   5188:                int c2 = CPP_BUF_PEEK (CPP_PREV_BUFFER (CPP_BUFFER (pfile)));
                   5189:                if (c2 == EOF || ! unsafe_chars (c1, c2))
                   5190:                  pfile->buffer->rlimit -= 2;
                   5191:              }
                   5192:          }
                   5193:          goto get_next;
                   5194: 
                   5195:        case ' ':  case '\t':  case '\v':  case '\r':
                   5196:          for (;;)
                   5197:            {
                   5198:              CPP_PUTC (pfile, c);
                   5199:              c = PEEKC ();
                   5200:              if (c == EOF || !is_hor_space[c])
                   5201:                break;
                   5202:              FORWARD(1);
                   5203:            }
                   5204:          return CPP_HSPACE;
                   5205: 
                   5206:         case '\\':
                   5207:          c2 = PEEKC ();
                   5208:          if (c2 != '\n')
                   5209:            goto randomchar;
                   5210:          token = CPP_HSPACE;
                   5211:          goto op2any;
                   5212: 
                   5213:        case '\n':
                   5214:          CPP_PUTC (pfile, c);
                   5215:          if (pfile->only_seen_white == 0)
                   5216:            pfile->only_seen_white = 1;
                   5217:          pfile->lineno++;
                   5218:          output_line_command (pfile, 1, same_file);
                   5219:          return CPP_VSPACE;
                   5220: 
                   5221:        case '(': token = CPP_LPAREN;    goto char1;
                   5222:        case ')': token = CPP_RPAREN;    goto char1;
                   5223:        case '{': token = CPP_LBRACE;    goto char1;
                   5224:        case '}': token = CPP_RBRACE;    goto char1;
                   5225:        case ',': token = CPP_COMMA;     goto char1;
                   5226:        case ';': token = CPP_SEMICOLON; goto char1;
                   5227: 
                   5228:        randomchar:
                   5229:        default:
                   5230:          token = CPP_OTHER;
                   5231:        char1:
                   5232:          pfile->only_seen_white = 0;
                   5233:          CPP_PUTC (pfile, c);
                   5234:          return token;
                   5235:        }
                   5236:     }
                   5237: }
                   5238: 
                   5239: /* Like cpp_get_token, but skip spaces and comments. */
                   5240: enum cpp_token
                   5241: cpp_get_non_space_token (pfile)
                   5242:      cpp_reader *pfile;
                   5243: {
                   5244:   int old_written = CPP_WRITTEN (pfile);
                   5245:   for (;;)
                   5246:     {
                   5247:       enum cpp_token token = cpp_get_token (pfile);
                   5248:       if (token != CPP_COMMENT && token != CPP_POP
                   5249:          && token != CPP_HSPACE && token != CPP_VSPACE)
                   5250:        return token;
                   5251:       CPP_SET_WRITTEN (pfile, old_written);
                   5252:     }
                   5253: }
                   5254: 
                   5255: /* Parse an identifier starting with C. */
                   5256: 
                   5257: int
                   5258: parse_name (pfile, c)
                   5259:      cpp_reader *pfile; int c;
                   5260: {
                   5261:   for (;;)
                   5262:   {
                   5263:       if (! is_idchar[c])
                   5264:       {
                   5265:          if (c == '\\' && PEEKC() == '\n')
                   5266:          {
                   5267:              FORWARD(2);
                   5268:              continue;
                   5269:          }
                   5270:          FORWARD (-1);
                   5271:          break;
                   5272:       }
                   5273: 
                   5274:       CPP_RESERVE(pfile, 2); /* One more for final NUL. */
                   5275:       CPP_PUTC_Q (pfile, c);
                   5276:       c = GETC();
                   5277:       if (c == EOF)
                   5278:        break;
                   5279:   }
                   5280:   CPP_NUL_TERMINATE_Q (pfile);
                   5281:   return 1;
                   5282: }
                   5283: 
                   5284: 
                   5285: /* Maintain and search list of included files, for #import.  */
                   5286: 
                   5287: /* Hash a file name for import_hash_table.  */
                   5288: 
                   5289: static int 
                   5290: import_hash (f)
                   5291:      char *f;
                   5292: {
                   5293:   int val = 0;
                   5294: 
                   5295:   while (*f) val += *f++;
                   5296:   return (val%IMPORT_HASH_SIZE);
                   5297: }
                   5298: 
                   5299: /* Search for file FILENAME in import_hash_table.
                   5300:    Return -2 if found, either a matching name or a matching inode.
                   5301:    Otherwise, open the file and return a file descriptor if successful
                   5302:    or -1 if unsuccessful.  */
                   5303: 
                   5304: static int
                   5305: lookup_import (pfile, filename, searchptr)
                   5306:      cpp_reader *pfile;
                   5307:      char *filename;
                   5308:      struct file_name_list *searchptr;
                   5309: {
                   5310:   struct import_file *i;
                   5311:   int h;
                   5312:   int hashval;
                   5313:   struct stat sb;
                   5314:   int fd;
                   5315: 
                   5316:   hashval = import_hash (filename);
                   5317: 
                   5318:   /* Attempt to find file in list of already included files */
                   5319:   i = pfile->import_hash_table[hashval];
                   5320: 
                   5321:   while (i) {
                   5322:     if (!strcmp (filename, i->name))
                   5323:       return -2;               /* return found */
                   5324:     i = i->next;
                   5325:   }
                   5326:   /* Open it and try a match on inode/dev */
                   5327:   fd = open_include_file (pfile, filename, searchptr);
                   5328:   if (fd < 0)
                   5329:     return fd;
                   5330:   fstat (fd, &sb);
                   5331:   for (h = 0; h < IMPORT_HASH_SIZE; h++) {
                   5332:     i = pfile->import_hash_table[h];
                   5333:     while (i) {
                   5334:       /* Compare the inode and the device.
                   5335:         Supposedly on some systems the inode is not a scalar.  */
                   5336:       if (!bcmp ((char *) &i->inode, (char *) &sb.st_ino, sizeof (sb.st_ino))
                   5337:          && i->dev == sb.st_dev) {
                   5338:         close (fd);
                   5339:         return -2;             /* return found */
                   5340:       }
                   5341:       i = i->next;
                   5342:     }
                   5343:   }
                   5344:   return fd;                   /* Not found, return open file */
                   5345: }
                   5346: 
                   5347: /* Add the file FNAME, open on descriptor FD, to import_hash_table.  */
                   5348: 
                   5349: static void
                   5350: add_import (pfile, fd, fname)
                   5351:      cpp_reader *pfile;
                   5352:      int fd;
                   5353:      char *fname;
                   5354: {
                   5355:   struct import_file *i;
                   5356:   int hashval;
                   5357:   struct stat sb;
                   5358: 
                   5359:   hashval = import_hash (fname);
                   5360:   fstat (fd, &sb);
                   5361:   i = (struct import_file *)xmalloc (sizeof (struct import_file));
                   5362:   i->name = (char *)xmalloc (strlen (fname)+1);
                   5363:   strcpy (i->name, fname);
                   5364:   bcopy ((char *) &sb.st_ino, (char *) &i->inode, sizeof (sb.st_ino));
                   5365:   i->dev = sb.st_dev;
                   5366:   i->next = pfile->import_hash_table[hashval];
                   5367:   pfile->import_hash_table[hashval] = i;
                   5368: }
                   5369: 
                   5370: /* The file_name_map structure holds a mapping of file names for a
                   5371:    particular directory.  This mapping is read from the file named
                   5372:    FILE_NAME_MAP_FILE in that directory.  Such a file can be used to
                   5373:    map filenames on a file system with severe filename restrictions,
                   5374:    such as DOS.  The format of the file name map file is just a series
                   5375:    of lines with two tokens on each line.  The first token is the name
                   5376:    to map, and the second token is the actual name to use.  */
                   5377: 
                   5378: struct file_name_map
                   5379: {
                   5380:   struct file_name_map *map_next;
                   5381:   char *map_from;
                   5382:   char *map_to;
                   5383: };
                   5384: 
                   5385: #define FILE_NAME_MAP_FILE "header.gcc"
                   5386: 
                   5387: /* Read a space delimited string of unlimited length from a stdio
                   5388:    file.  */
                   5389: 
                   5390: static char *
                   5391: read_filename_string (ch, f)
                   5392:      int ch;
                   5393:      FILE *f;
                   5394: {
                   5395:   char *alloc, *set;
                   5396:   int len;
                   5397: 
                   5398:   len = 20;
                   5399:   set = alloc = xmalloc (len + 1);
                   5400:   if (! is_space[ch])
                   5401:     {
                   5402:       *set++ = ch;
                   5403:       while ((ch = getc (f)) != EOF && ! is_space[ch])
                   5404:        {
                   5405:          if (set - alloc == len)
                   5406:            {
                   5407:              len *= 2;
                   5408:              alloc = xrealloc (alloc, len + 1);
                   5409:              set = alloc + len / 2;
                   5410:            }
                   5411:          *set++ = ch;
                   5412:        }
                   5413:     }
                   5414:   *set = '\0';
                   5415:   ungetc (ch, f);
                   5416:   return alloc;
                   5417: }
                   5418: 
                   5419: /* This structure holds a linked list of file name maps, one per directory. */
                   5420: struct file_name_map_list
                   5421: {
                   5422:   struct file_name_map_list *map_list_next;
                   5423:   char *map_list_name;
                   5424:   struct file_name_map *map_list_map;
                   5425: };
                   5426: 
                   5427: /* Read the file name map file for DIRNAME.  */
                   5428: 
                   5429: static struct file_name_map *
                   5430: read_name_map (pfile, dirname)
                   5431:      cpp_reader *pfile;
                   5432:      char *dirname;
                   5433: {
                   5434:   register struct file_name_map_list *map_list_ptr;
                   5435:   char *name;
                   5436:   FILE *f;
                   5437: 
                   5438:   for (map_list_ptr = CPP_OPTIONS (pfile)->map_list; map_list_ptr;
                   5439:        map_list_ptr = map_list_ptr->map_list_next)
                   5440:     if (! strcmp (map_list_ptr->map_list_name, dirname))
                   5441:       return map_list_ptr->map_list_map;
                   5442: 
                   5443:   map_list_ptr = ((struct file_name_map_list *)
                   5444:                  xmalloc (sizeof (struct file_name_map_list)));
                   5445:   map_list_ptr->map_list_name = savestring (dirname);
                   5446:   map_list_ptr->map_list_map = NULL;
                   5447: 
                   5448:   name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
                   5449:   strcpy (name, dirname);
                   5450:   if (*dirname)
                   5451:     strcat (name, "/");
                   5452:   strcat (name, FILE_NAME_MAP_FILE);
                   5453:   f = fopen (name, "r");
                   5454:   if (!f)
                   5455:     map_list_ptr->map_list_map = NULL;
                   5456:   else
                   5457:     {
                   5458:       int ch;
                   5459:       int dirlen = strlen (dirname);
                   5460: 
                   5461:       while ((ch = getc (f)) != EOF)
                   5462:        {
                   5463:          char *from, *to;
                   5464:          struct file_name_map *ptr;
                   5465: 
                   5466:          if (is_space[ch])
                   5467:            continue;
                   5468:          from = read_filename_string (ch, f);
                   5469:          while ((ch = getc (f)) != EOF && is_hor_space[ch])
                   5470:            ;
                   5471:          to = read_filename_string (ch, f);
                   5472: 
                   5473:          ptr = ((struct file_name_map *)
                   5474:                 xmalloc (sizeof (struct file_name_map)));
                   5475:          ptr->map_from = from;
                   5476: 
                   5477:          /* Make the real filename absolute.  */
                   5478:          if (*to == '/')
                   5479:            ptr->map_to = to;
                   5480:          else
                   5481:            {
                   5482:              ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
                   5483:              strcpy (ptr->map_to, dirname);
                   5484:              ptr->map_to[dirlen] = '/';
                   5485:              strcpy (ptr->map_to + dirlen + 1, to);
                   5486:              free (to);
                   5487:            }         
                   5488: 
                   5489:          ptr->map_next = map_list_ptr->map_list_map;
                   5490:          map_list_ptr->map_list_map = ptr;
                   5491: 
                   5492:          while ((ch = getc (f)) != '\n')
                   5493:            if (ch == EOF)
                   5494:              break;
                   5495:        }
                   5496:       fclose (f);
                   5497:     }
                   5498:   
                   5499:   map_list_ptr->map_list_next = CPP_OPTIONS (pfile)->map_list;
                   5500:   CPP_OPTIONS (pfile)->map_list = map_list_ptr;
                   5501: 
                   5502:   return map_list_ptr->map_list_map;
                   5503: }  
                   5504: 
                   5505: /* Try to open include file FILENAME.  SEARCHPTR is the directory
                   5506:    being tried from the include file search path.  This function maps
                   5507:    filenames on file systems based on information read by
                   5508:    read_name_map.  */
                   5509: 
                   5510: static int
                   5511: open_include_file (pfile, filename, searchptr)
                   5512:      cpp_reader *pfile;
                   5513:      char *filename;
                   5514:      struct file_name_list *searchptr;
                   5515: {
                   5516:   register struct file_name_map *map;
                   5517:   register char *from;
                   5518:   char *p, *dir;
                   5519: 
                   5520:   if (searchptr && ! searchptr->got_name_map)
                   5521:     {
                   5522:       searchptr->name_map = read_name_map (pfile,
                   5523:                                           searchptr->fname
                   5524:                                           ? searchptr->fname : ".");
                   5525:       searchptr->got_name_map = 1;
                   5526:     }
                   5527: 
                   5528:   /* First check the mapping for the directory we are using.  */
                   5529:   if (searchptr && searchptr->name_map)
                   5530:     {
                   5531:       from = filename;
                   5532:       if (searchptr->fname)
                   5533:        from += strlen (searchptr->fname) + 1;
                   5534:       for (map = searchptr->name_map; map; map = map->map_next)
                   5535:        {
                   5536:          if (! strcmp (map->map_from, from))
                   5537:            {
                   5538:              /* Found a match.  */
                   5539:              return open (map->map_to, O_RDONLY, 0666);
                   5540:            }
                   5541:        }
                   5542:     }
                   5543: 
                   5544:   /* Try to find a mapping file for the particular directory we are
                   5545:      looking in.  Thus #include <sys/types.h> will look up sys/types.h
                   5546:      in /usr/include/header.gcc and look up types.h in
                   5547:      /usr/include/sys/header.gcc.  */
                   5548:   p = rindex (filename, '/');
                   5549:   if (! p)
                   5550:     p = filename;
                   5551:   if (searchptr
                   5552:       && searchptr->fname
                   5553:       && strlen (searchptr->fname) == p - filename
                   5554:       && ! strncmp (searchptr->fname, filename, p - filename))
                   5555:     {
                   5556:       /* FILENAME is in SEARCHPTR, which we've already checked.  */
                   5557:       return open (filename, O_RDONLY, 0666);
                   5558:     }
                   5559: 
                   5560:   if (p == filename)
                   5561:     {
                   5562:       dir = ".";
                   5563:       from = filename;
                   5564:     }
                   5565:   else
                   5566:     {
                   5567:       dir = (char *) alloca (p - filename + 1);
                   5568:       bcopy (filename, dir, p - filename);
                   5569:       dir[p - filename] = '\0';
                   5570:       from = p + 1;
                   5571:     }
                   5572:   for (map = read_name_map (pfile, dir); map; map = map->map_next)
                   5573:     if (! strcmp (map->map_from, from))
                   5574:       return open (map->map_to, O_RDONLY, 0666);
                   5575: 
                   5576:   return open (filename, O_RDONLY, 0666);
                   5577: }
                   5578: 
                   5579: /* Process the contents of include file FNAME, already open on descriptor F,
                   5580:    with output to OP.
                   5581:    SYSTEM_HEADER_P is 1 if this file resides in any one of the known
                   5582:    "system" include directories (as decided by the `is_system_include'
                   5583:    function above).
                   5584:    DIRPTR is the link in the dir path through which this file was found,
                   5585:    or 0 if the file name was absolute or via the current directory.
                   5586:    Return 1 on success, 0 on failure.
                   5587: 
                   5588:    The caller is responsible for the cpp_push_buffer.  */
                   5589: 
                   5590: static int
                   5591: finclude (pfile, f, fname, system_header_p, dirptr)
                   5592:      cpp_reader *pfile;
                   5593:      int f;
                   5594:      char *fname;
                   5595:      int system_header_p;
                   5596:      struct file_name_list *dirptr;
                   5597: {
                   5598:   int st_mode;
                   5599:   long st_size;
                   5600:   long i;
                   5601:   int length;
                   5602:   cpp_buffer *fp;                      /* For input stack frame */
                   5603:   int missing_newline = 0;
                   5604: 
                   5605:   if (file_size_and_mode (f, &st_mode, &st_size) < 0)
                   5606:     {
                   5607:       cpp_perror_with_name (pfile, fname);
                   5608:       close (f);
                   5609:       cpp_pop_buffer (pfile);
                   5610:       return 0;
                   5611:     }
                   5612: 
                   5613:   fp = CPP_BUFFER (pfile);
                   5614:   fp->nominal_fname = fp->fname = fname;
                   5615: #if 0
                   5616:   fp->length = 0;
                   5617: #endif
                   5618:   fp->dir = dirptr;
                   5619:   fp->system_header_p = system_header_p;
                   5620:   fp->lineno = 1;
                   5621:   fp->colno = 1;
                   5622:   fp->cleanup = file_cleanup;
                   5623: 
                   5624:   if (S_ISREG (st_mode)) {
                   5625:     fp->buf = (U_CHAR *) xmalloc (st_size + 2);
                   5626:     fp->alimit = fp->buf + st_size + 2;
                   5627:     fp->cur = fp->buf;
                   5628: 
                   5629:     /* Read the file contents, knowing that st_size is an upper bound
                   5630:        on the number of bytes we can read.  */
                   5631:     length = safe_read (f, fp->buf, st_size);
                   5632:     fp->rlimit = fp->buf + length;
                   5633:     if (length < 0) goto nope;
                   5634:   }
                   5635:   else if (S_ISDIR (st_mode)) {
                   5636:     cpp_error (pfile, "directory `%s' specified in #include", fname);
                   5637:     close (f);
                   5638:     return 0;
                   5639:   } else {
                   5640:     /* Cannot count its file size before reading.
                   5641:        First read the entire file into heap and
                   5642:        copy them into buffer on stack. */
                   5643: 
                   5644:     int bsize = 2000;
                   5645: 
                   5646:     st_size = 0;
                   5647:     fp->buf = (U_CHAR *) xmalloc (bsize + 2);
                   5648: 
                   5649:     for (;;) {
                   5650:       i = safe_read (f, fp->buf + st_size, bsize - st_size);
                   5651:       if (i < 0)
                   5652:        goto nope;      /* error! */
                   5653:       st_size += i;
                   5654:       if (st_size != bsize)
                   5655:        break;  /* End of file */
                   5656:       bsize *= 2;
                   5657:       fp->buf = (U_CHAR *) xrealloc (fp->buf, bsize + 2);
                   5658:     }
                   5659:     fp->cur = fp->buf;
                   5660:     length = st_size;
                   5661:   }
                   5662: 
                   5663:   if ((length > 0 && fp->buf[length - 1] != '\n')
                   5664:       /* Backslash-newline at end is not good enough.  */
                   5665:       || (length > 1 && fp->buf[length - 2] == '\\')) {
                   5666:     fp->buf[length++] = '\n';
                   5667: #if 0
                   5668:     missing_newline = 1;
                   5669: #endif
                   5670:   }
                   5671:   fp->buf[length] = '\0';
                   5672:   fp->rlimit = fp->buf + length;
                   5673: 
                   5674:   /* Close descriptor now, so nesting does not use lots of descriptors.  */
                   5675:   close (f);
                   5676: 
                   5677:   /* Must do this before calling trigraph_pcp, so that the correct file name
                   5678:      will be printed in warning messages.  */
                   5679: 
                   5680:   pfile->input_stack_listing_current = 0;
                   5681: 
                   5682: #if 0
                   5683:   if (!no_trigraphs)
                   5684:     trigraph_pcp (fp);
                   5685: #endif
                   5686: 
                   5687: #if 0
                   5688:   rescan (op, 0);
                   5689: 
                   5690:   if (missing_newline)
                   5691:     fp->lineno--;
                   5692: 
                   5693:   if (CPP_PEDANTIC (pfile) && missing_newline)
                   5694:     pedwarn ("file does not end in newline");
                   5695: 
                   5696:   indepth--;
                   5697:   input_file_stack_tick++;
                   5698:   free (fp->buf);
                   5699: #endif
                   5700:   return 1;
                   5701: 
                   5702:  nope:
                   5703: 
                   5704:   cpp_perror_with_name (pfile, fname);
                   5705:   close (f);
                   5706:   free (fp->buf);
                   5707:   return 1;
                   5708: }
                   5709: 
                   5710: int
                   5711: push_parse_file (pfile, fname)
                   5712:      cpp_reader *pfile;
                   5713:      char *fname;
                   5714: {
                   5715:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                   5716:   struct cpp_pending *pend;
                   5717:   char *p;
                   5718:   int f;
                   5719:   cpp_buffer *fp;
                   5720: 
                   5721:   /* The code looks at the defaults through this pointer, rather than through
                   5722:      the constant structure above.  This pointer gets changed if an environment
                   5723:      variable specifies other defaults.  */
                   5724:   struct default_include *include_defaults = include_defaults_array;
                   5725: 
                   5726:   /* Add dirs from CPATH after dirs from -I.  */
                   5727:   /* There seems to be confusion about what CPATH should do,
                   5728:      so for the moment it is not documented.  */
                   5729:   /* Some people say that CPATH should replace the standard include dirs,
                   5730:      but that seems pointless: it comes before them, so it overrides them
                   5731:      anyway.  */
                   5732:   p = (char *) getenv ("CPATH");
                   5733:   if (p != 0 && ! opts->no_standard_includes)
                   5734:     path_include (pfile, p);
                   5735: 
                   5736:   /* Now that dollars_in_ident is known, initialize is_idchar.  */
                   5737:   initialize_char_syntax (opts);
                   5738: 
                   5739:   /* Do partial setup of input buffer for the sake of generating
                   5740:      early #line directives (when -g is in effect).  */
                   5741:   fp = cpp_push_buffer (pfile, NULL, 0);
                   5742:   if (opts->in_fname == NULL)
                   5743:     opts->in_fname = "";
                   5744:   fp->nominal_fname = fp->fname = opts->in_fname;
                   5745:   fp->lineno = 0;
                   5746: 
                   5747:   /* Install __LINE__, etc.  Must follow initialize_char_syntax
                   5748:      and option processing.  */
                   5749:   initialize_builtins (pfile);
                   5750: 
                   5751:   /* Do standard #defines and assertions
                   5752:      that identify system and machine type.  */
                   5753: 
                   5754:   if (!opts->inhibit_predefs) {
                   5755:     char *p = (char *) alloca (strlen (predefs) + 1);
                   5756:     strcpy (p, predefs);
                   5757:     while (*p) {
                   5758:       char *q;
                   5759:       while (*p == ' ' || *p == '\t')
                   5760:        p++;
                   5761:       /* Handle -D options.  */ 
                   5762:       if (p[0] == '-' && p[1] == 'D') {
                   5763:        q = &p[2];
                   5764:        while (*p && *p != ' ' && *p != '\t')
                   5765:          p++;
                   5766:        if (*p != 0)
                   5767:          *p++= 0;
                   5768:        if (opts->debug_output)
                   5769:          output_line_command (pfile, 0, same_file);
                   5770:        cpp_define (pfile, q);
                   5771:        while (*p == ' ' || *p == '\t')
                   5772:          p++;
                   5773:       } else if (p[0] == '-' && p[1] == 'A') {
                   5774:        /* Handle -A options (assertions).  */ 
                   5775:        char *assertion;
                   5776:        char *past_name;
                   5777:        char *value;
                   5778:        char *past_value;
                   5779:        char *termination;
                   5780:        int save_char;
                   5781: 
                   5782:        assertion = &p[2];
                   5783:        past_name = assertion;
                   5784:        /* Locate end of name.  */
                   5785:        while (*past_name && *past_name != ' '
                   5786:               && *past_name != '\t' && *past_name != '(')
                   5787:          past_name++;
                   5788:        /* Locate `(' at start of value.  */
                   5789:        value = past_name;
                   5790:        while (*value && (*value == ' ' || *value == '\t'))
                   5791:          value++;
                   5792:        if (*value++ != '(')
                   5793:          abort ();
                   5794:        while (*value && (*value == ' ' || *value == '\t'))
                   5795:          value++;
                   5796:        past_value = value;
                   5797:        /* Locate end of value.  */
                   5798:        while (*past_value && *past_value != ' '
                   5799:               && *past_value != '\t' && *past_value != ')')
                   5800:          past_value++;
                   5801:        termination = past_value;
                   5802:        while (*termination && (*termination == ' ' || *termination == '\t'))
                   5803:          termination++;
                   5804:        if (*termination++ != ')')
                   5805:          abort ();
                   5806:        if (*termination && *termination != ' ' && *termination != '\t')
                   5807:          abort ();
                   5808:        /* Temporarily null-terminate the value.  */
                   5809:        save_char = *termination;
                   5810:        *termination = '\0';
                   5811:        /* Install the assertion.  */
                   5812:        make_assertion (pfile, "-A", assertion);
                   5813:        *termination = (char) save_char;
                   5814:        p = termination;
                   5815:        while (*p == ' ' || *p == '\t')
                   5816:          p++;
                   5817:       } else {
                   5818:        abort ();
                   5819:       }
                   5820:     }
                   5821:   }
                   5822: 
                   5823:   /* Now handle the command line options.  */
                   5824: 
                   5825:   /* Do -U's, -D's and -A's in the order they were seen.  */
                   5826:   /* First reverse the list. */
                   5827:   opts->pending = nreverse_pending (opts->pending);
                   5828: 
                   5829:   for (pend = opts->pending;  pend;  pend = pend->next)
                   5830:     {
                   5831:       if (pend->cmd != NULL && pend->cmd[0] == '-')
                   5832:        {
                   5833:          switch (pend->cmd[1])
                   5834:            {
                   5835:            case 'U':
                   5836:              if (opts->debug_output)
                   5837:                output_line_command (pfile, 0, same_file);
                   5838:              do_undef (pfile, NULL, pend->arg, pend->arg + strlen (pend->arg));
                   5839:              break;
                   5840:            case 'D':
                   5841:              if (opts->debug_output)
                   5842:                output_line_command (pfile, 0, same_file);
                   5843:              cpp_define (pfile, pend->arg);
                   5844:              break;
                   5845:            case 'A':
                   5846:              make_assertion (pfile, "-A", pend->arg);
                   5847:              break;
                   5848:            }
                   5849:        }
                   5850:     }
                   5851: 
                   5852:   opts->done_initializing = 1;
                   5853: 
                   5854:   { /* read the appropriate environment variable and if it exists
                   5855:        replace include_defaults with the listed path. */
                   5856:     char *epath = 0;
                   5857:     switch ((opts->objc << 1) + opts->cplusplus)
                   5858:       {
                   5859:       case 0:
                   5860:        epath = getenv ("C_INCLUDE_PATH");
                   5861:        break;
                   5862:       case 1:
                   5863:        epath = getenv ("CPLUS_INCLUDE_PATH");
                   5864:        break;
                   5865:       case 2:
                   5866:        epath = getenv ("OBJC_INCLUDE_PATH");
                   5867:        break;
                   5868:       case 3:
                   5869:        epath = getenv ("OBJCPLUS_INCLUDE_PATH");
                   5870:        break;
                   5871:       }
                   5872:     /* If the environment var for this language is set,
                   5873:        add to the default list of include directories.  */
                   5874:     if (epath) {
                   5875:       char *nstore = (char *) alloca (strlen (epath) + 2);
                   5876:       int num_dirs;
                   5877:       char *startp, *endp;
                   5878: 
                   5879:       for (num_dirs = 1, startp = epath; *startp; startp++)
                   5880:        if (*startp == PATH_SEPARATOR)
                   5881:          num_dirs++;
                   5882:       include_defaults
                   5883:        = (struct default_include *) xmalloc ((num_dirs
                   5884:                                               * sizeof (struct default_include))
                   5885:                                              + sizeof (include_defaults_array));
                   5886:       startp = endp = epath;
                   5887:       num_dirs = 0;
                   5888:       while (1) {
                   5889:         /* Handle cases like c:/usr/lib:d:/gcc/lib */
                   5890:         if ((*endp == PATH_SEPARATOR)
                   5891:             || *endp == 0) {
                   5892:          strncpy (nstore, startp, endp-startp);
                   5893:          if (endp == startp)
                   5894:            strcpy (nstore, ".");
                   5895:          else
                   5896:            nstore[endp-startp] = '\0';
                   5897: 
                   5898:          include_defaults[num_dirs].fname = savestring (nstore);
                   5899:          include_defaults[num_dirs].cplusplus = opts->cplusplus;
                   5900:          include_defaults[num_dirs].cxx_aware = 1;
                   5901:          num_dirs++;
                   5902:          if (*endp == '\0')
                   5903:            break;
                   5904:          endp = startp = endp + 1;
                   5905:        } else
                   5906:          endp++;
                   5907:       }
                   5908:       /* Put the usual defaults back in at the end.  */
                   5909:       bcopy ((char *) include_defaults_array,
                   5910:             (char *) &include_defaults[num_dirs],
                   5911:             sizeof (include_defaults_array));
                   5912:     }
                   5913:   }
                   5914: 
                   5915:   append_include_chain (pfile, opts->before_system, opts->last_before_system);
                   5916:   opts->first_system_include = opts->before_system;
                   5917: 
                   5918:   /* Unless -fnostdinc,
                   5919:      tack on the standard include file dirs to the specified list */
                   5920:   if (!opts->no_standard_includes) {
                   5921:     struct default_include *p = include_defaults;
                   5922:     char *specd_prefix = opts->include_prefix;
                   5923:     char *default_prefix = savestring (GCC_INCLUDE_DIR);
                   5924:     int default_len = 0;
                   5925:     /* Remove the `include' from /usr/local/lib/gcc.../include.  */
                   5926:     if (!strcmp (default_prefix + strlen (default_prefix) - 8, "/include")) {
                   5927:       default_len = strlen (default_prefix) - 7;
                   5928:       default_prefix[default_len] = 0;
                   5929:     }
                   5930:     /* Search "translated" versions of GNU directories.
                   5931:        These have /usr/local/lib/gcc... replaced by specd_prefix.  */
                   5932:     if (specd_prefix != 0 && default_len != 0)
                   5933:       for (p = include_defaults; p->fname; p++) {
                   5934:        /* Some standard dirs are only for C++.  */
                   5935:        if (!p->cplusplus
                   5936:            || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
                   5937:          /* Does this dir start with the prefix?  */
                   5938:          if (!strncmp (p->fname, default_prefix, default_len)) {
                   5939:            /* Yes; change prefix and add to search list.  */
                   5940:            struct file_name_list *new
                   5941:              = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
                   5942:            int this_len = strlen (specd_prefix) + strlen (p->fname) - default_len;
                   5943:            char *str = (char *) xmalloc (this_len + 1);
                   5944:            strcpy (str, specd_prefix);
                   5945:            strcat (str, p->fname + default_len);
                   5946:            new->fname = str;
                   5947:            new->control_macro = 0;
                   5948:            new->c_system_include_path = !p->cxx_aware;
                   5949:            new->got_name_map = 0;
                   5950:            append_include_chain (pfile, new, new);
                   5951:            if (opts->first_system_include == 0)
                   5952:              opts->first_system_include = new;
                   5953:          }
                   5954:        }
                   5955:       }
                   5956:     /* Search ordinary names for GNU include directories.  */
                   5957:     for (p = include_defaults; p->fname; p++) {
                   5958:       /* Some standard dirs are only for C++.  */
                   5959:       if (!p->cplusplus
                   5960:          || (opts->cplusplus && !opts->no_standard_cplusplus_includes)) {
                   5961:        struct file_name_list *new
                   5962:          = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
                   5963:        new->control_macro = 0;
                   5964:        new->c_system_include_path = !p->cxx_aware;
                   5965:        new->fname = p->fname;
                   5966:        new->got_name_map = 0;
                   5967:        append_include_chain (pfile, new, new);
                   5968:        if (opts->first_system_include == 0)
                   5969:          opts->first_system_include = new;
                   5970:       }
                   5971:     }
                   5972:   }
                   5973: 
                   5974:   /* Tack the after_include chain at the end of the include chain.  */
                   5975:   append_include_chain (pfile, opts->after_include, opts->last_after_include);
                   5976:   if (opts->first_system_include == 0)
                   5977:     opts->first_system_include = opts->after_include;
                   5978: 
                   5979:   /* With -v, print the list of dirs to search.  */
                   5980:   if (opts->verbose) {
                   5981:     struct file_name_list *p;
                   5982:     fprintf (stderr, "#include \"...\" search starts here:\n");
                   5983:     for (p = opts->include; p; p = p->next) {
                   5984:       if (p == opts->first_bracket_include)
                   5985:        fprintf (stderr, "#include <...> search starts here:\n");
                   5986:       fprintf (stderr, " %s\n", p->fname);
                   5987:     }
                   5988:     fprintf (stderr, "End of search list.\n");
                   5989:   }
                   5990: 
                   5991:   /* Scan the -imacros files before the main input.
                   5992:      Much like #including them, but with no_output set
                   5993:      so that only their macro definitions matter.  */
                   5994: 
                   5995:   opts->no_output++; pfile->no_record_file++;
                   5996:   for (pend = opts->pending;  pend;  pend = pend->next)
                   5997:     {
                   5998:       if (pend->cmd != NULL && strcmp (pend->cmd, "-imacros") == 0)
                   5999:        {
                   6000:          int fd = open (pend->arg, O_RDONLY, 0666);
                   6001:          if (fd < 0)
                   6002:            {
                   6003:              cpp_perror_with_name (pfile, pend->arg);
                   6004:              return FATAL_EXIT_CODE;
                   6005:            }
                   6006:          cpp_push_buffer (pfile, NULL, 0);
                   6007:          finclude (pfile, fd, pend->arg, 0, NULL_PTR);
                   6008:          cpp_scan_buffer (pfile);
                   6009:        }
                   6010:     }
                   6011:   opts->no_output--; pfile->no_record_file--;
                   6012: 
                   6013:   /* Copy the entire contents of the main input file into
                   6014:      the stacked input buffer previously allocated for it.  */
                   6015:   if (fname == NULL || *fname == 0) {
                   6016:     fname = "";
                   6017:     f = 0;
                   6018:   } else if ((f = open (fname, O_RDONLY, 0666)) < 0)
                   6019:     cpp_pfatal_with_name (pfile, fname);
                   6020: 
                   6021:   /* -MG doesn't select the form of output and must be specified with one of
                   6022:      -M or -MM.  -MG doesn't make sense with -MD or -MMD since they don't
                   6023:      inhibit compilation.  */
                   6024:   if (opts->print_deps_missing_files
                   6025:       && (opts->print_deps == 0 || !opts->no_output))
                   6026:     fatal (pfile, "-MG must be specified with one of -M or -MM");
                   6027: 
                   6028:   /* Either of two environment variables can specify output of deps.
                   6029:      Its value is either "OUTPUT_FILE" or "OUTPUT_FILE DEPS_TARGET",
                   6030:      where OUTPUT_FILE is the file to write deps info to
                   6031:      and DEPS_TARGET is the target to mention in the deps.  */
                   6032: 
                   6033:   if (opts->print_deps == 0
                   6034:       && (getenv ("SUNPRO_DEPENDENCIES") != 0
                   6035:          || getenv ("DEPENDENCIES_OUTPUT") != 0)) {
                   6036:     char *spec = getenv ("DEPENDENCIES_OUTPUT");
                   6037:     char *s;
                   6038:     char *output_file;
                   6039: 
                   6040:     if (spec == 0)
                   6041:       {
                   6042:        spec = getenv ("SUNPRO_DEPENDENCIES");
                   6043:        opts->print_deps = 2;
                   6044:       }
                   6045:     else
                   6046:       opts->print_deps = 1;
                   6047: 
                   6048:     s = spec;
                   6049:     /* Find the space before the DEPS_TARGET, if there is one.  */
                   6050:     /* This should use index.  (mrs) */
                   6051:     while (*s != 0 && *s != ' ') s++;
                   6052:     if (*s != 0)
                   6053:       {
                   6054:        opts->deps_target = s + 1;
                   6055:        output_file = (char *) xmalloc (s - spec + 1);
                   6056:        bcopy (spec, output_file, s - spec);
                   6057:        output_file[s - spec] = 0;
                   6058:       }
                   6059:     else
                   6060:       {
                   6061:        opts->deps_target = 0;
                   6062:        output_file = spec;
                   6063:       }
                   6064: 
                   6065:     opts->deps_file = output_file;
                   6066:     opts->print_deps_append = 1;
                   6067:   }
                   6068: 
                   6069:   /* For -M, print the expected object file name
                   6070:      as the target of this Make-rule.  */
                   6071:   if (opts->print_deps)
                   6072:     {
                   6073:       pfile->deps_allocated_size = 200;
                   6074:       pfile->deps_buffer = (char *) xmalloc (pfile->deps_allocated_size);
                   6075:       pfile->deps_buffer[0] = 0;
                   6076:       pfile->deps_size = 0;
                   6077:       pfile->deps_column = 0;
                   6078: 
                   6079:       if (opts->deps_target)
                   6080:        deps_output (pfile, opts->deps_target, ':');
                   6081:       else if (*opts->in_fname == 0)
                   6082:        deps_output (pfile, "-", ':');
                   6083:       else
                   6084:        {
                   6085:          char *p, *q;
                   6086:          int len;
                   6087: 
                   6088:          /* Discard all directory prefixes from filename.  */
                   6089:          if ((q = rindex (opts->in_fname, '/')) != NULL
                   6090: #ifdef DIR_SEPARATOR
                   6091:              && (q = rindex (opts->in_fname, DIR_SEPARATOR)) != NULL
                   6092: #endif
                   6093:              )
                   6094:            ++q;
                   6095:          else
                   6096:            q = opts->in_fname;
                   6097: 
                   6098:          /* Copy remainder to mungable area.  */
                   6099:          p = (char *) alloca (strlen(q) + 8);
                   6100:          strcpy (p, q);
                   6101: 
                   6102:          /* Output P, but remove known suffixes.  */
                   6103:          len = strlen (p);
                   6104:          q = p + len;
                   6105:          if (len >= 2
                   6106:              && p[len - 2] == '.'
                   6107:              && index("cCsSm", p[len - 1]))
                   6108:            q = p + (len - 2);
                   6109:          else if (len >= 3
                   6110:                   && p[len - 3] == '.'
                   6111:                   && p[len - 2] == 'c'
                   6112:                   && p[len - 1] == 'c')
                   6113:            q = p + (len - 3);
                   6114:          else if (len >= 4
                   6115:                   && p[len - 4] == '.'
                   6116:                   && p[len - 3] == 'c'
                   6117:                   && p[len - 2] == 'x'
                   6118:                   && p[len - 1] == 'x')
                   6119:            q = p + (len - 4);
                   6120:          else if (len >= 4
                   6121:                   && p[len - 4] == '.'
                   6122:                   && p[len - 3] == 'c'
                   6123:                   && p[len - 2] == 'p'
                   6124:                   && p[len - 1] == 'p')
                   6125:            q = p + (len - 4);
                   6126: 
                   6127:          /* Supply our own suffix.  */
                   6128: #ifndef VMS
                   6129:          strcpy (q, ".o");
                   6130: #else
                   6131:          strcpy (q, ".obj");
                   6132: #endif
                   6133: 
                   6134:          deps_output (pfile, p, ':');
                   6135:          deps_output (pfile, opts->in_fname, ' ');
                   6136:        }
                   6137:     }
                   6138: 
                   6139: #if 0
                   6140:   /* Make sure data ends with a newline.  And put a null after it.  */
                   6141: 
                   6142:   if ((fp->length > 0 && fp->buf[fp->length - 1] != '\n')
                   6143:       /* Backslash-newline at end is not good enough.  */
                   6144:       || (fp->length > 1 && fp->buf[fp->length - 2] == '\\')) {
                   6145:     fp->buf[fp->length++] = '\n';
                   6146:     missing_newline = 1;
                   6147:   }
                   6148:   fp->buf[fp->length] = '\0';
                   6149: 
                   6150:   /* Unless inhibited, convert trigraphs in the input.  */
                   6151: 
                   6152:   if (!no_trigraphs)
                   6153:     trigraph_pcp (fp);
                   6154: #endif
                   6155: 
                   6156:   /* Scan the -include files before the main input.
                   6157:    We push these in reverse order, so that the first one is handled first.  */
                   6158: 
                   6159:   pfile->no_record_file++;
                   6160:   opts->pending = nreverse_pending (opts->pending);
                   6161:   for (pend = opts->pending;  pend;  pend = pend->next)
                   6162:     {
                   6163:       if (pend->cmd != NULL && strcmp (pend->cmd, "-include") == 0)
                   6164:        {
                   6165:          int fd = open (pend->arg, O_RDONLY, 0666);
                   6166:          if (fd < 0)
                   6167:            {
                   6168:              cpp_perror_with_name (pfile, pend->arg);
                   6169:              return FATAL_EXIT_CODE;
                   6170:            }
                   6171:          cpp_push_buffer (pfile, NULL, 0);
                   6172:          finclude (pfile, fd, pend->arg, 0, NULL_PTR);
                   6173:        }
                   6174:     }
                   6175:   pfile->no_record_file--;
                   6176: 
                   6177:   /* Free the pending list. */
                   6178:   for (pend = opts->pending;  pend; )
                   6179:     {
                   6180:       struct cpp_pending *next = pend->next;
                   6181:       free (pend);
                   6182:       pend = next;
                   6183:     }
                   6184:   opts->pending = NULL;
                   6185: 
                   6186: #if 0
                   6187:   /* Scan the input, processing macros and directives.  */
                   6188: 
                   6189:   rescan (&outbuf, 0);
                   6190: 
                   6191:   if (missing_newline)
                   6192:     fp->lineno--;
                   6193: 
                   6194:   if (CPP_PEDANTIC (pfile) && missing_newline)
                   6195:     pedwarn ("file does not end in newline");
                   6196: 
                   6197: #endif
                   6198:   if (finclude (pfile, f, fname, 0, NULL_PTR))
                   6199:     output_line_command (pfile, 0, same_file);
                   6200:   return SUCCESS_EXIT_CODE;
                   6201: }
                   6202: 
                   6203: void
                   6204: init_parse_file (pfile)
                   6205:      cpp_reader *pfile;
                   6206: {
                   6207:   bzero ((char *) pfile, sizeof (cpp_reader));
                   6208:   pfile->get_token = cpp_get_token;
                   6209: 
                   6210:   pfile->token_buffer_size = 200;
                   6211:   pfile->token_buffer = (U_CHAR*)xmalloc (pfile->token_buffer_size);
                   6212:   CPP_SET_WRITTEN (pfile, 0);
                   6213: 
                   6214:   pfile->system_include_depth = 0;
                   6215:   pfile->dont_repeat_files = 0;
                   6216:   pfile->all_include_files = 0;
                   6217:   pfile->max_include_len = 0;
                   6218:   pfile->timebuf = NULL;
                   6219:   pfile->only_seen_white = 1;
                   6220:   pfile->buffer = CPP_NULL_BUFFER(pfile);
                   6221: }
                   6222: 
                   6223: static struct cpp_pending *
                   6224: nreverse_pending (list)
                   6225:      struct cpp_pending *list;
                   6226:      
                   6227: {
                   6228:   register struct cpp_pending *prev = 0, *next, *pend;
                   6229:   for (pend = list;  pend;  pend = next)
                   6230:     {
                   6231:       next = pend->next;
                   6232:       pend->next = prev;
                   6233:       prev = pend;
                   6234:     }
                   6235:   return prev;
                   6236: }
                   6237: 
                   6238: static void
                   6239: push_pending (pfile, cmd, arg)
                   6240:      cpp_reader *pfile;
                   6241:      char *cmd;
                   6242:      char *arg;
                   6243: {
                   6244:   struct cpp_pending *pend
                   6245:     = (struct cpp_pending*)xmalloc (sizeof (struct cpp_pending));
                   6246:   pend->cmd = cmd;
                   6247:   pend->arg = arg;
                   6248:   pend->next = CPP_OPTIONS (pfile)->pending;
                   6249:   CPP_OPTIONS (pfile)->pending = pend;
                   6250: }
                   6251: 
                   6252: /* Handle command-line options in (argc, argv).
                   6253:    Can be called multiple times, to handle multiple sets of options.
                   6254:    Returns if an unrecognized option is seen.
                   6255:    Returns number of handled arguments.  */
                   6256: 
                   6257: int
                   6258: cpp_handle_options (pfile, argc, argv)
                   6259:      cpp_reader *pfile;
                   6260:      int argc;
                   6261:      char **argv;
                   6262: {
                   6263:   int i;
                   6264:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                   6265:   for (i = 0; i < argc; i++) {
                   6266:     if (argv[i][0] != '-') {
                   6267:       if (opts->out_fname != NULL)
                   6268:        fatal ("Usage: %s [switches] input output", argv[0]);
                   6269:       else if (opts->in_fname != NULL)
                   6270:        opts->out_fname = argv[i];
                   6271:       else
                   6272:        opts->in_fname = argv[i];
                   6273:     } else {
                   6274:       switch (argv[i][1]) {
                   6275: 
                   6276:       case 'i':
                   6277:        if (!strcmp (argv[i], "-include")
                   6278:            || !strcmp (argv[i], "-imacros")) {
                   6279:          if (i + 1 == argc)
                   6280:            fatal ("Filename missing after `%s' option", argv[i]);
                   6281:          else
                   6282:            push_pending (pfile, argv[i], argv[i+1]), i++;
                   6283:        }
                   6284:        if (!strcmp (argv[i], "-iprefix")) {
                   6285:          if (i + 1 == argc)
                   6286:            fatal ("Filename missing after `-iprefix' option");
                   6287:          else
                   6288:            opts->include_prefix = argv[++i];
                   6289:        }
                   6290:        if (!strcmp (argv[i], "-ifoutput")) {
                   6291:          opts->output_conditionals = 1;
                   6292:        }
                   6293:        if (!strcmp (argv[i], "-isystem")) {
                   6294:          struct file_name_list *dirtmp;
                   6295: 
                   6296:          if (i + 1 == argc)
                   6297:            fatal ("Filename missing after `-isystem' option");
                   6298: 
                   6299:          dirtmp = (struct file_name_list *)
                   6300:            xmalloc (sizeof (struct file_name_list));
                   6301:          dirtmp->next = 0;
                   6302:          dirtmp->control_macro = 0;
                   6303:          dirtmp->c_system_include_path = 1;
                   6304:          dirtmp->fname = (char *) xmalloc (strlen (argv[i+1]) + 1);
                   6305:          strcpy (dirtmp->fname, argv[++i]);
                   6306:          dirtmp->got_name_map = 0;
                   6307: 
                   6308:          if (opts->before_system == 0)
                   6309:            opts->before_system = dirtmp;
                   6310:          else
                   6311:            opts->last_before_system->next = dirtmp;
                   6312:          opts->last_before_system = dirtmp; /* Tail follows the last one */
                   6313:        }
                   6314:        /* Add directory to end of path for includes,
                   6315:           with the default prefix at the front of its name.  */
                   6316:        if (!strcmp (argv[i], "-iwithprefix")) {
                   6317:          struct file_name_list *dirtmp;
                   6318:          char *prefix;
                   6319: 
                   6320:          if (opts->include_prefix != 0)
                   6321:            prefix = opts->include_prefix;
                   6322:          else {
                   6323:            prefix = savestring (GCC_INCLUDE_DIR);
                   6324:            /* Remove the `include' from /usr/local/lib/gcc.../include.  */
                   6325:            if (!strcmp (prefix + strlen (prefix) - 8, "/include"))
                   6326:              prefix[strlen (prefix) - 7] = 0;
                   6327:          }
                   6328: 
                   6329:          dirtmp = (struct file_name_list *)
                   6330:            xmalloc (sizeof (struct file_name_list));
                   6331:          dirtmp->next = 0;     /* New one goes on the end */
                   6332:          dirtmp->control_macro = 0;
                   6333:          dirtmp->c_system_include_path = 0;
                   6334:          if (i + 1 == argc)
                   6335:            fatal ("Directory name missing after `-iwithprefix' option");
                   6336: 
                   6337:          dirtmp->fname = (char *) xmalloc (strlen (argv[i+1])
                   6338:                                            + strlen (prefix) + 1);
                   6339:          strcpy (dirtmp->fname, prefix);
                   6340:          strcat (dirtmp->fname, argv[++i]);
                   6341:          dirtmp->got_name_map = 0;
                   6342: 
                   6343:          if (opts->after_include == 0)
                   6344:            opts->after_include = dirtmp;
                   6345:          else
                   6346:            opts->last_after_include->next = dirtmp;
                   6347:          opts->last_after_include = dirtmp; /* Tail follows the last one */
                   6348:        }
                   6349:        /* Add directory to main path for includes,
                   6350:           with the default prefix at the front of its name.  */
                   6351:        if (!strcmp (argv[i], "-iwithprefixbefore")) {
                   6352:          struct file_name_list *dirtmp;
                   6353:          char *prefix;
                   6354: 
                   6355:          if (opts->include_prefix != 0)
                   6356:            prefix = opts->include_prefix;
                   6357:          else {
                   6358:            prefix = savestring (GCC_INCLUDE_DIR);
                   6359:            /* Remove the `include' from /usr/local/lib/gcc.../include.  */
                   6360:            if (!strcmp (prefix + strlen (prefix) - 8, "/include"))
                   6361:              prefix[strlen (prefix) - 7] = 0;
                   6362:          }
                   6363: 
                   6364:          dirtmp = (struct file_name_list *)
                   6365:            xmalloc (sizeof (struct file_name_list));
                   6366:          dirtmp->next = 0;     /* New one goes on the end */
                   6367:          dirtmp->control_macro = 0;
                   6368:          dirtmp->c_system_include_path = 0;
                   6369:          if (i + 1 == argc)
                   6370:            fatal ("Directory name missing after `-iwithprefixbefore' option");
                   6371: 
                   6372:          dirtmp->fname = (char *) xmalloc (strlen (argv[i+1])
                   6373:                                            + strlen (prefix) + 1);
                   6374:          strcpy (dirtmp->fname, prefix);
                   6375:          strcat (dirtmp->fname, argv[++i]);
                   6376:          dirtmp->got_name_map = 0;
                   6377: 
                   6378:          append_include_chain (pfile, dirtmp, dirtmp);
                   6379:        }
                   6380:        /* Add directory to end of path for includes.  */
                   6381:        if (!strcmp (argv[i], "-idirafter")) {
                   6382:          struct file_name_list *dirtmp;
                   6383: 
                   6384:          dirtmp = (struct file_name_list *)
                   6385:            xmalloc (sizeof (struct file_name_list));
                   6386:          dirtmp->next = 0;     /* New one goes on the end */
                   6387:          dirtmp->control_macro = 0;
                   6388:          dirtmp->c_system_include_path = 0;
                   6389:          if (i + 1 == argc)
                   6390:            fatal ("Directory name missing after `-idirafter' option");
                   6391:          else
                   6392:            dirtmp->fname = argv[++i];
                   6393:          dirtmp->got_name_map = 0;
                   6394: 
                   6395:          if (opts->after_include == 0)
                   6396:            opts->after_include = dirtmp;
                   6397:          else
                   6398:            opts->last_after_include->next = dirtmp;
                   6399:          opts->last_after_include = dirtmp; /* Tail follows the last one */
                   6400:        }
                   6401:        break;
                   6402: 
                   6403:       case 'o':
                   6404:        if (opts->out_fname != NULL)
                   6405:          fatal ("Output filename specified twice");
                   6406:        if (i + 1 == argc)
                   6407:          fatal ("Filename missing after -o option");
                   6408:        opts->out_fname = argv[++i];
                   6409:        if (!strcmp (opts->out_fname, "-"))
                   6410:          opts->out_fname = "";
                   6411:        break;
                   6412: 
                   6413:       case 'p':
                   6414:        if (!strcmp (argv[i], "-pedantic"))
                   6415:          CPP_PEDANTIC (pfile) = 1;
                   6416:        else if (!strcmp (argv[i], "-pedantic-errors")) {
                   6417:          CPP_PEDANTIC (pfile) = 1;
                   6418:          opts->pedantic_errors = 1;
                   6419:        }
                   6420: #if 0
                   6421:        else if (!strcmp (argv[i], "-pcp")) {
                   6422:          char *pcp_fname = argv[++i];
                   6423:          pcp_outfile = 
                   6424:            ((pcp_fname[0] != '-' || pcp_fname[1] != '\0')
                   6425:             ? fopen (pcp_fname, "w")
                   6426:             : fdopen (dup (fileno (stdout)), "w"));
                   6427:          if (pcp_outfile == 0)
                   6428:            cpp_pfatal_with_name (pfile, pcp_fname);
                   6429:          no_precomp = 1;
                   6430:        }
                   6431: #endif
                   6432:        break;
                   6433: 
                   6434:       case 't':
                   6435:        if (!strcmp (argv[i], "-traditional")) {
                   6436:          opts->traditional = 1;
                   6437:          if (opts->dollars_in_ident > 0)
                   6438:            opts->dollars_in_ident = 1;
                   6439:        } else if (!strcmp (argv[i], "-trigraphs")) {
                   6440:          if (!opts->chill)
                   6441:            opts->no_trigraphs = 0;
                   6442:        }
                   6443:        break;
                   6444: 
                   6445:       case 'l':
                   6446:        if (! strcmp (argv[i], "-lang-c"))
                   6447:          opts->cplusplus = 0, opts->cplusplus_comments = 0, opts->objc = 0;
                   6448:        if (! strcmp (argv[i], "-lang-c++"))
                   6449:          opts->cplusplus = 1, opts->cplusplus_comments = 1, opts->objc = 0;
                   6450:        if (! strcmp (argv[i], "-lang-c-c++-comments"))
                   6451:          opts->cplusplus = 0, opts->cplusplus_comments = 1, opts->objc = 0;
                   6452:        if (! strcmp (argv[i], "-lang-objc"))
                   6453:          opts->objc = 1, opts->cplusplus = 0, opts->cplusplus_comments = 1;
                   6454:        if (! strcmp (argv[i], "-lang-objc++"))
                   6455:          opts->objc = 1, opts->cplusplus = 1, opts->cplusplus_comments = 1;
                   6456:        if (! strcmp (argv[i], "-lang-asm"))
                   6457:          opts->lang_asm = 1;
                   6458:        if (! strcmp (argv[i], "-lint"))
                   6459:          opts->for_lint = 1;
                   6460:        if (! strcmp (argv[i], "-lang-chill"))
                   6461:          opts->objc = 0, opts->cplusplus = 0, opts->chill = 1,
                   6462:          opts->traditional = 1, opts->no_trigraphs = 1;
                   6463:        break;
                   6464: 
                   6465:       case '+':
                   6466:        opts->cplusplus = 1, opts->cplusplus_comments = 1;
                   6467:        break;
                   6468: 
                   6469:       case 'w':
                   6470:        opts->inhibit_warnings = 1;
                   6471:        break;
                   6472: 
                   6473:       case 'W':
                   6474:        if (!strcmp (argv[i], "-Wtrigraphs"))
                   6475:          opts->warn_trigraphs = 1;
                   6476:        else if (!strcmp (argv[i], "-Wno-trigraphs"))
                   6477:          opts->warn_trigraphs = 0;
                   6478:        else if (!strcmp (argv[i], "-Wcomment"))
                   6479:          opts->warn_comments = 1;
                   6480:        else if (!strcmp (argv[i], "-Wno-comment"))
                   6481:          opts->warn_comments = 0;
                   6482:        else if (!strcmp (argv[i], "-Wcomments"))
                   6483:          opts->warn_comments = 1;
                   6484:        else if (!strcmp (argv[i], "-Wno-comments"))
                   6485:          opts->warn_comments = 0;
                   6486:        else if (!strcmp (argv[i], "-Wtraditional"))
                   6487:          opts->warn_stringify = 1;
                   6488:        else if (!strcmp (argv[i], "-Wno-traditional"))
                   6489:          opts->warn_stringify = 0;
                   6490:        else if (!strcmp (argv[i], "-Wimport"))
                   6491:          opts->warn_import = 1;
                   6492:        else if (!strcmp (argv[i], "-Wno-import"))
                   6493:          opts->warn_import = 0;
                   6494:        else if (!strcmp (argv[i], "-Werror"))
                   6495:          opts->warnings_are_errors = 1;
                   6496:        else if (!strcmp (argv[i], "-Wno-error"))
                   6497:          opts->warnings_are_errors = 0;
                   6498:        else if (!strcmp (argv[i], "-Wall"))
                   6499:          {
                   6500:            opts->warn_trigraphs = 1;
                   6501:            opts->warn_comments = 1;
                   6502:          }
                   6503:        break;
                   6504: 
                   6505:       case 'M':
                   6506:        /* The style of the choices here is a bit mixed.
                   6507:           The chosen scheme is a hybrid of keeping all options in one string
                   6508:           and specifying each option in a separate argument:
                   6509:           -M|-MM|-MD file|-MMD file [-MG].  An alternative is:
                   6510:           -M|-MM|-MD file|-MMD file|-MG|-MMG; or more concisely:
                   6511:           -M[M][G][D file].  This is awkward to handle in specs, and is not
                   6512:           as extensible.  */
                   6513:        /* ??? -MG must be specified in addition to one of -M or -MM.
                   6514:           This can be relaxed in the future without breaking anything.
                   6515:           The converse isn't true.  */
                   6516: 
                   6517:        /* -MG isn't valid with -MD or -MMD.  This is checked for later.  */
                   6518:        if (!strcmp (argv[i], "-MG"))
                   6519:          {
                   6520:            opts->print_deps_missing_files = 1;
                   6521:            break;
                   6522:          }
                   6523:        if (!strcmp (argv[i], "-M"))
                   6524:          opts->print_deps = 2;
                   6525:        else if (!strcmp (argv[i], "-MM"))
                   6526:          opts->print_deps = 1;
                   6527:        else if (!strcmp (argv[i], "-MD"))
                   6528:          opts->print_deps = 2;
                   6529:        else if (!strcmp (argv[i], "-MMD"))
                   6530:          opts->print_deps = 1;
                   6531:        /* For -MD and -MMD options, write deps on file named by next arg.  */
                   6532:        if (!strcmp (argv[i], "-MD") || !strcmp (argv[i], "-MMD"))
                   6533:          {
                   6534:            if (i+1 == argc)
                   6535:              fatal ("Filename missing after %s option", argv[i]);
                   6536:            opts->deps_file = argv[++i];
                   6537:          }
                   6538:        else
                   6539:          {
                   6540:            /* For -M and -MM, write deps on standard output
                   6541:               and suppress the usual output.  */
                   6542:            opts->no_output = 1;
                   6543:          }       
                   6544:        break;
                   6545: 
                   6546:       case 'd':
                   6547:        {
                   6548:          char *p = argv[i] + 2;
                   6549:          char c;
                   6550:          while ((c = *p++) != 0) {
                   6551:            /* Arg to -d specifies what parts of macros to dump */
                   6552:            switch (c) {
                   6553:            case 'M':
                   6554:              opts->dump_macros = dump_only;
                   6555:              opts->no_output = 1;
                   6556:              break;
                   6557:            case 'N':
                   6558:              opts->dump_macros = dump_names;
                   6559:              break;
                   6560:            case 'D':
                   6561:              opts->dump_macros = dump_definitions;
                   6562:              break;
                   6563:            }
                   6564:          }
                   6565:        }
                   6566:        break;
                   6567: 
                   6568:       case 'g':
                   6569:        if (argv[i][2] == '3')
                   6570:          opts->debug_output = 1;
                   6571:        break;
                   6572: 
                   6573:       case 'v':
                   6574:        fprintf (stderr, "GNU CPP version %s", version_string);
                   6575: #ifdef TARGET_VERSION
                   6576:        TARGET_VERSION;
                   6577: #endif
                   6578:        fprintf (stderr, "\n");
                   6579:        opts->verbose = 1;
                   6580:        break;
                   6581: 
                   6582:       case 'H':
                   6583:        opts->print_include_names = 1;
                   6584:        break;
                   6585: 
                   6586:       case 'D':
                   6587:        if (argv[i][2] != 0)
                   6588:          push_pending (pfile, "-D", argv[i] + 2);
                   6589:        else if (i + 1 == argc)
                   6590:          fatal ("Macro name missing after -D option");
                   6591:        else
                   6592:          i++, push_pending (pfile, "-D", argv[i]);
                   6593:        break;
                   6594: 
                   6595:       case 'A':
                   6596:        {
                   6597:          char *p;
                   6598: 
                   6599:          if (argv[i][2] != 0)
                   6600:            p = argv[i] + 2;
                   6601:          else if (i + 1 == argc)
                   6602:            fatal ("Assertion missing after -A option");
                   6603:          else
                   6604:            p = argv[++i];
                   6605: 
                   6606:          if (!strcmp (p, "-")) {
                   6607:            struct cpp_pending **ptr;
                   6608:            /* -A- eliminates all predefined macros and assertions.
                   6609:               Let's include also any that were specified earlier
                   6610:               on the command line.  That way we can get rid of any
                   6611:               that were passed automatically in from GCC.  */
                   6612:            int j;
                   6613:            opts->inhibit_predefs = 1;
                   6614:            for (ptr = &opts->pending; *ptr != NULL; )
                   6615:              {
                   6616:                struct cpp_pending *pend = *ptr;
                   6617:                if (pend->cmd && pend->cmd[0] == '-'
                   6618:                    && (pend->cmd[1] == 'D' || pend->cmd[1] == 'A'))
                   6619:                  {
                   6620:                    *ptr = pend->next;
                   6621:                    free (pend);
                   6622:                  }
                   6623:                else
                   6624:                  ptr = &pend->next;
                   6625:              }
                   6626:          } else {
                   6627:            push_pending (pfile, "-A", p);
                   6628:          }
                   6629:        }
                   6630:        break;
                   6631: 
                   6632:       case 'U':                /* JF #undef something */
                   6633:        if (argv[i][2] != 0)
                   6634:          push_pending (pfile, "-U", argv[i] + 2);
                   6635:        else if (i + 1 == argc)
                   6636:          fatal ("Macro name missing after -U option");
                   6637:        else
                   6638:          push_pending (pfile, "-U", argv[i+1]), i++;
                   6639:        break;
                   6640: 
                   6641:       case 'C':
                   6642:        opts->put_out_comments = 1;
                   6643:        break;
                   6644: 
                   6645:       case 'E':                        /* -E comes from cc -E; ignore it.  */
                   6646:        break;
                   6647: 
                   6648:       case 'P':
                   6649:        opts->no_line_commands = 1;
                   6650:        break;
                   6651: 
                   6652:       case '$':                        /* Don't include $ in identifiers.  */
                   6653:        opts->dollars_in_ident = 0;
                   6654:        break;
                   6655: 
                   6656:       case 'I':                        /* Add directory to path for includes.  */
                   6657:        {
                   6658:          struct file_name_list *dirtmp;
                   6659: 
                   6660:          if (! CPP_OPTIONS(pfile)->ignore_srcdir
                   6661:              && !strcmp (argv[i] + 2, "-")) {
                   6662:            CPP_OPTIONS (pfile)->ignore_srcdir = 1;
                   6663:            /* Don't use any preceding -I directories for #include <...>.  */
                   6664:            CPP_OPTIONS (pfile)->first_bracket_include = 0;
                   6665:          }
                   6666:          else {
                   6667:            dirtmp = (struct file_name_list *)
                   6668:              xmalloc (sizeof (struct file_name_list));
                   6669:            dirtmp->next = 0;           /* New one goes on the end */
                   6670:            dirtmp->control_macro = 0;
                   6671:            dirtmp->c_system_include_path = 0;
                   6672:            if (argv[i][2] != 0)
                   6673:              dirtmp->fname = argv[i] + 2;
                   6674:            else if (i + 1 == argc)
                   6675:              fatal ("Directory name missing after -I option");
                   6676:            else
                   6677:              dirtmp->fname = argv[++i];
                   6678:            dirtmp->got_name_map = 0;
                   6679:            append_include_chain (pfile, dirtmp, dirtmp);
                   6680:          }
                   6681:        }
                   6682:        break;
                   6683: 
                   6684:       case 'n':
                   6685:        if (!strcmp (argv[i], "-nostdinc"))
                   6686:          /* -nostdinc causes no default include directories.
                   6687:             You must specify all include-file directories with -I.  */
                   6688:          opts->no_standard_includes = 1;
                   6689:        else if (!strcmp (argv[i], "-nostdinc++"))
                   6690:          /* -nostdinc++ causes no default C++-specific include directories. */
                   6691:          opts->no_standard_cplusplus_includes = 1;
                   6692: #if 0
                   6693:        else if (!strcmp (argv[i], "-noprecomp"))
                   6694:          no_precomp = 1;
                   6695: #endif
                   6696:        break;
                   6697: 
                   6698:       case 'u':
                   6699:        /* Sun compiler passes undocumented switch "-undef".
                   6700:           Let's assume it means to inhibit the predefined symbols.  */
                   6701:        opts->inhibit_predefs = 1;
                   6702:        break;
                   6703: 
                   6704:       case '\0': /* JF handle '-' as file name meaning stdin or stdout */
                   6705:        if (opts->in_fname == NULL) {
                   6706:          opts->in_fname = "";
                   6707:          break;
                   6708:        } else if (opts->out_fname == NULL) {
                   6709:          opts->out_fname = "";
                   6710:          break;
                   6711:        }       /* else fall through into error */
                   6712: 
                   6713:       default:
                   6714:        return i;
                   6715:       }
                   6716:     }
                   6717:   }
                   6718:   return i;
                   6719: }
                   6720: 
                   6721: void
                   6722: cpp_finish (pfile)
                   6723:      cpp_reader *pfile;
                   6724: {
                   6725:   struct cpp_options *opts = CPP_OPTIONS (pfile);
                   6726:   
                   6727:   if (opts->print_deps)
                   6728:     {
                   6729:       /* Stream on which to print the dependency information.  */
                   6730:       FILE *deps_stream;
                   6731: 
                   6732:       /* Don't actually write the deps file if compilation has failed.  */
                   6733:       if (pfile->errors == 0)
                   6734:        {
                   6735:          char *deps_mode = opts->print_deps_append ? "a" : "w";
                   6736:          if (opts->deps_file == 0)
                   6737:            deps_stream = stdout;
                   6738:          else if ((deps_stream = fopen (opts->deps_file, deps_mode)) == 0)
                   6739:            cpp_pfatal_with_name (pfile, opts->deps_file);
                   6740:          fputs (pfile->deps_buffer, deps_stream);
                   6741:          putc ('\n', deps_stream);
                   6742:          if (opts->deps_file)
                   6743:            {
                   6744:              if (ferror (deps_stream) || fclose (deps_stream) != 0)
                   6745:                fatal ("I/O error on output");
                   6746:            }
                   6747:        }
                   6748:     }
                   6749: }
                   6750: 
                   6751: /* Free resources used by PFILE. */
                   6752: 
                   6753: void
                   6754: cpp_cleanup (pfile)
                   6755:      cpp_reader *pfile;
                   6756: {
                   6757:   int i;
                   6758:   while ( CPP_BUFFER (pfile) != CPP_NULL_BUFFER (pfile))
                   6759:     cpp_pop_buffer (pfile);
                   6760: 
                   6761:   if (pfile->token_buffer)
                   6762:     {
                   6763:       free (pfile->token_buffer);
                   6764:       pfile->token_buffer = NULL;
                   6765:     }
                   6766: 
                   6767:   if (pfile->deps_buffer)
                   6768:     {
                   6769:       free (pfile->deps_buffer);
                   6770:       pfile->deps_buffer = NULL;
                   6771:       pfile->deps_allocated_size = 0;
                   6772:     }
                   6773: 
                   6774:   while (pfile->if_stack)
                   6775:     {
                   6776:       IF_STACK_FRAME *temp = pfile->if_stack;
                   6777:       pfile->if_stack = temp->next;
                   6778:       free (temp);
                   6779:     }
                   6780: 
                   6781:   while (pfile->dont_repeat_files)
                   6782:     {
                   6783:       struct file_name_list *temp = pfile->dont_repeat_files;
                   6784:       pfile->dont_repeat_files = temp->next;
                   6785:       free (temp->fname);
                   6786:       free (temp);
                   6787:     }
                   6788: 
                   6789:   while (pfile->all_include_files)
                   6790:     {
                   6791:       struct file_name_list *temp = pfile->all_include_files;
                   6792:       pfile->all_include_files = temp->next;
                   6793:       free (temp->fname);
                   6794:       free (temp);
                   6795:     }
                   6796: 
                   6797:   for (i = IMPORT_HASH_SIZE; --i >= 0; )
                   6798:     {
                   6799:       register struct import_file *imp = pfile->import_hash_table[i];
                   6800:       while (imp)
                   6801:        {
                   6802:          struct import_file *next = imp->next;
                   6803:          free (imp->name);
                   6804:          free (imp);
                   6805:          imp = next;
                   6806:        }
                   6807:       pfile->import_hash_table[i] = 0;
                   6808:     }
                   6809: 
                   6810:   for (i = ASSERTION_HASHSIZE; --i >= 0; )
                   6811:     {
                   6812:       while (pfile->assertion_hashtab[i])
                   6813:        delete_assertion (pfile->assertion_hashtab[i]);
                   6814:     }
                   6815: 
                   6816:   cpp_hash_cleanup (pfile);
                   6817: }
                   6818: 
                   6819: static int
                   6820: do_assert (pfile, keyword, buf, limit)
                   6821:      cpp_reader *pfile;
                   6822:      struct directive *keyword;
                   6823:      U_CHAR *buf, *limit;
                   6824: {
                   6825:   long symstart;               /* remember where symbol name starts */
                   6826:   int c;
                   6827:   int sym_length;              /* and how long it is */
                   6828:   struct arglist *tokens = NULL;
                   6829: 
                   6830:   if (CPP_PEDANTIC (pfile) && CPP_OPTIONS (pfile)->done_initializing
                   6831:       && !CPP_BUFFER (pfile)->system_header_p)
                   6832:     cpp_pedwarn (pfile, "ANSI C does not allow `#assert'");
                   6833: 
                   6834:   cpp_skip_hspace (pfile);
                   6835:   symstart = CPP_WRITTEN (pfile);      /* remember where it starts */
                   6836:   parse_name (pfile, GETC());
                   6837:   sym_length = check_macro_name (pfile, pfile->token_buffer + symstart,
                   6838:                                 "assertion");
                   6839: 
                   6840:   cpp_skip_hspace (pfile);
                   6841:   if (PEEKC() != '(') {
                   6842:     cpp_error (pfile, "missing token-sequence in `#assert'");
                   6843:     goto error;
                   6844:   }
                   6845: 
                   6846:   {
                   6847:     int error_flag = 0;
                   6848:     tokens = read_token_list (pfile, &error_flag);
                   6849:     if (error_flag)
                   6850:       goto error;
                   6851:     if (tokens == 0) {
                   6852:       cpp_error (pfile, "empty token-sequence in `#assert'");
                   6853:       goto error;
                   6854:     }
                   6855:   cpp_skip_hspace (pfile);
                   6856:   c = PEEKC ();
                   6857:   if (c != EOF && c != '\n')
                   6858:       cpp_pedwarn (pfile, "junk at end of `#assert'");
                   6859:   skip_rest_of_line (pfile);
                   6860:   }
                   6861: 
                   6862:   /* If this name isn't already an assertion name, make it one.
                   6863:      Error if it was already in use in some other way.  */
                   6864: 
                   6865:   {
                   6866:     ASSERTION_HASHNODE *hp;
                   6867:     U_CHAR *symname = pfile->token_buffer + symstart;
                   6868:     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
                   6869:     struct tokenlist_list *value
                   6870:       = (struct tokenlist_list *) xmalloc (sizeof (struct tokenlist_list));
                   6871: 
                   6872:     hp = assertion_lookup (pfile, symname, sym_length, hashcode);
                   6873:     if (hp == NULL) {
                   6874:       if (sym_length == 7 && ! strncmp (symname, "defined", sym_length))
                   6875:        cpp_error (pfile, "`defined' redefined as assertion");
                   6876:       hp = assertion_install (pfile, symname, sym_length, hashcode);
                   6877:     }
                   6878: 
                   6879:     /* Add the spec'd token-sequence to the list of such.  */
                   6880:     value->tokens = tokens;
                   6881:     value->next = hp->value;
                   6882:     hp->value = value;
                   6883:   }
                   6884:   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
                   6885:   return 0;
                   6886:  error:
                   6887:   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
                   6888:   skip_rest_of_line (pfile);
                   6889:   return 1;
                   6890: }
                   6891: 
                   6892: static int
                   6893: do_unassert (pfile, keyword, buf, limit)
                   6894:      cpp_reader *pfile;
                   6895:      struct directive *keyword;
                   6896:      U_CHAR *buf, *limit;
                   6897: {
                   6898:   long symstart;               /* remember where symbol name starts */
                   6899:   int sym_length;      /* and how long it is */
                   6900:   int c;
                   6901: 
                   6902:   struct arglist *tokens = NULL;
                   6903:   int tokens_specified = 0;
                   6904: 
                   6905:   if (CPP_PEDANTIC (pfile) && CPP_OPTIONS (pfile)->done_initializing
                   6906:       && !CPP_BUFFER (pfile)->system_header_p)
                   6907:     cpp_pedwarn (pfile, "ANSI C does not allow `#unassert'");
                   6908: 
                   6909:   cpp_skip_hspace (pfile);
                   6910: 
                   6911:   symstart = CPP_WRITTEN (pfile);      /* remember where it starts */
                   6912:   parse_name (pfile, GETC());
                   6913:   sym_length = check_macro_name (pfile, pfile->token_buffer + symstart,
                   6914:                                 "assertion");
                   6915: 
                   6916:   cpp_skip_hspace (pfile);
                   6917:   if (PEEKC() == '(') {
                   6918:     int error_flag = 0;
                   6919: 
                   6920:     tokens = read_token_list (pfile, &error_flag);
                   6921:     if (error_flag)
                   6922:       goto error;
                   6923:     if (tokens == 0) {
                   6924:       cpp_error (pfile, "empty token list in `#unassert'");
                   6925:       goto error;
                   6926:     }
                   6927: 
                   6928:     tokens_specified = 1;
                   6929:   }
                   6930: 
                   6931:   cpp_skip_hspace (pfile);
                   6932:   c = PEEKC ();
                   6933:   if (c != EOF && c != '\n')
                   6934:       cpp_error (pfile, "junk at end of `#unassert'");
                   6935:   skip_rest_of_line (pfile);
                   6936: 
                   6937:   {
                   6938:     ASSERTION_HASHNODE *hp;
                   6939:     U_CHAR *symname = pfile->token_buffer + symstart;
                   6940:     int hashcode = hashf (symname, sym_length, ASSERTION_HASHSIZE);
                   6941:     struct tokenlist_list *tail, *prev;
                   6942: 
                   6943:     hp = assertion_lookup (pfile, symname, sym_length, hashcode);
                   6944:     if (hp == NULL)
                   6945:       return 1;
                   6946: 
                   6947:     /* If no token list was specified, then eliminate this assertion
                   6948:        entirely.  */
                   6949:     if (! tokens_specified)
                   6950:       delete_assertion (hp);
                   6951:     else {
                   6952:       /* If a list of tokens was given, then delete any matching list.  */
                   6953: 
                   6954:       tail = hp->value;
                   6955:       prev = 0;
                   6956:       while (tail) {
                   6957:        struct tokenlist_list *next = tail->next;
                   6958:        if (compare_token_lists (tail->tokens, tokens)) {
                   6959:          if (prev)
                   6960:            prev->next = next;
                   6961:          else
                   6962:            hp->value = tail->next;
                   6963:          free_token_list (tail->tokens);
                   6964:          free (tail);
                   6965:        } else {
                   6966:          prev = tail;
                   6967:        }
                   6968:        tail = next;
                   6969:       }
                   6970:     }
                   6971:   }
                   6972: 
                   6973:   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
                   6974:   return 0;
                   6975:  error:
                   6976:   CPP_SET_WRITTEN (pfile, symstart); /* Pop */
                   6977:   skip_rest_of_line (pfile);
                   6978:   return 1;
                   6979: }
                   6980: 
                   6981: /* Test whether there is an assertion named NAME
                   6982:    and optionally whether it has an asserted token list TOKENS.
                   6983:    NAME is not null terminated; its length is SYM_LENGTH.
                   6984:    If TOKENS_SPECIFIED is 0, then don't check for any token list.  */
                   6985: 
                   6986: int
                   6987: check_assertion (pfile, name, sym_length, tokens_specified, tokens)
                   6988:      cpp_reader *pfile;
                   6989:      U_CHAR *name;
                   6990:      int sym_length;
                   6991:      int tokens_specified;
                   6992:      struct arglist *tokens;
                   6993: {
                   6994:   ASSERTION_HASHNODE *hp;
                   6995:   int hashcode = hashf (name, sym_length, ASSERTION_HASHSIZE);
                   6996: 
                   6997:   if (CPP_PEDANTIC (pfile) && !CPP_BUFFER (pfile)->system_header_p)
                   6998:     cpp_pedwarn (pfile, "ANSI C does not allow testing assertions");
                   6999: 
                   7000:   hp = assertion_lookup (pfile, name, sym_length, hashcode);
                   7001:   if (hp == NULL)
                   7002:     /* It is not an assertion; just return false.  */
                   7003:     return 0;
                   7004: 
                   7005:   /* If no token list was specified, then value is 1.  */
                   7006:   if (! tokens_specified)
                   7007:     return 1;
                   7008: 
                   7009:   {
                   7010:     struct tokenlist_list *tail;
                   7011: 
                   7012:     tail = hp->value;
                   7013: 
                   7014:     /* If a list of tokens was given,
                   7015:        then succeed if the assertion records a matching list.  */
                   7016: 
                   7017:     while (tail) {
                   7018:       if (compare_token_lists (tail->tokens, tokens))
                   7019:        return 1;
                   7020:       tail = tail->next;
                   7021:     }
                   7022: 
                   7023:     /* Fail if the assertion has no matching list.  */
                   7024:     return 0;
                   7025:   }
                   7026: }
                   7027: 
                   7028: /* Compare two lists of tokens for equality including order of tokens.  */
                   7029: 
                   7030: static int
                   7031: compare_token_lists (l1, l2)
                   7032:      struct arglist *l1, *l2;
                   7033: {
                   7034:   while (l1 && l2) {
                   7035:     if (l1->length != l2->length)
                   7036:       return 0;
                   7037:     if (strncmp (l1->name, l2->name, l1->length))
                   7038:       return 0;
                   7039:     l1 = l1->next;
                   7040:     l2 = l2->next;
                   7041:   }
                   7042: 
                   7043:   /* Succeed if both lists end at the same time.  */
                   7044:   return l1 == l2;
                   7045: }
                   7046: 
                   7047: struct arglist *
                   7048: reverse_token_list (tokens)
                   7049:      struct arglist *tokens;
                   7050: {
                   7051:   register struct arglist *prev = 0, *this, *next;
                   7052:   for (this = tokens; this; this = next)
                   7053:     {
                   7054:       next = this->next;
                   7055:       this->next = prev;
                   7056:       prev = this;
                   7057:     }
                   7058:   return prev;
                   7059: }
                   7060: 
                   7061: /* Read a space-separated list of tokens ending in a close parenthesis.
                   7062:    Return a list of strings, in the order they were written.
                   7063:    (In case of error, return 0 and store -1 in *ERROR_FLAG.) */
                   7064: 
                   7065: static struct arglist *
                   7066: read_token_list (pfile, error_flag)
                   7067:      cpp_reader *pfile;
                   7068:      int *error_flag;
                   7069: {
                   7070:   struct arglist *token_ptrs = 0;
                   7071:   int depth = 1;
                   7072:   int length;
                   7073: 
                   7074:   *error_flag = 0;
                   7075:   FORWARD (1);  /* Skip '(' */
                   7076: 
                   7077:   /* Loop over the assertion value tokens.  */
                   7078:   while (depth > 0)
                   7079:     {
                   7080:       struct arglist *temp;
                   7081:       long name_written = CPP_WRITTEN (pfile);
                   7082:       int eofp = 0;  int c;
                   7083: 
                   7084:       cpp_skip_hspace (pfile);
                   7085: 
                   7086:       c = GETC ();
                   7087:          
                   7088:       /* Find the end of the token.  */
                   7089:       if (c == '(')
                   7090:         {
                   7091:          CPP_PUTC (pfile, c);
                   7092:          depth++;
                   7093:         }
                   7094:       else if (c == ')')
                   7095:         {
                   7096:          depth--;
                   7097:          if (depth == 0)
                   7098:            break;
                   7099:          CPP_PUTC (pfile, c);
                   7100:         }
                   7101:       else if (c == '"' || c == '\'')
                   7102:         {
                   7103:          FORWARD(-1);
                   7104:          cpp_get_token (pfile);
                   7105:         }
                   7106:       else if (c == '\n')
                   7107:        break;
                   7108:       else
                   7109:         {
                   7110:          while (c != EOF && ! is_space[c] && c != '(' && c != ')'
                   7111:                 && c != '"' && c != '\'')
                   7112:            {
                   7113:              CPP_PUTC (pfile, c);
                   7114:              c = GETC();
                   7115:            }
                   7116:          if (c != EOF)  FORWARD(-1);
                   7117:         }
                   7118: 
                   7119:       length = CPP_WRITTEN (pfile) - name_written;
                   7120:       temp = (struct arglist *)
                   7121:          xmalloc (sizeof (struct arglist) + length + 1);
                   7122:       temp->name = (U_CHAR *) (temp + 1);
                   7123:       bcopy ((char *) (pfile->token_buffer + name_written),
                   7124:             (char *) temp->name, length);
                   7125:       temp->name[length] = 0;
                   7126:       temp->next = token_ptrs;
                   7127:       token_ptrs = temp;
                   7128:       temp->length = length;
                   7129: 
                   7130:       CPP_ADJUST_WRITTEN (pfile, -length); /* pop */
                   7131: 
                   7132:       if (c == EOF || c == '\n')
                   7133:         { /* FIXME */
                   7134:          cpp_error (pfile,
                   7135:                     "unterminated token sequence following  `#' operator");
                   7136:          return 0;
                   7137:        }
                   7138:     }
                   7139: 
                   7140:   /* We accumulated the names in reverse order.
                   7141:      Now reverse them to get the proper order.  */
                   7142:   return reverse_token_list (token_ptrs);
                   7143: }
                   7144: 
                   7145: static void
                   7146: free_token_list (tokens)
                   7147:      struct arglist *tokens;
                   7148: {
                   7149:   while (tokens) {
                   7150:     struct arglist *next = tokens->next;
                   7151:     free (tokens->name);
                   7152:     free (tokens);
                   7153:     tokens = next;
                   7154:   }
                   7155: }
                   7156: 
                   7157: /* Get the file-mode and data size of the file open on FD
                   7158:    and store them in *MODE_POINTER and *SIZE_POINTER.  */
                   7159: 
                   7160: static int
                   7161: file_size_and_mode (fd, mode_pointer, size_pointer)
                   7162:      int fd;
                   7163:      int *mode_pointer;
                   7164:      long int *size_pointer;
                   7165: {
                   7166:   struct stat sbuf;
                   7167: 
                   7168:   if (fstat (fd, &sbuf) < 0) return (-1);
                   7169:   if (mode_pointer) *mode_pointer = sbuf.st_mode;
                   7170:   if (size_pointer) *size_pointer = sbuf.st_size;
                   7171:   return 0;
                   7172: }
                   7173: 
                   7174: /* Read LEN bytes at PTR from descriptor DESC, for file FILENAME,
                   7175:    retrying if necessary.  Return a negative value if an error occurs,
                   7176:    otherwise return the actual number of bytes read,
                   7177:    which must be LEN unless end-of-file was reached.  */
                   7178: 
                   7179: static int
                   7180: safe_read (desc, ptr, len)
                   7181:      int desc;
                   7182:      char *ptr;
                   7183:      int len;
                   7184: {
                   7185:   int left = len;
                   7186:   while (left > 0) {
                   7187:     int nchars = read (desc, ptr, left);
                   7188:     if (nchars < 0)
                   7189:       {
                   7190: #ifdef EINTR
                   7191:        if (errno == EINTR)
                   7192:          continue;
                   7193: #endif
                   7194:        return nchars;
                   7195:       }
                   7196:     if (nchars == 0)
                   7197:       break;
                   7198:     ptr += nchars;
                   7199:     left -= nchars;
                   7200:   }
                   7201:   return len - left;
                   7202: }
                   7203: 
                   7204: static char *
                   7205: savestring (input)
                   7206:      char *input;
                   7207: {
                   7208:   unsigned size = strlen (input);
                   7209:   char *output = xmalloc (size + 1);
                   7210:   strcpy (output, input);
                   7211:   return output;
                   7212: }
                   7213: 
                   7214: /* Initialize PMARK to remember the current position of PFILE. */
                   7215: void
                   7216: parse_set_mark (pmark, pfile)
                   7217:      struct parse_marker *pmark;
                   7218:      cpp_reader *pfile;
                   7219: {
                   7220:   cpp_buffer *pbuf = CPP_BUFFER (pfile);
                   7221:   pmark->next = pbuf->marks;
                   7222:   pbuf->marks = pmark;
                   7223:   pmark->buf = pbuf;
                   7224:   pmark->position = pbuf->cur - pbuf->buf;
                   7225: }
                   7226: 
                   7227: /* Cleanup PMARK - we no longer need it. */
                   7228: void
                   7229: parse_clear_mark (pmark)
                   7230:      struct parse_marker *pmark;
                   7231: {
                   7232:   struct parse_marker **pp = &pmark->buf->marks;
                   7233:   for (; ; pp = &(*pp)->next) {
                   7234:     if (*pp == NULL) fatal ("internal error", "in parse_set_mark");
                   7235:     if (*pp == pmark) break;
                   7236:   }
                   7237:   *pp = pmark->next;
                   7238: }
                   7239: 
                   7240: /* Backup the current position of PFILE to that saved in PMARK. */
                   7241: 
                   7242: void
                   7243: parse_goto_mark (pmark, pfile)
                   7244:      struct parse_marker *pmark;
                   7245:      cpp_reader *pfile;
                   7246: {
                   7247:   cpp_buffer *pbuf = CPP_BUFFER (pfile);
                   7248:   if (pbuf != pmark->buf)
                   7249:     fatal ("internal error %s", "parse_goto_mark");
                   7250:   pbuf->cur = pbuf->buf + pmark->position;
                   7251: }
                   7252: 
                   7253: /* Reset PMARK to point to the current position of PFILE.  (Same
                   7254:    as parse_clear_mark (PMARK), parse_set_mark (PMARK, PFILE) but faster. */
                   7255: 
                   7256: void
                   7257: parse_move_mark (pmark, pfile)
                   7258:      struct parse_marker *pmark;
                   7259:      cpp_reader *pfile;
                   7260: {
                   7261:   cpp_buffer *pbuf = CPP_BUFFER (pfile);
                   7262:   if (pbuf != pmark->buf)
                   7263:     fatal ("internal error %s", "parse_move_mark");
                   7264:   pmark->position = pbuf->cur - pbuf->buf;
                   7265: }
                   7266: 
                   7267: int
                   7268: cpp_read_check_assertion (pfile)
                   7269:      cpp_reader *pfile;
                   7270: {
                   7271:   int name_start = CPP_WRITTEN (pfile);
                   7272:   int name_length, name_written;
                   7273:   int result;
                   7274:   FORWARD (1);  /* Skip '#' */
                   7275:   cpp_skip_hspace (pfile);
                   7276:   parse_name (pfile, GETC ());
                   7277:   name_written = CPP_WRITTEN (pfile);
                   7278:   name_length = name_written - name_start;
                   7279:   cpp_skip_hspace (pfile);
                   7280:   if (CPP_BUF_PEEK (CPP_BUFFER (pfile)) == '(')
                   7281:     {
                   7282:       int error_flag;
                   7283:       struct arglist *token_ptrs = read_token_list (pfile, &error_flag);
                   7284:       result = check_assertion (pfile,
                   7285:                                pfile->token_buffer + name_start, name_length,
                   7286:                                1, token_ptrs);
                   7287:     }
                   7288:   else
                   7289:     result = check_assertion (pfile,
                   7290:                              pfile->token_buffer + name_start, name_length,
                   7291:                              0, NULL_PTR);
                   7292:   CPP_ADJUST_WRITTEN (pfile, - name_length);  /* pop */
                   7293:   return result;
                   7294: }
                   7295: 
                   7296: void
                   7297: cpp_print_file_and_line (pfile)
                   7298:      cpp_reader *pfile;
                   7299: {
                   7300:   cpp_buffer *ip = cpp_file_buffer (pfile);
                   7301: 
                   7302:   if (ip != NULL)
                   7303:     {
                   7304:       long line, col;
                   7305:       cpp_buf_line_and_col (ip, &line, &col);
                   7306:       cpp_file_line_for_message (pfile, ip->nominal_fname,
                   7307:                                 line, pfile->show_column ? col : -1);
                   7308:     }
                   7309: }
                   7310: 
                   7311: void
                   7312: cpp_error (pfile, msg, arg1, arg2, arg3)
                   7313:      cpp_reader *pfile;
                   7314:      char *msg;
                   7315:      char *arg1, *arg2, *arg3;
                   7316: {
                   7317:   cpp_print_containing_files (pfile);
                   7318:   cpp_print_file_and_line (pfile);
                   7319:   cpp_message (pfile, 1, msg, arg1, arg2, arg3);
                   7320: }
                   7321: 
                   7322: /* Print error message but don't count it.  */
                   7323: 
                   7324: void
                   7325: cpp_warning (pfile, msg, arg1, arg2, arg3)
                   7326:      cpp_reader *pfile;
                   7327:      char *msg;
                   7328:      char *arg1, *arg2, *arg3;
                   7329: {
                   7330:   if (CPP_OPTIONS (pfile)->inhibit_warnings)
                   7331:     return;
                   7332: 
                   7333:   if (CPP_OPTIONS (pfile)->warnings_are_errors)
                   7334:     pfile->errors++;
                   7335: 
                   7336:   cpp_print_containing_files (pfile);
                   7337:   cpp_print_file_and_line (pfile);
                   7338:   cpp_message (pfile, 0, msg, arg1, arg2, arg3);
                   7339: }
                   7340: 
                   7341: /* Print an error message and maybe count it.  */
                   7342: 
                   7343: void
                   7344: cpp_pedwarn (pfile, msg, arg1, arg2, arg3)
                   7345:      cpp_reader *pfile;
                   7346:      char *msg;
                   7347:      char *arg1, *arg2, *arg3;
                   7348: {
                   7349:   if (CPP_OPTIONS (pfile)->pedantic_errors)
                   7350:     cpp_error (pfile, msg, arg1, arg2, arg3);
                   7351:   else
                   7352:     cpp_warning (pfile, msg, arg1, arg2, arg3);
                   7353: }
                   7354: 
                   7355: void
                   7356: cpp_error_with_line (pfile, line, column, msg, arg1, arg2, arg3)
                   7357:      cpp_reader *pfile;
                   7358:      int line, column;
                   7359:      char *msg;
                   7360:      char *arg1, *arg2, *arg3;
                   7361: {
                   7362:   int i;
                   7363:   cpp_buffer *ip = cpp_file_buffer (pfile);
                   7364: 
                   7365:   cpp_print_containing_files (pfile);
                   7366: 
                   7367:   if (ip != NULL)
                   7368:     cpp_file_line_for_message (pfile, ip->nominal_fname, line, column);
                   7369: 
                   7370:   cpp_message (pfile, 1, msg, arg1, arg2, arg3);
                   7371: }
                   7372: 
                   7373: static void
                   7374: cpp_warning_with_line (pfile, line, column, msg, arg1, arg2, arg3)
                   7375:      cpp_reader *pfile;
                   7376:      int line, column;
                   7377:      char *msg;
                   7378:      char *arg1, *arg2, *arg3;
                   7379: {
                   7380:   int i;
                   7381:   cpp_buffer *ip;
                   7382: 
                   7383:   if (CPP_OPTIONS (pfile)->inhibit_warnings)
                   7384:     return;
                   7385: 
                   7386:   if (CPP_OPTIONS (pfile)->warnings_are_errors)
                   7387:     pfile->errors++;
                   7388: 
                   7389:   cpp_print_containing_files (pfile);
                   7390: 
                   7391:   ip = cpp_file_buffer (pfile);
                   7392: 
                   7393:   if (ip != NULL)
                   7394:     cpp_file_line_for_message (pfile, ip->nominal_fname, line, column);
                   7395: 
                   7396:   cpp_message (pfile, 0, msg, arg1, arg2, arg3);
                   7397: }
                   7398: 
                   7399: void
                   7400: cpp_pedwarn_with_line (pfile, line, column, msg, arg1, arg2, arg3)
                   7401:      cpp_reader *pfile;
                   7402:      int line;
                   7403:      char *msg;
                   7404:      char *arg1, *arg2, *arg3;
                   7405: {
                   7406:   if (CPP_OPTIONS (pfile)->pedantic_errors)
                   7407:     cpp_error_with_line (pfile, column, line, msg, arg1, arg2, arg3);
                   7408:   else
                   7409:     cpp_warning_with_line (pfile, line, column, msg, arg1, arg2, arg3);
                   7410: }
                   7411: 
                   7412: /* Report a warning (or an error if pedantic_errors)
                   7413:    giving specified file name and line number, not current.  */
                   7414: 
                   7415: void
                   7416: cpp_pedwarn_with_file_and_line (pfile, file, line, msg, arg1, arg2, arg3)
                   7417:      cpp_reader *pfile;
                   7418:      char *file;
                   7419:      int line;
                   7420:      char *msg;
                   7421:      char *arg1, *arg2, *arg3;
                   7422: {
                   7423:   if (!CPP_OPTIONS (pfile)->pedantic_errors
                   7424:       && CPP_OPTIONS (pfile)->inhibit_warnings)
                   7425:     return;
                   7426:   if (file != NULL)
                   7427:     cpp_file_line_for_message (pfile, file, line, -1);
                   7428:   cpp_message (pfile, CPP_OPTIONS (pfile)->pedantic_errors,
                   7429:               msg, arg1, arg2, arg3);
                   7430: }
                   7431: 
                   7432: /* This defines "errno" properly for VMS, and gives us EACCES. */
                   7433: #include <errno.h>
                   7434: #ifndef errno
                   7435: extern int errno;
                   7436: #endif
                   7437: 
                   7438: #ifndef VMS
                   7439: #ifndef HAVE_STRERROR
                   7440: extern int sys_nerr;
                   7441: #if defined(bsd4_4)
                   7442: extern const char *const sys_errlist[];
                   7443: #else
                   7444: extern char *sys_errlist[];
                   7445: #endif
                   7446: #else  /* HAVE_STRERROR */
                   7447: char *strerror ();
                   7448: #endif
                   7449: #else  /* VMS */
                   7450: char *strerror (int,...);
                   7451: #endif
                   7452: 
                   7453: /*
                   7454:  * my_strerror - return the descriptive text associated with an `errno' code.
                   7455:  */
                   7456: 
                   7457: char *
                   7458: my_strerror (errnum)
                   7459:      int errnum;
                   7460: {
                   7461:   char *result;
                   7462: 
                   7463: #ifndef VMS
                   7464: #ifndef HAVE_STRERROR
                   7465:   result = (char *) ((errnum < sys_nerr) ? sys_errlist[errnum] : 0);
                   7466: #else
                   7467:   result = strerror (errnum);
                   7468: #endif
                   7469: #else  /* VMS */
                   7470:   /* VAXCRTL's strerror() takes an optional second argument, which only
                   7471:      matters when the first argument is EVMSERR.  However, it's simplest
                   7472:      just to pass it unconditionally.  `vaxc$errno' is declared in
                   7473:      <errno.h>, and maintained by the library in parallel with `errno'.
                   7474:      We assume that caller's `errnum' either matches the last setting of
                   7475:      `errno' by the library or else does not have the value `EVMSERR'.  */
                   7476: 
                   7477:   result = strerror (errnum, vaxc$errno);
                   7478: #endif
                   7479: 
                   7480:   if (!result)
                   7481:     result = "undocumented I/O error";
                   7482: 
                   7483:   return result;
                   7484: }
                   7485: 
                   7486: /* Error including a message from `errno'.  */
                   7487: 
                   7488: void
                   7489: cpp_error_from_errno (pfile, name)
                   7490:      cpp_reader *pfile;
                   7491:      char *name;
                   7492: {
                   7493:   int i;
                   7494:   cpp_buffer *ip = cpp_file_buffer (pfile);
                   7495: 
                   7496:   cpp_print_containing_files (pfile);
                   7497: 
                   7498:   if (ip != NULL)
                   7499:     cpp_file_line_for_message (pfile, ip->nominal_fname, ip->lineno, -1);
                   7500: 
                   7501:   cpp_message (pfile, 1, "%s: %s", name, my_strerror (errno));
                   7502: }
                   7503: 
                   7504: void
                   7505: cpp_perror_with_name (pfile, name)
                   7506:      cpp_reader *pfile;
                   7507:      char *name;
                   7508: {
                   7509:   cpp_message (pfile, 1, "%s: %s: %s", progname, name, my_strerror (errno));
                   7510: }
                   7511: 
                   7512: /* TODO:
                   7513:  * No pre-compiled header file support.
                   7514:  *
                   7515:  * Possibly different enum token codes for each C/C++ token.
                   7516:  *
                   7517:  * Should clean up remaining directives to that do_XXX functions
                   7518:  *   only take two arguments and all have command_reads_line.
                   7519:  *
                   7520:  * Find and cleanup remaining uses of static variables,
                   7521:  *
                   7522:  * Support for trigraphs.
                   7523:  *
                   7524:  * Support -dM flag (dump_all_macros).
                   7525:  *
                   7526:  * Support for_lint flag.
                   7527:  */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.