Working properly under Borland C++ now
[fw/sdcc] / support / cpp2 / cppfiles.c
1 /* Part of CPP library.  (include file handling)
2    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
3    1999, 2000, 2001 Free Software Foundation, Inc.
4    Written by Per Bothner, 1994.
5    Based on CCCP program by Paul Rubin, June 1986
6    Adapted to ANSI C, Richard Stallman, Jan 1987
7    Split out of cpplib.c, Zack Weinberg, Oct 1998
8
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "cpplib.h"
26 #include "cpphash.h"
27 #include "intl.h"
28 #include "mkdeps.h"
29 #include "splay-tree.h"
30
31 #ifdef HAVE_MMAP_FILE
32 # include <sys/mman.h>
33 # ifndef MMAP_THRESHOLD
34 #  define MMAP_THRESHOLD 3 /* Minimum page count to mmap the file.  */
35 # endif
36
37 #else  /* No MMAP_FILE */
38 #  undef MMAP_THRESHOLD
39 #  define MMAP_THRESHOLD 0
40 #endif
41
42 #ifndef O_BINARY
43 # define O_BINARY 0
44 #endif
45
46 /* If errno is inspected immediately after a system call fails, it will be
47    nonzero, and no error number will ever be zero.  */
48 #ifndef ENOENT
49 # define ENOENT 0
50 #endif
51 #ifndef ENOTDIR
52 # define ENOTDIR 0
53 #endif
54
55 /* Suppress warning about function macros used w/o arguments in traditional
56    C.  It is unlikely that glibc's strcmp macro helps this file at all.  */
57 #undef strcmp
58
59 /* This structure is used for the table of all includes.  */
60 struct include_file
61 {
62   const char *name;             /* actual path name of file */
63   const cpp_hashnode *cmacro;   /* macro, if any, preventing reinclusion.  */
64   const struct search_path *foundhere;
65                                 /* location in search path where file was
66                                    found, for #include_next and sysp.  */
67   const unsigned char *buffer;  /* pointer to cached file contents */
68   struct stat st;               /* copy of stat(2) data for file */
69   int fd;                       /* fd open on file (short term storage only) */
70   int err_no;                   /* errno obtained if opening a file failed */
71   unsigned short include_count; /* number of times file has been read */
72   unsigned short refcnt;        /* number of stacked buffers using this file */
73   unsigned char mapped;         /* file buffer is mmapped */
74 };
75
76 /* The cmacro works like this: If it's NULL, the file is to be
77    included again.  If it's NEVER_REREAD, the file is never to be
78    included again.  Otherwise it is a macro hashnode, and the file is
79    to be included again if the macro is defined.  */
80 #define NEVER_REREAD ((const cpp_hashnode *)-1)
81 #define DO_NOT_REREAD(inc) \
82 ((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \
83                    || (inc)->cmacro->type == NT_MACRO))
84 #define NO_INCLUDE_PATH ((struct include_file *) -1)
85
86 static struct file_name_map *read_name_map
87                                 PARAMS ((cpp_reader *, const char *));
88 static char *read_filename_string PARAMS ((int, FILE *));
89 static char *remap_filename     PARAMS ((cpp_reader *, char *,
90                                          struct search_path *));
91 static struct search_path *search_from PARAMS ((cpp_reader *,
92                                                 enum include_type));
93 static struct include_file *
94         find_include_file PARAMS ((cpp_reader *, const cpp_token *,
95                                    enum include_type));
96 static struct include_file *open_file PARAMS ((cpp_reader *, const char *));
97 static int read_include_file    PARAMS ((cpp_reader *, struct include_file *));
98 static 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 static int remove_component_p   PARAMS ((const char *));
106
107 /* Set up the splay tree we use to store information about all the
108    file names seen in this compilation.  We also have entries for each
109    file we tried to open but failed; this saves system calls since we
110    don't try to open it again in future.
111
112    The key of each node is the file name, after processing by
113    _cpp_simplify_pathname.  The path name may or may not be absolute.
114    The path string has been malloced, as is automatically freed by
115    registering free () as the splay tree key deletion function.
116
117    A node's value is a pointer to a struct include_file, and is never
118    NULL.  */
119 void
120 _cpp_init_includes (pfile)
121      cpp_reader *pfile;
122 {
123   pfile->all_include_files
124     = splay_tree_new ((splay_tree_compare_fn) strcmp,
125                       (splay_tree_delete_key_fn) free,
126                       destroy_node);
127 }
128
129 /* Tear down the splay tree.  */
130 void
131 _cpp_cleanup_includes (pfile)
132      cpp_reader *pfile;
133 {
134   splay_tree_delete (pfile->all_include_files);
135 }
136
137 /* Free a node.  The path string is automatically freed.  */
138 static void
139 destroy_node (v)
140      splay_tree_value v;
141 {
142   struct include_file *f = (struct include_file *)v;
143
144   if (f)
145     {
146       purge_cache (f);
147       free (f);
148     }
149 }
150
151 /* Mark a file to not be reread (e.g. #import, read failure).  */
152 void
153 _cpp_never_reread (file)
154      struct include_file *file;
155 {
156   file->cmacro = NEVER_REREAD;
157 }
158
159 /* Lookup a filename, which is simplified after making a copy, and
160    create an entry if none exists.  errno is nonzero iff a (reported)
161    stat() error occurred during simplification.  */
162 static splay_tree_node
163 find_or_create_entry (pfile, fname)
164      cpp_reader *pfile;
165      const char *fname;
166 {
167   splay_tree_node node;
168   struct include_file *file;
169   char *name = xstrdup (fname);
170
171   _cpp_simplify_pathname (name);
172   node = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
173   if (node)
174     free (name);
175   else
176     {
177       file = xcnew (struct include_file);
178       file->name = name;
179       file->err_no = errno;
180       node = splay_tree_insert (pfile->all_include_files,
181                                 (splay_tree_key) file->name,
182                                 (splay_tree_value) file);
183     }
184
185   return node;
186 }
187
188 /* Enter a file name in the splay tree, for the sake of cpp_included.  */
189 void
190 _cpp_fake_include (pfile, fname)
191      cpp_reader *pfile;
192      const char *fname;
193 {
194   find_or_create_entry (pfile, fname);
195 }
196
197 /* Given a file name, look it up in the cache; if there is no entry,
198    create one with a non-NULL value (regardless of success in opening
199    the file).  If the file doesn't exist or is inaccessible, this
200    entry is flagged so we don't attempt to open it again in the
201    future.  If the file isn't open, open it.  The empty string is
202    interpreted as stdin.
203
204    Returns an include_file structure with an open file descriptor on
205    success, or NULL on failure.  */
206
207 static struct include_file *
208 open_file (pfile, filename)
209      cpp_reader *pfile;
210      const char *filename;
211 {
212   splay_tree_node nd = find_or_create_entry (pfile, filename);
213   struct include_file *file = (struct include_file *) nd->value;
214
215   if (file->err_no)
216     {
217       /* Ugh.  handle_missing_header () needs errno to be set.  */
218       errno = file->err_no;
219       return 0;
220     }
221
222   /* Don't reopen an idempotent file. */
223   if (DO_NOT_REREAD (file))
224     return file;
225       
226   /* Don't reopen one which is already loaded. */
227   if (file->buffer != NULL)
228     return file;
229
230   /* We used to open files in nonblocking mode, but that caused more
231      problems than it solved.  Do take care not to acquire a
232      controlling terminal by mistake (this can't happen on sane
233      systems, but paranoia is a virtue).
234
235      Use the three-argument form of open even though we aren't
236      specifying O_CREAT, to defend against broken system headers.
237
238      O_BINARY tells some runtime libraries (notably DJGPP) not to do
239      newline translation; we can handle DOS line breaks just fine
240      ourselves.
241
242      Special case: the empty string is translated to stdin.  */
243
244   if (filename[0] == '\0')
245     file->fd = 0;
246   else
247     file->fd = open (file->name, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
248
249   if (file->fd != -1 && fstat (file->fd, &file->st) == 0)
250     {
251       /* If it's a directory, we return null and continue the search
252          as the file we're looking for may appear elsewhere in the
253          search path.  */
254       if (S_ISDIR (file->st.st_mode))
255         errno = ENOENT;
256       else
257         {
258           /* Mark a regular, zero-length file never-reread now.  */
259           if (S_ISREG (file->st.st_mode) && file->st.st_size == 0)
260             {
261               _cpp_never_reread (file);
262               close (file->fd);
263               file->fd = -1;
264             }
265
266           return file;
267         }
268     }
269
270   /* Don't issue an error message if the file doesn't exist.  */
271   file->err_no = errno;
272   if (errno != ENOENT && errno != ENOTDIR)
273     cpp_error_from_errno (pfile, file->name);
274
275   return 0;
276 }
277
278 /* Place the file referenced by INC into a new buffer on PFILE's
279    stack.  If there are errors, or the file should not be re-included,
280    a null (zero-length) buffer is pushed.  */
281
282 static void
283 stack_include_file (pfile, inc)
284      cpp_reader *pfile;
285      struct include_file *inc;
286 {
287   size_t len = 0;
288   cpp_buffer *fp;
289   int sysp, deps_sysp;
290
291   /* We'll try removing deps_sysp after the release of 3.0.  */
292   deps_sysp = pfile->system_include_depth != 0;
293   sysp = MAX ((pfile->buffer ? pfile->buffer->sysp : 0),
294               (inc->foundhere ? inc->foundhere->sysp : 0));
295
296   /* For -M, add the file to the dependencies on its first inclusion.  */
297   if (CPP_OPTION (pfile, print_deps) > deps_sysp && !inc->include_count)
298     deps_add_dep (pfile->deps, inc->name);
299
300   /* Not in cache?  */
301   if (! DO_NOT_REREAD (inc) && ! inc->buffer)
302     {
303       /* If an error occurs, do not try to read this file again.  */
304       if (read_include_file (pfile, inc))
305         _cpp_never_reread (inc);
306       close (inc->fd);
307       inc->fd = -1;
308     }
309
310   if (! DO_NOT_REREAD (inc))
311     {
312       len = inc->st.st_size;
313       if (pfile->buffer)
314         {
315           /* We don't want MI guard advice for the main file.  */
316           inc->include_count++;
317
318           /* Handle -H option.  */
319           if (CPP_OPTION (pfile, print_include_names))
320             {
321               for (fp = pfile->buffer; fp; fp = fp->prev)
322                 putc ('.', stderr);
323               fprintf (stderr, " %s\n", inc->name);
324             }
325         }
326     }
327
328   /* Push a buffer.  */
329   fp = cpp_push_buffer (pfile, inc->buffer, len, BUF_FILE, inc->name);
330   fp->inc = inc;
331   fp->inc->refcnt++;
332   fp->sysp = sysp;
333
334   /* Initialise controlling macro state.  */
335   pfile->mi_state = MI_OUTSIDE;
336   pfile->mi_cmacro = 0;
337   pfile->include_depth++;
338
339   /* Generate the call back.  */
340   fp->lineno = 0;
341   _cpp_do_file_change (pfile, FC_ENTER, 0, 0);
342   fp->lineno = 1;
343 }
344
345 /* Read the file referenced by INC into the file cache.
346
347    If fd points to a plain file, we might be able to mmap it; we can
348    definitely allocate the buffer all at once.  If fd is a pipe or
349    terminal, we can't do either.  If fd is something weird, like a
350    block device, we don't want to read it at all.
351
352    Unfortunately, different systems use different st.st_mode values
353    for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
354    zero the entire struct stat except a couple fields.  Hence we don't
355    even try to figure out what something is, except for plain files
356    and block devices.
357
358    FIXME: Flush file cache and try again if we run out of memory.  */
359
360 static int
361 read_include_file (pfile, inc)
362      cpp_reader *pfile;
363      struct include_file *inc;
364 {
365   ssize_t size, offset, count;
366   U_CHAR *buf;
367 #if MMAP_THRESHOLD
368   static int pagesize = -1;
369 #endif
370
371   if (S_ISREG (inc->st.st_mode))
372     {
373       /* off_t might have a wider range than ssize_t - in other words,
374          the max size of a file might be bigger than the address
375          space.  We can't handle a file that large.  (Anyone with
376          a single source file bigger than 2GB needs to rethink
377          their coding style.)  Some systems (e.g. AIX 4.1) define
378          SSIZE_MAX to be much smaller than the actual range of the
379          type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
380          does not bite us.  */
381 #ifndef __BORLANDC__
382       if (inc->st.st_size > INTTYPE_MAXIMUM (ssize_t))
383         {
384           cpp_error (pfile, "%s is too large (%lu > %lu)", inc->name, 
385                      (unsigned long)inc->st.st_size,
386                      INTTYPE_MAXIMUM(ssize_t));
387           goto fail;
388         }
389 #endif  
390       size = inc->st.st_size;
391
392       inc->mapped = 0;
393 #if MMAP_THRESHOLD
394       if (pagesize == -1)
395         pagesize = getpagesize ();
396
397       if (size / pagesize >= MMAP_THRESHOLD)
398         {
399           buf = (U_CHAR *) mmap (0, size, PROT_READ, MAP_PRIVATE, inc->fd, 0);
400           if (buf == (U_CHAR *)-1)
401             goto perror_fail;
402           inc->mapped = 1;
403         }
404       else
405 #endif
406         {
407           buf = (U_CHAR *) xmalloc (size);
408           offset = 0;
409           while (offset < size)
410             {
411               count = read (inc->fd, buf + offset, size - offset);
412               if (count < 0)
413                 goto perror_fail;
414               if (count == 0)
415                 {
416 #ifndef __BORLANDC__                
417                   /* For some reason, even though we opened with O_BINARY, 
418                    * Borland C++ seems to insist on doing CR/LF -> LF 
419                    * translations for us, which results in the file appearing
420                    * shorter than stat told us it should be.
421                    * 
422                    * This sucks, but don't bother throwing a warning.
423                    */
424                   cpp_warning (pfile, "%s is shorter than expected (expected %u, got %u)", 
425                                inc->name, inc->st.st_size, offset);
426 #endif              
427                   inc->st.st_size = offset;
428                   break;
429                 }
430               offset += count;
431             }
432         }
433     }
434   else if (S_ISBLK (inc->st.st_mode))
435     {
436       cpp_error (pfile, "%s is a block device", inc->name);
437       goto fail;
438     }
439   else
440     {
441       /* 8 kilobytes is a sensible starting size.  It ought to be
442          bigger than the kernel pipe buffer, and it's definitely
443          bigger than the majority of C source files.  */
444       size = 8 * 1024;
445
446       buf = (U_CHAR *) xmalloc (size);
447       offset = 0;
448       while ((count = read (inc->fd, buf + offset, size - offset)) > 0)
449         {
450           offset += count;
451           if (offset == size)
452             buf = xrealloc (buf, (size *= 2));
453         }
454       if (count < 0)
455         goto perror_fail;
456
457       if (offset < size)
458         buf = xrealloc (buf, offset);
459       inc->st.st_size = offset;
460     }
461
462   inc->buffer = buf;
463   return 0;
464
465  perror_fail:
466   cpp_error_from_errno (pfile, inc->name);
467  fail:
468   return 1;
469 }
470
471 static void
472 purge_cache (inc)
473      struct include_file *inc;
474 {
475   if (inc->buffer)
476     {
477 #if MMAP_THRESHOLD
478       if (inc->mapped)
479         munmap ((PTR) inc->buffer, inc->st.st_size);
480       else
481 #endif
482         free ((PTR) inc->buffer);
483       inc->buffer = NULL;
484     }
485 }
486
487 /* Return 1 if the file named by FNAME has been included before in
488    any context, 0 otherwise.  */
489 int
490 cpp_included (pfile, fname)
491      cpp_reader *pfile;
492      const char *fname;
493 {
494   struct search_path *path;
495   char *name, *n;
496   splay_tree_node nd;
497
498   if (IS_ABSOLUTE_PATHNAME (fname))
499     {
500       /* Just look it up.  */
501       nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) fname);
502       return (nd && nd->value);
503     }
504       
505   /* Search directory path for the file.  */
506   name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
507   for (path = CPP_OPTION (pfile, quote_include); path; path = path->next)
508     {
509       memcpy (name, path->name, path->len);
510       name[path->len] = '/';
511       strcpy (&name[path->len + 1], fname);
512       if (CPP_OPTION (pfile, remap))
513         n = remap_filename (pfile, name, path);
514       else
515         n = name;
516
517       nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) n);
518       if (nd && nd->value)
519         return 1;
520     }
521   return 0;
522 }
523
524 /* Search for HEADER.  Return 0 if there is no such file (or it's
525    un-openable), in which case an error code will be in errno.  If
526    there is no include path to use it returns NO_INCLUDE_PATH,
527    otherwise an include_file structure.  If this request originates
528    from a #include_next directive, set INCLUDE_NEXT to true.  */
529
530 static struct include_file *
531 find_include_file (pfile, header, type)
532      cpp_reader *pfile;
533      const cpp_token *header;
534      enum include_type type;
535 {
536   const char *fname = (const char *) header->val.str.text;
537   struct search_path *path;
538   struct include_file *file;
539   char *name, *n;
540
541   if (IS_ABSOLUTE_PATHNAME (fname))
542     return open_file (pfile, fname);
543
544   /* For #include_next, skip in the search path past the dir in which
545      the current file was found, but if it was found via an absolute
546      path use the normal search logic.  */
547   if (type == IT_INCLUDE_NEXT && pfile->buffer->inc->foundhere)
548     path = pfile->buffer->inc->foundhere->next;
549   else if (header->type == CPP_HEADER_NAME)
550     path = CPP_OPTION (pfile, bracket_include);
551   else
552     path = search_from (pfile, type);
553
554   if (path == NULL)
555     {
556       cpp_error (pfile, "No include path in which to find %s", fname);
557       return NO_INCLUDE_PATH;
558     }
559
560   /* Search directory path for the file.  */
561   name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
562   for (; path; path = path->next)
563     {
564       memcpy (name, path->name, path->len);
565       name[path->len] = '/';
566       strcpy (&name[path->len + 1], fname);
567       if (CPP_OPTION (pfile, remap))
568         n = remap_filename (pfile, name, path);
569       else
570         n = name;
571
572       file = open_file (pfile, n);
573       if (file)
574         {
575           file->foundhere = path;
576           return file;
577         }
578     }
579
580   return 0;
581 }
582
583 /* Not everyone who wants to set system-header-ness on a buffer can
584    see the details of a buffer.  This is an exported interface because
585    fix-header needs it.  */
586 void
587 cpp_make_system_header (pfile, syshdr, externc)
588      cpp_reader *pfile;
589      int syshdr, externc;
590 {
591   int flags = 0;
592
593   /* 1 = system header, 2 = system header to be treated as C.  */
594   if (syshdr)
595     flags = 1 + (externc != 0);
596   pfile->buffer->sysp = flags;
597   _cpp_do_file_change (pfile, FC_RENAME, pfile->buffer->nominal_fname,
598                        pfile->buffer->lineno);
599 }
600
601 /* Report on all files that might benefit from a multiple include guard.
602    Triggered by -H.  */
603 void
604 _cpp_report_missing_guards (pfile)
605      cpp_reader *pfile;
606 {
607   int banner = 0;
608   splay_tree_foreach (pfile->all_include_files, report_missing_guard,
609                       (PTR) &banner);
610 }
611
612 static int
613 report_missing_guard (n, b)
614      splay_tree_node n;
615      void *b;
616 {
617   struct include_file *f = (struct include_file *) n->value;
618   int *bannerp = (int *)b;
619
620   if (f && f->cmacro == 0 && f->include_count == 1)
621     {
622       if (*bannerp == 0)
623         {
624           fputs (_("Multiple include guards may be useful for:\n"), stderr);
625           *bannerp = 1;
626         }
627       fputs (f->name, stderr);
628       putc ('\n', stderr);
629     }
630   return 0;
631 }
632
633 /* Create a dependency, or issue an error message as appropriate.   */
634 static void
635 handle_missing_header (pfile, fname, angle_brackets)
636      cpp_reader *pfile;
637      const char *fname;
638      int angle_brackets;
639 {
640   /* We will try making the RHS pfile->buffer->sysp after 3.0.  */
641   int print_dep = CPP_PRINT_DEPS(pfile) > (angle_brackets
642                                            || pfile->system_include_depth);
643
644   if (CPP_OPTION (pfile, print_deps_missing_files) && print_dep)
645     {
646       if (!angle_brackets || IS_ABSOLUTE_PATHNAME (fname))
647         deps_add_dep (pfile->deps, fname);
648       else
649         {
650           /* If requested as a system header, assume it belongs in
651              the first system header directory.  */
652           struct search_path *ptr = CPP_OPTION (pfile, bracket_include);
653           char *p;
654           int len = 0, fname_len = strlen (fname);
655
656           if (ptr)
657             len = ptr->len;
658
659           p = (char *) alloca (len + fname_len + 2);
660           if (len)
661             {
662               memcpy (p, ptr->name, len);
663               p[len++] = '/';
664             }
665           memcpy (p + len, fname, fname_len + 1);
666           deps_add_dep (pfile->deps, p);
667         }
668     }
669   /* If -M was specified, then don't count this as an error, because
670      we can still produce correct output.  Otherwise, we can't produce
671      correct output, because there may be dependencies we need inside
672      the missing file, and we don't know what directory this missing
673      file exists in.  FIXME: Use a future cpp_diagnotic_with_errno ()
674      for both of these cases.  */
675   else if (CPP_PRINT_DEPS (pfile) && ! print_dep)
676     cpp_warning (pfile, "%s: %s", fname, xstrerror (errno));
677   else
678     cpp_error_from_errno (pfile, fname);
679 }
680
681 /* Returns non-zero if a buffer was stacked.  */
682 int
683 _cpp_execute_include (pfile, header, type)
684      cpp_reader *pfile;
685      const cpp_token *header;
686      enum include_type type;
687 {
688   struct include_file *inc = find_include_file (pfile, header, type);
689
690   if (inc == 0)
691     handle_missing_header (pfile, (const char *) header->val.str.text,
692                            header->type == CPP_HEADER_NAME);
693   else if (inc != NO_INCLUDE_PATH)
694     {
695       if (header->type == CPP_HEADER_NAME)
696         pfile->system_include_depth++;
697
698       stack_include_file (pfile, inc);
699
700       if (type == IT_IMPORT)
701         _cpp_never_reread (inc);
702
703       return 1;
704     }
705
706   return 0;
707 }
708
709 /* Locate HEADER, and determine whether it is newer than the current
710    file.  If it cannot be located or dated, return -1, if it is newer
711    newer, return 1, otherwise 0.  */
712 int
713 _cpp_compare_file_date (pfile, header)
714      cpp_reader *pfile;
715      const cpp_token *header;
716 {
717   struct include_file *inc = find_include_file (pfile, header, 0);
718   
719   if (inc == NULL || inc == NO_INCLUDE_PATH)
720     return -1;
721
722   if (inc->fd > 0)
723     {
724       close (inc->fd);
725       inc->fd = -1;
726     }
727     
728   return inc->st.st_mtime > pfile->buffer->inc->st.st_mtime;
729 }
730
731
732 /* Push an input buffer and load it up with the contents of FNAME.
733    If FNAME is "", read standard input.  */
734 int
735 _cpp_read_file (pfile, fname)
736      cpp_reader *pfile;
737      const char *fname;
738 {
739   struct include_file *f = open_file (pfile, fname);
740
741   if (f == NULL)
742     {
743       cpp_error_from_errno (pfile, fname);
744       return 0;
745     }
746
747   stack_include_file (pfile, f);
748   return 1;
749 }
750
751 /* Do appropriate cleanup when a file buffer is popped off the input
752    stack.  */
753 void
754 _cpp_pop_file_buffer (pfile, buf)
755      cpp_reader *pfile;
756      cpp_buffer *buf;
757 {
758   struct include_file *inc = buf->inc;
759
760   if (pfile->system_include_depth)
761     pfile->system_include_depth--;
762   if (pfile->include_depth)
763     pfile->include_depth--;
764
765   /* Record the inclusion-preventing macro, which could be NULL
766      meaning no controlling macro, if we haven't got it already.  */
767   if (pfile->mi_state == MI_OUTSIDE && inc->cmacro == NULL)
768     inc->cmacro = pfile->mi_cmacro;
769
770   /* Invalidate control macros in the #including file.  */
771   pfile->mi_state = MI_FAILED;
772
773   inc->refcnt--;
774   if (inc->refcnt == 0 && DO_NOT_REREAD (inc))
775     purge_cache (inc);
776 }
777
778 /* Returns the first place in the include chain to start searching for
779    "" includes.  This involves stripping away the basename of the
780    current file, unless -I- was specified.
781
782    If we're handling -include or -imacros, use the "" chain, but with
783    the preprocessor's cwd prepended.  */
784 static struct search_path *
785 search_from (pfile, type)
786      cpp_reader *pfile;
787      enum include_type type;
788 {
789   cpp_buffer *buffer = pfile->buffer;
790   unsigned int dlen;
791
792   /* Command line uses the cwd, and does not cache the result.  */
793   if (type == IT_CMDLINE)
794     goto use_cwd;
795
796   /* Ignore the current file's directory if -I- was given.  */
797   if (CPP_OPTION (pfile, ignore_srcdir))
798     return CPP_OPTION (pfile, quote_include);
799
800   if (! buffer->search_cached)
801     {
802       buffer->search_cached = 1;
803
804       dlen = lbasename (buffer->inc->name) - buffer->inc->name;
805
806       if (dlen)
807         {
808           /* We don't guarantee NAME is null-terminated.  This saves
809              allocating and freeing memory, and duplicating it when faking
810              buffers in cpp_push_buffer.  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 = buffer->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   register 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 }