OSDN Git Service

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