OSDN Git Service

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