OSDN Git Service

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