OSDN Git Service

* explow.c (set_mem_attributes): Avoid returning a bogus alias set
[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   int err_no;                   /* errno obtained if opening a file failed */
71   unsigned short include_count; /* number of times file has been read */
72   unsigned short refcnt;        /* number of stacked buffers using this file */
73   unsigned char mapped;         /* file buffer is mmapped */
74 };
75
76 /* The cmacro works like this: If it's NULL, the file is to be
77    included again.  If it's NEVER_REREAD, the file is never to be
78    included again.  Otherwise it is a macro hashnode, and the file is
79    to be included again if the macro is defined.  */
80 #define NEVER_REREAD ((const cpp_hashnode *)-1)
81 #define DO_NOT_REREAD(inc) \
82 ((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \
83                    || (inc)->cmacro->type == NT_MACRO))
84 #define NO_INCLUDE_PATH ((struct include_file *) -1)
85
86 static struct file_name_map *read_name_map
87                                 PARAMS ((cpp_reader *, const char *));
88 static char *read_filename_string PARAMS ((int, FILE *));
89 static char *remap_filename     PARAMS ((cpp_reader *, char *,
90                                          struct search_path *));
91 static struct search_path *search_from PARAMS ((cpp_reader *,
92                                                 enum include_type));
93 static struct include_file *
94         find_include_file PARAMS ((cpp_reader *, const cpp_token *,
95                                    enum include_type));
96 static struct include_file *open_file PARAMS ((cpp_reader *, const char *));
97 static int read_include_file    PARAMS ((cpp_reader *, struct include_file *));
98 static bool stack_include_file  PARAMS ((cpp_reader *, struct include_file *));
99 static void purge_cache         PARAMS ((struct include_file *));
100 static void destroy_node        PARAMS ((splay_tree_value));
101 static int report_missing_guard         PARAMS ((splay_tree_node, void *));
102 static splay_tree_node find_or_create_entry PARAMS ((cpp_reader *,
103                                                      const char *));
104 static void handle_missing_header PARAMS ((cpp_reader *, const char *, int));
105 static int remove_component_p   PARAMS ((const char *));
106
107 /* Set up the splay tree we use to store information about all the
108    file names seen in this compilation.  We also have entries for each
109    file we tried to open but failed; this saves system calls since we
110    don't try to open it again in future.
111
112    The key of each node is the file name, after processing by
113    _cpp_simplify_pathname.  The path name may or may not be absolute.
114    The path string has been malloced, as is automatically freed by
115    registering free () as the splay tree key deletion function.
116
117    A node's value is a pointer to a struct include_file, and is never
118    NULL.  */
119 void
120 _cpp_init_includes (pfile)
121      cpp_reader *pfile;
122 {
123   pfile->all_include_files
124     = splay_tree_new ((splay_tree_compare_fn) strcmp,
125                       (splay_tree_delete_key_fn) free,
126                       destroy_node);
127 }
128
129 /* Tear down the splay tree.  */
130 void
131 _cpp_cleanup_includes (pfile)
132      cpp_reader *pfile;
133 {
134   splay_tree_delete (pfile->all_include_files);
135 }
136
137 /* Free a node.  The path string is automatically freed.  */
138 static void
139 destroy_node (v)
140      splay_tree_value v;
141 {
142   struct include_file *f = (struct include_file *)v;
143
144   if (f)
145     {
146       purge_cache (f);
147       free (f);
148     }
149 }
150
151 /* Mark a file to not be reread (e.g. #import, read failure).  */
152 void
153 _cpp_never_reread (file)
154      struct include_file *file;
155 {
156   file->cmacro = NEVER_REREAD;
157 }
158
159 /* Lookup a filename, which is simplified after making a copy, and
160    create an entry if none exists.  errno is nonzero iff a (reported)
161    stat() error occurred during simplification.  */
162 static splay_tree_node
163 find_or_create_entry (pfile, fname)
164      cpp_reader *pfile;
165      const char *fname;
166 {
167   splay_tree_node node;
168   struct include_file *file;
169   char *name = xstrdup (fname);
170
171   _cpp_simplify_pathname (name);
172   node = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
173   if (node)
174     free (name);
175   else
176     {
177       file = xcnew (struct include_file);
178       file->name = name;
179       file->err_no = errno;
180       node = splay_tree_insert (pfile->all_include_files,
181                                 (splay_tree_key) file->name,
182                                 (splay_tree_value) file);
183     }
184
185   return node;
186 }
187
188 /* Enter a file name in the splay tree, for the sake of cpp_included.  */
189 void
190 _cpp_fake_include (pfile, fname)
191      cpp_reader *pfile;
192      const char *fname;
193 {
194   find_or_create_entry (pfile, fname);
195 }
196
197 /* Given a file name, look it up in the cache; if there is no entry,
198    create one with a non-NULL value (regardless of success in opening
199    the file).  If the file doesn't exist or is inaccessible, this
200    entry is flagged so we don't attempt to open it again in the
201    future.  If the file isn't open, open it.  The empty string is
202    interpreted as stdin.
203
204    Returns an include_file structure with an open file descriptor on
205    success, or NULL on failure.  */
206
207 static struct include_file *
208 open_file (pfile, filename)
209      cpp_reader *pfile;
210      const char *filename;
211 {
212   splay_tree_node nd = find_or_create_entry (pfile, filename);
213   struct include_file *file = (struct include_file *) nd->value;
214
215   if (file->err_no)
216     {
217       /* Ugh.  handle_missing_header () needs errno to be set.  */
218       errno = file->err_no;
219       return 0;
220     }
221
222   /* Don't reopen an idempotent file.  */
223   if (DO_NOT_REREAD (file))
224     return file;
225       
226   /* Don't reopen one which is already loaded.  */
227   if (file->buffer != NULL)
228     return file;
229
230   /* We used to open files in nonblocking mode, but that caused more
231      problems than it solved.  Do take care not to acquire a
232      controlling terminal by mistake (this can't happen on sane
233      systems, but paranoia is a virtue).
234
235      Use the three-argument form of open even though we aren't
236      specifying O_CREAT, to defend against broken system headers.
237
238      O_BINARY tells some runtime libraries (notably DJGPP) not to do
239      newline translation; we can handle DOS line breaks just fine
240      ourselves.
241
242      Special case: the empty string is translated to stdin.  */
243
244   if (filename[0] == '\0')
245     file->fd = 0;
246   else
247     file->fd = open (file->name, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
248
249   if (file->fd != -1 && fstat (file->fd, &file->st) == 0)
250     {
251       /* If it's a directory, we return null and continue the search
252          as the file we're looking for may appear elsewhere in the
253          search path.  */
254       if (S_ISDIR (file->st.st_mode))
255         errno = ENOENT;
256       else
257         {
258           /* Mark a regular, zero-length file never-reread now.  */
259           if (S_ISREG (file->st.st_mode) && file->st.st_size == 0)
260             {
261               _cpp_never_reread (file);
262               close (file->fd);
263               file->fd = -1;
264             }
265
266           return file;
267         }
268     }
269
270   /* Don't issue an error message if the file doesn't exist.  */
271   file->err_no = errno;
272   if (errno != ENOENT && errno != ENOTDIR)
273     cpp_error_from_errno (pfile, file->name);
274
275   return 0;
276 }
277
278 /* Place the file referenced by INC into a new buffer on the buffer
279    stack, unless there are errors, or the file is not re-included
280    because of e.g. multiple-include guards.  Returns true if a buffer
281    is stacked.  */
282
283 static bool
284 stack_include_file (pfile, inc)
285      cpp_reader *pfile;
286      struct include_file *inc;
287 {
288   cpp_buffer *fp;
289   int sysp;
290   const char *filename;
291
292   if (DO_NOT_REREAD (inc))
293     return false;
294
295   sysp = MAX ((pfile->map ? pfile->map->sysp : 0),
296               (inc->foundhere ? inc->foundhere->sysp : 0));
297
298   /* For -M, add the file to the dependencies on its first inclusion.  */
299   if (CPP_OPTION (pfile, print_deps) > sysp && !inc->include_count)
300     deps_add_dep (pfile->deps, inc->name);
301
302   /* Not in cache?  */
303   if (! inc->buffer)
304     {
305       /* If an error occurs, do not try to read this file again.  */
306       if (read_include_file (pfile, inc))
307         {
308           _cpp_never_reread (inc);
309           return false;
310         }
311       close (inc->fd);
312       inc->fd = -1;
313     }
314
315   if (pfile->buffer)
316     /* We don't want MI guard advice for the main file.  */
317     inc->include_count++;
318
319   /* Push a buffer.  */
320   fp = cpp_push_buffer (pfile, inc->buffer, inc->st.st_size, BUF_FILE, 0);
321   fp->inc = inc;
322   fp->inc->refcnt++;
323
324   /* Initialise controlling macro state.  */
325   pfile->mi_valid = true;
326   pfile->mi_cmacro = 0;
327
328   /* Generate the call back.  */
329   filename = inc->name;
330   if (*filename == '\0')
331     filename = _("<stdin>");
332   _cpp_do_file_change (pfile, LC_ENTER, filename, 1, sysp);
333
334   return true;
335 }
336
337 /* Read the file referenced by INC into the file cache.
338
339    If fd points to a plain file, we might be able to mmap it; we can
340    definitely allocate the buffer all at once.  If fd is a pipe or
341    terminal, we can't do either.  If fd is something weird, like a
342    block device, we don't want to read it at all.
343
344    Unfortunately, different systems use different st.st_mode values
345    for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
346    zero the entire struct stat except a couple fields.  Hence we don't
347    even try to figure out what something is, except for plain files
348    and block devices.
349
350    FIXME: Flush file cache and try again if we run out of memory.  */
351
352 static int
353 read_include_file (pfile, inc)
354      cpp_reader *pfile;
355      struct include_file *inc;
356 {
357   ssize_t size, offset, count;
358   U_CHAR *buf;
359 #if MMAP_THRESHOLD
360   static int pagesize = -1;
361 #endif
362
363   if (S_ISREG (inc->st.st_mode))
364     {
365       /* off_t might have a wider range than ssize_t - in other words,
366          the max size of a file might be bigger than the address
367          space.  We can't handle a file that large.  (Anyone with
368          a single source file bigger than 2GB needs to rethink
369          their coding style.)  Some systems (e.g. AIX 4.1) define
370          SSIZE_MAX to be much smaller than the actual range of the
371          type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
372          does not bite us.  */
373       if (inc->st.st_size > INTTYPE_MAXIMUM (ssize_t))
374         {
375           cpp_error (pfile, "%s is too large", inc->name);
376           goto fail;
377         }
378       size = inc->st.st_size;
379
380       inc->mapped = 0;
381 #if MMAP_THRESHOLD
382       if (pagesize == -1)
383         pagesize = getpagesize ();
384
385       if (size / pagesize >= MMAP_THRESHOLD)
386         {
387           buf = (U_CHAR *) mmap (0, size, PROT_READ, MAP_PRIVATE, inc->fd, 0);
388           if (buf == (U_CHAR *)-1)
389             goto perror_fail;
390           inc->mapped = 1;
391         }
392       else
393 #endif
394         {
395           buf = (U_CHAR *) xmalloc (size);
396           offset = 0;
397           while (offset < size)
398             {
399               count = read (inc->fd, buf + offset, size - offset);
400               if (count < 0)
401                 goto perror_fail;
402               if (count == 0)
403                 {
404                   cpp_warning (pfile, "%s is shorter than expected", inc->name);
405                   break;
406                 }
407               offset += count;
408             }
409         }
410     }
411   else if (S_ISBLK (inc->st.st_mode))
412     {
413       cpp_error (pfile, "%s is a block device", inc->name);
414       goto fail;
415     }
416   else
417     {
418       /* 8 kilobytes is a sensible starting size.  It ought to be
419          bigger than the kernel pipe buffer, and it's definitely
420          bigger than the majority of C source files.  */
421       size = 8 * 1024;
422
423       buf = (U_CHAR *) xmalloc (size);
424       offset = 0;
425       while ((count = read (inc->fd, buf + offset, size - offset)) > 0)
426         {
427           offset += count;
428           if (offset == size)
429             buf = xrealloc (buf, (size *= 2));
430         }
431       if (count < 0)
432         goto perror_fail;
433
434       if (offset < size)
435         buf = xrealloc (buf, offset);
436       inc->st.st_size = offset;
437     }
438
439   inc->buffer = buf;
440   return 0;
441
442  perror_fail:
443   cpp_error_from_errno (pfile, inc->name);
444  fail:
445   return 1;
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   _cpp_do_file_change (pfile, LC_RENAME, pfile->map->to_file,
574                        SOURCE_LINE (pfile->map, pfile->line), flags);
575 }
576
577 /* Report on all files that might benefit from a multiple include guard.
578    Triggered by -H.  */
579 void
580 _cpp_report_missing_guards (pfile)
581      cpp_reader *pfile;
582 {
583   int banner = 0;
584   splay_tree_foreach (pfile->all_include_files, report_missing_guard,
585                       (PTR) &banner);
586 }
587
588 static int
589 report_missing_guard (n, b)
590      splay_tree_node n;
591      void *b;
592 {
593   struct include_file *f = (struct include_file *) n->value;
594   int *bannerp = (int *)b;
595
596   if (f && f->cmacro == 0 && f->include_count == 1)
597     {
598       if (*bannerp == 0)
599         {
600           fputs (_("Multiple include guards may be useful for:\n"), stderr);
601           *bannerp = 1;
602         }
603       fputs (f->name, stderr);
604       putc ('\n', stderr);
605     }
606   return 0;
607 }
608
609 /* Create a dependency, or issue an error message as appropriate.   */
610 static void
611 handle_missing_header (pfile, fname, angle_brackets)
612      cpp_reader *pfile;
613      const char *fname;
614      int angle_brackets;
615 {
616   int print_dep = CPP_PRINT_DEPS(pfile) > (angle_brackets || pfile->map->sysp);
617
618   if (CPP_OPTION (pfile, print_deps_missing_files) && print_dep)
619     {
620       if (!angle_brackets || IS_ABSOLUTE_PATHNAME (fname))
621         deps_add_dep (pfile->deps, fname);
622       else
623         {
624           /* If requested as a system header, assume it belongs in
625              the first system header directory.  */
626           struct search_path *ptr = CPP_OPTION (pfile, bracket_include);
627           char *p;
628           int len = 0, fname_len = strlen (fname);
629
630           if (ptr)
631             len = ptr->len;
632
633           p = (char *) alloca (len + fname_len + 2);
634           if (len)
635             {
636               memcpy (p, ptr->name, len);
637               p[len++] = '/';
638             }
639           memcpy (p + len, fname, fname_len + 1);
640           deps_add_dep (pfile->deps, p);
641         }
642     }
643   /* If -M was specified, then don't count this as an error, because
644      we can still produce correct output.  Otherwise, we can't produce
645      correct output, because there may be dependencies we need inside
646      the missing file, and we don't know what directory this missing
647      file exists in.  FIXME: Use a future cpp_diagnotic_with_errno ()
648      for both of these cases.  */
649   else if (CPP_PRINT_DEPS (pfile) && ! print_dep)
650     cpp_warning (pfile, "%s: %s", fname, xstrerror (errno));
651   else
652     cpp_error_from_errno (pfile, fname);
653 }
654
655 /* Handles #include-family directives, and the command line -imacros
656    and -include.  Returns true if a buffer was stacked.  */
657 bool
658 _cpp_execute_include (pfile, header, type)
659      cpp_reader *pfile;
660      const cpp_token *header;
661      enum include_type type;
662 {
663   bool stacked = false;
664   struct include_file *inc = find_include_file (pfile, header, type);
665
666   if (inc == 0)
667     handle_missing_header (pfile, (const char *) header->val.str.text,
668                            header->type == CPP_HEADER_NAME);
669   else if (inc != NO_INCLUDE_PATH)
670     {
671       stacked = stack_include_file (pfile, inc);
672
673       if (type == IT_IMPORT)
674         _cpp_never_reread (inc);
675     }
676
677   return stacked;
678 }
679
680 /* Locate HEADER, and determine whether it is newer than the current
681    file.  If it cannot be located or dated, return -1, if it is newer
682    newer, return 1, otherwise 0.  */
683 int
684 _cpp_compare_file_date (pfile, header)
685      cpp_reader *pfile;
686      const cpp_token *header;
687 {
688   struct include_file *inc = find_include_file (pfile, header, 0);
689   
690   if (inc == NULL || inc == NO_INCLUDE_PATH)
691     return -1;
692
693   if (inc->fd > 0)
694     {
695       close (inc->fd);
696       inc->fd = -1;
697     }
698     
699   return inc->st.st_mtime > pfile->buffer->inc->st.st_mtime;
700 }
701
702
703 /* Push an input buffer and load it up with the contents of FNAME.  If
704    FNAME is "", read standard input.  Return true if a buffer was
705    stacked.  */
706 bool
707 _cpp_read_file (pfile, fname)
708      cpp_reader *pfile;
709      const char *fname;
710 {
711   struct include_file *f = open_file (pfile, fname);
712   bool stacked = false;
713
714   if (f == NULL)
715     cpp_error_from_errno (pfile, fname);
716   else
717     stacked = stack_include_file (pfile, f);
718
719   return stacked;
720 }
721
722 /* Do appropriate cleanup when a file buffer is popped off the input
723    stack.  */
724 void
725 _cpp_pop_file_buffer (pfile, buf)
726      cpp_reader *pfile;
727      cpp_buffer *buf;
728 {
729   struct include_file *inc = buf->inc;
730
731   /* Record the inclusion-preventing macro, which could be NULL
732      meaning no controlling macro.  */
733   if (pfile->mi_valid && inc->cmacro == NULL)
734     inc->cmacro = pfile->mi_cmacro;
735
736   /* Invalidate control macros in the #including file.  */
737   pfile->mi_valid = false;
738
739   inc->refcnt--;
740   if (inc->refcnt == 0 && DO_NOT_REREAD (inc))
741     purge_cache (inc);
742 }
743
744 /* Returns the first place in the include chain to start searching for
745    "" includes.  This involves stripping away the basename of the
746    current file, unless -I- was specified.
747
748    If we're handling -include or -imacros, use the "" chain, but with
749    the preprocessor's cwd prepended.  */
750 static struct search_path *
751 search_from (pfile, type)
752      cpp_reader *pfile;
753      enum include_type type;
754 {
755   cpp_buffer *buffer = pfile->buffer;
756   unsigned int dlen;
757
758   /* Command line uses the cwd, and does not cache the result.  */
759   if (type == IT_CMDLINE)
760     goto use_cwd;
761
762   /* Ignore the current file's directory if -I- was given.  */
763   if (CPP_OPTION (pfile, ignore_srcdir))
764     return CPP_OPTION (pfile, quote_include);
765
766   if (! buffer->search_cached)
767     {
768       buffer->search_cached = 1;
769
770       dlen = lbasename (buffer->inc->name) - buffer->inc->name;
771
772       if (dlen)
773         {
774           /* We don't guarantee NAME is null-terminated.  This saves
775              allocating and freeing memory, and duplicating it when faking
776              buffers in cpp_push_buffer.  Drop a trailing '/'.  */
777           buffer->dir.name = buffer->inc->name;
778           if (dlen > 1)
779             dlen--;
780         }
781       else
782         {
783         use_cwd:
784           buffer->dir.name = ".";
785           dlen = 1;
786         }
787
788       if (dlen > pfile->max_include_len)
789         pfile->max_include_len = dlen;
790
791       buffer->dir.len = dlen;
792       buffer->dir.next = CPP_OPTION (pfile, quote_include);
793       buffer->dir.sysp = pfile->map->sysp;
794     }
795
796   return &buffer->dir;
797 }
798
799 /* The file_name_map structure holds a mapping of file names for a
800    particular directory.  This mapping is read from the file named
801    FILE_NAME_MAP_FILE in that directory.  Such a file can be used to
802    map filenames on a file system with severe filename restrictions,
803    such as DOS.  The format of the file name map file is just a series
804    of lines with two tokens on each line.  The first token is the name
805    to map, and the second token is the actual name to use.  */
806
807 struct file_name_map
808 {
809   struct file_name_map *map_next;
810   char *map_from;
811   char *map_to;
812 };
813
814 #define FILE_NAME_MAP_FILE "header.gcc"
815
816 /* Read a space delimited string of unlimited length from a stdio
817    file.  */
818
819 static char *
820 read_filename_string (ch, f)
821      int ch;
822      FILE *f;
823 {
824   char *alloc, *set;
825   int len;
826
827   len = 20;
828   set = alloc = xmalloc (len + 1);
829   if (! is_space(ch))
830     {
831       *set++ = ch;
832       while ((ch = getc (f)) != EOF && ! is_space(ch))
833         {
834           if (set - alloc == len)
835             {
836               len *= 2;
837               alloc = xrealloc (alloc, len + 1);
838               set = alloc + len / 2;
839             }
840           *set++ = ch;
841         }
842     }
843   *set = '\0';
844   ungetc (ch, f);
845   return alloc;
846 }
847
848 /* This structure holds a linked list of file name maps, one per directory.  */
849
850 struct file_name_map_list
851 {
852   struct file_name_map_list *map_list_next;
853   char *map_list_name;
854   struct file_name_map *map_list_map;
855 };
856
857 /* Read the file name map file for DIRNAME.  */
858
859 static struct file_name_map *
860 read_name_map (pfile, dirname)
861      cpp_reader *pfile;
862      const char *dirname;
863 {
864   register struct file_name_map_list *map_list_ptr;
865   char *name;
866   FILE *f;
867
868   /* Check the cache of directories, and mappings in their remap file.  */
869   for (map_list_ptr = CPP_OPTION (pfile, map_list); map_list_ptr;
870        map_list_ptr = map_list_ptr->map_list_next)
871     if (! strcmp (map_list_ptr->map_list_name, dirname))
872       return map_list_ptr->map_list_map;
873
874   map_list_ptr = ((struct file_name_map_list *)
875                   xmalloc (sizeof (struct file_name_map_list)));
876   map_list_ptr->map_list_name = xstrdup (dirname);
877
878   /* The end of the list ends in NULL.  */
879   map_list_ptr->map_list_map = NULL;
880
881   name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
882   strcpy (name, dirname);
883   if (*dirname)
884     strcat (name, "/");
885   strcat (name, FILE_NAME_MAP_FILE);
886   f = fopen (name, "r");
887
888   /* Silently return NULL if we cannot open.  */
889   if (f)
890     {
891       int ch;
892       int dirlen = strlen (dirname);
893
894       while ((ch = getc (f)) != EOF)
895         {
896           char *from, *to;
897           struct file_name_map *ptr;
898
899           if (is_space(ch))
900             continue;
901           from = read_filename_string (ch, f);
902           while ((ch = getc (f)) != EOF && is_hspace(ch))
903             ;
904           to = read_filename_string (ch, f);
905
906           ptr = ((struct file_name_map *)
907                  xmalloc (sizeof (struct file_name_map)));
908           ptr->map_from = from;
909
910           /* Make the real filename absolute.  */
911           if (IS_ABSOLUTE_PATHNAME (to))
912             ptr->map_to = to;
913           else
914             {
915               ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
916               strcpy (ptr->map_to, dirname);
917               ptr->map_to[dirlen] = '/';
918               strcpy (ptr->map_to + dirlen + 1, to);
919               free (to);
920             }         
921
922           ptr->map_next = map_list_ptr->map_list_map;
923           map_list_ptr->map_list_map = ptr;
924
925           while ((ch = getc (f)) != '\n')
926             if (ch == EOF)
927               break;
928         }
929       fclose (f);
930     }
931   
932   /* Add this information to the cache.  */
933   map_list_ptr->map_list_next = CPP_OPTION (pfile, map_list);
934   CPP_OPTION (pfile, map_list) = map_list_ptr;
935
936   return map_list_ptr->map_list_map;
937 }  
938
939 /* Remap an unsimplified path NAME based on the file_name_map (if any)
940    for LOC.  */
941 static char *
942 remap_filename (pfile, name, loc)
943      cpp_reader *pfile;
944      char *name;
945      struct search_path *loc;
946 {
947   struct file_name_map *map;
948   const char *from, *p;
949   char *dir;
950
951   if (! loc->name_map)
952     {
953       /* Get a null-terminated path.  */
954       char *dname = alloca (loc->len + 1);
955       memcpy (dname, loc->name, loc->len);
956       dname[loc->len] = '\0';
957
958       loc->name_map = read_name_map (pfile, dname);
959       if (! loc->name_map)
960         return name;
961     }
962   
963   /* This works since NAME has not been simplified yet.  */
964   from = name + loc->len + 1;
965   
966   for (map = loc->name_map; map; map = map->map_next)
967     if (!strcmp (map->map_from, from))
968       return map->map_to;
969
970   /* Try to find a mapping file for the particular directory we are
971      looking in.  Thus #include <sys/types.h> will look up sys/types.h
972      in /usr/include/header.gcc and look up types.h in
973      /usr/include/sys/header.gcc.  */
974   p = strrchr (name, '/');
975   if (!p)
976     return name;
977
978   /* We know p != name as absolute paths don't call remap_filename.  */
979   if (p == name)
980     cpp_ice (pfile, "absolute file name in remap_filename");
981
982   dir = (char *) alloca (p - name + 1);
983   memcpy (dir, name, p - name);
984   dir[p - name] = '\0';
985   from = p + 1;
986   
987   for (map = read_name_map (pfile, dir); map; map = map->map_next)
988     if (! strcmp (map->map_from, from))
989       return map->map_to;
990
991   return name;
992 }
993
994 /* Returns true if it is safe to remove the final component of path,
995    when it is followed by a ".." component.  We use lstat to avoid
996    symlinks if we have it.  If not, we can still catch errors with
997    stat ().  */
998 static int
999 remove_component_p (path)
1000      const char *path;
1001 {
1002   struct stat s;
1003   int result;
1004
1005 #ifdef HAVE_LSTAT
1006   result = lstat (path, &s);
1007 #else
1008   result = stat (path, &s);
1009 #endif
1010
1011   /* There's no guarantee that errno will be unchanged, even on
1012      success.  Cygwin's lstat(), for example, will often set errno to
1013      ENOSYS.  In case of success, reset errno to zero.  */
1014   if (result == 0)
1015     errno = 0;
1016
1017   return result == 0 && S_ISDIR (s.st_mode);
1018 }
1019
1020 /* Simplify a path name in place, deleting redundant components.  This
1021    reduces OS overhead and guarantees that equivalent paths compare
1022    the same (modulo symlinks).
1023
1024    Transforms made:
1025    foo/bar/../quux      foo/quux
1026    foo/./bar            foo/bar
1027    foo//bar             foo/bar
1028    /../quux             /quux
1029    //quux               //quux  (POSIX allows leading // as a namespace escape)
1030
1031    Guarantees no trailing slashes.  All transforms reduce the length
1032    of the string.  Returns PATH.  errno is 0 if no error occurred;
1033    nonzero if an error occurred when using stat () or lstat ().  */
1034
1035 char *
1036 _cpp_simplify_pathname (path)
1037     char *path;
1038 {
1039 #ifndef VMS
1040   char *from, *to;
1041   char *base, *orig_base;
1042   int absolute = 0;
1043
1044   errno = 0;
1045   /* Don't overflow the empty path by putting a '.' in it below.  */
1046   if (*path == '\0')
1047     return path;
1048
1049 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
1050   /* Convert all backslashes to slashes.  */
1051   for (from = path; *from; from++)
1052     if (*from == '\\') *from = '/';
1053     
1054   /* Skip over leading drive letter if present.  */
1055   if (ISALPHA (path[0]) && path[1] == ':')
1056     from = to = &path[2];
1057   else
1058     from = to = path;
1059 #else
1060   from = to = path;
1061 #endif
1062     
1063   /* Remove redundant leading /s.  */
1064   if (*from == '/')
1065     {
1066       absolute = 1;
1067       to++;
1068       from++;
1069       if (*from == '/')
1070         {
1071           if (*++from == '/')
1072             /* 3 or more initial /s are equivalent to 1 /.  */
1073             while (*++from == '/');
1074           else
1075             /* On some hosts // differs from /; Posix allows this.  */
1076             to++;
1077         }
1078     }
1079
1080   base = orig_base = to;
1081   for (;;)
1082     {
1083       int move_base = 0;
1084
1085       while (*from == '/')
1086         from++;
1087
1088       if (*from == '\0')
1089         break;
1090
1091       if (*from == '.')
1092         {
1093           if (from[1] == '\0')
1094             break;
1095           if (from[1] == '/')
1096             {
1097               from += 2;
1098               continue;
1099             }
1100           else if (from[1] == '.' && (from[2] == '/' || from[2] == '\0'))
1101             {
1102               /* Don't simplify if there was no previous component.  */
1103               if (absolute && orig_base == to)
1104                 {
1105                   from += 2;
1106                   continue;
1107                 }
1108               /* Don't simplify if the previous component was "../",
1109                  or if an error has already occurred with (l)stat.  */
1110               if (base != to && errno == 0)
1111                 {
1112                   /* We don't back up if it's a symlink.  */
1113                   *to = '\0';
1114                   if (remove_component_p (path))
1115                     {
1116                       while (to > base && *to != '/')
1117                         to--;
1118                       from += 2;
1119                       continue;
1120                     }
1121                 }
1122               move_base = 1;
1123             }
1124         }
1125
1126       /* Add the component separator.  */
1127       if (to > orig_base)
1128         *to++ = '/';
1129
1130       /* Copy this component until the trailing null or '/'.  */
1131       while (*from != '\0' && *from != '/')
1132         *to++ = *from++;
1133
1134       if (move_base)
1135         base = to;
1136     }
1137     
1138   /* Change the empty string to "." so that it is not treated as stdin.
1139      Null terminate.  */
1140   if (to == path)
1141     *to++ = '.';
1142   *to = '\0';
1143
1144   return path;
1145 #else /* VMS  */
1146   errno = 0;
1147   return path;
1148 #endif /* !VMS  */
1149 }