xref: /netbsd-src/external/gpl3/gcc/dist/libcpp/files.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Part of CPP library.  File handling.
2    Copyright (C) 1986-2022 Free Software Foundation, Inc.
3    Written by Per Bothner, 1994.
4    Based on CCCP program by Paul Rubin, June 1986
5    Adapted to ANSI C, Richard Stallman, Jan 1987
6    Split out of cpplib.c, Zack Weinberg, Oct 1998
7    Reimplemented, Neil Booth, Jul 2003
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 3, 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; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22 
23 #include "config.h"
24 #include "system.h"
25 #include "cpplib.h"
26 #include "internal.h"
27 #include "mkdeps.h"
28 #include "obstack.h"
29 #include "hashtab.h"
30 #include "md5.h"
31 #include <dirent.h>
32 
33 /* Variable length record files on VMS will have a stat size that includes
34    record control characters that won't be included in the read size.  */
35 #ifdef VMS
36 # define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
37 # define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
38 #else
39 # define STAT_SIZE_RELIABLE(ST) true
40 #endif
41 
42 #ifdef __DJGPP__
43 #include <io.h>
44   /* For DJGPP redirected input is opened in text mode.  */
45 #  define set_stdin_to_binary_mode() \
46      if (! isatty (0)) setmode (0, O_BINARY)
47 #else
48 #  define set_stdin_to_binary_mode() /* Nothing */
49 #endif
50 
51 /* This structure represents a file searched for by CPP, whether it
52    exists or not.  An instance may be pointed to by more than one
53    cpp_file_hash_entry; at present no reference count is kept.  */
54 struct _cpp_file
55 {
56   /* Filename as given to #include or command line switch.  */
57   const char *name;
58 
59   /* The full path used to find the file.  */
60   const char *path;
61 
62   /* The full path of the pch file.  */
63   const char *pchname;
64 
65   /* The file's path with the basename stripped.  NULL if it hasn't
66      been calculated yet.  */
67   const char *dir_name;
68 
69   /* Chain through all files.  */
70   struct _cpp_file *next_file;
71 
72   /* The contents of NAME after calling read_file().  */
73   const uchar *buffer;
74 
75   /* Pointer to the real start of BUFFER.  read_file() might increment
76      BUFFER; when freeing, this this pointer must be used instead.  */
77   const uchar *buffer_start;
78 
79   /* The macro, if any, preventing re-inclusion.  */
80   const cpp_hashnode *cmacro;
81 
82   /* The directory in the search path where FILE was found.  Used for
83      #include_next and determining whether a header is a system
84      header.  */
85   cpp_dir *dir;
86 
87   /* As filled in by stat(2) for the file.  */
88   struct stat st;
89 
90   /* File descriptor.  Invalid if -1, otherwise open.  */
91   int fd;
92 
93   /* Zero if this file was successfully opened and stat()-ed,
94      otherwise errno obtained from failure.  */
95   int err_no;
96 
97   /* Number of times the file has been stacked for preprocessing.  */
98   unsigned short stack_count;
99 
100   /* If opened with #import or contains #pragma once.  */
101   bool once_only : 1;
102 
103   /* If read() failed before.  */
104   bool dont_read : 1;
105 
106   /* If BUFFER above contains the true contents of the file.  */
107   bool buffer_valid : 1;
108 
109   /* If this file is implicitly preincluded.  */
110   bool implicit_preinclude : 1;
111 
112   /* > 0: Known C++ Module header unit, <0: known not.  ==0, unknown  */
113   int header_unit : 2;
114 };
115 
116 /* A singly-linked list for all searches for a given file name, with
117    its head pointed to by a slot in FILE_HASH.  The file name is what
118    appeared between the quotes in a #include directive; it can be
119    determined implicitly from the hash table location or explicitly
120    from FILE->name.
121 
122    FILE is a structure containing details about the file that was
123    found with that search, or details of how the search failed.
124 
125    START_DIR is the starting location of the search in the include
126    chain.  The current directories for "" includes are also hashed in
127    the hash table and therefore unique.  Files that are looked up
128    without using a search path, such as absolute filenames and file
129    names from the command line share a special starting directory so
130    they don't cause cache hits with normal include-chain lookups.
131 
132    If START_DIR is NULL then the entry is for a directory, not a file,
133    and the directory is in DIR.  Since the starting point in a file
134    lookup chain is never NULL, this means that simple pointer
135    comparisons against START_DIR can be made to determine cache hits
136    in file lookups.
137 
138    If a cache lookup fails because of e.g. an extra "./" in the path,
139    then nothing will break.  It is just less efficient as CPP will
140    have to do more work re-preprocessing the file, and/or comparing
141    its contents against earlier once-only files.
142 */
143 struct cpp_file_hash_entry
144 {
145   struct cpp_file_hash_entry *next;
146   cpp_dir *start_dir;
147   location_t location;
148   union
149   {
150     _cpp_file *file;
151     cpp_dir *dir;
152   } u;
153 };
154 
155 /* Number of entries to put in a cpp_file_hash_entry pool.  */
156 #define FILE_HASH_POOL_SIZE 127
157 
158 /* A file hash entry pool.  We allocate cpp_file_hash_entry object from
159    one of these.  */
160 struct file_hash_entry_pool
161 {
162   /* Number of entries used from this pool.  */
163   unsigned int file_hash_entries_used;
164   /* Next pool in the chain; used when freeing.  */
165   struct file_hash_entry_pool *next;
166   /* The memory pool.  */
167   struct cpp_file_hash_entry pool[FILE_HASH_POOL_SIZE];
168 };
169 
170 static bool open_file (_cpp_file *file);
171 static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
172 			   bool *invalid_pch);
173 static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
174 			      bool *invalid_pch, location_t loc);
175 static bool read_file_guts (cpp_reader *pfile, _cpp_file *file,
176 			    location_t loc, const char *input_charset);
177 static bool read_file (cpp_reader *pfile, _cpp_file *file,
178 		       location_t loc);
179 static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
180 				 int angle_brackets, enum include_type);
181 static const char *dir_name_of_file (_cpp_file *file);
182 static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int,
183 			      location_t);
184 static struct cpp_file_hash_entry *search_cache (struct cpp_file_hash_entry *head,
185 					     const cpp_dir *start_dir);
186 static _cpp_file *make_cpp_file (cpp_dir *, const char *fname);
187 static void destroy_cpp_file (_cpp_file *);
188 static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
189 static void allocate_file_hash_entries (cpp_reader *pfile);
190 static struct cpp_file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
191 static int report_missing_guard (void **slot, void *b);
192 static hashval_t file_hash_hash (const void *p);
193 static int file_hash_eq (const void *p, const void *q);
194 static char *read_filename_string (int ch, FILE *f);
195 static void read_name_map (cpp_dir *dir);
196 static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
197 static char *append_file_to_dir (const char *fname, cpp_dir *dir);
198 static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
199 static int pchf_save_compare (const void *e1, const void *e2);
200 static int pchf_compare (const void *d_p, const void *e_p);
201 static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
202 
203 /* Given a filename in FILE->PATH, with the empty string interpreted
204    as <stdin>, open it.
205 
206    On success FILE contains an open file descriptor and stat
207    information for the file.  On failure the file descriptor is -1 and
208    the appropriate errno is also stored in FILE.  Returns TRUE iff
209    successful.
210 
211    We used to open files in nonblocking mode, but that caused more
212    problems than it solved.  Do take care not to acquire a controlling
213    terminal by mistake (this can't happen on sane systems, but
214    paranoia is a virtue).
215 
216    Use the three-argument form of open even though we aren't
217    specifying O_CREAT, to defend against broken system headers.
218 
219    O_BINARY tells some runtime libraries (notably DJGPP) not to do
220    newline translation; we can handle DOS line breaks just fine
221    ourselves.  */
222 static bool
223 open_file (_cpp_file *file)
224 {
225   if (file->path[0] == '\0')
226     {
227       file->fd = 0;
228       set_stdin_to_binary_mode ();
229     }
230   else
231     file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
232 
233   if (file->fd != -1)
234     {
235       if (fstat (file->fd, &file->st) == 0)
236 	{
237 	  if (!S_ISDIR (file->st.st_mode))
238 	    {
239 	      file->err_no = 0;
240 	      return true;
241 	    }
242 
243 	  /* Ignore a directory and continue the search.  The file we're
244 	     looking for may be elsewhere in the search path.  */
245 	  errno = ENOENT;
246 	}
247 
248       close (file->fd);
249       file->fd = -1;
250     }
251 #if defined(_WIN32) && !defined(__CYGWIN__)
252   else if (errno == EACCES)
253     {
254       /* On most UNIX systems, open succeeds on a directory.  Above,
255          we check if we have opened a directory and if so, set errno
256          to ENOENT.  However, on Windows, opening a directory
257          fails with EACCES.  We want to return ENOENT in that
258          case too.  */
259       if (stat (file->path, &file->st) == 0
260           && S_ISDIR (file->st.st_mode))
261         errno = ENOENT;
262       else
263 	/* The call to stat may have reset errno.  */
264 	errno = EACCES;
265     }
266 #endif
267   else if (errno == ENOTDIR)
268     errno = ENOENT;
269 
270   file->err_no = errno;
271 
272   return false;
273 }
274 
275 /* Temporary PCH intercept of opening a file.  Try to find a PCH file
276    based on FILE->name and FILE->dir, and test those found for
277    validity using PFILE->cb.valid_pch.  Return true iff a valid file is
278    found.  Set *INVALID_PCH if a PCH file is found but wasn't valid.  */
279 
280 static bool
281 pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
282 {
283   static const char extension[] = ".gch";
284   const char *path = file->path;
285   size_t len, flen;
286   char *pchname;
287   struct stat st;
288   bool valid = false;
289 
290   /* No PCH on <stdin> or if not requested.  */
291   if (file->name[0] == '\0' || !pfile->cb.valid_pch)
292     return false;
293 
294   /* If the file is not included as first include from either the toplevel
295      file or the command-line it is not a valid use of PCH.  */
296   for (_cpp_file *f = pfile->all_files; f; f = f->next_file)
297     if (f->implicit_preinclude)
298       continue;
299     else if (pfile->main_file == f)
300       break;
301     else
302       return false;
303 
304   flen = strlen (path);
305   len = flen + sizeof (extension);
306   pchname = XNEWVEC (char, len);
307   memcpy (pchname, path, flen);
308   memcpy (pchname + flen, extension, sizeof (extension));
309 
310   if (stat (pchname, &st) == 0)
311     {
312       DIR *pchdir;
313       struct dirent *d;
314       size_t dlen, plen = len;
315 
316       if (!S_ISDIR (st.st_mode))
317 	valid = validate_pch (pfile, file, pchname);
318       else if ((pchdir = opendir (pchname)) != NULL)
319 	{
320 	  pchname[plen - 1] = '/';
321 	  while ((d = readdir (pchdir)) != NULL)
322 	    {
323 	      dlen = strlen (d->d_name) + 1;
324 	      if ((strcmp (d->d_name, ".") == 0)
325 		  || (strcmp (d->d_name, "..") == 0))
326 		continue;
327 	      if (dlen + plen > len)
328 		{
329 		  len += dlen + 64;
330 		  pchname = XRESIZEVEC (char, pchname, len);
331 		}
332 	      memcpy (pchname + plen, d->d_name, dlen);
333 	      valid = validate_pch (pfile, file, pchname);
334 	      if (valid)
335 		break;
336 	    }
337 	  closedir (pchdir);
338 	}
339       if (!valid)
340 	*invalid_pch = true;
341     }
342 
343   if (valid)
344     file->pchname = pchname;
345   else
346     free (pchname);
347 
348   return valid;
349 }
350 
351 /* Canonicalize the path to FILE.  Return the canonical form if it is
352    shorter, otherwise return NULL.  This function does NOT free the
353    memory pointed by FILE.  */
354 
355 static char *
356 maybe_shorter_path (const char * file)
357 {
358   char * file2 = lrealpath (file);
359   if (file2 && strlen (file2) < strlen (file))
360     {
361       return file2;
362     }
363   else
364     {
365       free (file2);
366       return NULL;
367     }
368 }
369 
370 /* Try to open the path FILE->name appended to FILE->dir.  This is
371    where remap and PCH intercept the file lookup process.  Return true
372    if the file was found, whether or not the open was successful.
373    Set *INVALID_PCH to true if a PCH file is found but wasn't valid.
374    Use LOC when emitting any diagnostics.  */
375 
376 static bool
377 find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch,
378 		  location_t loc)
379 {
380   char *path;
381 
382   if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
383     ;
384   else
385     if (file->dir->construct)
386       path = file->dir->construct (file->name, file->dir);
387     else
388       path = append_file_to_dir (file->name, file->dir);
389 
390   if (path)
391     {
392       hashval_t hv;
393       char *copy;
394       void **pp;
395 
396       /* We try to canonicalize system headers.  For DOS based file
397        * system, we always try to shorten non-system headers, as DOS
398        * has a tighter constraint on max path length.  */
399       if ((CPP_OPTION (pfile, canonical_system_headers) && file->dir->sysp)
400 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
401 	  || !file->dir->sysp
402 #endif
403 	 )
404 	{
405 	  char * canonical_path = maybe_shorter_path (path);
406 	  if (canonical_path)
407 	    {
408 	      /* The canonical path was newly allocated.  Let's free the
409 		 non-canonical one.  */
410 	      free (path);
411 	      path = canonical_path;
412 	    }
413 	}
414 
415       hv = htab_hash_string (path);
416       if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL)
417 	{
418 	  file->err_no = ENOENT;
419 	  return false;
420 	}
421 
422       file->path = path;
423       if (pch_open_file (pfile, file, invalid_pch))
424 	return true;
425 
426       if (open_file (file))
427 	return true;
428 
429       if (file->err_no != ENOENT)
430 	{
431 	  open_file_failed (pfile, file, 0, loc);
432 	  return true;
433 	}
434 
435       /* We copy the path name onto an obstack partly so that we don't
436 	 leak the memory, but mostly so that we don't fragment the
437 	 heap.  */
438       copy = (char *) obstack_copy0 (&pfile->nonexistent_file_ob, path,
439 				     strlen (path));
440       free (path);
441       pp = htab_find_slot_with_hash (pfile->nonexistent_file_hash,
442 				     copy, hv, INSERT);
443       *pp = copy;
444 
445       file->path = file->name;
446     }
447   else
448     {
449       file->err_no = ENOENT;
450       file->path = NULL;
451     }
452 
453   return false;
454 }
455 
456 /* Return true iff the missing_header callback found the given HEADER.  */
457 static bool
458 search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
459 {
460   missing_header_cb func = pfile->cb.missing_header;
461 
462   /* When the regular search path doesn't work, try context dependent
463      headers search paths.  */
464   if (func
465       && file->dir == NULL)
466     {
467       if ((file->path = func (pfile, header, &file->dir)) != NULL)
468 	{
469 	  if (open_file (file))
470 	    return true;
471 	  free ((void *)file->path);
472 	}
473       file->path = file->name;
474     }
475 
476   return false;
477 }
478 
479 bool
480 _cpp_find_failed (_cpp_file *file)
481 {
482   return file->err_no != 0;
483 }
484 
485 /* Given a filename FNAME search for such a file in the include path
486    starting from START_DIR.  If FNAME is the empty string it is
487    interpreted as STDIN if START_DIR is PFILE->no_search_path.
488 
489    If the file is not found in the file cache fall back to the O/S and
490    add the result to our cache.
491 
492    If the file was not found in the filesystem, or there was an error
493    opening it, then ERR_NO is nonzero and FD is -1.  If the file was
494    found, then ERR_NO is zero and FD could be -1 or an open file
495    descriptor.  FD can be -1 if the file was found in the cache and
496    had previously been closed.  To open it again pass the return value
497    to open_file().
498 
499    If KIND is _cpp_FFK_PRE_INCLUDE then it is OK for the file to be
500    missing.  If present, it is OK for a precompiled header to be
501    included after it.
502 
503    Use LOC as the location for any errors.  */
504 
505 _cpp_file *
506 _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir,
507 		int angle_brackets, _cpp_find_file_kind kind, location_t loc)
508 {
509   bool invalid_pch = false;
510   bool saw_bracket_include = false;
511   bool saw_quote_include = false;
512   struct cpp_dir *found_in_cache = NULL;
513 
514   /* Ensure we get no confusion between cached files and directories.  */
515   if (start_dir == NULL)
516     cpp_error_at (pfile, CPP_DL_ICE, loc, "NULL directory in find_file");
517 
518   void **hash_slot
519     = htab_find_slot_with_hash (pfile->file_hash, fname,
520 				htab_hash_string (fname), INSERT);
521 
522   /* First check the cache before we resort to memory allocation.  */
523   cpp_file_hash_entry *entry
524     = search_cache ((struct cpp_file_hash_entry *) *hash_slot, start_dir);
525   if (entry)
526     return entry->u.file;
527 
528   _cpp_file *file = make_cpp_file (start_dir, fname);
529   file->implicit_preinclude
530     = (kind == _cpp_FFK_PRE_INCLUDE
531        || (pfile->buffer && pfile->buffer->file->implicit_preinclude));
532 
533   if (kind != _cpp_FFK_FAKE)
534     /* Try each path in the include chain.  */
535     for (;;)
536       {
537 	if (find_file_in_dir (pfile, file, &invalid_pch, loc))
538 	  break;
539 
540 	file->dir = file->dir->next;
541 	if (file->dir == NULL)
542 	  {
543 	    if (search_path_exhausted (pfile, fname, file))
544 	      {
545 		/* Although this file must not go in the cache,
546 		   because the file found might depend on things (like
547 		   the current file) that aren't represented in the
548 		   cache, it still has to go in the list of all files
549 		   so that #import works.  */
550 		file->next_file = pfile->all_files;
551 		pfile->all_files = file;
552 		if (*hash_slot == NULL)
553 		  {
554 		    /* If *hash_slot is NULL, the above
555 		       htab_find_slot_with_hash call just created the
556 		       slot, but we aren't going to store there anything
557 		       of use, so need to remove the newly created entry.
558 		       htab_clear_slot requires that it is non-NULL, so
559 		       store some non-NULL but valid pointer there,
560 		       htab_clear_slot will immediately overwrite it.  */
561 		    *hash_slot = file;
562 		    htab_clear_slot (pfile->file_hash, hash_slot);
563 		  }
564 		return file;
565 	      }
566 
567 	    if (invalid_pch)
568 	      {
569 		cpp_error (pfile, CPP_DL_ERROR,
570 			   "one or more PCH files were found,"
571 			   " but they were invalid");
572 		if (!cpp_get_options (pfile)->warn_invalid_pch)
573 		  cpp_error (pfile, CPP_DL_NOTE,
574 			     "use -Winvalid-pch for more information");
575 	      }
576 
577 	    if (kind == _cpp_FFK_PRE_INCLUDE)
578 	      {
579 		free ((char *) file->name);
580 		free (file);
581 		if (*hash_slot == NULL)
582 		  {
583 		    /* See comment on the above htab_clear_slot call.  */
584 		    *hash_slot = &hash_slot;
585 		    htab_clear_slot (pfile->file_hash, hash_slot);
586 		  }
587 		return NULL;
588 	      }
589 
590 	    if (kind != _cpp_FFK_HAS_INCLUDE)
591 	      open_file_failed (pfile, file, angle_brackets, loc);
592 	    break;
593 	  }
594 
595 	/* Only check the cache for the starting location (done above)
596 	   and the quote and bracket chain heads because there are no
597 	   other possible starting points for searches.  */
598 	if (file->dir == pfile->bracket_include)
599 	  saw_bracket_include = true;
600 	else if (file->dir == pfile->quote_include)
601 	  saw_quote_include = true;
602 	else
603 	  continue;
604 
605 	entry
606 	  = search_cache ((struct cpp_file_hash_entry *) *hash_slot, file->dir);
607 	if (entry)
608 	  {
609 	    found_in_cache = file->dir;
610 	    break;
611 	  }
612       }
613 
614   if (entry)
615     {
616       /* Cache for START_DIR too, sharing the _cpp_file structure.  */
617       free ((char *) file->name);
618       free (file);
619       file = entry->u.file;
620     }
621   else
622     {
623       /* This is a new file; put it in the list.  */
624       file->next_file = pfile->all_files;
625       pfile->all_files = file;
626     }
627 
628   /* Store this new result in the hash table.  */
629   entry = new_file_hash_entry (pfile);
630   entry->next = (struct cpp_file_hash_entry *) *hash_slot;
631   entry->start_dir = start_dir;
632   entry->location = loc;
633   entry->u.file = file;
634   *hash_slot = (void *) entry;
635 
636   /* If we passed the quote or bracket chain heads, cache them also.
637      This speeds up processing if there are lots of -I options.  */
638   if (saw_bracket_include
639       && pfile->bracket_include != start_dir
640       && found_in_cache != pfile->bracket_include)
641     {
642       entry = new_file_hash_entry (pfile);
643       entry->next = (struct cpp_file_hash_entry *) *hash_slot;
644       entry->start_dir = pfile->bracket_include;
645       entry->location = loc;
646       entry->u.file = file;
647       *hash_slot = (void *) entry;
648     }
649   if (saw_quote_include
650       && pfile->quote_include != start_dir
651       && found_in_cache != pfile->quote_include)
652     {
653       entry = new_file_hash_entry (pfile);
654       entry->next = (struct cpp_file_hash_entry *) *hash_slot;
655       entry->start_dir = pfile->quote_include;
656       entry->location = loc;
657       entry->u.file = file;
658       *hash_slot = (void *) entry;
659     }
660 
661   return file;
662 }
663 
664 /* Read a file into FILE->buffer, returning true on success.
665 
666    If FILE->fd is something weird, like a block device, we don't want
667    to read it at all.  Don't even try to figure out what something is,
668    except for plain files and block devices, since there is no
669    reliable portable way of doing this.
670 
671    Use LOC for any diagnostics.
672 
673    PFILE may be NULL.  In this case, no diagnostics are issued.
674 
675    FIXME: Flush file cache and try again if we run out of memory.  */
676 static bool
677 read_file_guts (cpp_reader *pfile, _cpp_file *file, location_t loc,
678 		const char *input_charset)
679 {
680   ssize_t size, total, count;
681   uchar *buf;
682   bool regular;
683 
684   if (S_ISBLK (file->st.st_mode))
685     {
686       if (pfile)
687 	cpp_error_at (pfile, CPP_DL_ERROR, loc,
688 		      "%s is a block device", file->path);
689       return false;
690     }
691 
692   regular = S_ISREG (file->st.st_mode) != 0;
693   if (regular)
694     {
695       /* off_t might have a wider range than ssize_t - in other words,
696 	 the max size of a file might be bigger than the address
697 	 space.  We can't handle a file that large.  (Anyone with
698 	 a single source file bigger than 2GB needs to rethink
699 	 their coding style.)  Some systems (e.g. AIX 4.1) define
700 	 SSIZE_MAX to be much smaller than the actual range of the
701 	 type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
702 	 does not bite us.  */
703       if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
704 	{
705 	  if (pfile)
706 	    cpp_error_at (pfile, CPP_DL_ERROR, loc,
707 			  "%s is too large", file->path);
708 	  return false;
709 	}
710 
711       size = file->st.st_size;
712     }
713   else
714     /* 8 kilobytes is a sensible starting size.  It ought to be bigger
715        than the kernel pipe buffer, and it's definitely bigger than
716        the majority of C source files.  */
717     size = 8 * 1024;
718 
719   /* The + 16 here is space for the final '\n' and 15 bytes of padding,
720      used to quiet warnings from valgrind or Address Sanitizer, when the
721      optimized lexer accesses aligned 16-byte memory chunks, including
722      the bytes after the malloced, area, and stops lexing on '\n'.  */
723   buf = XNEWVEC (uchar, size + 16);
724   total = 0;
725   while ((count = read (file->fd, buf + total, size - total)) > 0)
726     {
727       total += count;
728 
729       if (total == size)
730 	{
731 	  if (regular)
732 	    break;
733 	  size *= 2;
734 	  buf = XRESIZEVEC (uchar, buf, size + 16);
735 	}
736     }
737 
738   if (count < 0)
739     {
740       if (pfile)
741 	cpp_errno_filename (pfile, CPP_DL_ERROR, file->path, loc);
742       free (buf);
743       return false;
744     }
745 
746   if (pfile && regular && total != size && STAT_SIZE_RELIABLE (file->st))
747     cpp_error_at (pfile, CPP_DL_WARNING, loc,
748 	       "%s is shorter than expected", file->path);
749 
750   file->buffer = _cpp_convert_input (pfile,
751 				     input_charset,
752 				     buf, size + 16, total,
753 				     &file->buffer_start,
754 				     &file->st.st_size);
755   file->buffer_valid = file->buffer;
756   return file->buffer_valid;
757 }
758 
759 /* Convenience wrapper around read_file_guts that opens the file if
760    necessary and closes the file descriptor after reading.  FILE must
761    have been passed through find_file() at some stage.  Use LOC for
762    any diagnostics.  Unlike read_file_guts(), PFILE may not be NULL.  */
763 static bool
764 read_file (cpp_reader *pfile, _cpp_file *file, location_t loc)
765 {
766   /* If we already have its contents in memory, succeed immediately.  */
767   if (file->buffer_valid)
768     return true;
769 
770   /* If an earlier read failed for some reason don't try again.  */
771   if (file->dont_read || file->err_no)
772     return false;
773 
774   if (file->fd == -1 && !open_file (file))
775     {
776       open_file_failed (pfile, file, 0, loc);
777       return false;
778     }
779 
780   file->dont_read = !read_file_guts (pfile, file, loc,
781 				     CPP_OPTION (pfile, input_charset));
782   close (file->fd);
783   file->fd = -1;
784 
785   return !file->dont_read;
786 }
787 
788 /* Returns TRUE if FILE is already known to be idempotent, and should
789    therefore not be read again.  */
790 static bool
791 is_known_idempotent_file (cpp_reader *pfile, _cpp_file *file, bool import)
792 {
793   /* Skip once-only files.  */
794   if (file->once_only)
795     return true;
796 
797   /* We must mark the file once-only if #import now, before header
798      guard checks.  Otherwise, undefining the header guard might
799      cause the file to be re-stacked.  */
800   if (import)
801     {
802       _cpp_mark_file_once_only (pfile, file);
803 
804       /* Don't stack files that have been stacked before.  */
805       if (file->stack_count)
806 	return true;
807     }
808 
809   /* Skip if the file had a header guard and the macro is defined.
810      PCH relies on this appearing before the PCH handler below.  */
811   if (file->cmacro && cpp_macro_p (file->cmacro))
812     return true;
813 
814   /* Handle PCH files immediately; don't stack them.  */
815   if (file->pchname)
816     {
817       pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
818       file->fd = -1;
819       free ((void *) file->pchname);
820       file->pchname = NULL;
821       return true;
822     }
823 
824   return false;
825 }
826 
827 /* Return TRUE if file has unique contents, so we should read process
828    it.  The file's contents must already have been read.  */
829 
830 static bool
831 has_unique_contents (cpp_reader *pfile, _cpp_file *file, bool import,
832 		     location_t loc)
833 {
834   /* Check the file against the PCH file.  This is done before
835      checking against files we've already seen, since it may save on
836      I/O.  */
837   if (check_file_against_entries (pfile, file, import))
838     {
839       /* If this isn't a #import, but yet we can't include the file,
840 	 that means that it was #import-ed in the PCH file,
841 	 so we can never include it again.  */
842       if (! import)
843 	_cpp_mark_file_once_only (pfile, file);
844       return false;
845     }
846 
847   /* Now we've read the file's contents, we can stack it if there
848      are no once-only files.  */
849   if (!pfile->seen_once_only)
850     return true;
851 
852   /* We may have read the file under a different name.  Look
853      for likely candidates and compare file contents to be sure.  */
854   for (_cpp_file *f = pfile->all_files; f; f = f->next_file)
855     {
856       if (f == file)
857 	continue; /* It'sa me!  */
858 
859       if ((import || f->once_only)
860 	  && f->err_no == 0
861 	  && f->st.st_mtime == file->st.st_mtime
862 	  && f->st.st_size == file->st.st_size)
863 	{
864 	  _cpp_file *ref_file;
865 
866 	  if (f->buffer && !f->buffer_valid)
867 	    {
868 	      /* We already have a buffer but it is not valid, because
869 		 the file is still stacked.  Make a new one.  */
870 	      ref_file = make_cpp_file (f->dir, f->name);
871 	      ref_file->path = f->path;
872 	    }
873 	  else
874 	    /* The file is not stacked anymore.  We can reuse it.  */
875 	    ref_file = f;
876 
877 	  bool same_file_p = (read_file (pfile, ref_file, loc)
878 			      /* Size might have changed in read_file().  */
879 			      && ref_file->st.st_size == file->st.st_size
880 			      && !memcmp (ref_file->buffer, file->buffer,
881 					  file->st.st_size));
882 
883 	  if (f->buffer && !f->buffer_valid)
884 	    {
885 	      ref_file->path = 0;
886 	      destroy_cpp_file (ref_file);
887 	    }
888 
889 	  if (same_file_p)
890 	    /* Already seen under a different name.  */
891 	    return false;
892 	}
893     }
894 
895   return true;
896 }
897 
898 /* Place the file referenced by FILE into a new buffer on the buffer
899    stack if possible.  Returns true if a buffer is stacked.  Use LOC
900    for any diagnostics.  */
901 
902 bool
903 _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
904 		 location_t loc)
905 {
906   if (is_known_idempotent_file (pfile, file, type == IT_IMPORT))
907     return false;
908 
909   int sysp = 0;
910   char *buf = nullptr;
911 
912   /* Check C++ module include translation.  */
913   if (!file->header_unit && type < IT_HEADER_HWM
914       /* Do not include translate include-next.  */
915       && type != IT_INCLUDE_NEXT
916       && pfile->cb.translate_include)
917     buf = (pfile->cb.translate_include
918 	   (pfile, pfile->line_table, loc, file->path));
919 
920   if (buf)
921     {
922       /* We don't increment the line number at the end of a buffer,
923 	 because we don't usually need that location (we're popping an
924 	 include file).  However in this case we do want to do the
925 	 increment.  So push a writable buffer of two newlines to acheive
926 	 that.  (We also need an extra newline, so this looks like a regular
927 	 file, which we do that to to make sure we don't fall off the end in the
928 	 middle of a line.  */
929       static uchar newlines[] = "\n\n\n";
930       cpp_push_buffer (pfile, newlines, 2, true);
931 
932       size_t len = strlen (buf);
933       buf[len] = '\n'; /* See above  */
934       cpp_buffer *buffer
935 	= cpp_push_buffer (pfile, reinterpret_cast<unsigned char *> (buf),
936 			   len, true);
937       buffer->to_free = buffer->buf;
938 
939       file->header_unit = +1;
940       _cpp_mark_file_once_only (pfile, file);
941     }
942   else
943     {
944       /* Not a header unit, and we know it.  */
945       file->header_unit = -1;
946 
947       if (!read_file (pfile, file, loc))
948 	return false;
949 
950       if (!has_unique_contents (pfile, file, type == IT_IMPORT, loc))
951 	return false;
952 
953       if (pfile->buffer && file->dir)
954 	sysp = MAX (pfile->buffer->sysp, file->dir->sysp);
955 
956       /* Add the file to the dependencies on its first inclusion.  */
957       if (CPP_OPTION (pfile, deps.style) > (sysp != 0)
958 	  && !file->stack_count
959 	  && file->path[0]
960 	  && !(pfile->main_file == file
961 	       && CPP_OPTION (pfile, deps.ignore_main_file)))
962 	deps_add_dep (pfile->deps, file->path);
963 
964       /* Clear buffer_valid since _cpp_clean_line messes it up.  */
965       file->buffer_valid = false;
966       file->stack_count++;
967 
968       /* Stack the buffer.  */
969       cpp_buffer *buffer
970 	= cpp_push_buffer (pfile, file->buffer, file->st.st_size,
971 			   CPP_OPTION (pfile, preprocessed)
972 			   && !CPP_OPTION (pfile, directives_only));
973       buffer->file = file;
974       buffer->sysp = sysp;
975       buffer->to_free = file->buffer_start;
976 
977       /* Initialize controlling macro state.  */
978       pfile->mi_valid = true;
979       pfile->mi_cmacro = 0;
980     }
981 
982   /* In the case of a normal #include, we're now at the start of the
983      line *following* the #include.  A separate location_t for this
984      location makes no sense, until we do the LC_LEAVE.
985 
986      This does not apply if we found a PCH file, we're not a regular
987      include, or we ran out of locations.  */
988   bool decrement = (file->pchname == NULL
989 		    && type < IT_DIRECTIVE_HWM
990 		    && (pfile->line_table->highest_location
991 			!= LINE_MAP_MAX_LOCATION - 1));
992   if (decrement)
993     pfile->line_table->highest_location--;
994 
995   if (file->header_unit <= 0)
996     /* Add line map and do callbacks.  */
997     _cpp_do_file_change (pfile, LC_ENTER, file->path,
998 		       /* With preamble injection, start on line zero,
999 			  so the preamble doesn't appear to have been
1000 			  included from line 1.  Likewise when
1001 			  starting preprocessed, we expect an initial
1002 			  locating line.  */
1003 			 type == IT_PRE_MAIN ? 0 : 1, sysp);
1004   else if (decrement)
1005     {
1006       /* Adjust the line back one so we appear on the #include line itself.  */
1007       const line_map_ordinary *map
1008 	= LINEMAPS_LAST_ORDINARY_MAP (pfile->line_table);
1009       linenum_type line = SOURCE_LINE (map, pfile->line_table->highest_line);
1010       linemap_line_start (pfile->line_table, line - 1, 0);
1011     }
1012 
1013   return true;
1014 }
1015 
1016 /* Mark FILE to be included once only.  */
1017 void
1018 _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
1019 {
1020   pfile->seen_once_only = true;
1021   file->once_only = true;
1022 }
1023 
1024 /* Return the directory from which searching for FNAME should start,
1025    considering the directive TYPE and ANGLE_BRACKETS.  If there is
1026    nothing left in the path, returns NULL.  */
1027 static struct cpp_dir *
1028 search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
1029 		  enum include_type type)
1030 {
1031   cpp_dir *dir;
1032   _cpp_file *file;
1033 
1034   if (IS_ABSOLUTE_PATH (fname))
1035     return &pfile->no_search_path;
1036 
1037   /* pfile->buffer is NULL when processing an -include command-line flag.  */
1038   file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
1039 
1040   /* For #include_next, skip in the search path past the dir in which
1041      the current file was found, but if it was found via an absolute
1042      path use the normal search logic.  */
1043   if (type == IT_INCLUDE_NEXT && file->dir
1044       && file->dir != &pfile->no_search_path)
1045     dir = file->dir->next;
1046   else if (angle_brackets)
1047     dir = pfile->bracket_include;
1048   else if (type == IT_CMDLINE)
1049     /* -include and -imacros use the #include "" chain with the
1050        preprocessor's cwd prepended.  */
1051     return make_cpp_dir (pfile, "./", false);
1052   else if (pfile->quote_ignores_source_dir)
1053     dir = pfile->quote_include;
1054   else
1055     return make_cpp_dir (pfile, dir_name_of_file (file),
1056 			 pfile->buffer ? pfile->buffer->sysp : 0);
1057 
1058   if (dir == NULL)
1059     cpp_error (pfile, CPP_DL_ERROR,
1060 	       "no include path in which to search for %s", fname);
1061 
1062   return dir;
1063 }
1064 
1065 /* Strip the basename from the file's path.  It ends with a slash if
1066    of nonzero length.  Note that this procedure also works for
1067    <stdin>, which is represented by the empty string.  */
1068 static const char *
1069 dir_name_of_file (_cpp_file *file)
1070 {
1071   if (!file->dir_name)
1072     {
1073       size_t len = lbasename (file->path) - file->path;
1074       char *dir_name = XNEWVEC (char, len + 1);
1075 
1076       memcpy (dir_name, file->path, len);
1077       dir_name[len] = '\0';
1078       file->dir_name = dir_name;
1079     }
1080 
1081   return file->dir_name;
1082 }
1083 
1084 /* Handles #include-family directives (distinguished by TYPE),
1085    including HEADER, and the command line -imacros and -include.
1086    Returns true if a buffer was stacked.  */
1087 bool
1088 _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
1089 		    enum include_type type, location_t loc)
1090 {
1091   /* For -include command-line flags we have type == IT_CMDLINE.
1092      When the first -include file is processed we have the case, where
1093      pfile->cur_token == pfile->cur_run->base, we are directly called up
1094      by the front end.  However in the case of the second -include file,
1095      we are called from _cpp_lex_token -> _cpp_get_fresh_line ->
1096      cpp_push_include, with pfile->cur_token != pfile->cur_run->base,
1097      and pfile->cur_token[-1].src_loc not (yet) initialized.
1098      However, when the include file cannot be found, we need src_loc to
1099      be initialized to some safe value: 0 means UNKNOWN_LOCATION.  */
1100   if (type == IT_CMDLINE && pfile->cur_token != pfile->cur_run->base)
1101     pfile->cur_token[-1].src_loc = 0;
1102 
1103   cpp_dir *dir = search_path_head (pfile, fname, angle_brackets, type);
1104   if (!dir)
1105     return false;
1106 
1107   _cpp_file *file = _cpp_find_file (pfile, fname, dir, angle_brackets,
1108 				    type == IT_DEFAULT ? _cpp_FFK_PRE_INCLUDE
1109 				    : _cpp_FFK_NORMAL, loc);
1110   if (type == IT_DEFAULT && file == NULL)
1111     return false;
1112 
1113   return _cpp_stack_file (pfile, file, type, loc);
1114 }
1115 
1116 /* NAME is a header file name, find the _cpp_file, if any.  */
1117 
1118 static _cpp_file *
1119 test_header_unit (cpp_reader *pfile, const char *name, bool angle,
1120 		  location_t loc)
1121 {
1122   if (cpp_dir *dir = search_path_head (pfile, name, angle, IT_INCLUDE))
1123     return _cpp_find_file (pfile, name, dir, angle, _cpp_FFK_NORMAL, loc);
1124 
1125   return nullptr;
1126 }
1127 
1128 /* NAME is a header file name, find the path we'll use to open it and infer that
1129    it is a header-unit.  */
1130 
1131 const char *
1132 _cpp_find_header_unit (cpp_reader *pfile, const char *name, bool angle,
1133 		       location_t loc)
1134 {
1135   if (_cpp_file *file = test_header_unit (pfile, name, angle, loc))
1136     {
1137       if (file->fd > 0)
1138 	{
1139 	  /* Don't leave it open.  */
1140 	  close (file->fd);
1141 	  file->fd = 0;
1142 	}
1143 
1144       file->header_unit = +1;
1145       _cpp_mark_file_once_only (pfile, file);
1146 
1147       return file->path;
1148     }
1149 
1150   return nullptr;
1151 }
1152 
1153 /* NAME is a header file name, find the path we'll use to open it.  But do not
1154    infer it is a header unit.  */
1155 
1156 const char *
1157 cpp_probe_header_unit (cpp_reader *pfile, const char *name, bool angle,
1158 		       location_t loc)
1159 {
1160   if (_cpp_file *file = test_header_unit (pfile, name, angle, loc))
1161     return file->path;
1162 
1163   return nullptr;
1164 }
1165 
1166 /* Retrofit the just-entered main file asif it was an include.  This
1167    will permit correct include_next use, and mark it as a system
1168    header if that's where it resides.  We use filesystem-appropriate
1169    prefix matching of the include path to locate the main file.  */
1170 void
1171 cpp_retrofit_as_include (cpp_reader *pfile)
1172 {
1173   /* We should be the outermost.  */
1174   gcc_assert (!pfile->buffer->prev);
1175 
1176   if (const char *name = pfile->main_file->name)
1177     {
1178       /* Locate name on the include dir path, using a prefix match.  */
1179       size_t name_len = strlen (name);
1180       for (cpp_dir *dir = pfile->quote_include; dir; dir = dir->next)
1181 	if (dir->len < name_len
1182 	    && IS_DIR_SEPARATOR (name[dir->len])
1183 	    && !filename_ncmp (name, dir->name, dir->len))
1184 	  {
1185 	    pfile->main_file->dir = dir;
1186 	    if (dir->sysp)
1187 	      cpp_make_system_header (pfile, 1, 0);
1188 	    break;
1189 	  }
1190     }
1191 
1192   /* Initialize controlling macro state.  */
1193   pfile->mi_valid = true;
1194   pfile->mi_cmacro = 0;
1195 }
1196 
1197 /* Could not open FILE.  The complication is dependency output.  */
1198 static void
1199 open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets,
1200 		  location_t loc)
1201 {
1202   int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
1203   bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
1204 
1205   errno = file->err_no;
1206   if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
1207     {
1208       deps_add_dep (pfile->deps, file->name);
1209       /* If the preprocessor output (other than dependency information) is
1210          being used, we must also flag an error.  */
1211       if (CPP_OPTION (pfile, deps.need_preprocessor_output))
1212 	cpp_errno_filename (pfile, CPP_DL_FATAL,
1213 			    file->path ? file->path : file->name,
1214 			    loc);
1215     }
1216   else
1217     {
1218       /* If we are not outputting dependencies, or if we are and dependencies
1219          were requested for this file, or if preprocessor output is needed
1220          in addition to dependency information, this is an error.
1221 
1222          Otherwise (outputting dependencies but not for this file, and not
1223          using the preprocessor output), we can still produce correct output
1224          so it's only a warning.  */
1225       if (CPP_OPTION (pfile, deps.style) == DEPS_NONE
1226           || print_dep
1227           || CPP_OPTION (pfile, deps.need_preprocessor_output))
1228 	cpp_errno_filename (pfile, CPP_DL_FATAL,
1229 			    file->path ? file->path : file->name,
1230 			    loc);
1231       else
1232 	cpp_errno_filename (pfile, CPP_DL_WARNING,
1233 			    file->path ? file->path : file->name,
1234 			    loc);
1235     }
1236 }
1237 
1238 /* Search in the chain beginning at HEAD for a file whose search path
1239    started at START_DIR != NULL.  */
1240 static struct cpp_file_hash_entry *
1241 search_cache (struct cpp_file_hash_entry *head, const cpp_dir *start_dir)
1242 {
1243   while (head && head->start_dir != start_dir)
1244     head = head->next;
1245 
1246   return head;
1247 }
1248 
1249 /* Allocate a new _cpp_file structure.  */
1250 static _cpp_file *
1251 make_cpp_file (cpp_dir *dir, const char *fname)
1252 {
1253   _cpp_file *file = XCNEW (_cpp_file);
1254   file->fd = -1;
1255   file->dir = dir;
1256   file->name = xstrdup (fname);
1257 
1258   return file;
1259 }
1260 
1261 /* Release a _cpp_file structure.  */
1262 static void
1263 destroy_cpp_file (_cpp_file *file)
1264 {
1265   free ((void *) file->buffer_start);
1266   free ((void *) file->name);
1267   free ((void *) file->path);
1268   free (file);
1269 }
1270 
1271 /* Release all the files allocated by this reader.  */
1272 static void
1273 destroy_all_cpp_files (cpp_reader *pfile)
1274 {
1275   _cpp_file *iter = pfile->all_files;
1276   while (iter)
1277     {
1278       _cpp_file *next = iter->next_file;
1279       destroy_cpp_file (iter);
1280       iter = next;
1281     }
1282 }
1283 
1284 /* A hash of directory names.  The directory names are the path names
1285    of files which contain a #include "", the included file name is
1286    appended to this directories.
1287 
1288    To avoid duplicate entries we follow the convention that all
1289    non-empty directory names should end in a '/'.  DIR_NAME must be
1290    stored in permanently allocated memory.  */
1291 static cpp_dir *
1292 make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
1293 {
1294   struct cpp_file_hash_entry *entry, **hash_slot;
1295   cpp_dir *dir;
1296 
1297   hash_slot = (struct cpp_file_hash_entry **)
1298     htab_find_slot_with_hash (pfile->dir_hash, dir_name,
1299 			      htab_hash_string (dir_name),
1300 			      INSERT);
1301 
1302   /* Have we already hashed this directory?  */
1303   for (entry = *hash_slot; entry; entry = entry->next)
1304     if (entry->start_dir == NULL)
1305       return entry->u.dir;
1306 
1307   dir = XCNEW (cpp_dir);
1308   dir->next = pfile->quote_include;
1309   dir->name = (char *) dir_name;
1310   dir->len = strlen (dir_name);
1311   dir->sysp = sysp;
1312   dir->construct = 0;
1313 
1314   /* Store this new result in the hash table.  */
1315   entry = new_file_hash_entry (pfile);
1316   entry->next = *hash_slot;
1317   entry->start_dir = NULL;
1318   entry->location = pfile->line_table->highest_location;
1319   entry->u.dir = dir;
1320   *hash_slot = entry;
1321 
1322   return dir;
1323 }
1324 
1325 /* Create a new block of memory for file hash entries.  */
1326 static void
1327 allocate_file_hash_entries (cpp_reader *pfile)
1328 {
1329   struct file_hash_entry_pool *pool = XNEW (struct file_hash_entry_pool);
1330   pool->file_hash_entries_used = 0;
1331   pool->next = pfile->file_hash_entries;
1332   pfile->file_hash_entries = pool;
1333 }
1334 
1335 /* Return a new file hash entry.  */
1336 static struct cpp_file_hash_entry *
1337 new_file_hash_entry (cpp_reader *pfile)
1338 {
1339   unsigned int idx;
1340   if (pfile->file_hash_entries->file_hash_entries_used == FILE_HASH_POOL_SIZE)
1341     allocate_file_hash_entries (pfile);
1342 
1343   idx = pfile->file_hash_entries->file_hash_entries_used++;
1344   return &pfile->file_hash_entries->pool[idx];
1345 }
1346 
1347 /* Free the file hash entry pools.  */
1348 static void
1349 free_file_hash_entries (cpp_reader *pfile)
1350 {
1351   struct file_hash_entry_pool *iter = pfile->file_hash_entries;
1352   while (iter)
1353     {
1354       struct file_hash_entry_pool *next = iter->next;
1355       free (iter);
1356       iter = next;
1357     }
1358 }
1359 
1360 /* Returns TRUE if a file FNAME has ever been successfully opened.
1361    This routine is not intended to correctly handle filenames aliased
1362    by links or redundant . or .. traversals etc.  */
1363 bool
1364 cpp_included (cpp_reader *pfile, const char *fname)
1365 {
1366   struct cpp_file_hash_entry *entry;
1367 
1368   entry = (struct cpp_file_hash_entry *)
1369      htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
1370 
1371   while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
1372     entry = entry->next;
1373 
1374   return entry != NULL;
1375 }
1376 
1377 /* Returns TRUE if a file FNAME has ever been successfully opened
1378    before LOCATION.  This routine is not intended to correctly handle
1379    filenames aliased by links or redundant . or .. traversals etc.  */
1380 bool
1381 cpp_included_before (cpp_reader *pfile, const char *fname,
1382 		     location_t location)
1383 {
1384   struct cpp_file_hash_entry *entry
1385     = (struct cpp_file_hash_entry *)
1386       htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
1387 
1388   if (IS_ADHOC_LOC (location))
1389     location = get_location_from_adhoc_loc (pfile->line_table, location);
1390 
1391   while (entry && (entry->start_dir == NULL || entry->u.file->err_no
1392 		   || entry->location > location))
1393     entry = entry->next;
1394 
1395   return entry != NULL;
1396 }
1397 
1398 /* Calculate the hash value of a file hash entry P.  */
1399 
1400 static hashval_t
1401 file_hash_hash (const void *p)
1402 {
1403   struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) p;
1404   const char *hname;
1405   if (entry->start_dir)
1406     hname = entry->u.file->name;
1407   else
1408     hname = entry->u.dir->name;
1409 
1410   return htab_hash_string (hname);
1411 }
1412 
1413 /* Compare a string Q against a file hash entry P.  */
1414 static int
1415 file_hash_eq (const void *p, const void *q)
1416 {
1417   struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) p;
1418   const char *fname = (const char *) q;
1419   const char *hname;
1420 
1421   if (entry->start_dir)
1422     hname = entry->u.file->name;
1423   else
1424     hname = entry->u.dir->name;
1425 
1426   return filename_cmp (hname, fname) == 0;
1427 }
1428 
1429 /* Compare entries in the nonexistent file hash table.  These are just
1430    strings.  */
1431 static int
1432 nonexistent_file_hash_eq (const void *p, const void *q)
1433 {
1434   return filename_cmp ((const char *) p, (const char *) q) == 0;
1435 }
1436 
1437 /* Initialize everything in this source file.  */
1438 void
1439 _cpp_init_files (cpp_reader *pfile)
1440 {
1441   pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1442 					NULL, xcalloc, free);
1443   pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1444 					NULL, xcalloc, free);
1445   allocate_file_hash_entries (pfile);
1446   pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string,
1447 						    nonexistent_file_hash_eq,
1448 						    NULL, xcalloc, free);
1449   obstack_specify_allocation (&pfile->nonexistent_file_ob, 0, 0,
1450 			      xmalloc, free);
1451 }
1452 
1453 /* Finalize everything in this source file.  */
1454 void
1455 _cpp_cleanup_files (cpp_reader *pfile)
1456 {
1457   htab_delete (pfile->file_hash);
1458   htab_delete (pfile->dir_hash);
1459   htab_delete (pfile->nonexistent_file_hash);
1460   obstack_free (&pfile->nonexistent_file_ob, 0);
1461   free_file_hash_entries (pfile);
1462   destroy_all_cpp_files (pfile);
1463 }
1464 
1465 /* Make the parser forget about files it has seen.  This can be useful
1466    for resetting the parser to start another run.  */
1467 void
1468 cpp_clear_file_cache (cpp_reader *pfile)
1469 {
1470   _cpp_cleanup_files (pfile);
1471   pfile->file_hash_entries = NULL;
1472   pfile->all_files = NULL;
1473   _cpp_init_files (pfile);
1474 }
1475 
1476 /* Enter a file name in the hash for the sake of cpp_included.  */
1477 void
1478 _cpp_fake_include (cpp_reader *pfile, const char *fname)
1479 {
1480   _cpp_find_file (pfile, fname, pfile->buffer->file->dir, 0, _cpp_FFK_FAKE, 0);
1481 }
1482 
1483 /* Not everyone who wants to set system-header-ness on a buffer can
1484    see the details of a buffer.  This is an exported interface because
1485    fix-header needs it.  */
1486 void
1487 cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
1488 {
1489   int flags = 0;
1490   const class line_maps *line_table = pfile->line_table;
1491   const line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (line_table);
1492   /* 1 = system header, 2 = system header to be treated as C.  */
1493   if (syshdr)
1494     flags = 1 + (externc != 0);
1495   pfile->buffer->sysp = flags;
1496   _cpp_do_file_change (pfile, LC_RENAME, ORDINARY_MAP_FILE_NAME (map),
1497 		       SOURCE_LINE (map, pfile->line_table->highest_line),
1498 		       flags);
1499 }
1500 
1501 /* Allow the client to change the current file.  Used by the front end
1502    to achieve pseudo-file names like <built-in>.
1503    If REASON is LC_LEAVE, then NEW_NAME must be NULL.  */
1504 void
1505 cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1506 		 const char *new_name)
1507 {
1508   _cpp_do_file_change (pfile, reason, new_name, 1, 0);
1509 }
1510 
1511 struct report_missing_guard_data
1512 {
1513   cpp_reader *pfile;
1514   const char **paths;
1515   size_t count;
1516 };
1517 
1518 /* Callback function for htab_traverse.  */
1519 static int
1520 report_missing_guard (void **slot, void *d)
1521 {
1522   struct cpp_file_hash_entry *entry = (struct cpp_file_hash_entry *) *slot;
1523   struct report_missing_guard_data *data
1524     = (struct report_missing_guard_data *) d;
1525 
1526   /* Skip directories.  */
1527   if (entry->start_dir != NULL)
1528     {
1529       _cpp_file *file = entry->u.file;
1530 
1531       /* We don't want MI guard advice for the main file.  */
1532       if (!file->once_only
1533 	  && file->cmacro == NULL
1534 	  && file->stack_count == 1
1535 	  && data->pfile->main_file != file)
1536 	{
1537 	  if (data->paths == NULL)
1538 	    {
1539 	      data->paths = XCNEWVEC (const char *, data->count);
1540 	      data->count = 0;
1541 	    }
1542 
1543 	  data->paths[data->count++] = file->path;
1544 	}
1545     }
1546 
1547   /* Keep traversing the hash table.  */
1548   return 1;
1549 }
1550 
1551 /* Comparison function for qsort.  */
1552 static int
1553 report_missing_guard_cmp (const void *p1, const void *p2)
1554 {
1555   return strcmp (*(const char *const *) p1, *(const char *const *) p2);
1556 }
1557 
1558 /* Report on all files that might benefit from a multiple include guard.
1559    Triggered by -H.  */
1560 void
1561 _cpp_report_missing_guards (cpp_reader *pfile)
1562 {
1563   struct report_missing_guard_data data;
1564 
1565   data.pfile = pfile;
1566   data.paths = NULL;
1567   data.count = htab_elements (pfile->file_hash);
1568   htab_traverse (pfile->file_hash, report_missing_guard, &data);
1569 
1570   if (data.paths != NULL)
1571     {
1572       size_t i;
1573 
1574       /* Sort the paths to avoid outputting them in hash table
1575 	 order.  */
1576       qsort (data.paths, data.count, sizeof (const char *),
1577 	     report_missing_guard_cmp);
1578       fputs (_("Multiple include guards may be useful for:\n"),
1579 	     stderr);
1580       for (i = 0; i < data.count; i++)
1581 	{
1582 	  fputs (data.paths[i], stderr);
1583 	  putc ('\n', stderr);
1584 	}
1585       free (data.paths);
1586     }
1587 }
1588 
1589 /* Locate HEADER, and determine whether it is newer than the current
1590    file.  If it cannot be located or dated, return -1, if it is
1591    newer, return 1, otherwise 0.  */
1592 int
1593 _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1594 			int angle_brackets)
1595 {
1596   _cpp_file *file;
1597   struct cpp_dir *dir;
1598 
1599   dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1600   if (!dir)
1601     return -1;
1602 
1603   file = _cpp_find_file (pfile, fname, dir, angle_brackets, _cpp_FFK_NORMAL, 0);
1604   if (file->err_no)
1605     return -1;
1606 
1607   if (file->fd != -1)
1608     {
1609       close (file->fd);
1610       file->fd = -1;
1611     }
1612 
1613   return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
1614 }
1615 
1616 /* Pushes the given file onto the buffer stack.  Returns nonzero if
1617    successful.  */
1618 bool
1619 cpp_push_include (cpp_reader *pfile, const char *fname)
1620 {
1621   return _cpp_stack_include (pfile, fname, false, IT_CMDLINE,
1622 			     pfile->line_table->highest_line);
1623 }
1624 
1625 /* Pushes the given file, implicitly included at the start of a
1626    compilation, onto the buffer stack but without any errors if the
1627    file is not found.  Returns nonzero if successful.  */
1628 bool
1629 cpp_push_default_include (cpp_reader *pfile, const char *fname)
1630 {
1631   return _cpp_stack_include (pfile, fname, true, IT_DEFAULT,
1632 			     pfile->line_table->highest_line);
1633 }
1634 
1635 /* Do appropriate cleanup when a file INC's buffer is popped off the
1636    input stack.  */
1637 void
1638 _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file,
1639 		      const unsigned char *to_free)
1640 {
1641   /* Record the inclusion-preventing macro, which could be NULL
1642      meaning no controlling macro.  */
1643   if (pfile->mi_valid && file->cmacro == NULL)
1644     file->cmacro = pfile->mi_cmacro;
1645 
1646   /* Invalidate control macros in the #including file.  */
1647   pfile->mi_valid = false;
1648 
1649   if (to_free)
1650     {
1651       if (to_free == file->buffer_start)
1652 	{
1653 	  file->buffer_start = NULL;
1654 	  file->buffer = NULL;
1655 	  file->buffer_valid = false;
1656 	}
1657       free ((void *) to_free);
1658     }
1659 }
1660 
1661 /* Return the file name associated with FILE.  */
1662 const char *
1663 _cpp_get_file_name (_cpp_file *file)
1664 {
1665   return file->name;
1666 }
1667 
1668 /* Inteface to file statistics record in _cpp_file structure. */
1669 struct stat *
1670 _cpp_get_file_stat (_cpp_file *file)
1671 {
1672     return &file->st;
1673 }
1674 
1675 /* Set the include chain for "" to QUOTE, for <> to BRACKET.  If
1676    QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1677    directory of the including file.
1678 
1679    If BRACKET does not lie in the QUOTE chain, it is set to QUOTE.  */
1680 void
1681 cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1682 			int quote_ignores_source_dir)
1683 {
1684   pfile->quote_include = quote;
1685   pfile->bracket_include = quote;
1686   pfile->quote_ignores_source_dir = quote_ignores_source_dir;
1687 
1688   for (; quote; quote = quote->next)
1689     {
1690       quote->name_map = NULL;
1691       quote->len = strlen (quote->name);
1692       if (quote == bracket)
1693 	pfile->bracket_include = bracket;
1694     }
1695 }
1696 
1697 /* Append the file name to the directory to create the path, but don't
1698    turn / into // or // into ///; // may be a namespace escape.  */
1699 static char *
1700 append_file_to_dir (const char *fname, cpp_dir *dir)
1701 {
1702   size_t dlen, flen;
1703   char *path;
1704 
1705   dlen = dir->len;
1706   flen = strlen (fname);
1707   path = XNEWVEC (char, dlen + 1 + flen + 1);
1708   memcpy (path, dir->name, dlen);
1709   if (dlen && !IS_DIR_SEPARATOR (path[dlen - 1]))
1710     path[dlen++] = '/';
1711   memcpy (&path[dlen], fname, flen + 1);
1712 
1713   return path;
1714 }
1715 
1716 /* Read a space delimited string of unlimited length from a stdio
1717    file F.  */
1718 static char *
1719 read_filename_string (int ch, FILE *f)
1720 {
1721   char *alloc, *set;
1722   int len;
1723 
1724   len = 20;
1725   set = alloc = XNEWVEC (char, len + 1);
1726   if (! is_space (ch))
1727     {
1728       *set++ = ch;
1729       while ((ch = getc (f)) != EOF && ! is_space (ch))
1730 	{
1731 	  if (set - alloc == len)
1732 	    {
1733 	      len *= 2;
1734 	      alloc = XRESIZEVEC (char, alloc, len + 1);
1735 	      set = alloc + len / 2;
1736 	    }
1737 	  *set++ = ch;
1738 	}
1739     }
1740   *set = '\0';
1741   ungetc (ch, f);
1742   return alloc;
1743 }
1744 
1745 /* Read the file name map file for DIR.  */
1746 static void
1747 read_name_map (cpp_dir *dir)
1748 {
1749   static const char FILE_NAME_MAP_FILE[] = "header.gcc";
1750   char *name;
1751   FILE *f;
1752   size_t len, count = 0, room = 9;
1753 
1754   len = dir->len;
1755   name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
1756   memcpy (name, dir->name, len);
1757   if (len && !IS_DIR_SEPARATOR (name[len - 1]))
1758     name[len++] = '/';
1759   strcpy (name + len, FILE_NAME_MAP_FILE);
1760   f = fopen (name, "r");
1761 
1762   dir->name_map = XNEWVEC (const char *, room);
1763 
1764   /* Silently return NULL if we cannot open.  */
1765   if (f)
1766     {
1767       int ch;
1768 
1769       while ((ch = getc (f)) != EOF)
1770 	{
1771 	  char *to;
1772 
1773 	  if (is_space (ch))
1774 	    continue;
1775 
1776 	  if (count + 2 > room)
1777 	    {
1778 	      room += 8;
1779 	      dir->name_map = XRESIZEVEC (const char *, dir->name_map, room);
1780 	    }
1781 
1782 	  dir->name_map[count] = read_filename_string (ch, f);
1783 	  while ((ch = getc (f)) != EOF && is_hspace (ch))
1784 	    ;
1785 
1786 	  to = read_filename_string (ch, f);
1787 	  if (IS_ABSOLUTE_PATH (to))
1788 	    dir->name_map[count + 1] = to;
1789 	  else
1790 	    {
1791 	      dir->name_map[count + 1] = append_file_to_dir (to, dir);
1792 	      free (to);
1793 	    }
1794 
1795 	  count += 2;
1796 	  while ((ch = getc (f)) != '\n')
1797 	    if (ch == EOF)
1798 	      break;
1799 	}
1800 
1801       fclose (f);
1802     }
1803 
1804   /* Terminate the list of maps.  */
1805   dir->name_map[count] = NULL;
1806 }
1807 
1808 /* Remap a FILE's name based on the file_name_map, if any, for
1809    FILE->dir.  If the file name has any directory separators,
1810    recursively check those directories too.  */
1811 static char *
1812 remap_filename (cpp_reader *pfile, _cpp_file *file)
1813 {
1814   const char *fname, *p;
1815   char *new_dir, *p3;
1816   cpp_dir *dir;
1817   size_t index, len;
1818 
1819   dir = file->dir;
1820   fname = file->name;
1821 
1822   for (;;)
1823     {
1824       if (!dir->name_map)
1825 	read_name_map (dir);
1826 
1827       for (index = 0; dir->name_map[index]; index += 2)
1828 	if (!filename_cmp (dir->name_map[index], fname))
1829 	    return xstrdup (dir->name_map[index + 1]);
1830       if (IS_ABSOLUTE_PATH (fname))
1831 	return NULL;
1832       p = strchr (fname, '/');
1833 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
1834       {
1835 	const char *p2 = strchr (fname, '\\');
1836 	if (!p || (p > p2))
1837 	  p = p2;
1838       }
1839 #endif
1840       if (!p || p == fname)
1841 	return NULL;
1842 
1843       len = dir->len + (p - fname + 1);
1844       new_dir = XNEWVEC (char, len + 2);
1845       p3 = new_dir + dir->len;
1846       memcpy (new_dir, dir->name, dir->len);
1847       if (dir->len && !IS_DIR_SEPARATOR (dir->name[dir->len - 1]))
1848 	{
1849 	  *p3++ = '/';
1850 	  len++;
1851 	}
1852       memcpy (p3, fname, p - fname + 1);
1853       new_dir[len] = '\0';
1854 
1855       dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1856       fname = p + 1;
1857     }
1858 }
1859 
1860 /* Returns true if PCHNAME is a valid PCH file for FILE.  */
1861 static bool
1862 validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
1863 {
1864   const char *saved_path = file->path;
1865   bool valid = false;
1866 
1867   file->path = pchname;
1868   if (open_file (file))
1869     {
1870       valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
1871 
1872       if (!valid)
1873 	{
1874 	  close (file->fd);
1875 	  file->fd = -1;
1876 	}
1877 
1878       if (CPP_OPTION (pfile, print_include_names))
1879 	{
1880 	  unsigned int i;
1881 	  for (i = 1; i < pfile->line_table->depth; i++)
1882 	    putc ('.', stderr);
1883 	  fprintf (stderr, "%c %s\n",
1884 		   valid ? '!' : 'x', pchname);
1885 	}
1886     }
1887 
1888   file->path = saved_path;
1889   return valid;
1890 }
1891 
1892 /* Get the path associated with the _cpp_file F.  The path includes
1893    the base name from the include directive and the directory it was
1894    found in via the search path.  */
1895 
1896 const char *
1897 cpp_get_path (struct _cpp_file *f)
1898 {
1899   return f->path;
1900 }
1901 
1902 /* Get the directory associated with the _cpp_file F.  */
1903 
1904 cpp_dir *
1905 cpp_get_dir (struct _cpp_file *f)
1906 {
1907   return f->dir;
1908 }
1909 
1910 /* Get the cpp_buffer currently associated with the cpp_reader
1911    PFILE.  */
1912 
1913 cpp_buffer *
1914 cpp_get_buffer (cpp_reader *pfile)
1915 {
1916   return pfile->buffer;
1917 }
1918 
1919 /* Get the _cpp_file associated with the cpp_buffer B.  */
1920 
1921 _cpp_file *
1922 cpp_get_file (cpp_buffer *b)
1923 {
1924   return b->file;
1925 }
1926 
1927 /* Get the previous cpp_buffer given a cpp_buffer B.  The previous
1928    buffer is the buffer that included the given buffer.  */
1929 
1930 cpp_buffer *
1931 cpp_get_prev (cpp_buffer *b)
1932 {
1933   return b->prev;
1934 }
1935 
1936 /* This data structure holds the list of header files that were seen
1937    while the PCH was being built.  The 'entries' field is kept sorted
1938    in memcmp() order; yes, this means that on little-endian systems,
1939    it's sorted initially by the least-significant byte of 'size', but
1940    that's OK.  The code does rely on having entries with the same size
1941    next to each other.  */
1942 
1943 struct pchf_entry {
1944   /* The size of this file.  This is used to save running a MD5 checksum
1945      if the sizes don't match.  */
1946   off_t size;
1947   /* The MD5 checksum of this file.  */
1948   unsigned char sum[16];
1949   /* Is this file to be included only once?  */
1950   bool once_only;
1951 };
1952 
1953 struct pchf_data {
1954   /* Number of pchf_entry structures.  */
1955   size_t count;
1956 
1957   /* Are there any values with once_only set?
1958      This is used as an optimisation, it means we don't have to search
1959      the structure if we're processing a regular #include.  */
1960   bool have_once_only;
1961 
1962   struct pchf_entry entries[1];
1963 };
1964 
1965 static struct pchf_data *pchf;
1966 
1967 /* A qsort ordering function for pchf_entry structures.  */
1968 
1969 static int
1970 pchf_save_compare (const void *e1, const void *e2)
1971 {
1972   return memcmp (e1, e2, sizeof (struct pchf_entry));
1973 }
1974 
1975 /* Create and write to F a pchf_data structure.  */
1976 
1977 bool
1978 _cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
1979 {
1980   size_t count = 0;
1981   struct pchf_data *result;
1982   size_t result_size;
1983   _cpp_file *f;
1984   bool ret;
1985 
1986   for (f = pfile->all_files; f; f = f->next_file)
1987     ++count;
1988 
1989   result_size = (sizeof (struct pchf_data)
1990 		 + sizeof (struct pchf_entry) * (count - 1));
1991   result = XCNEWVAR (struct pchf_data, result_size);
1992 
1993   result->count = 0;
1994   result->have_once_only = false;
1995 
1996   for (f = pfile->all_files; f; f = f->next_file)
1997     {
1998       size_t count;
1999 
2000       /* This should probably never happen, since if a read error occurred
2001 	 the PCH file shouldn't be written...  */
2002       if (f->dont_read || f->err_no)
2003 	continue;
2004 
2005       if (f->stack_count == 0)
2006 	continue;
2007 
2008       count = result->count++;
2009 
2010       result->entries[count].once_only = f->once_only;
2011       /* |= is avoided in the next line because of an HP C compiler bug */
2012       result->have_once_only = result->have_once_only | f->once_only;
2013       if (f->buffer_valid)
2014 	md5_buffer ((const char *)f->buffer,
2015 		    f->st.st_size, result->entries[count].sum);
2016       else
2017 	{
2018 	  FILE *ff;
2019 	  int oldfd = f->fd;
2020 
2021 	  if (!open_file (f))
2022 	    {
2023 	      open_file_failed (pfile, f, 0, 0);
2024 	      free (result);
2025 	      return false;
2026 	    }
2027 	  ff = fdopen (f->fd, "rb");
2028 	  md5_stream (ff, result->entries[count].sum);
2029 	  fclose (ff);
2030 	  f->fd = oldfd;
2031 	}
2032       result->entries[count].size = f->st.st_size;
2033     }
2034 
2035   result_size = (sizeof (struct pchf_data)
2036                  + sizeof (struct pchf_entry) * (result->count - 1));
2037 
2038   qsort (result->entries, result->count, sizeof (struct pchf_entry),
2039 	 pchf_save_compare);
2040 
2041   ret = fwrite (result, result_size, 1, fp) == 1;
2042   free (result);
2043   return ret;
2044 }
2045 
2046 /* Read the pchf_data structure from F.  */
2047 
2048 bool
2049 _cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
2050 {
2051   struct pchf_data d;
2052 
2053   if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
2054        != 1)
2055     return false;
2056 
2057   pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data)
2058 		  + sizeof (struct pchf_entry) * (d.count - 1));
2059   memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
2060   if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
2061       != d.count)
2062     return false;
2063   return true;
2064 }
2065 
2066 /* The parameters for pchf_compare.  */
2067 
2068 struct pchf_compare_data
2069 {
2070   /* The size of the file we're looking for.  */
2071   off_t size;
2072 
2073   /* The MD5 checksum of the file, if it's been computed.  */
2074   unsigned char sum[16];
2075 
2076   /* Is SUM valid?  */
2077   bool sum_computed;
2078 
2079   /* Do we need to worry about entries that don't have ONCE_ONLY set?  */
2080   bool check_included;
2081 
2082   /* The file that we're searching for.  */
2083   _cpp_file *f;
2084 };
2085 
2086 /* bsearch comparison function; look for D_P in E_P.  */
2087 
2088 static int
2089 pchf_compare (const void *d_p, const void *e_p)
2090 {
2091   const struct pchf_entry *e = (const struct pchf_entry *)e_p;
2092   struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
2093   int result;
2094 
2095   result = memcmp (&d->size, &e->size, sizeof (off_t));
2096   if (result != 0)
2097     return result;
2098 
2099   if (! d->sum_computed)
2100     {
2101       _cpp_file *const f = d->f;
2102 
2103       md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
2104       d->sum_computed = true;
2105     }
2106 
2107   result = memcmp (d->sum, e->sum, 16);
2108   if (result != 0)
2109     return result;
2110 
2111   if (d->check_included || e->once_only)
2112     return 0;
2113   else
2114     return 1;
2115 }
2116 
2117 /* Check that F is not in a list read from a PCH file (if any).
2118    Assumes that f->buffer_valid is true.  Return TRUE if the file
2119    should not be read.  */
2120 
2121 static bool
2122 check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
2123 			    _cpp_file *f,
2124 			    bool check_included)
2125 {
2126   struct pchf_compare_data d;
2127 
2128   if (pchf == NULL
2129       || (! check_included && ! pchf->have_once_only))
2130     return false;
2131 
2132   d.size = f->st.st_size;
2133   d.sum_computed = false;
2134   d.f = f;
2135   d.check_included = check_included;
2136   return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
2137 		  pchf_compare) != NULL;
2138 }
2139 
2140 /* Return true if the file FNAME is found in the appropriate include file path
2141    as indicated by ANGLE_BRACKETS.  */
2142 
2143 bool
2144 _cpp_has_header (cpp_reader *pfile, const char *fname, int angle_brackets,
2145 		 enum include_type type)
2146 {
2147   cpp_dir *start_dir = search_path_head (pfile, fname, angle_brackets, type);
2148   _cpp_file *file = _cpp_find_file (pfile, fname, start_dir, angle_brackets,
2149 				    _cpp_FFK_HAS_INCLUDE, 0);
2150   return file->err_no != ENOENT;
2151 }
2152 
2153 /* Read a file and convert to input charset, the same as if it were being read
2154    by a cpp_reader.  */
2155 
2156 cpp_converted_source
2157 cpp_get_converted_source (const char *fname, const char *input_charset)
2158 {
2159   cpp_converted_source res = {};
2160   _cpp_file file = {};
2161   file.fd = -1;
2162   file.name = lbasename (fname);
2163   file.path = fname;
2164   if (!open_file (&file))
2165     return res;
2166   const bool ok = read_file_guts (NULL, &file, 0, input_charset);
2167   close (file.fd);
2168   if (!ok)
2169     return res;
2170   res.to_free = (char *) file.buffer_start;
2171   res.data = (char *) file.buffer;
2172   res.len = file.st.st_size;
2173   return res;
2174 }
2175