OSDN Git Service

* i386.c (function_arg): Return constm1_rtx for last argument.
[pf3gnuchains/gcc-fork.git] / gcc / cppfiles.c
1 /* Part of CPP library.  (include file handling)
2    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
3    1999, 2000, 2001 Free Software Foundation, Inc.
4    Written by Per Bothner, 1994.
5    Based on CCCP program by Paul Rubin, June 1986
6    Adapted to ANSI C, Richard Stallman, Jan 1987
7    Split out of cpplib.c, Zack Weinberg, Oct 1998
8
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "cpplib.h"
26 #include "cpphash.h"
27 #include "intl.h"
28 #include "mkdeps.h"
29 #include "splay-tree.h"
30
31 #ifdef HAVE_MMAP_FILE
32 # include <sys/mman.h>
33 # ifndef MMAP_THRESHOLD
34 #  define MMAP_THRESHOLD 3 /* Minimum page count to mmap the file.  */
35 # endif
36
37 #else  /* No MMAP_FILE */
38 #  undef MMAP_THRESHOLD
39 #  define MMAP_THRESHOLD 0
40 #endif
41
42 #ifndef O_BINARY
43 # define O_BINARY 0
44 #endif
45
46 /* If errno is inspected immediately after a system call fails, it will be
47    nonzero, and no error number will ever be zero.  */
48 #ifndef ENOENT
49 # define ENOENT 0
50 #endif
51 #ifndef ENOTDIR
52 # define ENOTDIR 0
53 #endif
54
55 /* Suppress warning about function macros used w/o arguments in traditional
56    C.  It is unlikely that glibc's strcmp macro helps this file at all.  */
57 #undef strcmp
58
59 /* This structure is used for the table of all includes.  */
60 struct include_file
61 {
62   const char *name;             /* actual path name of file */
63   const cpp_hashnode *cmacro;   /* macro, if any, preventing reinclusion.  */
64   const struct search_path *foundhere;
65                                 /* location in search path where file was
66                                    found, for #include_next and sysp.  */
67   const unsigned char *buffer;  /* pointer to cached file contents */
68   struct stat st;               /* copy of stat(2) data for file */
69   int fd;                       /* fd open on file (short term storage only) */
70   unsigned short include_count; /* number of times file has been read */
71   unsigned short refcnt;        /* number of stacked buffers using this file */
72   unsigned char mapped;         /* file buffer is mmapped */
73 };
74
75 /* The cmacro works like this: If it's NULL, the file is to be
76    included again.  If it's NEVER_REREAD, the file is never to be
77    included again.  Otherwise it is a macro hashnode, and the file is
78    to be included again if the macro is defined.  */
79 #define NEVER_REREAD ((const cpp_hashnode *)-1)
80 #define DO_NOT_REREAD(inc) \
81 ((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \
82                    || (inc)->cmacro->type == NT_MACRO))
83 #define NO_INCLUDE_PATH ((struct include_file *) -1)
84
85 static struct file_name_map *read_name_map
86                                 PARAMS ((cpp_reader *, const char *));
87 static char *read_filename_string PARAMS ((int, FILE *));
88 static char *remap_filename     PARAMS ((cpp_reader *, char *,
89                                          struct search_path *));
90 static struct search_path *search_from PARAMS ((cpp_reader *,
91                                                 enum include_type));
92 static struct include_file *
93         find_include_file PARAMS ((cpp_reader *, const cpp_token *,
94                                    enum include_type));
95 static struct include_file *open_file PARAMS ((cpp_reader *, const char *));
96 static void read_include_file   PARAMS ((cpp_reader *, struct include_file *));
97 static void stack_include_file  PARAMS ((cpp_reader *, struct include_file *));
98 static void purge_cache         PARAMS ((struct include_file *));
99 static void destroy_node        PARAMS ((splay_tree_value));
100 static int report_missing_guard         PARAMS ((splay_tree_node, void *));
101 static splay_tree_node find_or_create_entry PARAMS ((cpp_reader *,
102                                                      const char *));
103 static void handle_missing_header PARAMS ((cpp_reader *, const char *, int));
104
105 /* Set up the splay tree we use to store information about all the
106    file names seen in this compilation.  We also have entries for each
107    file we tried to open but failed; this saves system calls since we
108    don't try to open it again in future.
109
110    The key of each node is the file name, after processing by
111    _cpp_simplify_pathname.  The path name may or may not be absolute.
112    The path string has been malloced, as is automatically freed by
113    registering free () as the splay tree key deletion function.
114
115    A node's value is a pointer to a struct include_file, and is never
116    NULL.  */
117 void
118 _cpp_init_includes (pfile)
119      cpp_reader *pfile;
120 {
121   pfile->all_include_files
122     = splay_tree_new ((splay_tree_compare_fn) strcmp,
123                       (splay_tree_delete_key_fn) free,
124                       destroy_node);
125 }
126
127 /* Tear down the splay tree.  */
128 void
129 _cpp_cleanup_includes (pfile)
130      cpp_reader *pfile;
131 {
132   splay_tree_delete (pfile->all_include_files);
133 }
134
135 /* Free a node.  The path string is automatically freed.  */
136 static void
137 destroy_node (v)
138      splay_tree_value v;
139 {
140   struct include_file *f = (struct include_file *)v;
141
142   if (f)
143     {
144       purge_cache (f);
145       free (f);
146     }
147 }
148
149 /* Mark a file to not be reread (e.g. #import, read failure).  */
150 void
151 _cpp_never_reread (file)
152      struct include_file *file;
153 {
154   file->cmacro = NEVER_REREAD;
155 }
156
157 /* Lookup a filename, which is simplified after making a copy, and
158    create an entry if none exists.  */
159 static splay_tree_node
160 find_or_create_entry (pfile, fname)
161      cpp_reader *pfile;
162      const char *fname;
163 {
164   splay_tree_node node;
165   struct include_file *file;
166   char *name = xstrdup (fname);
167
168   _cpp_simplify_pathname (name);
169   node = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
170   if (node)
171     free (name);
172   else
173     {
174       file = xcnew (struct include_file);
175       file->name = name;
176       node = splay_tree_insert (pfile->all_include_files,
177                                 (splay_tree_key) file->name,
178                                 (splay_tree_value) file);
179     }
180
181   return node;
182 }
183
184 /* Enter a file name in the splay tree, for the sake of cpp_included.  */
185 void
186 _cpp_fake_include (pfile, fname)
187      cpp_reader *pfile;
188      const char *fname;
189 {
190   find_or_create_entry (pfile, fname);
191 }
192
193 /* Given a file name, look it up in the cache; if there is no entry,
194    create one with a non-NULL value (regardless of success in opening
195    the file).  If the file doesn't exist or is inaccessible, this
196    entry is flagged so we don't attempt to open it again in the
197    future.  If the file isn't open, open it.  The empty string is
198    interpreted as stdin.
199
200    Returns an include_file structure with an open file descriptor on
201    success, or NULL on failure.  */
202
203 static struct include_file *
204 open_file (pfile, filename)
205      cpp_reader *pfile;
206      const char *filename;
207 {
208   splay_tree_node nd = find_or_create_entry (pfile, filename);
209   struct include_file *file = (struct include_file *) nd->value;
210
211   /* Don't retry opening if we failed previously.  */
212   if (file->fd == -2)
213     return 0;
214
215   /* Don't reopen an idempotent file. */
216   if (DO_NOT_REREAD (file))
217     return file;
218       
219   /* Don't reopen one which is already loaded. */
220   if (file->buffer != NULL)
221     return file;
222
223   /* We used to open files in nonblocking mode, but that caused more
224      problems than it solved.  Do take care not to acquire a
225      controlling terminal by mistake (this can't happen on sane
226      systems, but paranoia is a virtue).
227
228      Use the three-argument form of open even though we aren't
229      specifying O_CREAT, to defend against broken system headers.
230
231      O_BINARY tells some runtime libraries (notably DJGPP) not to do
232      newline translation; we can handle DOS line breaks just fine
233      ourselves.
234
235      Special case: the empty string is translated to stdin.  */
236
237   if (filename[0] == '\0')
238     file->fd = 0;
239   else
240     file->fd = open (file->name, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
241
242   if (file->fd != -1 && fstat (file->fd, &file->st) == 0)
243     {
244       /* Mark a regular, zero-length file never-reread now.  */
245       if (S_ISREG (file->st.st_mode) && file->st.st_size == 0)
246         {
247           _cpp_never_reread (file);
248           close (file->fd);
249           file->fd = -1;
250         }
251
252       return file;
253     }
254
255   /* Don't issue an error message if the file doesn't exist.  */
256   if (errno != ENOENT && errno != ENOTDIR)
257     cpp_error_from_errno (pfile, file->name);
258
259   /* Create a negative node for this path, and return null.  */
260   file->fd = -2;
261
262   return 0;
263 }
264
265 /* Place the file referenced by INC into a new buffer on PFILE's
266    stack.  If there are errors, or the file should not be re-included,
267    a null (zero-length) buffer is pushed.  */
268
269 static void
270 stack_include_file (pfile, inc)
271      cpp_reader *pfile;
272      struct include_file *inc;
273 {
274   size_t len = 0;
275   cpp_buffer *fp;
276   int sysp, deps_sysp;
277
278   /* We'll try removing deps_sysp after the release of 3.0.  */
279   deps_sysp = pfile->system_include_depth != 0;
280   sysp = MAX ((pfile->buffer ? pfile->buffer->sysp : 0),
281               (inc->foundhere ? inc->foundhere->sysp : 0));
282
283   /* For -M, add the file to the dependencies on its first inclusion.  */
284   if (CPP_OPTION (pfile, print_deps) > deps_sysp && !inc->include_count)
285     deps_add_dep (pfile->deps, inc->name);
286
287   if (! DO_NOT_REREAD (inc))
288     {
289       /* Not in cache?  */
290       if (! inc->buffer)
291         read_include_file (pfile, inc);
292       len = inc->st.st_size;
293
294       if (pfile->buffer)
295         {
296           /* We don't want MI guard advice for the main file.  */
297           inc->include_count++;
298
299           /* Handle -H option.  */
300           if (CPP_OPTION (pfile, print_include_names))
301             {
302               for (fp = pfile->buffer; fp; fp = fp->prev)
303                 putc ('.', stderr);
304               fprintf (stderr, " %s\n", inc->name);
305             }
306         }
307     }
308
309   /* Push a buffer.  */
310   fp = cpp_push_buffer (pfile, inc->buffer, len, BUF_FILE, inc->name);
311   fp->inc = inc;
312   fp->inc->refcnt++;
313   fp->sysp = sysp;
314
315   /* Initialise controlling macro state.  */
316   pfile->mi_state = MI_OUTSIDE;
317   pfile->mi_cmacro = 0;
318   pfile->include_depth++;
319
320   /* Generate the call back.  */
321   fp->lineno = 0;
322   _cpp_do_file_change (pfile, FC_ENTER, 0, 0);
323   fp->lineno = 1;
324 }
325
326 /* Read the file referenced by INC into the file cache.
327
328    If fd points to a plain file, we might be able to mmap it; we can
329    definitely allocate the buffer all at once.  If fd is a pipe or
330    terminal, we can't do either.  If fd is something weird, like a
331    block device or a directory, we don't want to read it at all.
332
333    Unfortunately, different systems use different st.st_mode values
334    for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
335    zero the entire struct stat except a couple fields.  Hence we don't
336    even try to figure out what something is, except for plain files,
337    directories, and block devices.
338
339    FIXME: Flush file cache and try again if we run out of memory.  */
340
341 static void
342 read_include_file (pfile, inc)
343      cpp_reader *pfile;
344      struct include_file *inc;
345 {
346   ssize_t size, offset, count;
347   U_CHAR *buf;
348 #if MMAP_THRESHOLD
349   static int pagesize = -1;
350 #endif
351
352   if (S_ISREG (inc->st.st_mode))
353     {
354       /* off_t might have a wider range than ssize_t - in other words,
355          the max size of a file might be bigger than the address
356          space.  We can't handle a file that large.  (Anyone with
357          a single source file bigger than 2GB needs to rethink
358          their coding style.)  Some systems (e.g. AIX 4.1) define
359          SSIZE_MAX to be much smaller than the actual range of the
360          type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
361          does not bite us.  */
362       if (inc->st.st_size > INTTYPE_MAXIMUM (ssize_t))
363         {
364           cpp_error (pfile, "%s is too large", inc->name);
365           goto fail;
366         }
367       size = inc->st.st_size;
368
369       inc->mapped = 0;
370 #if MMAP_THRESHOLD
371       if (pagesize == -1)
372         pagesize = getpagesize ();
373
374       if (size / pagesize >= MMAP_THRESHOLD)
375         {
376           buf = (U_CHAR *) mmap (0, size, PROT_READ, MAP_PRIVATE, inc->fd, 0);
377           if (buf == (U_CHAR *)-1)
378             goto perror_fail;
379           inc->mapped = 1;
380         }
381       else
382 #endif
383         {
384           buf = (U_CHAR *) xmalloc (size);
385           offset = 0;
386           while (offset < size)
387             {
388               count = read (inc->fd, buf + offset, size - offset);
389               if (count < 0)
390                 goto perror_fail;
391               if (count == 0)
392                 {
393                   cpp_warning (pfile, "%s is shorter than expected", inc->name);
394                   break;
395                 }
396               offset += count;
397             }
398         }
399     }
400   else if (S_ISBLK (inc->st.st_mode))
401     {
402       cpp_error (pfile, "%s is a block device", inc->name);
403       goto fail;
404     }
405   else if (S_ISDIR (inc->st.st_mode))
406     {
407       cpp_error (pfile, "%s is a directory", inc->name);
408       goto fail;
409     }
410   else
411     {
412       /* 8 kilobytes is a sensible starting size.  It ought to be
413          bigger than the kernel pipe buffer, and it's definitely
414          bigger than the majority of C source files.  */
415       size = 8 * 1024;
416
417       buf = (U_CHAR *) xmalloc (size);
418       offset = 0;
419       while ((count = read (inc->fd, buf + offset, size - offset)) > 0)
420         {
421           offset += count;
422           if (offset == size)
423             buf = xrealloc (buf, (size *= 2));
424         }
425       if (count < 0)
426         goto perror_fail;
427
428       if (offset < size)
429         buf = xrealloc (buf, offset);
430       inc->st.st_size = offset;
431     }
432
433   close (inc->fd);
434   inc->buffer = buf;
435   inc->fd = -1;
436   return;
437
438  perror_fail:
439   cpp_error_from_errno (pfile, inc->name);
440  fail:
441   /* Do not try to read this file again.  */
442   close (inc->fd);
443   inc->fd = -1;
444   _cpp_never_reread (inc);
445   return;
446 }
447
448 static void
449 purge_cache (inc)
450      struct include_file *inc;
451 {
452   if (inc->buffer)
453     {
454 #if MMAP_THRESHOLD
455       if (inc->mapped)
456         munmap ((PTR) inc->buffer, inc->st.st_size);
457       else
458 #endif
459         free ((PTR) inc->buffer);
460       inc->buffer = NULL;
461     }
462 }
463
464 /* Return 1 if the file named by FNAME has been included before in
465    any context, 0 otherwise.  */
466 int
467 cpp_included (pfile, fname)
468      cpp_reader *pfile;
469      const char *fname;
470 {
471   struct search_path *path;
472   char *name, *n;
473   splay_tree_node nd;
474
475   if (IS_ABSOLUTE_PATHNAME (fname))
476     {
477       /* Just look it up.  */
478       nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) fname);
479       return (nd && nd->value);
480     }
481       
482   /* Search directory path for the file.  */
483   name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
484   for (path = CPP_OPTION (pfile, quote_include); path; path = path->next)
485     {
486       memcpy (name, path->name, path->len);
487       name[path->len] = '/';
488       strcpy (&name[path->len + 1], fname);
489       if (CPP_OPTION (pfile, remap))
490         n = remap_filename (pfile, name, path);
491       else
492         n = name;
493
494       nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) n);
495       if (nd && nd->value)
496         return 1;
497     }
498   return 0;
499 }
500
501 /* Search for HEADER.  Return 0 if there is no such file (or it's
502    un-openable), in which case an error code will be in errno.  If
503    there is no include path to use it returns NO_INCLUDE_PATH,
504    otherwise an include_file structure.  If this request originates
505    from a #include_next directive, set INCLUDE_NEXT to true.  */
506
507 static struct include_file *
508 find_include_file (pfile, header, type)
509      cpp_reader *pfile;
510      const cpp_token *header;
511      enum include_type type;
512 {
513   const char *fname = (const char *) header->val.str.text;
514   struct search_path *path;
515   struct include_file *file;
516   char *name, *n;
517
518   if (IS_ABSOLUTE_PATHNAME (fname))
519     return open_file (pfile, fname);
520
521   /* For #include_next, skip in the search path past the dir in which
522      the current file was found, but if it was found via an absolute
523      path use the normal search logic.  */
524   if (type == IT_INCLUDE_NEXT && pfile->buffer->inc->foundhere)
525     path = pfile->buffer->inc->foundhere->next;
526   else if (header->type == CPP_HEADER_NAME)
527     path = CPP_OPTION (pfile, bracket_include);
528   else
529     path = search_from (pfile, type);
530
531   if (path == NULL)
532     {
533       cpp_error (pfile, "No include path in which to find %s", fname);
534       return NO_INCLUDE_PATH;
535     }
536
537   /* Search directory path for the file.  */
538   name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
539   for (; path; path = path->next)
540     {
541       memcpy (name, path->name, path->len);
542       name[path->len] = '/';
543       strcpy (&name[path->len + 1], fname);
544       if (CPP_OPTION (pfile, remap))
545         n = remap_filename (pfile, name, path);
546       else
547         n = name;
548
549       file = open_file (pfile, n);
550       if (file)
551         {
552           file->foundhere = path;
553           return file;
554         }
555     }
556
557   return 0;
558 }
559
560 /* Not everyone who wants to set system-header-ness on a buffer can
561    see the details of a buffer.  This is an exported interface because
562    fix-header needs it.  */
563 void
564 cpp_make_system_header (pfile, syshdr, externc)
565      cpp_reader *pfile;
566      int syshdr, externc;
567 {
568   int flags = 0;
569
570   /* 1 = system header, 2 = system header to be treated as C.  */
571   if (syshdr)
572     flags = 1 + (externc != 0);
573   pfile->buffer->sysp = flags;
574   _cpp_do_file_change (pfile, FC_RENAME, pfile->buffer->nominal_fname,
575                        pfile->buffer->lineno);
576 }
577
578 /* Report on all files that might benefit from a multiple include guard.
579    Triggered by -H.  */
580 void
581 _cpp_report_missing_guards (pfile)
582      cpp_reader *pfile;
583 {
584   int banner = 0;
585   splay_tree_foreach (pfile->all_include_files, report_missing_guard,
586                       (PTR) &banner);
587 }
588
589 static int
590 report_missing_guard (n, b)
591      splay_tree_node n;
592      void *b;
593 {
594   struct include_file *f = (struct include_file *) n->value;
595   int *bannerp = (int *)b;
596
597   if (f && f->cmacro == 0 && f->include_count == 1)
598     {
599       if (*bannerp == 0)
600         {
601           fputs (_("Multiple include guards may be useful for:\n"), stderr);
602           *bannerp = 1;
603         }
604       fputs (f->name, stderr);
605       putc ('\n', stderr);
606     }
607   return 0;
608 }
609
610 /* Create a dependency, or issue an error message as appropriate.   */
611 static void
612 handle_missing_header (pfile, fname, angle_brackets)
613      cpp_reader *pfile;
614      const char *fname;
615      int angle_brackets;
616 {
617   /* We will try making the RHS pfile->buffer->sysp after 3.0.  */
618   int print_dep = CPP_PRINT_DEPS(pfile) > (angle_brackets
619                                            || pfile->system_include_depth);
620   if (CPP_OPTION (pfile, print_deps_missing_files) && print_dep)
621     {
622       if (!angle_brackets || IS_ABSOLUTE_PATHNAME (fname))
623         deps_add_dep (pfile->deps, fname);
624       else
625         {
626           /* If requested as a system header, assume it belongs in
627              the first system header directory.  */
628           struct search_path *ptr = CPP_OPTION (pfile, bracket_include);
629           char *p;
630           int len = 0, fname_len = strlen (fname);
631
632           if (ptr)
633             len = ptr->len;
634
635           p = (char *) alloca (len + fname_len + 2);
636           if (len)
637             {
638               memcpy (p, ptr->name, len);
639               p[len++] = '/';
640             }
641           memcpy (p + len, fname, fname_len + 1);
642           _cpp_simplify_pathname (p);
643           deps_add_dep (pfile->deps, p);
644         }
645     }
646   /* If -M was specified, then don't count this as an error, because
647      we can still produce correct output.  Otherwise, we can't produce
648      correct output, because there may be dependencies we need inside
649      the missing file, and we don't know what directory this missing
650      file exists in.  FIXME: Use a future cpp_diagnotic_with_errno ()
651      for both of these cases.  */
652   else if (CPP_PRINT_DEPS (pfile) && ! print_dep)
653     cpp_warning (pfile, "%s: %s", fname, xstrerror (errno));
654   else
655     cpp_error_from_errno (pfile, fname);
656 }
657
658 /* Returns non-zero if a buffer was stacked.  */
659 int
660 _cpp_execute_include (pfile, header, type)
661      cpp_reader *pfile;
662      const cpp_token *header;
663      enum include_type type;
664 {
665   struct include_file *inc = find_include_file (pfile, header, type);
666
667   if (inc == 0)
668     handle_missing_header (pfile, (const char *) header->val.str.text,
669                            header->type == CPP_HEADER_NAME);
670   else if (inc != NO_INCLUDE_PATH)
671     {
672       if (header->type == CPP_HEADER_NAME)
673         pfile->system_include_depth++;
674
675       stack_include_file (pfile, inc);
676
677       if (type == IT_IMPORT)
678         _cpp_never_reread (inc);
679
680       return 1;
681     }
682
683   return 0;
684 }
685
686 /* Locate HEADER, and determine whether it is newer than the current
687    file.  If it cannot be located or dated, return -1, if it is newer
688    newer, return 1, otherwise 0.  */
689 int
690 _cpp_compare_file_date (pfile, header)
691      cpp_reader *pfile;
692      const cpp_token *header;
693 {
694   struct include_file *inc = find_include_file (pfile, header, 0);
695   
696   if (inc == NULL || inc == NO_INCLUDE_PATH)
697     return -1;
698
699   if (inc->fd > 0)
700     {
701       close (inc->fd);
702       inc->fd = -1;
703     }
704     
705   return inc->st.st_mtime > pfile->buffer->inc->st.st_mtime;
706 }
707
708
709 /* Push an input buffer and load it up with the contents of FNAME.
710    If FNAME is "", read standard input.  */
711 int
712 _cpp_read_file (pfile, fname)
713      cpp_reader *pfile;
714      const char *fname;
715 {
716   struct include_file *f = open_file (pfile, fname);
717
718   if (f == NULL)
719     {
720       cpp_error_from_errno (pfile, fname);
721       return 0;
722     }
723
724   stack_include_file (pfile, f);
725   return 1;
726 }
727
728 /* Do appropriate cleanup when a file buffer is popped off the input
729    stack.  */
730 void
731 _cpp_pop_file_buffer (pfile, buf)
732      cpp_reader *pfile;
733      cpp_buffer *buf;
734 {
735   struct include_file *inc = buf->inc;
736
737   if (pfile->system_include_depth)
738     pfile->system_include_depth--;
739   if (pfile->include_depth)
740     pfile->include_depth--;
741
742   /* Record the inclusion-preventing macro, which could be NULL
743      meaning no controlling macro, if we haven't got it already.  */
744   if (pfile->mi_state == MI_OUTSIDE && inc->cmacro == NULL)
745     inc->cmacro = pfile->mi_cmacro;
746
747   /* Invalidate control macros in the #including file.  */
748   pfile->mi_state = MI_FAILED;
749
750   inc->refcnt--;
751   if (inc->refcnt == 0 && DO_NOT_REREAD (inc))
752     purge_cache (inc);
753 }
754
755 /* Returns the first place in the include chain to start searching for
756    "" includes.  This involves stripping away the basename of the
757    current file, unless -I- was specified.
758
759    If we're handling -include or -imacros, use the "" chain, but with
760    the preprocessor's cwd prepended.  */
761 static struct search_path *
762 search_from (pfile, type)
763      cpp_reader *pfile;
764      enum include_type type;
765 {
766   cpp_buffer *buffer = pfile->buffer;
767   unsigned int dlen;
768
769   /* Command line uses the cwd, and does not cache the result.  */
770   if (type == IT_CMDLINE)
771     goto use_cwd;
772
773   /* Ignore the current file's directory if -I- was given.  */
774   if (CPP_OPTION (pfile, ignore_srcdir))
775     return CPP_OPTION (pfile, quote_include);
776
777   if (! buffer->search_cached)
778     {
779       buffer->search_cached = 1;
780
781       dlen = lbasename (buffer->inc->name) - buffer->inc->name;
782
783       if (dlen)
784         {
785           /* We don't guarantee NAME is null-terminated.  This saves
786              allocating and freeing memory, and duplicating it when faking
787              buffers in cpp_push_buffer.  Drop a trailing '/'.  */
788           buffer->dir.name = buffer->inc->name;
789           if (dlen > 1)
790             dlen--;
791         }
792       else
793         {
794         use_cwd:
795           buffer->dir.name = ".";
796           dlen = 1;
797         }
798
799       if (dlen > pfile->max_include_len)
800         pfile->max_include_len = dlen;
801
802       buffer->dir.len = dlen;
803       buffer->dir.next = CPP_OPTION (pfile, quote_include);
804       buffer->dir.sysp = buffer->sysp;
805     }
806
807   return &buffer->dir;
808 }
809
810 /* The file_name_map structure holds a mapping of file names for a
811    particular directory.  This mapping is read from the file named
812    FILE_NAME_MAP_FILE in that directory.  Such a file can be used to
813    map filenames on a file system with severe filename restrictions,
814    such as DOS.  The format of the file name map file is just a series
815    of lines with two tokens on each line.  The first token is the name
816    to map, and the second token is the actual name to use.  */
817
818 struct file_name_map
819 {
820   struct file_name_map *map_next;
821   char *map_from;
822   char *map_to;
823 };
824
825 #define FILE_NAME_MAP_FILE "header.gcc"
826
827 /* Read a space delimited string of unlimited length from a stdio
828    file.  */
829
830 static char *
831 read_filename_string (ch, f)
832      int ch;
833      FILE *f;
834 {
835   char *alloc, *set;
836   int len;
837
838   len = 20;
839   set = alloc = xmalloc (len + 1);
840   if (! is_space(ch))
841     {
842       *set++ = ch;
843       while ((ch = getc (f)) != EOF && ! is_space(ch))
844         {
845           if (set - alloc == len)
846             {
847               len *= 2;
848               alloc = xrealloc (alloc, len + 1);
849               set = alloc + len / 2;
850             }
851           *set++ = ch;
852         }
853     }
854   *set = '\0';
855   ungetc (ch, f);
856   return alloc;
857 }
858
859 /* This structure holds a linked list of file name maps, one per directory.  */
860
861 struct file_name_map_list
862 {
863   struct file_name_map_list *map_list_next;
864   char *map_list_name;
865   struct file_name_map *map_list_map;
866 };
867
868 /* Read the file name map file for DIRNAME.  */
869
870 static struct file_name_map *
871 read_name_map (pfile, dirname)
872      cpp_reader *pfile;
873      const char *dirname;
874 {
875   register struct file_name_map_list *map_list_ptr;
876   char *name;
877   FILE *f;
878
879   /* Check the cache of directories, and mappings in their remap file.  */
880   for (map_list_ptr = CPP_OPTION (pfile, map_list); map_list_ptr;
881        map_list_ptr = map_list_ptr->map_list_next)
882     if (! strcmp (map_list_ptr->map_list_name, dirname))
883       return map_list_ptr->map_list_map;
884
885   map_list_ptr = ((struct file_name_map_list *)
886                   xmalloc (sizeof (struct file_name_map_list)));
887   map_list_ptr->map_list_name = xstrdup (dirname);
888
889   /* The end of the list ends in NULL.  */
890   map_list_ptr->map_list_map = NULL;
891
892   name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
893   strcpy (name, dirname);
894   if (*dirname)
895     strcat (name, "/");
896   strcat (name, FILE_NAME_MAP_FILE);
897   f = fopen (name, "r");
898
899   /* Silently return NULL if we cannot open.  */
900   if (f)
901     {
902       int ch;
903       int dirlen = strlen (dirname);
904
905       while ((ch = getc (f)) != EOF)
906         {
907           char *from, *to;
908           struct file_name_map *ptr;
909
910           if (is_space(ch))
911             continue;
912           from = read_filename_string (ch, f);
913           while ((ch = getc (f)) != EOF && is_hspace(ch))
914             ;
915           to = read_filename_string (ch, f);
916
917           ptr = ((struct file_name_map *)
918                  xmalloc (sizeof (struct file_name_map)));
919           ptr->map_from = from;
920
921           /* Make the real filename absolute.  */
922           if (IS_ABSOLUTE_PATHNAME (to))
923             ptr->map_to = to;
924           else
925             {
926               ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
927               strcpy (ptr->map_to, dirname);
928               ptr->map_to[dirlen] = '/';
929               strcpy (ptr->map_to + dirlen + 1, to);
930               free (to);
931             }         
932
933           ptr->map_next = map_list_ptr->map_list_map;
934           map_list_ptr->map_list_map = ptr;
935
936           while ((ch = getc (f)) != '\n')
937             if (ch == EOF)
938               break;
939         }
940       fclose (f);
941     }
942   
943   /* Add this information to the cache.  */
944   map_list_ptr->map_list_next = CPP_OPTION (pfile, map_list);
945   CPP_OPTION (pfile, map_list) = map_list_ptr;
946
947   return map_list_ptr->map_list_map;
948 }  
949
950 /* Remap an unsimplified path NAME based on the file_name_map (if any)
951    for LOC.  */
952 static char *
953 remap_filename (pfile, name, loc)
954      cpp_reader *pfile;
955      char *name;
956      struct search_path *loc;
957 {
958   struct file_name_map *map;
959   const char *from, *p;
960   char *dir;
961
962   if (! loc->name_map)
963     {
964       /* Get a null-terminated path.  */
965       char *dname = alloca (loc->len + 1);
966       memcpy (dname, loc->name, loc->len);
967       dname[loc->len] = '\0';
968
969       loc->name_map = read_name_map (pfile, dname);
970       if (! loc->name_map)
971         return name;
972     }
973   
974   /* This works since NAME has not been simplified yet.  */
975   from = name + loc->len + 1;
976   
977   for (map = loc->name_map; map; map = map->map_next)
978     if (!strcmp (map->map_from, from))
979       return map->map_to;
980
981   /* Try to find a mapping file for the particular directory we are
982      looking in.  Thus #include <sys/types.h> will look up sys/types.h
983      in /usr/include/header.gcc and look up types.h in
984      /usr/include/sys/header.gcc.  */
985   p = strrchr (name, '/');
986   if (!p)
987     return name;
988
989   /* We know p != name as absolute paths don't call remap_filename.  */
990   if (p == name)
991     cpp_ice (pfile, "absolute file name in remap_filename");
992
993   dir = (char *) alloca (p - name + 1);
994   memcpy (dir, name, p - name);
995   dir[p - name] = '\0';
996   from = p + 1;
997   
998   for (map = read_name_map (pfile, dir); map; map = map->map_next)
999     if (! strcmp (map->map_from, from))
1000       return map->map_to;
1001
1002   return name;
1003 }
1004
1005 /* Simplify a path name in place, deleting redundant components.  This
1006    reduces OS overhead and guarantees that equivalent paths compare
1007    the same (modulo symlinks).
1008
1009    Transforms made:
1010    foo/bar/../quux      foo/quux
1011    foo/./bar            foo/bar
1012    foo//bar             foo/bar
1013    /../quux             /quux
1014    //quux               //quux  (POSIX allows leading // as a namespace escape)
1015
1016    Guarantees no trailing slashes. All transforms reduce the length
1017    of the string.  Returns PATH;
1018  */
1019 char *
1020 _cpp_simplify_pathname (path)
1021     char *path;
1022 {
1023     char *from, *to;
1024     char *base;
1025     int absolute = 0;
1026
1027 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
1028     /* Convert all backslashes to slashes. */
1029     for (from = path; *from; from++)
1030         if (*from == '\\') *from = '/';
1031     
1032     /* Skip over leading drive letter if present. */
1033     if (ISALPHA (path[0]) && path[1] == ':')
1034         from = to = &path[2];
1035     else
1036         from = to = path;
1037 #else
1038     from = to = path;
1039 #endif
1040     
1041     /* Remove redundant initial /s.  */
1042     if (*from == '/')
1043     {
1044         absolute = 1;
1045         to++;
1046         from++;
1047         if (*from == '/')
1048         {
1049             if (*++from == '/')
1050                 /* 3 or more initial /s are equivalent to 1 /.  */
1051                 while (*++from == '/');
1052             else
1053                 /* On some hosts // differs from /; Posix allows this.  */
1054                 to++;
1055         }
1056     }
1057     base = to;
1058     
1059     for (;;)
1060     {
1061         while (*from == '/')
1062             from++;
1063
1064         if (from[0] == '.' && from[1] == '/')
1065             from += 2;
1066         else if (from[0] == '.' && from[1] == '\0')
1067             goto done;
1068         else if (from[0] == '.' && from[1] == '.' && from[2] == '/')
1069         {
1070             if (base == to)
1071             {
1072                 if (absolute)
1073                     from += 3;
1074                 else
1075                 {
1076                     *to++ = *from++;
1077                     *to++ = *from++;
1078                     *to++ = *from++;
1079                     base = to;
1080                 }
1081             }
1082             else
1083             {
1084                 to -= 2;
1085                 while (to > base && *to != '/') to--;
1086                 if (*to == '/')
1087                     to++;
1088                 from += 3;
1089             }
1090         }
1091         else if (from[0] == '.' && from[1] == '.' && from[2] == '\0')
1092         {
1093             if (base == to)
1094             {
1095                 if (!absolute)
1096                 {
1097                     *to++ = *from++;
1098                     *to++ = *from++;
1099                 }
1100             }
1101             else
1102             {
1103                 to -= 2;
1104                 while (to > base && *to != '/') to--;
1105                 if (*to == '/')
1106                     to++;
1107             }
1108             goto done;
1109         }
1110         else
1111             /* Copy this component and trailing /, if any.  */
1112             while ((*to++ = *from++) != '/')
1113             {
1114                 if (!to[-1])
1115                 {
1116                     to--;
1117                     goto done;
1118                 }
1119             }
1120         
1121     }
1122     
1123  done:
1124     /* Trim trailing slash */
1125     if (to[0] == '/' && (!absolute || to > path+1))
1126         to--;
1127
1128     /* Change the empty string to "." so that stat() on the result
1129        will always work. */
1130     if (to == path)
1131       *to++ = '.';
1132     
1133     *to = '\0';
1134
1135     return path;
1136 }