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