OSDN Git Service

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