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