blob: 467bb145ab9d517df5663697ca57d689a46b29ea [file] [log] [blame]
Neil Booth8f9b4002003-07-29 22:26:13 +00001/* Part of CPP library. File handling.
Neil Booth5793b272003-03-01 14:31:21 +00002 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +00003 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
Zack Weinbergadd70911998-10-29 11:54:13 +00005 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
Neil Booth8f9b4002003-07-29 22:26:13 +00009 Reimplemented, Neil Booth, Jul 2003
Zack Weinbergadd70911998-10-29 11:54:13 +000010
11This program is free software; you can redistribute it and/or modify it
12under the terms of the GNU General Public License as published by the
13Free Software Foundation; either version 2, or (at your option) any
14later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with this program; if not, write to the Free Software
Kelley Cook200031d2005-06-29 02:34:39 +000023Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
Zack Weinbergadd70911998-10-29 11:54:13 +000024
25#include "config.h"
26#include "system.h"
Zack Weinbergadd70911998-10-29 11:54:13 +000027#include "cpplib.h"
Paolo Bonzini4f4e53dd2004-05-24 10:50:45 +000028#include "internal.h"
Zack Weinberg168d3732000-03-14 06:34:11 +000029#include "mkdeps.h"
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +000030#include "obstack.h"
Neil Boothbf42e452003-08-01 14:04:02 +000031#include "hashtab.h"
Geoffrey Keating73e61092004-01-17 00:37:47 +000032#include "md5.h"
Neil Booth8f9b4002003-07-29 22:26:13 +000033#include <dirent.h>
Neil Booth642ce432000-12-07 23:17:56 +000034
Douglas B Ruppae1139f2001-11-21 17:03:27 -050035/* Variable length record files on VMS will have a stat size that includes
Kazu Hirata3ef42a02002-01-18 13:40:36 +000036 record control characters that won't be included in the read size. */
Douglas B Ruppae1139f2001-11-21 17:03:27 -050037#ifdef VMS
38# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
Neil Booth8f9b4002003-07-29 22:26:13 +000039# define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
Douglas B Ruppae1139f2001-11-21 17:03:27 -050040#else
Neil Booth8f9b4002003-07-29 22:26:13 +000041# define STAT_SIZE_RELIABLE(ST) true
Douglas B Ruppae1139f2001-11-21 17:03:27 -050042#endif
43
Neil Booth8f9b4002003-07-29 22:26:13 +000044#ifdef __DJGPP__
Andris Pavenis473c5bc2005-04-28 05:38:59 +030045#include <io.h>
Neil Booth8f9b4002003-07-29 22:26:13 +000046 /* 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
Neil Booth28e0f042000-12-09 12:06:37 +000052
Neil Booth8f9b4002003-07-29 22:26:13 +000053/* 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. */
Neil Booth8f9b4002003-07-29 22:26:13 +000056struct _cpp_file
Zack Weinbergd35364d2000-03-12 23:46:05 +000057{
Neil Booth8f9b4002003-07-29 22:26:13 +000058 /* Filename as given to #include or command line switch. */
59 const char *name;
Zack Weinberg0b3d7761998-11-25 11:56:54 +000060
Neil Booth8f9b4002003-07-29 22:26:13 +000061 /* 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
Neil Boothbf42e452003-08-01 14:04:02 +000067 /* The file's path with the basename stripped. NULL if it hasn't
68 been calculated yet. */
Neil Booth8f9b4002003-07-29 22:26:13 +000069 const char *dir_name;
70
Neil Booth49634b32003-08-02 16:29:46 +000071 /* Chain through all files. */
72 struct _cpp_file *next_file;
Neil Booth8f9b4002003-07-29 22:26:13 +000073
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
Neil Boothbf42e452003-08-01 14:04:02 +000082 header. */
Neil Booth8f9b4002003-07-29 22:26:13 +000083 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
Neil Booth49634b32003-08-02 16:29:46 +000098 /* If opened with #import or contains #pragma once. */
99 bool once_only;
Neil Booth8f9b4002003-07-29 22:26:13 +0000100
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
Kazu Hirataa1105612004-02-27 07:09:43 +0000110 /* File is a PCH (on return from find_include_file). */
Per Bothner22234f52004-02-18 14:02:39 -0800111 bool pch;
Neil Booth8f9b4002003-07-29 22:26:13 +0000112};
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
Kazu Hirataa98ebe22003-08-19 23:22:00 +0000117 determined implicitly from the hash table location or explicitly
Neil Boothbf42e452003-08-01 14:04:02 +0000118 from FILE->name.
Neil Booth8f9b4002003-07-29 22:26:13 +0000119
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
Neil Boothbf42e452003-08-01 14:04:02 +0000125 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.
Neil Booth8f9b4002003-07-29 22:26:13 +0000129
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.
Neil Boothbf42e452003-08-01 14:04:02 +0000135
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.
Neil Booth8f9b4002003-07-29 22:26:13 +0000140*/
141struct file_hash_entry
Zack Weinbergc71f8352000-07-05 05:33:57 +0000142{
Neil Booth8f9b4002003-07-29 22:26:13 +0000143 struct file_hash_entry *next;
144 cpp_dir *start_dir;
Tom Tromeyf1e20712007-11-12 00:38:48 +0000145 source_location location;
Neil Booth8f9b4002003-07-29 22:26:13 +0000146 union
147 {
148 _cpp_file *file;
149 cpp_dir *dir;
150 } u;
151};
Zack Weinbergc71f8352000-07-05 05:33:57 +0000152
Tom Tromey97f6bd42007-12-06 18:56:26 +0000153/* Number of entries to put in a file_hash_entry pool. */
154#define FILE_HASH_POOL_SIZE 127
155
156/* A file hash entry pool. We allocate file_hash_entry object from
157 one of these. */
158struct file_hash_entry_pool
159{
160 /* Number of entries used from this pool. */
161 unsigned int file_hash_entries_used;
162 /* Next pool in the chain; used when freeing. */
163 struct file_hash_entry_pool *next;
164 /* The memory pool. */
165 struct file_hash_entry pool[FILE_HASH_POOL_SIZE];
166};
167
Neil Booth8f9b4002003-07-29 22:26:13 +0000168static bool open_file (_cpp_file *file);
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000169static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
170 bool *invalid_pch);
171static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
172 bool *invalid_pch);
Neil Booth8f9b4002003-07-29 22:26:13 +0000173static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
174static bool read_file (cpp_reader *pfile, _cpp_file *file);
Neil Boothcf1ee302003-08-02 12:44:27 +0000175static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
Neil Booth8f9b4002003-07-29 22:26:13 +0000176static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
177 int angle_brackets, enum include_type);
178static const char *dir_name_of_file (_cpp_file *file);
James E Wilson6568f342005-10-21 10:54:20 -0700179static void open_file_failed (cpp_reader *pfile, _cpp_file *file, int);
Zack Weinberge83d8d42004-06-26 17:39:40 +0000180static struct file_hash_entry *search_cache (struct file_hash_entry *head,
Neil Booth8f9b4002003-07-29 22:26:13 +0000181 const cpp_dir *start_dir);
182static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
Eric Botcazou1b449372004-12-15 14:31:28 +0100183static void destroy_cpp_file (_cpp_file *);
Neil Booth8f9b4002003-07-29 22:26:13 +0000184static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
185static void allocate_file_hash_entries (cpp_reader *pfile);
186static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
187static int report_missing_guard (void **slot, void *b);
Per Bothnerb92be662003-12-05 22:50:53 +0000188static hashval_t file_hash_hash (const void *p);
189static int file_hash_eq (const void *p, const void *q);
Neil Booth8f9b4002003-07-29 22:26:13 +0000190static char *read_filename_string (int ch, FILE *f);
191static void read_name_map (cpp_dir *dir);
192static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
193static char *append_file_to_dir (const char *fname, cpp_dir *dir);
194static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
Geoffrey Keating73e61092004-01-17 00:37:47 +0000195static int pchf_save_compare (const void *e1, const void *e2);
196static int pchf_compare (const void *d_p, const void *e_p);
197static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
Neil Booth8f9b4002003-07-29 22:26:13 +0000198
199/* Given a filename in FILE->PATH, with the empty string interpreted
200 as <stdin>, open it.
201
202 On success FILE contains an open file descriptor and stat
203 information for the file. On failure the file descriptor is -1 and
204 the appropriate errno is also stored in FILE. Returns TRUE iff
205 successful.
206
207 We used to open files in nonblocking mode, but that caused more
208 problems than it solved. Do take care not to acquire a controlling
209 terminal by mistake (this can't happen on sane systems, but
210 paranoia is a virtue).
211
212 Use the three-argument form of open even though we aren't
213 specifying O_CREAT, to defend against broken system headers.
214
215 O_BINARY tells some runtime libraries (notably DJGPP) not to do
216 newline translation; we can handle DOS line breaks just fine
217 ourselves. */
218static bool
219open_file (_cpp_file *file)
Neil Bootha36c54f2001-03-12 19:33:08 +0000220{
Neil Booth8f9b4002003-07-29 22:26:13 +0000221 if (file->path[0] == '\0')
Andris Pavenis85be8c22002-05-13 23:28:28 +0300222 {
223 file->fd = 0;
Neil Booth8f9b4002003-07-29 22:26:13 +0000224 set_stdin_to_binary_mode ();
Andris Pavenis85be8c22002-05-13 23:28:28 +0300225 }
Zack Weinbergc31a6502000-06-21 18:33:51 +0000226 else
Neil Booth8f9b4002003-07-29 22:26:13 +0000227 file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
Zack Weinbergd4506962000-06-28 19:03:08 +0000228
Neil Booth8f9b4002003-07-29 22:26:13 +0000229 if (file->fd != -1)
Neil Booth2047e262000-09-21 18:01:22 +0000230 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000231 if (fstat (file->fd, &file->st) == 0)
232 {
233 if (!S_ISDIR (file->st.st_mode))
234 {
235 file->err_no = 0;
236 return true;
237 }
Zack Weinberg55485cd2001-12-06 16:41:18 +0000238
Neil Booth8f9b4002003-07-29 22:26:13 +0000239 /* Ignore a directory and continue the search. The file we're
240 looking for may be elsewhere in the search path. */
241 errno = ENOENT;
242 }
243
Zack Weinberg55485cd2001-12-06 16:41:18 +0000244 close (file->fd);
245 file->fd = -1;
Neil Booth2047e262000-09-21 18:01:22 +0000246 }
Vladimir Prus84152c22007-06-09 10:16:52 +0000247#if defined(_WIN32) && !defined(__CYGWIN__)
248 else if (errno == EACCES)
249 {
250 /* On most UNIX systems, open succeeds on a directory. Above,
251 we check if we have opened a directory and if so, set errno
252 to ENOENT. However, on Windows, opening a directory
Danny Smith66938a12007-06-17 23:15:58 +0000253 fails with EACCES. We want to return ENOENT in that
Vladimir Prus84152c22007-06-09 10:16:52 +0000254 case too. */
255 if (stat (file->path, &file->st) == 0
256 && S_ISDIR (file->st.st_mode))
257 errno = ENOENT;
Vladimir Prus71995ed2007-06-16 12:30:49 +0000258 else
259 /* The call to stat may have reset errno. */
Danny Smith66938a12007-06-17 23:15:58 +0000260 errno = EACCES;
Vladimir Prus84152c22007-06-09 10:16:52 +0000261 }
262#endif
Neil Bootha54c5502003-08-09 08:53:02 +0000263 else if (errno == ENOTDIR)
264 errno = ENOENT;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000265
Neil Boothf277b5e2001-05-05 11:12:19 +0000266 file->err_no = errno;
Neil Booth8f9b4002003-07-29 22:26:13 +0000267
268 return false;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000269}
270
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000271/* Temporary PCH intercept of opening a file. Try to find a PCH file
272 based on FILE->name and FILE->dir, and test those found for
273 validity using PFILE->cb.valid_pch. Return true iff a valid file is
274 found. Set *INVALID_PCH if a PCH file is found but wasn't valid. */
275
Neil Boothe5eba702001-08-21 19:23:24 +0000276static bool
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000277pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000278{
Neil Booth8f9b4002003-07-29 22:26:13 +0000279 static const char extension[] = ".gch";
280 const char *path = file->path;
281 size_t len, flen;
282 char *pchname;
283 struct stat st;
284 bool valid = false;
Neil Booth51d0f322001-02-19 19:50:21 +0000285
Neil Booth8f9b4002003-07-29 22:26:13 +0000286 /* No PCH on <stdin> or if not requested. */
287 if (file->name[0] == '\0' || !pfile->cb.valid_pch)
Neil Boothe5eba702001-08-21 19:23:24 +0000288 return false;
289
Neil Booth8f9b4002003-07-29 22:26:13 +0000290 flen = strlen (path);
291 len = flen + sizeof (extension);
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000292 pchname = XNEWVEC (char, len);
Neil Booth8f9b4002003-07-29 22:26:13 +0000293 memcpy (pchname, path, flen);
294 memcpy (pchname + flen, extension, sizeof (extension));
Neil Booth51d0f322001-02-19 19:50:21 +0000295
Neil Booth8f9b4002003-07-29 22:26:13 +0000296 if (stat (pchname, &st) == 0)
Neil Booth182d89a2002-08-14 22:34:50 +0000297 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000298 DIR *pchdir;
299 struct dirent *d;
300 size_t dlen, plen = len;
301
302 if (!S_ISDIR (st.st_mode))
303 valid = validate_pch (pfile, file, pchname);
304 else if ((pchdir = opendir (pchname)) != NULL)
305 {
306 pchname[plen - 1] = '/';
307 while ((d = readdir (pchdir)) != NULL)
308 {
309 dlen = strlen (d->d_name) + 1;
Phil Edwards230fcd32003-09-25 04:46:44 +0000310 if ((strcmp (d->d_name, ".") == 0)
311 || (strcmp (d->d_name, "..") == 0))
312 continue;
Neil Booth8f9b4002003-07-29 22:26:13 +0000313 if (dlen + plen > len)
314 {
315 len += dlen + 64;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000316 pchname = XRESIZEVEC (char, pchname, len);
Neil Booth8f9b4002003-07-29 22:26:13 +0000317 }
318 memcpy (pchname + plen, d->d_name, dlen);
319 valid = validate_pch (pfile, file, pchname);
320 if (valid)
321 break;
322 }
323 closedir (pchdir);
324 }
Roger Saylebcad4ca2003-12-31 05:11:44 +0000325 if (valid)
326 file->pch = true;
327 else
328 *invalid_pch = true;
Neil Booth182d89a2002-08-14 22:34:50 +0000329 }
Neil Booth51d0f322001-02-19 19:50:21 +0000330
Neil Booth8f9b4002003-07-29 22:26:13 +0000331 if (valid)
332 file->pchname = pchname;
333 else
334 free (pchname);
335
336 return valid;
337}
338
339/* Try to open the path FILE->name appended to FILE->dir. This is
Neil Boothcf1ee302003-08-02 12:44:27 +0000340 where remap and PCH intercept the file lookup process. Return true
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000341 if the file was found, whether or not the open was successful.
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000342 Set *INVALID_PCH to true if a PCH file is found but wasn't valid. */
343
Neil Booth8f9b4002003-07-29 22:26:13 +0000344static bool
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000345find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
Neil Booth8f9b4002003-07-29 22:26:13 +0000346{
347 char *path;
348
349 if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
350 ;
351 else
Mike Stump94d16132004-03-04 00:18:54 +0000352 if (file->dir->construct)
353 path = file->dir->construct (file->name, file->dir);
354 else
355 path = append_file_to_dir (file->name, file->dir);
Neil Booth8f9b4002003-07-29 22:26:13 +0000356
Mike Stump94d16132004-03-04 00:18:54 +0000357 if (path)
Neil Boothcf1ee302003-08-02 12:44:27 +0000358 {
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000359 hashval_t hv = htab_hash_string (path);
360 char *copy;
361 void **pp;
362
363 if (htab_find_with_hash (pfile->nonexistent_file_hash, path, hv) != NULL)
364 {
365 file->err_no = ENOENT;
366 return false;
367 }
368
Mike Stump94d16132004-03-04 00:18:54 +0000369 file->path = path;
370 if (pch_open_file (pfile, file, invalid_pch))
371 return true;
372
373 if (open_file (file))
374 return true;
375
376 if (file->err_no != ENOENT)
377 {
James E Wilson6568f342005-10-21 10:54:20 -0700378 open_file_failed (pfile, file, 0);
Mike Stump94d16132004-03-04 00:18:54 +0000379 return true;
380 }
381
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000382 /* We copy the path name onto an obstack partly so that we don't
383 leak the memory, but mostly so that we don't fragment the
384 heap. */
385 copy = obstack_copy0 (&pfile->nonexistent_file_ob, path,
386 strlen (path));
Mike Stump94d16132004-03-04 00:18:54 +0000387 free (path);
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000388 pp = htab_find_slot_with_hash (pfile->nonexistent_file_hash,
389 copy, hv, INSERT);
390 *pp = copy;
391
Mike Stump94d16132004-03-04 00:18:54 +0000392 file->path = file->name;
393 }
394 else
395 {
396 file->err_no = ENOENT;
397 file->path = NULL;
Neil Boothcf1ee302003-08-02 12:44:27 +0000398 }
399
Mike Stump94d16132004-03-04 00:18:54 +0000400 return false;
401}
402
403/* Return tue iff the missing_header callback found the given HEADER. */
404static bool
405search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
406{
407 missing_header_cb func = pfile->cb.missing_header;
408
409 /* When the regular search path doesn't work, try context dependent
410 headers search paths. */
411 if (func
412 && file->dir == NULL)
413 {
Mike Stumpe3c287c2004-05-05 18:25:52 +0000414 if ((file->path = func (pfile, header, &file->dir)) != NULL)
Mike Stump94d16132004-03-04 00:18:54 +0000415 {
416 if (open_file (file))
417 return true;
418 free ((void *)file->path);
419 }
420 file->path = file->name;
421 }
422
Neil Booth8f9b4002003-07-29 22:26:13 +0000423 return false;
424}
425
Per Bothner4dc299f2003-10-02 07:23:27 +0000426bool
427_cpp_find_failed (_cpp_file *file)
428{
429 return file->err_no != 0;
430}
431
Neil Booth8f9b4002003-07-29 22:26:13 +0000432/* Given a filename FNAME search for such a file in the include path
433 starting from START_DIR. If FNAME is the empty string it is
Kazu Hirata1ae58c32004-04-30 16:27:30 +0000434 interpreted as STDIN if START_DIR is PFILE->no_search_path.
Neil Booth8f9b4002003-07-29 22:26:13 +0000435
436 If the file is not found in the file cache fall back to the O/S and
437 add the result to our cache.
438
439 If the file was not found in the filesystem, or there was an error
Kazu Hirata02fa63c2003-08-19 21:09:36 +0000440 opening it, then ERR_NO is nonzero and FD is -1. If the file was
Neil Booth8f9b4002003-07-29 22:26:13 +0000441 found, then ERR_NO is zero and FD could be -1 or an open file
442 descriptor. FD can be -1 if the file was found in the cache and
443 had previously been closed. To open it again pass the return value
444 to open_file().
445*/
Per Bothner4dc299f2003-10-02 07:23:27 +0000446_cpp_file *
James E Wilson6568f342005-10-21 10:54:20 -0700447_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake, int angle_brackets)
Neil Booth8f9b4002003-07-29 22:26:13 +0000448{
449 struct file_hash_entry *entry, **hash_slot;
450 _cpp_file *file;
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000451 bool invalid_pch = false;
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000452 bool saw_bracket_include = false;
453 bool saw_quote_include = false;
454 struct cpp_dir *found_in_cache = NULL;
Neil Booth8f9b4002003-07-29 22:26:13 +0000455
456 /* Ensure we get no confusion between cached files and directories. */
457 if (start_dir == NULL)
John David Anglin0527bc42003-11-01 22:56:54 +0000458 cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
Neil Booth8f9b4002003-07-29 22:26:13 +0000459
460 hash_slot = (struct file_hash_entry **)
Per Bothnerb92be662003-12-05 22:50:53 +0000461 htab_find_slot_with_hash (pfile->file_hash, fname,
462 htab_hash_string (fname),
463 INSERT);
Neil Booth8f9b4002003-07-29 22:26:13 +0000464
465 /* First check the cache before we resort to memory allocation. */
Zack Weinberge83d8d42004-06-26 17:39:40 +0000466 entry = search_cache (*hash_slot, start_dir);
Neil Booth8f9b4002003-07-29 22:26:13 +0000467 if (entry)
468 return entry->u.file;
469
470 file = make_cpp_file (pfile, start_dir, fname);
471
472 /* Try each path in the include chain. */
473 for (; !fake ;)
Geoffrey Keating17211ab2003-01-10 02:22:34 +0000474 {
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000475 if (find_file_in_dir (pfile, file, &invalid_pch))
Neil Booth8f9b4002003-07-29 22:26:13 +0000476 break;
477
Neil Boothcf1ee302003-08-02 12:44:27 +0000478 file->dir = file->dir->next;
479 if (file->dir == NULL)
Neil Booth8f9b4002003-07-29 22:26:13 +0000480 {
Mike Stump94d16132004-03-04 00:18:54 +0000481 if (search_path_exhausted (pfile, fname, file))
Geoffrey Keating942926a2005-01-04 02:13:56 +0000482 {
483 /* Although this file must not go in the cache, because
484 the file found might depend on things (like the current file)
485 that aren't represented in the cache, it still has to go in
486 the list of all files so that #import works. */
487 file->next_file = pfile->all_files;
488 pfile->all_files = file;
489 return file;
490 }
Mike Stump94d16132004-03-04 00:18:54 +0000491
James E Wilson6568f342005-10-21 10:54:20 -0700492 open_file_failed (pfile, file, angle_brackets);
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000493 if (invalid_pch)
494 {
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000495 cpp_error (pfile, CPP_DL_ERROR,
Geoffrey Keatinge235d8b2003-11-14 19:00:04 +0000496 "one or more PCH files were found, but they were invalid");
497 if (!cpp_get_options (pfile)->warn_invalid_pch)
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000498 cpp_error (pfile, CPP_DL_ERROR,
Geoffrey Keatinge235d8b2003-11-14 19:00:04 +0000499 "use -Winvalid-pch for more information");
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000500 }
Neil Booth8f9b4002003-07-29 22:26:13 +0000501 break;
502 }
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200503
504 /* Only check the cache for the starting location (done above)
505 and the quote and bracket chain heads because there are no
506 other possible starting points for searches. */
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000507 if (file->dir == pfile->bracket_include)
508 saw_bracket_include = true;
509 else if (file->dir == pfile->quote_include)
510 saw_quote_include = true;
511 else
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200512 continue;
513
514 entry = search_cache (*hash_slot, file->dir);
515 if (entry)
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000516 {
517 found_in_cache = file->dir;
518 break;
519 }
Neil Booth49634b32003-08-02 16:29:46 +0000520 }
521
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200522 if (entry)
Zack Weinbergc6e83802004-06-05 20:58:06 +0000523 {
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200524 /* Cache for START_DIR too, sharing the _cpp_file structure. */
525 free ((char *) file->name);
526 free (file);
527 file = entry->u.file;
528 }
529 else
530 {
531 /* This is a new file; put it in the list. */
532 file->next_file = pfile->all_files;
533 pfile->all_files = file;
Zack Weinbergc6e83802004-06-05 20:58:06 +0000534 }
535
Neil Booth8f9b4002003-07-29 22:26:13 +0000536 /* Store this new result in the hash table. */
537 entry = new_file_hash_entry (pfile);
538 entry->next = *hash_slot;
539 entry->start_dir = start_dir;
Tom Tromeyf1e20712007-11-12 00:38:48 +0000540 entry->location = pfile->line_table->highest_location;
Neil Booth8f9b4002003-07-29 22:26:13 +0000541 entry->u.file = file;
542 *hash_slot = entry;
543
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000544 /* If we passed the quote or bracket chain heads, cache them also.
545 This speeds up processing if there are lots of -I options. */
546 if (saw_bracket_include
547 && pfile->bracket_include != start_dir
548 && found_in_cache != pfile->bracket_include)
549 {
550 entry = new_file_hash_entry (pfile);
551 entry->next = *hash_slot;
552 entry->start_dir = pfile->bracket_include;
Tom Tromeyf1e20712007-11-12 00:38:48 +0000553 entry->location = pfile->line_table->highest_location;
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000554 entry->u.file = file;
555 *hash_slot = entry;
556 }
557 if (saw_quote_include
558 && pfile->quote_include != start_dir
559 && found_in_cache != pfile->quote_include)
560 {
561 entry = new_file_hash_entry (pfile);
562 entry->next = *hash_slot;
563 entry->start_dir = pfile->quote_include;
Tom Tromeyf1e20712007-11-12 00:38:48 +0000564 entry->location = pfile->line_table->highest_location;
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +0000565 entry->u.file = file;
566 *hash_slot = entry;
567 }
568
Neil Booth8f9b4002003-07-29 22:26:13 +0000569 return file;
570}
571
572/* Read a file into FILE->buffer, returning true on success.
573
574 If FILE->fd is something weird, like a block device, we don't want
575 to read it at all. Don't even try to figure out what something is,
576 except for plain files and block devices, since there is no
577 reliable portable way of doing this.
578
579 FIXME: Flush file cache and try again if we run out of memory. */
580static bool
581read_file_guts (cpp_reader *pfile, _cpp_file *file)
582{
583 ssize_t size, total, count;
584 uchar *buf;
585 bool regular;
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000586
Neil Booth8f9b4002003-07-29 22:26:13 +0000587 if (S_ISBLK (file->st.st_mode))
588 {
John David Anglin0527bc42003-11-01 22:56:54 +0000589 cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
Geoffrey Keating17211ab2003-01-10 02:22:34 +0000590 return false;
591 }
592
Neil Booth8f9b4002003-07-29 22:26:13 +0000593 regular = S_ISREG (file->st.st_mode);
594 if (regular)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000595 {
596 /* off_t might have a wider range than ssize_t - in other words,
597 the max size of a file might be bigger than the address
598 space. We can't handle a file that large. (Anyone with
599 a single source file bigger than 2GB needs to rethink
600 their coding style.) Some systems (e.g. AIX 4.1) define
601 SSIZE_MAX to be much smaller than the actual range of the
602 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
603 does not bite us. */
Neil Booth8f9b4002003-07-29 22:26:13 +0000604 if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
Zack Weinberga58d32c2000-09-12 03:42:30 +0000605 {
John David Anglin0527bc42003-11-01 22:56:54 +0000606 cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000607 return false;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000608 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000609
Neil Booth8f9b4002003-07-29 22:26:13 +0000610 size = file->st.st_size;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000611 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000612 else
Neil Booth8f9b4002003-07-29 22:26:13 +0000613 /* 8 kilobytes is a sensible starting size. It ought to be bigger
614 than the kernel pipe buffer, and it's definitely bigger than
615 the majority of C source files. */
616 size = 8 * 1024;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000617
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000618 buf = XNEWVEC (uchar, size + 1);
Neil Booth8f9b4002003-07-29 22:26:13 +0000619 total = 0;
620 while ((count = read (file->fd, buf + total, size - total)) > 0)
621 {
622 total += count;
623
624 if (total == size)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000625 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000626 if (regular)
627 break;
628 size *= 2;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000629 buf = XRESIZEVEC (uchar, buf, size + 1);
Zack Weinberga58d32c2000-09-12 03:42:30 +0000630 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000631 }
632
Neil Booth8f9b4002003-07-29 22:26:13 +0000633 if (count < 0)
634 {
John David Anglin0527bc42003-11-01 22:56:54 +0000635 cpp_errno (pfile, CPP_DL_ERROR, file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000636 return false;
637 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000638
Neil Booth8f9b4002003-07-29 22:26:13 +0000639 if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
John David Anglin0527bc42003-11-01 22:56:54 +0000640 cpp_error (pfile, CPP_DL_WARNING,
641 "%s is shorter than expected", file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000642
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000643 file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
644 buf, size, total, &file->st.st_size);
Neil Booth8f9b4002003-07-29 22:26:13 +0000645 file->buffer_valid = true;
646
647 return true;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000648}
649
Neil Booth8f9b4002003-07-29 22:26:13 +0000650/* Convenience wrapper around read_file_guts that opens the file if
Kazu Hirataa98ebe22003-08-19 23:22:00 +0000651 necessary and closes the file descriptor after reading. FILE must
Neil Booth8f9b4002003-07-29 22:26:13 +0000652 have been passed through find_file() at some stage. */
653static bool
654read_file (cpp_reader *pfile, _cpp_file *file)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000655{
Neil Booth8f9b4002003-07-29 22:26:13 +0000656 /* If we already have its contents in memory, succeed immediately. */
657 if (file->buffer_valid)
658 return true;
659
660 /* If an earlier read failed for some reason don't try again. */
661 if (file->dont_read || file->err_no)
662 return false;
663
664 if (file->fd == -1 && !open_file (file))
665 {
James E Wilson6568f342005-10-21 10:54:20 -0700666 open_file_failed (pfile, file, 0);
Neil Booth8f9b4002003-07-29 22:26:13 +0000667 return false;
668 }
669
670 file->dont_read = !read_file_guts (pfile, file);
671 close (file->fd);
672 file->fd = -1;
673
674 return !file->dont_read;
Zack Weinbergadd70911998-10-29 11:54:13 +0000675}
676
Neil Boothcf1ee302003-08-02 12:44:27 +0000677/* Returns TRUE if FILE's contents have been successfully placed in
678 FILE->buffer and the file should be stacked, otherwise false. */
679static bool
680should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
681{
682 _cpp_file *f;
683
Neil Booth49634b32003-08-02 16:29:46 +0000684 /* Skip once-only files. */
685 if (file->once_only)
686 return false;
687
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000688 /* We must mark the file once-only if #import now, before header
Neil Booth49634b32003-08-02 16:29:46 +0000689 guard checks. Otherwise, undefining the header guard might
690 cause the file to be re-stacked. */
691 if (import)
692 {
693 _cpp_mark_file_once_only (pfile, file);
694
695 /* Don't stack files that have been stacked before. */
696 if (file->stack_count)
697 return false;
698 }
699
Neil Boothcf1ee302003-08-02 12:44:27 +0000700 /* Skip if the file had a header guard and the macro is defined.
701 PCH relies on this appearing before the PCH handler below. */
702 if (file->cmacro && file->cmacro->type == NT_MACRO)
703 return false;
704
705 /* Handle PCH files immediately; don't stack them. */
Per Bothner22234f52004-02-18 14:02:39 -0800706 if (file->pch)
Neil Boothcf1ee302003-08-02 12:44:27 +0000707 {
Geoffrey Keatingc0d578e2004-06-22 06:51:56 +0000708 pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
Neil Boothcf1ee302003-08-02 12:44:27 +0000709 close (file->fd);
710 file->fd = -1;
711 return false;
712 }
713
Neil Boothcf1ee302003-08-02 12:44:27 +0000714 if (!read_file (pfile, file))
715 return false;
716
Geoffrey Keating73e61092004-01-17 00:37:47 +0000717 /* Check the file against the PCH file. This is done before
718 checking against files we've already seen, since it may save on
719 I/O. */
720 if (check_file_against_entries (pfile, file, import))
721 {
722 /* If this isn't a #import, but yet we can't include the file,
723 that means that it was #import-ed in the PCH file,
724 so we can never include it again. */
725 if (! import)
726 _cpp_mark_file_once_only (pfile, file);
727 return false;
728 }
729
Neil Booth49634b32003-08-02 16:29:46 +0000730 /* Now we've read the file's contents, we can stack it if there
731 are no once-only files. */
732 if (!pfile->seen_once_only)
Neil Boothcf1ee302003-08-02 12:44:27 +0000733 return true;
734
Neil Booth49634b32003-08-02 16:29:46 +0000735 /* We may have read the file under a different name. Look
Neil Boothcf1ee302003-08-02 12:44:27 +0000736 for likely candidates and compare file contents to be sure. */
Neil Booth49634b32003-08-02 16:29:46 +0000737 for (f = pfile->all_files; f; f = f->next_file)
Neil Boothcf1ee302003-08-02 12:44:27 +0000738 {
739 if (f == file)
740 continue;
741
Neil Booth49634b32003-08-02 16:29:46 +0000742 if ((import || f->once_only)
743 && f->err_no == 0
Neil Boothcf1ee302003-08-02 12:44:27 +0000744 && f->st.st_mtime == file->st.st_mtime
Eric Botcazou1b449372004-12-15 14:31:28 +0100745 && f->st.st_size == file->st.st_size)
746 {
747 _cpp_file *ref_file;
748 bool same_file_p = false;
749
750 if (f->buffer && !f->buffer_valid)
751 {
752 /* We already have a buffer but it is not valid, because
753 the file is still stacked. Make a new one. */
754 ref_file = make_cpp_file (pfile, f->dir, f->name);
755 ref_file->path = f->path;
756 }
757 else
758 /* The file is not stacked anymore. We can reuse it. */
759 ref_file = f;
760
761 same_file_p = read_file (pfile, ref_file)
762 /* Size might have changed in read_file(). */
763 && ref_file->st.st_size == file->st.st_size
764 && !memcmp (ref_file->buffer,
765 file->buffer,
766 file->st.st_size);
767
768 if (f->buffer && !f->buffer_valid)
769 {
770 ref_file->path = 0;
771 destroy_cpp_file (ref_file);
772 }
773
774 if (same_file_p)
775 break;
776 }
Neil Boothcf1ee302003-08-02 12:44:27 +0000777 }
778
Neil Boothcf1ee302003-08-02 12:44:27 +0000779 return f == NULL;
780}
781
Neil Booth8f9b4002003-07-29 22:26:13 +0000782/* Place the file referenced by FILE into a new buffer on the buffer
783 stack if possible. IMPORT is true if this stacking attempt is
784 because of a #import directive. Returns true if a buffer is
785 stacked. */
Per Bothner4dc299f2003-10-02 07:23:27 +0000786bool
787_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
Zack Weinbergb0699da2000-03-07 20:58:47 +0000788{
Neil Booth8f9b4002003-07-29 22:26:13 +0000789 cpp_buffer *buffer;
790 int sysp;
Zack Weinbergb0699da2000-03-07 20:58:47 +0000791
Neil Boothcf1ee302003-08-02 12:44:27 +0000792 if (!should_stack_file (pfile, file, import))
Neil Booth8f9b4002003-07-29 22:26:13 +0000793 return false;
794
Per Bothner12f9df42004-02-11 07:29:30 -0800795 if (pfile->buffer == NULL || file->dir == NULL)
796 sysp = 0;
797 else
798 sysp = MAX (pfile->buffer->sysp, file->dir->sysp);
Neil Booth8f9b4002003-07-29 22:26:13 +0000799
800 /* Add the file to the dependencies on its first inclusion. */
801 if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +0000802 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000803 if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file))
Neil Boothf0babc92003-07-30 22:30:40 +0000804 deps_add_dep (pfile->deps, file->path);
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +0000805 }
Kazu Hiratadf383482002-05-22 22:02:16 +0000806
Neil Booth8f9b4002003-07-29 22:26:13 +0000807 /* Clear buffer_valid since _cpp_clean_line messes it up. */
808 file->buffer_valid = false;
809 file->stack_count++;
Zack Weinberge576beb2000-03-15 22:03:37 +0000810
Neil Booth8f9b4002003-07-29 22:26:13 +0000811 /* Stack the buffer. */
812 buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
Ollie Wildccfc4c92007-07-30 18:29:20 +0000813 CPP_OPTION (pfile, preprocessed)
814 && !CPP_OPTION (pfile, directives_only));
Neil Booth8f9b4002003-07-29 22:26:13 +0000815 buffer->file = file;
Per Bothner12f9df42004-02-11 07:29:30 -0800816 buffer->sysp = sysp;
Zack Weinbergadd70911998-10-29 11:54:13 +0000817
Neil Booth8f9b4002003-07-29 22:26:13 +0000818 /* Initialize controlling macro state. */
819 pfile->mi_valid = true;
820 pfile->mi_cmacro = 0;
821
822 /* Generate the call back. */
Neil Booth76bf2c92003-08-03 09:28:25 +0000823 _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
Neil Booth8f9b4002003-07-29 22:26:13 +0000824
825 return true;
826}
827
Neil Booth49634b32003-08-02 16:29:46 +0000828/* Mark FILE to be included once only. */
Neil Booth8f9b4002003-07-29 22:26:13 +0000829void
Neil Booth49634b32003-08-02 16:29:46 +0000830_cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
Neil Booth8f9b4002003-07-29 22:26:13 +0000831{
Neil Booth49634b32003-08-02 16:29:46 +0000832 pfile->seen_once_only = true;
833 file->once_only = true;
Neil Booth8f9b4002003-07-29 22:26:13 +0000834}
835
836/* Return the directory from which searching for FNAME should start,
Kazu Hirata2067c112003-10-05 19:50:56 +0000837 considering the directive TYPE and ANGLE_BRACKETS. If there is
Neil Booth8f9b4002003-07-29 22:26:13 +0000838 nothing left in the path, returns NULL. */
839static struct cpp_dir *
840search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
841 enum include_type type)
842{
843 cpp_dir *dir;
844 _cpp_file *file;
845
Zack Weinberg3dce1402003-07-03 04:24:01 +0000846 if (IS_ABSOLUTE_PATH (fname))
Neil Booth8f9b4002003-07-29 22:26:13 +0000847 return &pfile->no_search_path;
848
Per Bothner4dc299f2003-10-02 07:23:27 +0000849 /* pfile->buffer is NULL when processing an -include command-line flag. */
850 file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
Neil Booth41947a52001-03-13 23:55:10 +0000851
852 /* For #include_next, skip in the search path past the dir in which
Neil Boothe7182662001-03-14 19:35:08 +0000853 the current file was found, but if it was found via an absolute
854 path use the normal search logic. */
Michael Matzb0f48072007-11-16 13:46:57 +0000855 if (type == IT_INCLUDE_NEXT && file->dir
856 && file->dir != &pfile->no_search_path)
Neil Booth8f9b4002003-07-29 22:26:13 +0000857 dir = file->dir->next;
Neil Booth74eb4b32003-04-21 19:21:59 +0000858 else if (angle_brackets)
Neil Booth8f9b4002003-07-29 22:26:13 +0000859 dir = pfile->bracket_include;
860 else if (type == IT_CMDLINE)
861 /* -include and -imacros use the #include "" chain with the
862 preprocessor's cwd prepended. */
863 return make_cpp_dir (pfile, "./", false);
864 else if (pfile->quote_ignores_source_dir)
865 dir = pfile->quote_include;
Neil Booth41947a52001-03-13 23:55:10 +0000866 else
Per Bothner12f9df42004-02-11 07:29:30 -0800867 return make_cpp_dir (pfile, dir_name_of_file (file),
868 pfile->buffer ? pfile->buffer->sysp : 0);
Neil Booth41947a52001-03-13 23:55:10 +0000869
Neil Booth8f9b4002003-07-29 22:26:13 +0000870 if (dir == NULL)
John David Anglin0527bc42003-11-01 22:56:54 +0000871 cpp_error (pfile, CPP_DL_ERROR,
Neil Booth8f9b4002003-07-29 22:26:13 +0000872 "no include path in which to search for %s", fname);
873
874 return dir;
875}
876
877/* Strip the basename from the file's path. It ends with a slash if
Kazu Hirata02fa63c2003-08-19 21:09:36 +0000878 of nonzero length. Note that this procedure also works for
Neil Booth8f9b4002003-07-29 22:26:13 +0000879 <stdin>, which is represented by the empty string. */
880static const char *
881dir_name_of_file (_cpp_file *file)
882{
883 if (!file->dir_name)
Neil Booth41947a52001-03-13 23:55:10 +0000884 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000885 size_t len = lbasename (file->path) - file->path;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000886 char *dir_name = XNEWVEC (char, len + 1);
Neil Booth8f9b4002003-07-29 22:26:13 +0000887
888 memcpy (dir_name, file->path, len);
889 dir_name[len] = '\0';
890 file->dir_name = dir_name;
Neil Booth41947a52001-03-13 23:55:10 +0000891 }
892
Neil Booth8f9b4002003-07-29 22:26:13 +0000893 return file->dir_name;
894}
895
Neil Booth8f9b4002003-07-29 22:26:13 +0000896/* Handles #include-family directives (distinguished by TYPE),
897 including HEADER, and the command line -imacros and -include.
898 Returns true if a buffer was stacked. */
899bool
900_cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
901 enum include_type type)
902{
903 struct cpp_dir *dir;
Per Bothner22234f52004-02-18 14:02:39 -0800904 _cpp_file *file;
Neil Booth8f9b4002003-07-29 22:26:13 +0000905
906 dir = search_path_head (pfile, fname, angle_brackets, type);
907 if (!dir)
908 return false;
909
James E Wilson6568f342005-10-21 10:54:20 -0700910 file = _cpp_find_file (pfile, fname, dir, false, angle_brackets);
Per Bothner22234f52004-02-18 14:02:39 -0800911
912 /* Compensate for the increment in linemap_add. In the case of a
913 normal #include, we're currently at the start of the line
914 *following* the #include. A separate source_location for this
915 location makes no sense (until we do the LC_LEAVE), and
916 complicates LAST_SOURCE_LINE_LOCATION. This does not apply if we
917 found a PCH file (in which case linemap_add is not called) or we
918 were included from the command-line. */
919 if (! file->pch && file->err_no == 0 && type != IT_CMDLINE)
920 pfile->line_table->highest_location--;
921
922 return _cpp_stack_file (pfile, file, type == IT_IMPORT);
Neil Booth8f9b4002003-07-29 22:26:13 +0000923}
924
925/* Could not open FILE. The complication is dependency output. */
926static void
James E Wilson6568f342005-10-21 10:54:20 -0700927open_file_failed (cpp_reader *pfile, _cpp_file *file, int angle_brackets)
Neil Booth8f9b4002003-07-29 22:26:13 +0000928{
Per Bothner500bee02004-04-22 19:22:27 -0700929 int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
James E Wilson6568f342005-10-21 10:54:20 -0700930 bool print_dep = CPP_OPTION (pfile, deps.style) > (angle_brackets || !!sysp);
Neil Booth8f9b4002003-07-29 22:26:13 +0000931
932 errno = file->err_no;
933 if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
Neil Boothbf42e452003-08-01 14:04:02 +0000934 deps_add_dep (pfile->deps, file->name);
Neil Booth8f9b4002003-07-29 22:26:13 +0000935 else
Zack Weinbergadd70911998-10-29 11:54:13 +0000936 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000937 /* If we are outputting dependencies but not for this file then
938 don't error because we can still produce correct output. */
939 if (CPP_OPTION (pfile, deps.style) && ! print_dep)
John David Anglin0527bc42003-11-01 22:56:54 +0000940 cpp_errno (pfile, CPP_DL_WARNING, file->path);
Neil Boothe7182662001-03-14 19:35:08 +0000941 else
John David Anglin0527bc42003-11-01 22:56:54 +0000942 cpp_errno (pfile, CPP_DL_ERROR, file->path);
Zack Weinbergd35364d2000-03-12 23:46:05 +0000943 }
Neil Booth8f9b4002003-07-29 22:26:13 +0000944}
Neil Booth591e15a2001-03-02 07:35:12 +0000945
Neil Booth8f9b4002003-07-29 22:26:13 +0000946/* Search in the chain beginning at HEAD for a file whose search path
947 started at START_DIR != NULL. */
948static struct file_hash_entry *
Zack Weinberge83d8d42004-06-26 17:39:40 +0000949search_cache (struct file_hash_entry *head, const cpp_dir *start_dir)
Neil Booth8f9b4002003-07-29 22:26:13 +0000950{
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200951 while (head && head->start_dir != start_dir)
952 head = head->next;
Neil Booth8f9b4002003-07-29 22:26:13 +0000953
Jakub Jelinekf5eab472005-08-30 08:28:21 +0200954 return head;
Neil Booth8f9b4002003-07-29 22:26:13 +0000955}
956
957/* Allocate a new _cpp_file structure. */
958static _cpp_file *
959make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
960{
961 _cpp_file *file;
962
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +0000963 file = XCNEW (_cpp_file);
Neil Booth8f9b4002003-07-29 22:26:13 +0000964 file->main_file = !pfile->buffer;
965 file->fd = -1;
966 file->dir = dir;
967 file->name = xstrdup (fname);
968
969 return file;
970}
971
Eric Botcazou1b449372004-12-15 14:31:28 +0100972/* Release a _cpp_file structure. */
973static void
974destroy_cpp_file (_cpp_file *file)
975{
976 if (file->buffer)
977 free ((void *) file->buffer);
978 free ((void *) file->name);
979 free (file);
980}
981
Tom Tromey97f6bd42007-12-06 18:56:26 +0000982/* Release all the files allocated by this reader. */
983static void
984destroy_all_cpp_files (cpp_reader *pfile)
985{
986 _cpp_file *iter = pfile->all_files;
987 while (iter)
988 {
989 _cpp_file *next = iter->next_file;
990 destroy_cpp_file (iter);
991 iter = next;
992 }
993}
994
Neil Booth8f9b4002003-07-29 22:26:13 +0000995/* A hash of directory names. The directory names are the path names
996 of files which contain a #include "", the included file name is
997 appended to this directories.
998
999 To avoid duplicate entries we follow the convention that all
1000 non-empty directory names should end in a '/'. DIR_NAME must be
1001 stored in permanently allocated memory. */
1002static cpp_dir *
1003make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
1004{
1005 struct file_hash_entry *entry, **hash_slot;
1006 cpp_dir *dir;
1007
1008 hash_slot = (struct file_hash_entry **)
Andris Pavenisa23ee062004-07-16 20:07:01 +03001009 htab_find_slot_with_hash (pfile->dir_hash, dir_name,
Per Bothnerb92be662003-12-05 22:50:53 +00001010 htab_hash_string (dir_name),
1011 INSERT);
Neil Booth8f9b4002003-07-29 22:26:13 +00001012
1013 /* Have we already hashed this directory? */
1014 for (entry = *hash_slot; entry; entry = entry->next)
1015 if (entry->start_dir == NULL)
1016 return entry->u.dir;
1017
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001018 dir = XCNEW (cpp_dir);
Neil Booth8f9b4002003-07-29 22:26:13 +00001019 dir->next = pfile->quote_include;
1020 dir->name = (char *) dir_name;
1021 dir->len = strlen (dir_name);
1022 dir->sysp = sysp;
Mike Stump94d16132004-03-04 00:18:54 +00001023 dir->construct = 0;
Neil Booth8f9b4002003-07-29 22:26:13 +00001024
1025 /* Store this new result in the hash table. */
1026 entry = new_file_hash_entry (pfile);
1027 entry->next = *hash_slot;
1028 entry->start_dir = NULL;
Tom Tromeyf1e20712007-11-12 00:38:48 +00001029 entry->location = pfile->line_table->highest_location;
Neil Booth8f9b4002003-07-29 22:26:13 +00001030 entry->u.dir = dir;
1031 *hash_slot = entry;
1032
1033 return dir;
1034}
1035
1036/* Create a new block of memory for file hash entries. */
1037static void
1038allocate_file_hash_entries (cpp_reader *pfile)
1039{
Tom Tromey97f6bd42007-12-06 18:56:26 +00001040 struct file_hash_entry_pool *pool = XNEW (struct file_hash_entry_pool);
1041 pool->file_hash_entries_used = 0;
1042 pool->next = pfile->file_hash_entries;
1043 pfile->file_hash_entries = pool;
Neil Booth8f9b4002003-07-29 22:26:13 +00001044}
1045
1046/* Return a new file hash entry. */
1047static struct file_hash_entry *
1048new_file_hash_entry (cpp_reader *pfile)
1049{
Tom Tromey97f6bd42007-12-06 18:56:26 +00001050 unsigned int idx;
1051 if (pfile->file_hash_entries->file_hash_entries_used == FILE_HASH_POOL_SIZE)
Neil Booth8f9b4002003-07-29 22:26:13 +00001052 allocate_file_hash_entries (pfile);
1053
Tom Tromey97f6bd42007-12-06 18:56:26 +00001054 idx = pfile->file_hash_entries->file_hash_entries_used++;
1055 return &pfile->file_hash_entries->pool[idx];
1056}
1057
1058/* Free the file hash entry pools. */
1059static void
1060free_file_hash_entries (cpp_reader *pfile)
1061{
1062 struct file_hash_entry_pool *iter = pfile->file_hash_entries;
1063 while (iter)
1064 {
1065 struct file_hash_entry_pool *next = iter->next;
1066 free (iter);
1067 iter = next;
1068 }
Neil Booth8f9b4002003-07-29 22:26:13 +00001069}
1070
1071/* Returns TRUE if a file FNAME has ever been successfully opened.
1072 This routine is not intended to correctly handle filenames aliased
1073 by links or redundant . or .. traversals etc. */
1074bool
1075cpp_included (cpp_reader *pfile, const char *fname)
1076{
1077 struct file_hash_entry *entry;
1078
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001079 entry = (struct file_hash_entry *)
1080 htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
Neil Booth8f9b4002003-07-29 22:26:13 +00001081
1082 while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
1083 entry = entry->next;
1084
1085 return entry != NULL;
1086}
1087
Tom Tromeyf1e20712007-11-12 00:38:48 +00001088/* Returns TRUE if a file FNAME has ever been successfully opened
1089 before LOCATION. This routine is not intended to correctly handle
1090 filenames aliased by links or redundant . or .. traversals etc. */
1091bool
1092cpp_included_before (cpp_reader *pfile, const char *fname,
1093 source_location location)
1094{
1095 struct file_hash_entry *entry;
1096
1097 entry = (struct file_hash_entry *)
1098 htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
1099
1100 while (entry && (entry->start_dir == NULL || entry->u.file->err_no
1101 || entry->location > location))
1102 entry = entry->next;
1103
1104 return entry != NULL;
1105}
1106
Kazu Hirata6614fd42003-12-21 14:08:35 +00001107/* Calculate the hash value of a file hash entry P. */
Per Bothnerb92be662003-12-05 22:50:53 +00001108
1109static hashval_t
1110file_hash_hash (const void *p)
1111{
1112 struct file_hash_entry *entry = (struct file_hash_entry *) p;
1113 const char *hname;
1114 if (entry->start_dir)
1115 hname = entry->u.file->name;
1116 else
1117 hname = entry->u.dir->name;
1118
1119 return htab_hash_string (hname);
1120}
1121
Neil Booth8f9b4002003-07-29 22:26:13 +00001122/* Compare a string Q against a file hash entry P. */
1123static int
Per Bothnerb92be662003-12-05 22:50:53 +00001124file_hash_eq (const void *p, const void *q)
Neil Booth8f9b4002003-07-29 22:26:13 +00001125{
1126 struct file_hash_entry *entry = (struct file_hash_entry *) p;
1127 const char *fname = (const char *) q;
1128 const char *hname;
1129
1130 if (entry->start_dir)
1131 hname = entry->u.file->name;
1132 else
1133 hname = entry->u.dir->name;
1134
1135 return strcmp (hname, fname) == 0;
1136}
1137
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +00001138/* Compare entries in the nonexistent file hash table. These are just
1139 strings. */
1140static int
1141nonexistent_file_hash_eq (const void *p, const void *q)
1142{
1143 return strcmp (p, q) == 0;
1144}
1145
Neil Booth8f9b4002003-07-29 22:26:13 +00001146/* Initialize everything in this source file. */
1147void
1148_cpp_init_files (cpp_reader *pfile)
1149{
Per Bothnerb92be662003-12-05 22:50:53 +00001150 pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
Neil Booth8f9b4002003-07-29 22:26:13 +00001151 NULL, xcalloc, free);
Andris Pavenisa23ee062004-07-16 20:07:01 +03001152 pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1153 NULL, xcalloc, free);
Neil Booth8f9b4002003-07-29 22:26:13 +00001154 allocate_file_hash_entries (pfile);
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +00001155 pfile->nonexistent_file_hash = htab_create_alloc (127, htab_hash_string,
1156 nonexistent_file_hash_eq,
1157 NULL, xcalloc, free);
1158 _obstack_begin (&pfile->nonexistent_file_ob, 0, 0,
1159 (void *(*) (long)) xmalloc,
1160 (void (*) (void *)) free);
Neil Booth8f9b4002003-07-29 22:26:13 +00001161}
1162
1163/* Finalize everything in this source file. */
1164void
1165_cpp_cleanup_files (cpp_reader *pfile)
1166{
1167 htab_delete (pfile->file_hash);
Andris Pavenisa23ee062004-07-16 20:07:01 +03001168 htab_delete (pfile->dir_hash);
Ian Lance Taylor0b4cafe2007-05-21 23:43:53 +00001169 htab_delete (pfile->nonexistent_file_hash);
1170 obstack_free (&pfile->nonexistent_file_ob, 0);
Tom Tromey97f6bd42007-12-06 18:56:26 +00001171 free_file_hash_entries (pfile);
1172 destroy_all_cpp_files (pfile);
1173}
1174
1175/* Make the parser forget about files it has seen. This can be useful
1176 for resetting the parser to start another run. */
1177void
1178cpp_clear_file_cache (cpp_reader *pfile)
1179{
1180 _cpp_cleanup_files (pfile);
1181 pfile->file_hash_entries = NULL;
1182 pfile->all_files = NULL;
1183 _cpp_init_files (pfile);
Neil Booth8f9b4002003-07-29 22:26:13 +00001184}
1185
1186/* Enter a file name in the hash for the sake of cpp_included. */
1187void
1188_cpp_fake_include (cpp_reader *pfile, const char *fname)
1189{
James E Wilson6568f342005-10-21 10:54:20 -07001190 _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true, 0);
Zack Weinbergadd70911998-10-29 11:54:13 +00001191}
1192
Zack Weinberge605b042000-06-21 23:08:17 +00001193/* Not everyone who wants to set system-header-ness on a buffer can
Neil Booth642ce432000-12-07 23:17:56 +00001194 see the details of a buffer. This is an exported interface because
1195 fix-header needs it. */
Zack Weinberge605b042000-06-21 23:08:17 +00001196void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001197cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
Zack Weinberge605b042000-06-21 23:08:17 +00001198{
Neil Booth614c7d32000-12-04 07:32:04 +00001199 int flags = 0;
Per Bothner500bee02004-04-22 19:22:27 -07001200 const struct line_maps *line_table = pfile->line_table;
1201 const struct line_map *map = &line_table->maps[line_table->used-1];
Neil Booth614c7d32000-12-04 07:32:04 +00001202
1203 /* 1 = system header, 2 = system header to be treated as C. */
1204 if (syshdr)
1205 flags = 1 + (externc != 0);
Per Bothner12f9df42004-02-11 07:29:30 -08001206 pfile->buffer->sysp = flags;
1207 _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
Per Bothner500bee02004-04-22 19:22:27 -07001208 SOURCE_LINE (map, pfile->line_table->highest_line), flags);
Zack Weinberge605b042000-06-21 23:08:17 +00001209}
1210
Per Bothnerb4e46ce2003-03-20 16:46:18 +00001211/* Allow the client to change the current file. Used by the front end
1212 to achieve pseudo-file names like <built-in>.
1213 If REASON is LC_LEAVE, then NEW_NAME must be NULL. */
Neil Boothc19b12c2003-03-12 21:31:51 +00001214void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001215cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1216 const char *new_name)
Neil Boothc19b12c2003-03-12 21:31:51 +00001217{
Per Bothnerb4e46ce2003-03-20 16:46:18 +00001218 _cpp_do_file_change (pfile, reason, new_name, 1, 0);
Neil Boothc19b12c2003-03-12 21:31:51 +00001219}
1220
Neil Booth8f9b4002003-07-29 22:26:13 +00001221/* Callback function for htab_traverse. */
1222static int
1223report_missing_guard (void **slot, void *b)
1224{
1225 struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
1226 int *bannerp = (int *) b;
1227
1228 /* Skip directories. */
1229 if (entry->start_dir != NULL)
1230 {
1231 _cpp_file *file = entry->u.file;
1232
1233 /* We don't want MI guard advice for the main file. */
1234 if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
1235 {
1236 if (*bannerp == 0)
1237 {
1238 fputs (_("Multiple include guards may be useful for:\n"),
1239 stderr);
1240 *bannerp = 1;
1241 }
1242
1243 fputs (entry->u.file->path, stderr);
1244 putc ('\n', stderr);
1245 }
1246 }
1247
1248 return 0;
1249}
1250
Zack Weinbergc71f8352000-07-05 05:33:57 +00001251/* Report on all files that might benefit from a multiple include guard.
1252 Triggered by -H. */
1253void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001254_cpp_report_missing_guards (cpp_reader *pfile)
Zack Weinbergc71f8352000-07-05 05:33:57 +00001255{
1256 int banner = 0;
Zack Weinbergc71f8352000-07-05 05:33:57 +00001257
Neil Booth8f9b4002003-07-29 22:26:13 +00001258 htab_traverse (pfile->file_hash, report_missing_guard, &banner);
Zack Weinbergc31a6502000-06-21 18:33:51 +00001259}
1260
Neil Booth41947a52001-03-13 23:55:10 +00001261/* Locate HEADER, and determine whether it is newer than the current
Martin Schaffner48c47212003-06-25 23:01:10 +02001262 file. If it cannot be located or dated, return -1, if it is
Neil Booth41947a52001-03-13 23:55:10 +00001263 newer, return 1, otherwise 0. */
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001264int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001265_cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1266 int angle_brackets)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001267{
Neil Booth8f9b4002003-07-29 22:26:13 +00001268 _cpp_file *file;
1269 struct cpp_dir *dir;
Kazu Hiratadf383482002-05-22 22:02:16 +00001270
Neil Booth8f9b4002003-07-29 22:26:13 +00001271 dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1272 if (!dir)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001273 return -1;
Neil Booth41947a52001-03-13 23:55:10 +00001274
James E Wilson6568f342005-10-21 10:54:20 -07001275 file = _cpp_find_file (pfile, fname, dir, false, angle_brackets);
Neil Booth8f9b4002003-07-29 22:26:13 +00001276 if (file->err_no)
1277 return -1;
1278
1279 if (file->fd != -1)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001280 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001281 close (file->fd);
1282 file->fd = -1;
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001283 }
Kazu Hiratadf383482002-05-22 22:02:16 +00001284
Neil Booth8f9b4002003-07-29 22:26:13 +00001285 return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
Zack Weinbergc31a6502000-06-21 18:33:51 +00001286}
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +00001287
Neil Boothc19b12c2003-03-12 21:31:51 +00001288/* Pushes the given file onto the buffer stack. Returns nonzero if
1289 successful. */
1290bool
Neil Booth8f9b4002003-07-29 22:26:13 +00001291cpp_push_include (cpp_reader *pfile, const char *fname)
Neil Boothc19b12c2003-03-12 21:31:51 +00001292{
Neil Booth8f9b4002003-07-29 22:26:13 +00001293 return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
Neil Boothc19b12c2003-03-12 21:31:51 +00001294}
1295
Neil Booth5d8ebbd2002-01-03 21:43:09 +00001296/* Do appropriate cleanup when a file INC's buffer is popped off the
Neil Boothaf0d16c2002-04-22 17:48:02 +00001297 input stack. */
1298void
Neil Booth8f9b4002003-07-29 22:26:13 +00001299_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
Zack Weinbergf9a0e962000-07-13 02:32:41 +00001300{
Neil Boothba133c92001-03-15 07:57:13 +00001301 /* Record the inclusion-preventing macro, which could be NULL
Neil Booth6d18adb2001-07-29 17:27:57 +00001302 meaning no controlling macro. */
Neil Booth8f9b4002003-07-29 22:26:13 +00001303 if (pfile->mi_valid && file->cmacro == NULL)
1304 file->cmacro = pfile->mi_cmacro;
Neil Booth93c803682000-10-28 17:59:06 +00001305
1306 /* Invalidate control macros in the #including file. */
Neil Booth6d18adb2001-07-29 17:27:57 +00001307 pfile->mi_valid = false;
Neil Booth93c803682000-10-28 17:59:06 +00001308
Neil Booth8f9b4002003-07-29 22:26:13 +00001309 if (file->buffer)
Neil Booth591e15a2001-03-02 07:35:12 +00001310 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001311 free ((void *) file->buffer);
1312 file->buffer = NULL;
James E Wilson5571f742005-11-03 18:10:19 -08001313 file->buffer_valid = false;
Neil Boothba133c92001-03-15 07:57:13 +00001314 }
Neil Booth591e15a2001-03-02 07:35:12 +00001315}
1316
Grigory Zagorodnevbe8ac3e2006-02-18 09:25:31 +00001317/* Inteface to file statistics record in _cpp_file structure. */
1318struct stat *
1319_cpp_get_file_stat (_cpp_file *file)
1320{
1321 return &file->st;
1322}
1323
Neil Booth8f9b4002003-07-29 22:26:13 +00001324/* Set the include chain for "" to QUOTE, for <> to BRACKET. If
1325 QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1326 directory of the including file.
Zack Weinbergadd70911998-10-29 11:54:13 +00001327
Neil Booth8f9b4002003-07-29 22:26:13 +00001328 If BRACKET does not lie in the QUOTE chain, it is set to QUOTE. */
1329void
1330cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1331 int quote_ignores_source_dir)
1332{
1333 pfile->quote_include = quote;
1334 pfile->bracket_include = quote;
1335 pfile->quote_ignores_source_dir = quote_ignores_source_dir;
1336
1337 for (; quote; quote = quote->next)
1338 {
1339 quote->name_map = NULL;
1340 quote->len = strlen (quote->name);
1341 if (quote == bracket)
1342 pfile->bracket_include = bracket;
1343 }
1344}
1345
1346/* Append the file name to the directory to create the path, but don't
1347 turn / into // or // into ///; // may be a namespace escape. */
1348static char *
1349append_file_to_dir (const char *fname, cpp_dir *dir)
1350{
1351 size_t dlen, flen;
1352 char *path;
1353
1354 dlen = dir->len;
1355 flen = strlen (fname);
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001356 path = XNEWVEC (char, dlen + 1 + flen + 1);
Neil Booth8f9b4002003-07-29 22:26:13 +00001357 memcpy (path, dir->name, dlen);
1358 if (dlen && path[dlen - 1] != '/')
1359 path[dlen++] = '/';
1360 memcpy (&path[dlen], fname, flen + 1);
1361
1362 return path;
1363}
Zack Weinbergadd70911998-10-29 11:54:13 +00001364
1365/* Read a space delimited string of unlimited length from a stdio
Neil Booth5d8ebbd2002-01-03 21:43:09 +00001366 file F. */
Zack Weinbergadd70911998-10-29 11:54:13 +00001367static char *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001368read_filename_string (int ch, FILE *f)
Zack Weinbergadd70911998-10-29 11:54:13 +00001369{
1370 char *alloc, *set;
1371 int len;
1372
1373 len = 20;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001374 set = alloc = XNEWVEC (char, len + 1);
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001375 if (! is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001376 {
1377 *set++ = ch;
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001378 while ((ch = getc (f)) != EOF && ! is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001379 {
1380 if (set - alloc == len)
1381 {
1382 len *= 2;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001383 alloc = XRESIZEVEC (char, alloc, len + 1);
Zack Weinbergadd70911998-10-29 11:54:13 +00001384 set = alloc + len / 2;
1385 }
1386 *set++ = ch;
1387 }
1388 }
1389 *set = '\0';
1390 ungetc (ch, f);
1391 return alloc;
1392}
1393
Neil Booth8f9b4002003-07-29 22:26:13 +00001394/* Read the file name map file for DIR. */
1395static void
1396read_name_map (cpp_dir *dir)
Zack Weinbergadd70911998-10-29 11:54:13 +00001397{
Neil Booth8f9b4002003-07-29 22:26:13 +00001398 static const char FILE_NAME_MAP_FILE[] = "header.gcc";
Zack Weinbergadd70911998-10-29 11:54:13 +00001399 char *name;
1400 FILE *f;
Neil Booth8f9b4002003-07-29 22:26:13 +00001401 size_t len, count = 0, room = 9;
Zack Weinbergadd70911998-10-29 11:54:13 +00001402
Neil Booth8f9b4002003-07-29 22:26:13 +00001403 len = dir->len;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001404 name = (char *) alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
Neil Booth8f9b4002003-07-29 22:26:13 +00001405 memcpy (name, dir->name, len);
1406 if (len && name[len - 1] != '/')
1407 name[len++] = '/';
1408 strcpy (name + len, FILE_NAME_MAP_FILE);
Zack Weinbergadd70911998-10-29 11:54:13 +00001409 f = fopen (name, "r");
Neil Booth8767c892000-12-13 19:20:14 +00001410
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001411 dir->name_map = XNEWVEC (const char *, room);
Neil Booth8f9b4002003-07-29 22:26:13 +00001412
Neil Booth8767c892000-12-13 19:20:14 +00001413 /* Silently return NULL if we cannot open. */
1414 if (f)
Zack Weinbergadd70911998-10-29 11:54:13 +00001415 {
1416 int ch;
Zack Weinbergadd70911998-10-29 11:54:13 +00001417
1418 while ((ch = getc (f)) != EOF)
1419 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001420 char *to;
Zack Weinbergadd70911998-10-29 11:54:13 +00001421
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001422 if (is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001423 continue;
Neil Booth8f9b4002003-07-29 22:26:13 +00001424
1425 if (count + 2 > room)
1426 {
1427 room += 8;
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001428 dir->name_map = XRESIZEVEC (const char *, dir->name_map, room);
Neil Booth8f9b4002003-07-29 22:26:13 +00001429 }
1430
1431 dir->name_map[count] = read_filename_string (ch, f);
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001432 while ((ch = getc (f)) != EOF && is_hspace (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001433 ;
Neil Booth8f9b4002003-07-29 22:26:13 +00001434
Zack Weinbergadd70911998-10-29 11:54:13 +00001435 to = read_filename_string (ch, f);
Zack Weinberg3dce1402003-07-03 04:24:01 +00001436 if (IS_ABSOLUTE_PATH (to))
Neil Booth8f9b4002003-07-29 22:26:13 +00001437 dir->name_map[count + 1] = to;
Zack Weinbergadd70911998-10-29 11:54:13 +00001438 else
1439 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001440 dir->name_map[count + 1] = append_file_to_dir (to, dir);
Zack Weinbergadd70911998-10-29 11:54:13 +00001441 free (to);
Kazu Hiratadf383482002-05-22 22:02:16 +00001442 }
Zack Weinbergadd70911998-10-29 11:54:13 +00001443
Neil Booth8f9b4002003-07-29 22:26:13 +00001444 count += 2;
Zack Weinbergadd70911998-10-29 11:54:13 +00001445 while ((ch = getc (f)) != '\n')
1446 if (ch == EOF)
1447 break;
1448 }
Neil Booth8f9b4002003-07-29 22:26:13 +00001449
Zack Weinbergadd70911998-10-29 11:54:13 +00001450 fclose (f);
1451 }
Kazu Hiratadf383482002-05-22 22:02:16 +00001452
Neil Booth8f9b4002003-07-29 22:26:13 +00001453 /* Terminate the list of maps. */
1454 dir->name_map[count] = NULL;
Kazu Hiratadf383482002-05-22 22:02:16 +00001455}
Zack Weinbergadd70911998-10-29 11:54:13 +00001456
Neil Booth8f9b4002003-07-29 22:26:13 +00001457/* Remap a FILE's name based on the file_name_map, if any, for
1458 FILE->dir. If the file name has any directory separators,
1459 recursively check those directories too. */
Zack Weinberg0b3d7761998-11-25 11:56:54 +00001460static char *
Neil Booth8f9b4002003-07-29 22:26:13 +00001461remap_filename (cpp_reader *pfile, _cpp_file *file)
Zack Weinbergadd70911998-10-29 11:54:13 +00001462{
Neil Booth8f9b4002003-07-29 22:26:13 +00001463 const char *fname, *p;
1464 char *new_dir;
1465 cpp_dir *dir;
1466 size_t index, len;
Zack Weinberg0b3d7761998-11-25 11:56:54 +00001467
Neil Booth8f9b4002003-07-29 22:26:13 +00001468 dir = file->dir;
1469 fname = file->name;
Neil Boothe7182662001-03-14 19:35:08 +00001470
Neil Booth986b1f12003-03-02 17:44:18 +00001471 for (;;)
1472 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001473 if (!dir->name_map)
1474 read_name_map (dir);
Neil Booth986b1f12003-03-02 17:44:18 +00001475
Neil Booth8f9b4002003-07-29 22:26:13 +00001476 for (index = 0; dir->name_map[index]; index += 2)
1477 if (!strcmp (dir->name_map[index], fname))
1478 return xstrdup (dir->name_map[index + 1]);
Neil Booth986b1f12003-03-02 17:44:18 +00001479
Neil Booth8f9b4002003-07-29 22:26:13 +00001480 p = strchr (fname, '/');
1481 if (!p || p == fname)
1482 return NULL;
Neil Booth986b1f12003-03-02 17:44:18 +00001483
Neil Booth8f9b4002003-07-29 22:26:13 +00001484 len = dir->len + (p - fname + 1);
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001485 new_dir = XNEWVEC (char, len + 1);
Neil Booth8f9b4002003-07-29 22:26:13 +00001486 memcpy (new_dir, dir->name, dir->len);
1487 memcpy (new_dir + dir->len, fname, p - fname + 1);
1488 new_dir[len] = '\0';
1489
1490 dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1491 fname = p + 1;
1492 }
1493}
1494
Neil Booth8f9b4002003-07-29 22:26:13 +00001495/* Returns true if PCHNAME is a valid PCH file for FILE. */
1496static bool
1497validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
1498{
1499 const char *saved_path = file->path;
Phil Edwards230fcd32003-09-25 04:46:44 +00001500 bool valid = false;
Neil Booth8f9b4002003-07-29 22:26:13 +00001501
1502 file->path = pchname;
1503 if (open_file (file))
1504 {
Phil Edwards230fcd32003-09-25 04:46:44 +00001505 valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
Neil Booth8f9b4002003-07-29 22:26:13 +00001506
Phil Edwards230fcd32003-09-25 04:46:44 +00001507 if (!valid)
Neil Booth986b1f12003-03-02 17:44:18 +00001508 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001509 close (file->fd);
1510 file->fd = -1;
Neil Booth986b1f12003-03-02 17:44:18 +00001511 }
1512
Neil Booth8f9b4002003-07-29 22:26:13 +00001513 if (CPP_OPTION (pfile, print_include_names))
1514 {
1515 unsigned int i;
Per Bothner54020b22004-01-19 23:35:21 -08001516 for (i = 1; i < pfile->line_table->depth; i++)
Neil Booth8f9b4002003-07-29 22:26:13 +00001517 putc ('.', stderr);
1518 fprintf (stderr, "%c %s\n",
Phil Edwards230fcd32003-09-25 04:46:44 +00001519 valid ? '!' : 'x', pchname);
Neil Booth8f9b4002003-07-29 22:26:13 +00001520 }
Neil Booth986b1f12003-03-02 17:44:18 +00001521 }
1522
Neil Booth8f9b4002003-07-29 22:26:13 +00001523 file->path = saved_path;
Phil Edwards230fcd32003-09-25 04:46:44 +00001524 return valid;
Neil Booth986b1f12003-03-02 17:44:18 +00001525}
Mike Stump94d16132004-03-04 00:18:54 +00001526
1527/* Get the path associated with the _cpp_file F. The path includes
1528 the base name from the include directive and the directory it was
1529 found in via the search path. */
1530
1531const char *
1532cpp_get_path (struct _cpp_file *f)
1533{
1534 return f->path;
1535}
1536
Mike Stumpe3c287c2004-05-05 18:25:52 +00001537/* Get the directory associated with the _cpp_file F. */
1538
1539cpp_dir *
1540cpp_get_dir (struct _cpp_file *f)
1541{
1542 return f->dir;
1543}
1544
Mike Stump94d16132004-03-04 00:18:54 +00001545/* Get the cpp_buffer currently associated with the cpp_reader
1546 PFILE. */
1547
1548cpp_buffer *
1549cpp_get_buffer (cpp_reader *pfile)
1550{
1551 return pfile->buffer;
1552}
1553
1554/* Get the _cpp_file associated with the cpp_buffer B. */
1555
1556_cpp_file *
1557cpp_get_file (cpp_buffer *b)
1558{
1559 return b->file;
1560}
1561
1562/* Get the previous cpp_buffer given a cpp_buffer B. The previous
1563 buffer is the buffer that included the given buffer. */
1564
1565cpp_buffer *
1566cpp_get_prev (cpp_buffer *b)
1567{
1568 return b->prev;
1569}
Geoffrey Keating73e61092004-01-17 00:37:47 +00001570
Kazu Hirata1ae58c32004-04-30 16:27:30 +00001571/* This data structure holds the list of header files that were seen
Geoffrey Keating73e61092004-01-17 00:37:47 +00001572 while the PCH was being built. The 'entries' field is kept sorted
1573 in memcmp() order; yes, this means that on little-endian systems,
1574 it's sorted initially by the least-significant byte of 'size', but
1575 that's OK. The code does rely on having entries with the same size
1576 next to each other. */
1577
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001578struct pchf_entry {
1579 /* The size of this file. This is used to save running a MD5 checksum
1580 if the sizes don't match. */
1581 off_t size;
1582 /* The MD5 checksum of this file. */
1583 unsigned char sum[16];
1584 /* Is this file to be included only once? */
1585 bool once_only;
1586};
1587
Geoffrey Keating73e61092004-01-17 00:37:47 +00001588struct pchf_data {
1589 /* Number of pchf_entry structures. */
1590 size_t count;
1591
1592 /* Are there any values with once_only set?
1593 This is used as an optimisation, it means we don't have to search
1594 the structure if we're processing a regular #include. */
1595 bool have_once_only;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001596
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001597 struct pchf_entry entries[1];
Geoffrey Keating73e61092004-01-17 00:37:47 +00001598};
1599
1600static struct pchf_data *pchf;
1601
Geoffrey Keating73e61092004-01-17 00:37:47 +00001602/* A qsort ordering function for pchf_entry structures. */
1603
1604static int
1605pchf_save_compare (const void *e1, const void *e2)
1606{
1607 return memcmp (e1, e2, sizeof (struct pchf_entry));
1608}
1609
1610/* Create and write to F a pchf_data structure. */
1611
1612bool
Mike Stumpecddfb32005-02-09 01:23:56 +00001613_cpp_save_file_entries (cpp_reader *pfile, FILE *fp)
Geoffrey Keating73e61092004-01-17 00:37:47 +00001614{
1615 size_t count = 0;
1616 struct pchf_data *result;
1617 size_t result_size;
Mike Stumpecddfb32005-02-09 01:23:56 +00001618 _cpp_file *f;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001619
Mike Stumpecddfb32005-02-09 01:23:56 +00001620 for (f = pfile->all_files; f; f = f->next_file)
1621 ++count;
1622
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001623 result_size = (sizeof (struct pchf_data)
Geoffrey Keating73e61092004-01-17 00:37:47 +00001624 + sizeof (struct pchf_entry) * (count - 1));
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001625 result = XCNEWVAR (struct pchf_data, result_size);
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001626
Geoffrey Keating73e61092004-01-17 00:37:47 +00001627 result->count = 0;
1628 result->have_once_only = false;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001629
Mike Stumpecddfb32005-02-09 01:23:56 +00001630 for (f = pfile->all_files; f; f = f->next_file)
1631 {
1632 size_t count;
1633
1634 /* This should probably never happen, since if a read error occurred
1635 the PCH file shouldn't be written... */
1636 if (f->dont_read || f->err_no)
1637 continue;
1638
1639 if (f->stack_count == 0)
1640 continue;
1641
1642 count = result->count++;
1643
1644 result->entries[count].once_only = f->once_only;
1645 /* |= is avoided in the next line because of an HP C compiler bug */
1646 result->have_once_only = result->have_once_only | f->once_only;
1647 if (f->buffer_valid)
1648 md5_buffer ((const char *)f->buffer,
1649 f->st.st_size, result->entries[count].sum);
1650 else
1651 {
1652 FILE *ff;
1653 int oldfd = f->fd;
1654
1655 if (!open_file (f))
1656 {
James E Wilson6568f342005-10-21 10:54:20 -07001657 open_file_failed (pfile, f, 0);
Mike Stumpecddfb32005-02-09 01:23:56 +00001658 return false;
1659 }
1660 ff = fdopen (f->fd, "rb");
1661 md5_stream (ff, result->entries[count].sum);
1662 fclose (ff);
1663 f->fd = oldfd;
1664 }
1665 result->entries[count].size = f->st.st_size;
1666 }
Geoffrey Keating73e61092004-01-17 00:37:47 +00001667
1668 result_size = (sizeof (struct pchf_data)
1669 + sizeof (struct pchf_entry) * (result->count - 1));
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001670
Geoffrey Keating73e61092004-01-17 00:37:47 +00001671 qsort (result->entries, result->count, sizeof (struct pchf_entry),
1672 pchf_save_compare);
1673
Mike Stumpecddfb32005-02-09 01:23:56 +00001674 return fwrite (result, result_size, 1, fp) == 1;
Geoffrey Keating73e61092004-01-17 00:37:47 +00001675}
1676
1677/* Read the pchf_data structure from F. */
1678
1679bool
1680_cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1681{
1682 struct pchf_data d;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001683
Geoffrey Keating73e61092004-01-17 00:37:47 +00001684 if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1685 != 1)
1686 return false;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001687
Gabriel Dos Reisc3f829c2005-05-28 15:52:48 +00001688 pchf = XNEWVAR (struct pchf_data, sizeof (struct pchf_data)
Geoffrey Keating73e61092004-01-17 00:37:47 +00001689 + sizeof (struct pchf_entry) * (d.count - 1));
1690 memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1691 if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1692 != d.count)
1693 return false;
1694 return true;
1695}
1696
1697/* The parameters for pchf_compare. */
1698
1699struct pchf_compare_data
1700{
1701 /* The size of the file we're looking for. */
1702 off_t size;
1703
1704 /* The MD5 checksum of the file, if it's been computed. */
1705 unsigned char sum[16];
1706
1707 /* Is SUM valid? */
1708 bool sum_computed;
1709
1710 /* Do we need to worry about entries that don't have ONCE_ONLY set? */
1711 bool check_included;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001712
Geoffrey Keating73e61092004-01-17 00:37:47 +00001713 /* The file that we're searching for. */
1714 _cpp_file *f;
1715};
1716
1717/* bsearch comparison function; look for D_P in E_P. */
1718
1719static int
1720pchf_compare (const void *d_p, const void *e_p)
1721{
1722 const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1723 struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1724 int result;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001725
Geoffrey Keating73e61092004-01-17 00:37:47 +00001726 result = memcmp (&d->size, &e->size, sizeof (off_t));
1727 if (result != 0)
1728 return result;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001729
Geoffrey Keating73e61092004-01-17 00:37:47 +00001730 if (! d->sum_computed)
1731 {
1732 _cpp_file *const f = d->f;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001733
Geoffrey Keating73e61092004-01-17 00:37:47 +00001734 md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1735 d->sum_computed = true;
1736 }
1737
1738 result = memcmp (d->sum, e->sum, 16);
1739 if (result != 0)
1740 return result;
1741
1742 if (d->check_included || e->once_only)
1743 return 0;
1744 else
1745 return 1;
1746}
1747
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001748/* Check that F is not in a list read from a PCH file (if any).
Geoffrey Keating73e61092004-01-17 00:37:47 +00001749 Assumes that f->buffer_valid is true. Return TRUE if the file
1750 should not be read. */
1751
1752static bool
1753check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1754 _cpp_file *f,
1755 bool check_included)
1756{
1757 struct pchf_compare_data d;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001758
Geoffrey Keating73e61092004-01-17 00:37:47 +00001759 if (pchf == NULL
1760 || (! check_included && ! pchf->have_once_only))
1761 return false;
1762
1763 d.size = f->st.st_size;
1764 d.sum_computed = false;
1765 d.f = f;
1766 d.check_included = check_included;
1767 return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1768 pchf_compare) != NULL;
1769}