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