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