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