xref: /freebsd-12.1/contrib/gcclibs/libcpp/files.c (revision dda5b397)
1 /* Part of CPP library.  File handling.
2    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4    Free Software Foundation, Inc.
5    Written by Per Bothner, 1994.
6    Based on CCCP program by Paul Rubin, June 1986
7    Adapted to ANSI C, Richard Stallman, Jan 1987
8    Split out of cpplib.c, Zack Weinberg, Oct 1998
9    Reimplemented, Neil Booth, Jul 2003
10 
11 This program is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2, or (at your option) any
14 later version.
15 
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 GNU General Public License for more details.
20 
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
24 
25 #include "config.h"
26 #include "system.h"
27 #include "cpplib.h"
28 #include "internal.h"
29 #include "mkdeps.h"
30 #include "obstack.h"
31 #include "hashtab.h"
32 #include "md5.h"
33 #include <dirent.h>
34 
35 /* Variable length record files on VMS will have a stat size that includes
36    record control characters that won't be included in the read size.  */
37 #ifdef VMS
38 # define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
39 # define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
40 #else
41 # define STAT_SIZE_RELIABLE(ST) true
42 #endif
43 
44 #ifdef __DJGPP__
45 #include <io.h>
46   /* For DJGPP redirected input is opened in text mode.  */
47 #  define set_stdin_to_binary_mode() \
48      if (! isatty (0)) setmode (0, O_BINARY)
49 #else
50 #  define set_stdin_to_binary_mode() /* Nothing */
51 #endif
52 
53 /* This structure represents a file searched for by CPP, whether it
54    exists or not.  An instance may be pointed to by more than one
55    file_hash_entry; at present no reference count is kept.  */
56 struct _cpp_file
57 {
58   /* Filename as given to #include or command line switch.  */
59   const char *name;
60 
61   /* The full path used to find the file.  */
62   const char *path;
63 
64   /* The full path of the pch file.  */
65   const char *pchname;
66 
67   /* The file's path with the basename stripped.  NULL if it hasn't
68      been calculated yet.  */
69   const char *dir_name;
70 
71   /* Chain through all files.  */
72   struct _cpp_file *next_file;
73 
74   /* The contents of NAME after calling read_file().  */
75   const uchar *buffer;
76 
77   /* The macro, if any, preventing re-inclusion.  */
78   const cpp_hashnode *cmacro;
79 
80   /* The directory in the search path where FILE was found.  Used for
81      #include_next and determining whether a header is a system
82      header.  */
83   cpp_dir *dir;
84 
85   /* As filled in by stat(2) for the file.  */
86   struct stat st;
87 
88   /* File descriptor.  Invalid if -1, otherwise open.  */
89   int fd;
90 
91   /* Zero if this file was successfully opened and stat()-ed,
92      otherwise errno obtained from failure.  */
93   int err_no;
94 
95   /* Number of times the file has been stacked for preprocessing.  */
96   unsigned short stack_count;
97 
98   /* If opened with #import or contains #pragma once.  */
99   bool once_only;
100 
101   /* If read() failed before.  */
102   bool dont_read;
103 
104   /* If this file is the main file.  */
105   bool main_file;
106 
107   /* If BUFFER above contains the true contents of the file.  */
108   bool buffer_valid;
109 
110   /* File is a PCH (on return from find_include_file).  */
111   bool pch;
112 };
113 
114 /* A singly-linked list for all searches for a given file name, with
115    its head pointed to by a slot in FILE_HASH.  The file name is what
116    appeared between the quotes in a #include directive; it can be
117    determined implicitly from the hash table location or explicitly
118    from FILE->name.
119 
120    FILE is a structure containing details about the file that was
121    found with that search, or details of how the search failed.
122 
123    START_DIR is the starting location of the search in the include
124    chain.  The current directories for "" includes are also hashed in
125    the hash table and therefore unique.  Files that are looked up
126    without using a search path, such as absolute filenames and file
127    names from the command line share a special starting directory so
128    they don't cause cache hits with normal include-chain lookups.
129 
130    If START_DIR is NULL then the entry is for a directory, not a file,
131    and the directory is in DIR.  Since the starting point in a file
132    lookup chain is never NULL, this means that simple pointer
133    comparisons against START_DIR can be made to determine cache hits
134    in file lookups.
135 
136    If a cache lookup fails because of e.g. an extra "./" in the path,
137    then nothing will break.  It is just less efficient as CPP will
138    have to do more work re-preprocessing the file, and/or comparing
139    its contents against earlier once-only files.
140 */
141 struct file_hash_entry
142 {
143   struct file_hash_entry *next;
144   cpp_dir *start_dir;
145   union
146   {
147     _cpp_file *file;
148     cpp_dir *dir;
149   } u;
150 };
151 
152 static bool open_file (_cpp_file *file);
153 static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
154 			   bool *invalid_pch);
155 static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
156 			      bool *invalid_pch);
157 static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
158 static bool read_file (cpp_reader *pfile, _cpp_file *file);
159 static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
160 static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
161 				 int angle_brackets, enum include_type);
162 static const char *dir_name_of_file (_cpp_file *file);
163 static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int);
164 static struct file_hash_entry *search_cache (struct file_hash_entry *head,
165 					     const cpp_dir *start_dir);
166 static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
167 static void destroy_cpp_file (_cpp_file *);
168 static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
169 static void allocate_file_hash_entries (cpp_reader *pfile);
170 static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
171 static int report_missing_guard (void **slot, void *b);
172 static hashval_t file_hash_hash (const void *p);
173 static int file_hash_eq (const void *p, const void *q);
174 static char *read_filename_string (int ch, FILE *f);
175 static void read_name_map (cpp_dir *dir);
176 static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
177 static char *append_file_to_dir (const char *fname, cpp_dir *dir);
178 static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
179 static int pchf_save_compare (const void *e1, const void *e2);
180 static int pchf_compare (const void *d_p, const void *e_p);
181 static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
182 
183 /* Given a filename in FILE->PATH, with the empty string interpreted
184    as <stdin>, open it.
185 
186    On success FILE contains an open file descriptor and stat
187    information for the file.  On failure the file descriptor is -1 and
188    the appropriate errno is also stored in FILE.  Returns TRUE iff
189    successful.
190 
191    We used to open files in nonblocking mode, but that caused more
192    problems than it solved.  Do take care not to acquire a controlling
193    terminal by mistake (this can't happen on sane systems, but
194    paranoia is a virtue).
195 
196    Use the three-argument form of open even though we aren't
197    specifying O_CREAT, to defend against broken system headers.
198 
199    O_BINARY tells some runtime libraries (notably DJGPP) not to do
200    newline translation; we can handle DOS line breaks just fine
201    ourselves.  */
202 static bool
203 open_file (_cpp_file *file)
204 {
205   if (file->path[0] == '\0')
206     {
207       file->fd = 0;
208       set_stdin_to_binary_mode ();
209     }
210   else
211     file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
212 
213   if (file->fd != -1)
214     {
215       if (fstat (file->fd, &file->st) == 0)
216 	{
217 	  if (!S_ISDIR (file->st.st_mode))
218 	    {
219 	      file->err_no = 0;
220 	      return true;
221 	    }
222 
223 	  /* Ignore a directory and continue the search.  The file we're
224 	     looking for may be elsewhere in the search path.  */
225 	  errno = ENOENT;
226 	}
227 
228       close (file->fd);
229       file->fd = -1;
230     }
231   else if (errno == ENOTDIR)
232     errno = ENOENT;
233 
234   file->err_no = errno;
235 
236   return false;
237 }
238 
239 /* Temporary PCH intercept of opening a file.  Try to find a PCH file
240    based on FILE->name and FILE->dir, and test those found for
241    validity using PFILE->cb.valid_pch.  Return true iff a valid file is
242    found.  Set *INVALID_PCH if a PCH file is found but wasn't valid.  */
243 
244 static bool
245 pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
246 {
247   static const char extension[] = ".gch";
248   const char *path = file->path;
249   size_t len, flen;
250   char *pchname;
251   struct stat st;
252   bool valid = false;
253 
254   /* No PCH on <stdin> or if not requested.  */
255   if (file->name[0] == '\0' || !pfile->cb.valid_pch)
256     return false;
257 
258   flen = strlen (path);
259   len = flen + sizeof (extension);
260   pchname = XNEWVEC (char, len);
261   memcpy (pchname, path, flen);
262   memcpy (pchname + flen, extension, sizeof (extension));
263 
264   if (stat (pchname, &st) == 0)
265     {
266       DIR *pchdir;
267       struct dirent *d;
268       size_t dlen, plen = len;
269 
270       if (!S_ISDIR (st.st_mode))
271 	valid = validate_pch (pfile, file, pchname);
272       else if ((pchdir = opendir (pchname)) != NULL)
273 	{
274 	  pchname[plen - 1] = '/';
275 	  while ((d = readdir (pchdir)) != NULL)
276 	    {
277 	      dlen = strlen (d->d_name) + 1;
278 	      if ((strcmp (d->d_name, ".") == 0)
279 		  || (strcmp (d->d_name, "..") == 0))
280 		continue;
281 	      if (dlen + plen > len)
282 		{
283 		  len += dlen + 64;
284 		  pchname = XRESIZEVEC (char, pchname, len);
285 		}
286 	      memcpy (pchname + plen, d->d_name, dlen);
287 	      valid = validate_pch (pfile, file, pchname);
288 	      if (valid)
289 		break;
290 	    }
291 	  closedir (pchdir);
292 	}
293       if (valid)
294 	file->pch = true;
295       else
296 	*invalid_pch = true;
297     }
298 
299   if (valid)
300     file->pchname = pchname;
301   else
302     free (pchname);
303 
304   return valid;
305 }
306 
307 /* Try to open the path FILE->name appended to FILE->dir.  This is
308    where remap and PCH intercept the file lookup process.  Return true
309    if the file was found, whether or not the open was successful.
310    Set *INVALID_PCH to true if a PCH file is found but wasn't valid.  */
311 
312 static bool
313 find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
314 {
315   char *path;
316 
317   if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
318     ;
319   else
320     if (file->dir->construct)
321       path = file->dir->construct (file->name, file->dir);
322     else
323       path = append_file_to_dir (file->name, file->dir);
324 
325   if (path)
326     {
327       hashval_t hv = htab_hash_string (path);
328       char *copy;
329       void **pp;
330 
331       if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL)
332 	{
333 	  file->err_no = ENOENT;
334 	  return false;
335 	}
336 
337       file->path = path;
338       if (pch_open_file (pfile, file, invalid_pch))
339 	return true;
340 
341       if (open_file (file))
342 	return true;
343 
344       if (file->err_no != ENOENT)
345 	{
346 	  open_file_failed (pfile, file, 0);
347 	  return true;
348 	}
349 
350       /* We copy the path name onto an obstack partly so that we don't
351 	 leak the memory, but mostly so that we don't fragment the
352 	 heap.  */
353       copy = obstack_copy0 (&pfile->nonexistent_file_ob, path,
354 			    strlen (path));
355       free (path);
356       pp = htab_find_slot_with_hash (pfile->nonexistent_file_hash,
357 				     copy, hv, INSERT);
358       *pp = copy;
359 
360       file->path = file->name;
361     }
362   else
363     {
364       file->err_no = ENOENT;
365       file->path = NULL;
366     }
367 
368   return false;
369 }
370 
371 /* Return tue iff the missing_header callback found the given HEADER.  */
372 static bool
373 search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
374 {
375   missing_header_cb func = pfile->cb.missing_header;
376 
377   /* When the regular search path doesn't work, try context dependent
378      headers search paths.  */
379   if (func
380       && file->dir == NULL)
381     {
382       if ((file->path = func (pfile, header, &file->dir)) != NULL)
383 	{
384 	  if (open_file (file))
385 	    return true;
386 	  free ((void *)file->path);
387 	}
388       file->path = file->name;
389     }
390 
391   return false;
392 }
393 
394 bool
395 _cpp_find_failed (_cpp_file *file)
396 {
397   return file->err_no != 0;
398 }
399 
400 /* Given a filename FNAME search for such a file in the include path
401    starting from START_DIR.  If FNAME is the empty string it is
402    interpreted as STDIN if START_DIR is PFILE->no_search_path.
403 
404    If the file is not found in the file cache fall back to the O/S and
405    add the result to our cache.
406 
407    If the file was not found in the filesystem, or there was an error
408    opening it, then ERR_NO is nonzero and FD is -1.  If the file was
409    found, then ERR_NO is zero and FD could be -1 or an open file
410    descriptor.  FD can be -1 if the file was found in the cache and
411    had previously been closed.  To open it again pass the return value
412    to open_file().
413 */
414 _cpp_file *
415 _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake, int angle_brackets)
416 {
417   struct file_hash_entry *entry, **hash_slot;
418   _cpp_file *file;
419   bool invalid_pch = false;
420   bool saw_bracket_include = false;
421   bool saw_quote_include = false;
422   struct cpp_dir *found_in_cache = NULL;
423 
424   /* Ensure we get no confusion between cached files and directories.  */
425   if (start_dir == NULL)
426     cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
427 
428   hash_slot = (struct file_hash_entry **)
429     htab_find_slot_with_hash (pfile->file_hash, fname,
430 			      htab_hash_string (fname),
431 			      INSERT);
432 
433   /* First check the cache before we resort to memory allocation.  */
434   entry = search_cache (*hash_slot, start_dir);
435   if (entry)
436     return entry->u.file;
437 
438   file = make_cpp_file (pfile, start_dir, fname);
439 
440   /* Try each path in the include chain.  */
441   for (; !fake ;)
442     {
443       if (find_file_in_dir (pfile, file, &invalid_pch))
444 	break;
445 
446       file->dir = file->dir->next;
447       if (file->dir == NULL)
448 	{
449 	  if (search_path_exhausted (pfile, fname, file))
450 	    {
451 	      /* Although this file must not go in the cache, because
452 		 the file found might depend on things (like the current file)
453 		 that aren't represented in the cache, it still has to go in
454 		 the list of all files so that #import works.  */
455 	      file->next_file = pfile->all_files;
456 	      pfile->all_files = file;
457 	      return file;
458 	    }
459 
460 	  open_file_failed (pfile, file, angle_brackets);
461 	  if (invalid_pch)
462 	    {
463 	      cpp_error (pfile, CPP_DL_ERROR,
464 	       "one or more PCH files were found, but they were invalid");
465 	      if (!cpp_get_options (pfile)->warn_invalid_pch)
466 		cpp_error (pfile, CPP_DL_ERROR,
467 			   "use -Winvalid-pch for more information");
468 	    }
469 	  break;
470 	}
471 
472       /* Only check the cache for the starting location (done above)
473 	 and the quote and bracket chain heads because there are no
474 	 other possible starting points for searches.  */
475       if (file->dir == pfile->bracket_include)
476 	saw_bracket_include = true;
477       else if (file->dir == pfile->quote_include)
478 	saw_quote_include = true;
479       else
480 	continue;
481 
482       entry = search_cache (*hash_slot, file->dir);
483       if (entry)
484 	{
485 	  found_in_cache = file->dir;
486 	  break;
487 	}
488     }
489 
490   if (entry)
491     {
492       /* Cache for START_DIR too, sharing the _cpp_file structure.  */
493       free ((char *) file->name);
494       free (file);
495       file = entry->u.file;
496     }
497   else
498     {
499       /* This is a new file; put it in the list.  */
500       file->next_file = pfile->all_files;
501       pfile->all_files = file;
502     }
503 
504   /* Store this new result in the hash table.  */
505   entry = new_file_hash_entry (pfile);
506   entry->next = *hash_slot;
507   entry->start_dir = start_dir;
508   entry->u.file = file;
509   *hash_slot = entry;
510 
511   /* If we passed the quote or bracket chain heads, cache them also.
512      This speeds up processing if there are lots of -I options.  */
513   if (saw_bracket_include
514       && pfile->bracket_include != start_dir
515       && found_in_cache != pfile->bracket_include)
516     {
517       entry = new_file_hash_entry (pfile);
518       entry->next = *hash_slot;
519       entry->start_dir = pfile->bracket_include;
520       entry->u.file = file;
521       *hash_slot = entry;
522     }
523   if (saw_quote_include
524       && pfile->quote_include != start_dir
525       && found_in_cache != pfile->quote_include)
526     {
527       entry = new_file_hash_entry (pfile);
528       entry->next = *hash_slot;
529       entry->start_dir = pfile->quote_include;
530       entry->u.file = file;
531       *hash_slot = entry;
532     }
533 
534   return file;
535 }
536 
537 /* Read a file into FILE->buffer, returning true on success.
538 
539    If FILE->fd is something weird, like a block device, we don't want
540    to read it at all.  Don't even try to figure out what something is,
541    except for plain files and block devices, since there is no
542    reliable portable way of doing this.
543 
544    FIXME: Flush file cache and try again if we run out of memory.  */
545 static bool
546 read_file_guts (cpp_reader *pfile, _cpp_file *file)
547 {
548   ssize_t size, total, count;
549   uchar *buf;
550   bool regular;
551 
552   if (S_ISBLK (file->st.st_mode))
553     {
554       cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
555       return false;
556     }
557 
558   regular = S_ISREG (file->st.st_mode);
559   if (regular)
560     {
561       /* off_t might have a wider range than ssize_t - in other words,
562 	 the max size of a file might be bigger than the address
563 	 space.  We can't handle a file that large.  (Anyone with
564 	 a single source file bigger than 2GB needs to rethink
565 	 their coding style.)  Some systems (e.g. AIX 4.1) define
566 	 SSIZE_MAX to be much smaller than the actual range of the
567 	 type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
568 	 does not bite us.  */
569       if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
570 	{
571 	  cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
572 	  return false;
573 	}
574 
575       size = file->st.st_size;
576     }
577   else
578     /* 8 kilobytes is a sensible starting size.  It ought to be bigger
579        than the kernel pipe buffer, and it's definitely bigger than
580        the majority of C source files.  */
581     size = 8 * 1024;
582 
583   buf = XNEWVEC (uchar, size + 1);
584   total = 0;
585   while ((count = read (file->fd, buf + total, size - total)) > 0)
586     {
587       total += count;
588 
589       if (total == size)
590 	{
591 	  if (regular)
592 	    break;
593 	  size *= 2;
594 	  buf = XRESIZEVEC (uchar, buf, size + 1);
595 	}
596     }
597 
598   if (count < 0)
599     {
600       cpp_errno (pfile, CPP_DL_ERROR, file->path);
601       return false;
602     }
603 
604   if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
605     cpp_error (pfile, CPP_DL_WARNING,
606 	       "%s is shorter than expected", file->path);
607 
608   file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
609 				     buf, size, total, &file->st.st_size);
610   file->buffer_valid = true;
611 
612   return true;
613 }
614 
615 /* Convenience wrapper around read_file_guts that opens the file if
616    necessary and closes the file descriptor after reading.  FILE must
617    have been passed through find_file() at some stage.  */
618 static bool
619 read_file (cpp_reader *pfile, _cpp_file *file)
620 {
621   /* If we already have its contents in memory, succeed immediately.  */
622   if (file->buffer_valid)
623     return true;
624 
625   /* If an earlier read failed for some reason don't try again.  */
626   if (file->dont_read || file->err_no)
627     return false;
628 
629   if (file->fd == -1 && !open_file (file))
630     {
631       open_file_failed (pfile, file, 0);
632       return false;
633     }
634 
635   file->dont_read = !read_file_guts (pfile, file);
636   close (file->fd);
637   file->fd = -1;
638 
639   return !file->dont_read;
640 }
641 
642 /* Returns TRUE if FILE's contents have been successfully placed in
643    FILE->buffer and the file should be stacked, otherwise false.  */
644 static bool
645 should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
646 {
647   _cpp_file *f;
648 
649   /* Skip once-only files.  */
650   if (file->once_only)
651     return false;
652 
653   /* We must mark the file once-only if #import now, before header
654      guard checks.  Otherwise, undefining the header guard might
655      cause the file to be re-stacked.  */
656   if (import)
657     {
658       _cpp_mark_file_once_only (pfile, file);
659 
660       /* Don't stack files that have been stacked before.  */
661       if (file->stack_count)
662 	return false;
663     }
664 
665   /* Skip if the file had a header guard and the macro is defined.
666      PCH relies on this appearing before the PCH handler below.  */
667   if (file->cmacro && file->cmacro->type == NT_MACRO)
668     return false;
669 
670   /* Handle PCH files immediately; don't stack them.  */
671   if (file->pch)
672     {
673       pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
674       close (file->fd);
675       file->fd = -1;
676       return false;
677     }
678 
679   if (!read_file (pfile, file))
680     return false;
681 
682   /* Check the file against the PCH file.  This is done before
683      checking against files we've already seen, since it may save on
684      I/O.  */
685   if (check_file_against_entries (pfile, file, import))
686     {
687       /* If this isn't a #import, but yet we can't include the file,
688 	 that means that it was #import-ed in the PCH file,
689 	 so we can never include it again.  */
690       if (! import)
691 	_cpp_mark_file_once_only (pfile, file);
692       return false;
693     }
694 
695   /* Now we've read the file's contents, we can stack it if there
696      are no once-only files.  */
697   if (!pfile->seen_once_only)
698     return true;
699 
700   /* We may have read the file under a different name.  Look
701      for likely candidates and compare file contents to be sure.  */
702   for (f = pfile->all_files; f; f = f->next_file)
703     {
704       if (f == file)
705 	continue;
706 
707       if ((import || f->once_only)
708 	  && f->err_no == 0
709 	  && f->st.st_mtime == file->st.st_mtime
710 	  && f->st.st_size == file->st.st_size)
711 	{
712 	  _cpp_file *ref_file;
713 	  bool same_file_p = false;
714 
715 	  if (f->buffer && !f->buffer_valid)
716 	    {
717 	      /* We already have a buffer but it is not valid, because
718 		 the file is still stacked.  Make a new one.  */
719 	      ref_file = make_cpp_file (pfile, f->dir, f->name);
720 	      ref_file->path = f->path;
721 	    }
722 	  else
723 	    /* The file is not stacked anymore.  We can reuse it.  */
724 	    ref_file = f;
725 
726 	  same_file_p = read_file (pfile, ref_file)
727 			/* Size might have changed in read_file().  */
728 			&& ref_file->st.st_size == file->st.st_size
729 			&& !memcmp (ref_file->buffer,
730 				    file->buffer,
731 				    file->st.st_size);
732 
733 	  if (f->buffer && !f->buffer_valid)
734 	    {
735 	      ref_file->path = 0;
736 	      destroy_cpp_file (ref_file);
737 	    }
738 
739 	  if (same_file_p)
740 	    break;
741 	}
742     }
743 
744   return f == NULL;
745 }
746 
747 /* Place the file referenced by FILE into a new buffer on the buffer
748    stack if possible.  IMPORT is true if this stacking attempt is
749    because of a #import directive.  Returns true if a buffer is
750    stacked.  */
751 bool
752 _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
753 {
754   cpp_buffer *buffer;
755   int sysp;
756 
757   if (!should_stack_file (pfile, file, import))
758       return false;
759 
760   if (pfile->buffer == NULL || file->dir == NULL)
761     sysp = 0;
762   else
763     sysp = MAX (pfile->buffer->sysp,  file->dir->sysp);
764 
765   /* Add the file to the dependencies on its first inclusion.  */
766   if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
767     {
768       if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file))
769 	deps_add_dep (pfile->deps, file->path);
770     }
771 
772   /* Clear buffer_valid since _cpp_clean_line messes it up.  */
773   file->buffer_valid = false;
774   file->stack_count++;
775 
776   /* Stack the buffer.  */
777   buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
778 			    CPP_OPTION (pfile, preprocessed)
779 			    && !CPP_OPTION (pfile, directives_only));
780   buffer->file = file;
781   buffer->sysp = sysp;
782 
783   /* Initialize controlling macro state.  */
784   pfile->mi_valid = true;
785   pfile->mi_cmacro = 0;
786 
787   /* Generate the call back.  */
788   _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
789 
790   return true;
791 }
792 
793 /* Mark FILE to be included once only.  */
794 void
795 _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
796 {
797   pfile->seen_once_only = true;
798   file->once_only = true;
799 }
800 
801 /* Return the directory from which searching for FNAME should start,
802    considering the directive TYPE and ANGLE_BRACKETS.  If there is
803    nothing left in the path, returns NULL.  */
804 static struct cpp_dir *
805 search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
806 		  enum include_type type)
807 {
808   cpp_dir *dir;
809   _cpp_file *file;
810 
811   if (IS_ABSOLUTE_PATH (fname))
812     return &pfile->no_search_path;
813 
814   /* pfile->buffer is NULL when processing an -include command-line flag.  */
815   file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
816 
817   /* For #include_next, skip in the search path past the dir in which
818      the current file was found, but if it was found via an absolute
819      path use the normal search logic.  */
820   if (type == IT_INCLUDE_NEXT && file->dir)
821     dir = file->dir->next;
822   else if (angle_brackets)
823     dir = pfile->bracket_include;
824   else if (type == IT_CMDLINE)
825     /* -include and -imacros use the #include "" chain with the
826        preprocessor's cwd prepended.  */
827     return make_cpp_dir (pfile, "./", false);
828   else if (pfile->quote_ignores_source_dir)
829     dir = pfile->quote_include;
830   else
831     return make_cpp_dir (pfile, dir_name_of_file (file),
832 			 pfile->buffer ? pfile->buffer->sysp : 0);
833 
834   if (dir == NULL)
835     cpp_error (pfile, CPP_DL_ERROR,
836 	       "no include path in which to search for %s", fname);
837 
838   return dir;
839 }
840 
841 /* Strip the basename from the file's path.  It ends with a slash if
842    of nonzero length.  Note that this procedure also works for
843    <stdin>, which is represented by the empty string.  */
844 static const char *
845 dir_name_of_file (_cpp_file *file)
846 {
847   if (!file->dir_name)
848     {
849       size_t len = lbasename (file->path) - file->path;
850       char *dir_name = XNEWVEC (char, len + 1);
851 
852       memcpy (dir_name, file->path, len);
853       dir_name[len] = '\0';
854       file->dir_name = dir_name;
855     }
856 
857   return file->dir_name;
858 }
859 
860 /* Handles #include-family directives (distinguished by TYPE),
861    including HEADER, and the command line -imacros and -include.
862    Returns true if a buffer was stacked.  */
863 bool
864 _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
865 		    enum include_type type)
866 {
867   struct cpp_dir *dir;
868   _cpp_file *file;
869 
870   dir = search_path_head (pfile, fname, angle_brackets, type);
871   if (!dir)
872     return false;
873 
874   file = _cpp_find_file (pfile, fname, dir, false, angle_brackets);
875 
876   /* Compensate for the increment in linemap_add.  In the case of a
877      normal #include, we're currently at the start of the line
878      *following* the #include.  A separate source_location for this
879      location makes no sense (until we do the LC_LEAVE), and
880      complicates LAST_SOURCE_LINE_LOCATION.  This does not apply if we
881      found a PCH file (in which case linemap_add is not called) or we
882      were included from the command-line.  */
883   if (! file->pch && file->err_no == 0 && type != IT_CMDLINE)
884     pfile->line_table->highest_location--;
885 
886   return _cpp_stack_file (pfile, file, type == IT_IMPORT);
887 }
888 
889 /* Could not open FILE.  The complication is dependency output.  */
890 static void
891 open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
892 {
893   int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
894   bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
895 
896   errno = file->err_no;
897   if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
898     deps_add_dep (pfile->deps, file->name);
899   else
900     {
901       /* If we are outputting dependencies but not for this file then
902 	 don't error because we can still produce correct output.  */
903       if (CPP_OPTION (pfile, deps.style) && ! print_dep)
904 	cpp_errno (pfile, CPP_DL_WARNING, file->path);
905       else
906 	cpp_errno (pfile, CPP_DL_ERROR, file->path);
907     }
908 }
909 
910 /* Search in the chain beginning at HEAD for a file whose search path
911    started at START_DIR != NULL.  */
912 static struct file_hash_entry *
913 search_cache (struct file_hash_entry *head, const cpp_dir *start_dir)
914 {
915   while (head && head->start_dir != start_dir)
916     head = head->next;
917 
918   return head;
919 }
920 
921 /* Allocate a new _cpp_file structure.  */
922 static _cpp_file *
923 make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
924 {
925   _cpp_file *file;
926 
927   file = XCNEW (_cpp_file);
928   file->main_file = !pfile->buffer;
929   file->fd = -1;
930   file->dir = dir;
931   file->name = xstrdup (fname);
932 
933   return file;
934 }
935 
936 /* Release a _cpp_file structure.  */
937 static void
938 destroy_cpp_file (_cpp_file *file)
939 {
940   if (file->buffer)
941     free ((void *) file->buffer);
942   free ((void *) file->name);
943   free (file);
944 }
945 
946 /* A hash of directory names.  The directory names are the path names
947    of files which contain a #include "", the included file name is
948    appended to this directories.
949 
950    To avoid duplicate entries we follow the convention that all
951    non-empty directory names should end in a '/'.  DIR_NAME must be
952    stored in permanently allocated memory.  */
953 static cpp_dir *
954 make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
955 {
956   struct file_hash_entry *entry, **hash_slot;
957   cpp_dir *dir;
958 
959   hash_slot = (struct file_hash_entry **)
960     htab_find_slot_with_hash (pfile->dir_hash, dir_name,
961 			      htab_hash_string (dir_name),
962 			      INSERT);
963 
964   /* Have we already hashed this directory?  */
965   for (entry = *hash_slot; entry; entry = entry->next)
966     if (entry->start_dir == NULL)
967       return entry->u.dir;
968 
969   dir = XCNEW (cpp_dir);
970   dir->next = pfile->quote_include;
971   dir->name = (char *) dir_name;
972   dir->len = strlen (dir_name);
973   dir->sysp = sysp;
974   dir->construct = 0;
975 
976   /* Store this new result in the hash table.  */
977   entry = new_file_hash_entry (pfile);
978   entry->next = *hash_slot;
979   entry->start_dir = NULL;
980   entry->u.dir = dir;
981   *hash_slot = entry;
982 
983   return dir;
984 }
985 
986 /* Create a new block of memory for file hash entries.  */
987 static void
988 allocate_file_hash_entries (cpp_reader *pfile)
989 {
990   pfile->file_hash_entries_used = 0;
991   pfile->file_hash_entries_allocated = 127;
992   pfile->file_hash_entries = XNEWVEC (struct file_hash_entry,
993                                       pfile->file_hash_entries_allocated);
994 }
995 
996 /* Return a new file hash entry.  */
997 static struct file_hash_entry *
998 new_file_hash_entry (cpp_reader *pfile)
999 {
1000   if (pfile->file_hash_entries_used == pfile->file_hash_entries_allocated)
1001     allocate_file_hash_entries (pfile);
1002 
1003   return &pfile->file_hash_entries[pfile->file_hash_entries_used++];
1004 }
1005 
1006 /* Returns TRUE if a file FNAME has ever been successfully opened.
1007    This routine is not intended to correctly handle filenames aliased
1008    by links or redundant . or .. traversals etc.  */
1009 bool
1010 cpp_included (cpp_reader *pfile, const char *fname)
1011 {
1012   struct file_hash_entry *entry;
1013 
1014   entry = (struct file_hash_entry *)
1015      htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
1016 
1017   while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
1018     entry = entry->next;
1019 
1020   return entry != NULL;
1021 }
1022 
1023 /* Calculate the hash value of a file hash entry P.  */
1024 
1025 static hashval_t
1026 file_hash_hash (const void *p)
1027 {
1028   struct file_hash_entry *entry = (struct file_hash_entry *) p;
1029   const char *hname;
1030   if (entry->start_dir)
1031     hname = entry->u.file->name;
1032   else
1033     hname = entry->u.dir->name;
1034 
1035   return htab_hash_string (hname);
1036 }
1037 
1038 /* Compare a string Q against a file hash entry P.  */
1039 static int
1040 file_hash_eq (const void *p, const void *q)
1041 {
1042   struct file_hash_entry *entry = (struct file_hash_entry *) p;
1043   const char *fname = (const char *) q;
1044   const char *hname;
1045 
1046   if (entry->start_dir)
1047     hname = entry->u.file->name;
1048   else
1049     hname = entry->u.dir->name;
1050 
1051   return strcmp (hname, fname) == 0;
1052 }
1053 
1054 /* Compare entries in the nonexistent file hash table.  These are just
1055    strings.  */
1056 static int
1057 nonexistent_file_hash_eq (const void *p, const void *q)
1058 {
1059   return strcmp (p, q) == 0;
1060 }
1061 
1062 /* Initialize everything in this source file.  */
1063 void
1064 _cpp_init_files (cpp_reader *pfile)
1065 {
1066   pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1067 					NULL, xcalloc, free);
1068   pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1069 					NULL, xcalloc, free);
1070   allocate_file_hash_entries (pfile);
1071   pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string,
1072 						    nonexistent_file_hash_eq,
1073 						    NULL, xcalloc, free);
1074   _obstack_begin (&pfile->nonexistent_file_ob, 0, 0,
1075 		  (void *(*) (long)) xmalloc,
1076 		  (void (*) (void *)) free);
1077 }
1078 
1079 /* Finalize everything in this source file.  */
1080 void
1081 _cpp_cleanup_files (cpp_reader *pfile)
1082 {
1083   htab_delete (pfile->file_hash);
1084   htab_delete (pfile->dir_hash);
1085   htab_delete (pfile->nonexistent_file_hash);
1086   obstack_free (&pfile->nonexistent_file_ob, 0);
1087 }
1088 
1089 /* Enter a file name in the hash for the sake of cpp_included.  */
1090 void
1091 _cpp_fake_include (cpp_reader *pfile, const char *fname)
1092 {
1093   _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0);
1094 }
1095 
1096 /* Not everyone who wants to set system-header-ness on a buffer can
1097    see the details of a buffer.  This is an exported interface because
1098    fix-header needs it.  */
1099 void
1100 cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
1101 {
1102   int flags = 0;
1103   const struct line_maps *line_table = pfile->line_table;
1104   const struct line_map *map = &line_table->maps[line_table->used-1];
1105 
1106   /* 1 = system header, 2 = system header to be treated as C.  */
1107   if (syshdr)
1108     flags = 1 + (externc != 0);
1109   pfile->buffer->sysp = flags;
1110   _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
1111 		       SOURCE_LINE (map, pfile->line_table->highest_line), flags);
1112 }
1113 
1114 /* Allow the client to change the current file.  Used by the front end
1115    to achieve pseudo-file names like <built-in>.
1116    If REASON is LC_LEAVE, then NEW_NAME must be NULL.  */
1117 void
1118 cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1119 		 const char *new_name)
1120 {
1121   _cpp_do_file_change (pfile, reason, new_name, 1, 0);
1122 }
1123 
1124 /* Callback function for htab_traverse.  */
1125 static int
1126 report_missing_guard (void **slot, void *b)
1127 {
1128   struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
1129   int *bannerp = (int *) b;
1130 
1131   /* Skip directories.  */
1132   if (entry->start_dir != NULL)
1133     {
1134       _cpp_file *file = entry->u.file;
1135 
1136       /* We don't want MI guard advice for the main file.  */
1137       if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
1138 	{
1139 	  if (*bannerp == 0)
1140 	    {
1141 	      fputs (_("Multiple include guards may be useful for:\n"),
1142 		     stderr);
1143 	      *bannerp = 1;
1144 	    }
1145 
1146 	  fputs (entry->u.file->path, stderr);
1147 	  putc ('\n', stderr);
1148 	}
1149     }
1150 
1151   return 0;
1152 }
1153 
1154 /* Report on all files that might benefit from a multiple include guard.
1155    Triggered by -H.  */
1156 void
1157 _cpp_report_missing_guards (cpp_reader *pfile)
1158 {
1159   int banner = 0;
1160 
1161   htab_traverse (pfile->file_hash, report_missing_guard, &banner);
1162 }
1163 
1164 /* Locate HEADER, and determine whether it is newer than the current
1165    file.  If it cannot be located or dated, return -1, if it is
1166    newer, return 1, otherwise 0.  */
1167 int
1168 _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1169 			int angle_brackets)
1170 {
1171   _cpp_file *file;
1172   struct cpp_dir *dir;
1173 
1174   dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1175   if (!dir)
1176     return -1;
1177 
1178   file = _cpp_find_file (pfile, fname, dir, false, angle_brackets);
1179   if (file->err_no)
1180     return -1;
1181 
1182   if (file->fd != -1)
1183     {
1184       close (file->fd);
1185       file->fd = -1;
1186     }
1187 
1188   return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
1189 }
1190 
1191 /* Pushes the given file onto the buffer stack.  Returns nonzero if
1192    successful.  */
1193 bool
1194 cpp_push_include (cpp_reader *pfile, const char *fname)
1195 {
1196   return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
1197 }
1198 
1199 /* Do appropriate cleanup when a file INC's buffer is popped off the
1200    input stack.  */
1201 void
1202 _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
1203 {
1204   /* Record the inclusion-preventing macro, which could be NULL
1205      meaning no controlling macro.  */
1206   if (pfile->mi_valid && file->cmacro == NULL)
1207     file->cmacro = pfile->mi_cmacro;
1208 
1209   /* Invalidate control macros in the #including file.  */
1210   pfile->mi_valid = false;
1211 
1212   if (file->buffer)
1213     {
1214       free ((void *) file->buffer);
1215       file->buffer = NULL;
1216       file->buffer_valid = false;
1217     }
1218 }
1219 
1220 /* Inteface to file statistics record in _cpp_file structure. */
1221 struct stat *
1222 _cpp_get_file_stat (_cpp_file *file)
1223 {
1224     return &file->st;
1225 }
1226 
1227 /* Set the include chain for "" to QUOTE, for <> to BRACKET.  If
1228    QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1229    directory of the including file.
1230 
1231    If BRACKET does not lie in the QUOTE chain, it is set to QUOTE.  */
1232 void
1233 cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1234 			int quote_ignores_source_dir)
1235 {
1236   pfile->quote_include = quote;
1237   pfile->bracket_include = quote;
1238   pfile->quote_ignores_source_dir = quote_ignores_source_dir;
1239 
1240   for (; quote; quote = quote->next)
1241     {
1242       quote->name_map = NULL;
1243       quote->len = strlen (quote->name);
1244       if (quote == bracket)
1245 	pfile->bracket_include = bracket;
1246     }
1247 }
1248 
1249 /* Append the file name to the directory to create the path, but don't
1250    turn / into // or // into ///; // may be a namespace escape.  */
1251 static char *
1252 append_file_to_dir (const char *fname, cpp_dir *dir)
1253 {
1254   size_t dlen, flen;
1255   char *path;
1256 
1257   dlen = dir->len;
1258   flen = strlen (fname);
1259   path = XNEWVEC (char, dlen + 1 + flen + 1);
1260   memcpy (path, dir->name, dlen);
1261   if (dlen && path[dlen - 1] != '/')
1262     path[dlen++] = '/';
1263   memcpy (&path[dlen], fname, flen + 1);
1264 
1265   return path;
1266 }
1267 
1268 /* Read a space delimited string of unlimited length from a stdio
1269    file F.  */
1270 static char *
1271 read_filename_string (int ch, FILE *f)
1272 {
1273   char *alloc, *set;
1274   int len;
1275 
1276   len = 20;
1277   set = alloc = XNEWVEC (char, len + 1);
1278   if (! is_space (ch))
1279     {
1280       *set++ = ch;
1281       while ((ch = getc (f)) != EOF && ! is_space (ch))
1282 	{
1283 	  if (set - alloc == len)
1284 	    {
1285 	      len *= 2;
1286 	      alloc = XRESIZEVEC (char, alloc, len + 1);
1287 	      set = alloc + len / 2;
1288 	    }
1289 	  *set++ = ch;
1290 	}
1291     }
1292   *set = '\0';
1293   ungetc (ch, f);
1294   return alloc;
1295 }
1296 
1297 /* Read the file name map file for DIR.  */
1298 static void
1299 read_name_map (cpp_dir *dir)
1300 {
1301   static const char FILE_NAME_MAP_FILE[] = "header.gcc";
1302   char *name;
1303   FILE *f;
1304   size_t len, count = 0, room = 9;
1305 
1306   len = dir->len;
1307   name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
1308   memcpy (name, dir->name, len);
1309   if (len && name[len - 1] != '/')
1310     name[len++] = '/';
1311   strcpy (name + len, FILE_NAME_MAP_FILE);
1312   f = fopen (name, "r");
1313 
1314   dir->name_map = XNEWVEC (const char *, room);
1315 
1316   /* Silently return NULL if we cannot open.  */
1317   if (f)
1318     {
1319       int ch;
1320 
1321       while ((ch = getc (f)) != EOF)
1322 	{
1323 	  char *to;
1324 
1325 	  if (is_space (ch))
1326 	    continue;
1327 
1328 	  if (count + 2 > room)
1329 	    {
1330 	      room += 8;
1331 	      dir->name_map = XRESIZEVEC (const char *, dir->name_map, room);
1332 	    }
1333 
1334 	  dir->name_map[count] = read_filename_string (ch, f);
1335 	  while ((ch = getc (f)) != EOF && is_hspace (ch))
1336 	    ;
1337 
1338 	  to = read_filename_string (ch, f);
1339 	  if (IS_ABSOLUTE_PATH (to))
1340 	    dir->name_map[count + 1] = to;
1341 	  else
1342 	    {
1343 	      dir->name_map[count + 1] = append_file_to_dir (to, dir);
1344 	      free (to);
1345 	    }
1346 
1347 	  count += 2;
1348 	  while ((ch = getc (f)) != '\n')
1349 	    if (ch == EOF)
1350 	      break;
1351 	}
1352 
1353       fclose (f);
1354     }
1355 
1356   /* Terminate the list of maps.  */
1357   dir->name_map[count] = NULL;
1358 }
1359 
1360 /* Remap a FILE's name based on the file_name_map, if any, for
1361    FILE->dir.  If the file name has any directory separators,
1362    recursively check those directories too.  */
1363 static char *
1364 remap_filename (cpp_reader *pfile, _cpp_file *file)
1365 {
1366   const char *fname, *p;
1367   char *new_dir;
1368   cpp_dir *dir;
1369   size_t index, len;
1370 
1371   dir = file->dir;
1372   fname = file->name;
1373 
1374   for (;;)
1375     {
1376       if (!dir->name_map)
1377 	read_name_map (dir);
1378 
1379       for (index = 0; dir->name_map[index]; index += 2)
1380 	if (!strcmp (dir->name_map[index], fname))
1381 	    return xstrdup (dir->name_map[index + 1]);
1382 
1383       p = strchr (fname, '/');
1384       if (!p || p == fname)
1385 	return NULL;
1386 
1387       len = dir->len + (p - fname + 1);
1388       new_dir = XNEWVEC (char, len + 1);
1389       memcpy (new_dir, dir->name, dir->len);
1390       memcpy (new_dir + dir->len, fname, p - fname + 1);
1391       new_dir[len] = '\0';
1392 
1393       dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1394       fname = p + 1;
1395     }
1396 }
1397 
1398 /* Returns true if PCHNAME is a valid PCH file for FILE.  */
1399 static bool
1400 validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
1401 {
1402   const char *saved_path = file->path;
1403   bool valid = false;
1404 
1405   file->path = pchname;
1406   if (open_file (file))
1407     {
1408       valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
1409 
1410       if (!valid)
1411 	{
1412 	  close (file->fd);
1413 	  file->fd = -1;
1414 	}
1415 
1416       if (CPP_OPTION (pfile, print_include_names))
1417 	{
1418 	  unsigned int i;
1419 	  for (i = 1; i < pfile->line_table->depth; i++)
1420 	    putc ('.', stderr);
1421 	  fprintf (stderr, "%c %s\n",
1422 		   valid ? '!' : 'x', pchname);
1423 	}
1424     }
1425 
1426   file->path = saved_path;
1427   return valid;
1428 }
1429 
1430 /* Get the path associated with the _cpp_file F.  The path includes
1431    the base name from the include directive and the directory it was
1432    found in via the search path.  */
1433 
1434 const char *
1435 cpp_get_path (struct _cpp_file *f)
1436 {
1437   return f->path;
1438 }
1439 
1440 /* Get the directory associated with the _cpp_file F.  */
1441 
1442 cpp_dir *
1443 cpp_get_dir (struct _cpp_file *f)
1444 {
1445   return f->dir;
1446 }
1447 
1448 /* Get the cpp_buffer currently associated with the cpp_reader
1449    PFILE.  */
1450 
1451 cpp_buffer *
1452 cpp_get_buffer (cpp_reader *pfile)
1453 {
1454   return pfile->buffer;
1455 }
1456 
1457 /* Get the _cpp_file associated with the cpp_buffer B.  */
1458 
1459 _cpp_file *
1460 cpp_get_file (cpp_buffer *b)
1461 {
1462   return b->file;
1463 }
1464 
1465 /* Get the previous cpp_buffer given a cpp_buffer B.  The previous
1466    buffer is the buffer that included the given buffer.  */
1467 
1468 cpp_buffer *
1469 cpp_get_prev (cpp_buffer *b)
1470 {
1471   return b->prev;
1472 }
1473 
1474 /* This data structure holds the list of header files that were seen
1475    while the PCH was being built.  The 'entries' field is kept sorted
1476    in memcmp() order; yes, this means that on little-endian systems,
1477    it's sorted initially by the least-significant byte of 'size', but
1478    that's OK.  The code does rely on having entries with the same size
1479    next to each other.  */
1480 
1481 struct pchf_entry {
1482   /* The size of this file.  This is used to save running a MD5 checksum
1483      if the sizes don't match.  */
1484   off_t size;
1485   /* The MD5 checksum of this file.  */
1486   unsigned char sum[16];
1487   /* Is this file to be included only once?  */
1488   bool once_only;
1489 };
1490 
1491 struct pchf_data {
1492   /* Number of pchf_entry structures.  */
1493   size_t count;
1494 
1495   /* Are there any values with once_only set?
1496      This is used as an optimisation, it means we don't have to search
1497      the structure if we're processing a regular #include.  */
1498   bool have_once_only;
1499 
1500   struct pchf_entry entries[1];
1501 };
1502 
1503 static struct pchf_data *pchf;
1504 
1505 /* A qsort ordering function for pchf_entry structures.  */
1506 
1507 static int
1508 pchf_save_compare (const void *e1, const void *e2)
1509 {
1510   return memcmp (e1, e2, sizeof (struct pchf_entry));
1511 }
1512 
1513 /* Create and write to F a pchf_data structure.  */
1514 
1515 bool
1516 _cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
1517 {
1518   size_t count = 0;
1519   struct pchf_data *result;
1520   size_t result_size;
1521   _cpp_file *f;
1522 
1523   for (f = pfile->all_files; f; f = f->next_file)
1524     ++count;
1525 
1526   result_size = (sizeof (struct pchf_data)
1527 		 + sizeof (struct pchf_entry) * (count - 1));
1528   result = XCNEWVAR (struct pchf_data, result_size);
1529 
1530   result->count = 0;
1531   result->have_once_only = false;
1532 
1533   for (f = pfile->all_files; f; f = f->next_file)
1534     {
1535       size_t count;
1536 
1537       /* This should probably never happen, since if a read error occurred
1538 	 the PCH file shouldn't be written...  */
1539       if (f->dont_read || f->err_no)
1540 	continue;
1541 
1542       if (f->stack_count == 0)
1543 	continue;
1544 
1545       count = result->count++;
1546 
1547       result->entries[count].once_only = f->once_only;
1548       /* |= is avoided in the next line because of an HP C compiler bug */
1549       result->have_once_only = result->have_once_only | f->once_only;
1550       if (f->buffer_valid)
1551 	md5_buffer ((const char *)f->buffer,
1552 		    f->st.st_size, result->entries[count].sum);
1553       else
1554 	{
1555 	  FILE *ff;
1556 	  int oldfd = f->fd;
1557 
1558 	  if (!open_file (f))
1559 	    {
1560 	      open_file_failed (pfile, f, 0);
1561 	      return false;
1562 	    }
1563 	  ff = fdopen (f->fd, "rb");
1564 	  md5_stream (ff, result->entries[count].sum);
1565 	  fclose (ff);
1566 	  f->fd = oldfd;
1567 	}
1568       result->entries[count].size = f->st.st_size;
1569     }
1570 
1571   result_size = (sizeof (struct pchf_data)
1572                  + sizeof (struct pchf_entry) * (result->count - 1));
1573 
1574   qsort (result->entries, result->count, sizeof (struct pchf_entry),
1575 	 pchf_save_compare);
1576 
1577   return fwrite (result, result_size, 1, fp) == 1;
1578 }
1579 
1580 /* Read the pchf_data structure from F.  */
1581 
1582 bool
1583 _cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1584 {
1585   struct pchf_data d;
1586 
1587   if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1588        != 1)
1589     return false;
1590 
1591   pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data)
1592 		  + sizeof (struct pchf_entry) * (d.count - 1));
1593   memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1594   if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1595       != d.count)
1596     return false;
1597   return true;
1598 }
1599 
1600 /* The parameters for pchf_compare.  */
1601 
1602 struct pchf_compare_data
1603 {
1604   /* The size of the file we're looking for.  */
1605   off_t size;
1606 
1607   /* The MD5 checksum of the file, if it's been computed.  */
1608   unsigned char sum[16];
1609 
1610   /* Is SUM valid?  */
1611   bool sum_computed;
1612 
1613   /* Do we need to worry about entries that don't have ONCE_ONLY set?  */
1614   bool check_included;
1615 
1616   /* The file that we're searching for.  */
1617   _cpp_file *f;
1618 };
1619 
1620 /* bsearch comparison function; look for D_P in E_P.  */
1621 
1622 static int
1623 pchf_compare (const void *d_p, const void *e_p)
1624 {
1625   const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1626   struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1627   int result;
1628 
1629   result = memcmp (&d->size, &e->size, sizeof (off_t));
1630   if (result != 0)
1631     return result;
1632 
1633   if (! d->sum_computed)
1634     {
1635       _cpp_file *const f = d->f;
1636 
1637       md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1638       d->sum_computed = true;
1639     }
1640 
1641   result = memcmp (d->sum, e->sum, 16);
1642   if (result != 0)
1643     return result;
1644 
1645   if (d->check_included || e->once_only)
1646     return 0;
1647   else
1648     return 1;
1649 }
1650 
1651 /* Check that F is not in a list read from a PCH file (if any).
1652    Assumes that f->buffer_valid is true.  Return TRUE if the file
1653    should not be read.  */
1654 
1655 static bool
1656 check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1657 			    _cpp_file *f,
1658 			    bool check_included)
1659 {
1660   struct pchf_compare_data d;
1661 
1662   if (pchf == NULL
1663       || (! check_included && ! pchf->have_once_only))
1664     return false;
1665 
1666   d.size = f->st.st_size;
1667   d.sum_computed = false;
1668   d.f = f;
1669   d.check_included = check_included;
1670   return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1671 		  pchf_compare) != NULL;
1672 }
1673