blob: 7d7b271da0ec7d37e98c888b4598d55fe90a12ed [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,
Geoffrey Keating73e61092004-01-17 00:37:47 +00003 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Zack Weinbergadd70911998-10-29 11:54:13 +00004 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
Neil Booth8f9b4002003-07-29 22:26:13 +00008 Reimplemented, Neil Booth, Jul 2003
Zack Weinbergadd70911998-10-29 11:54:13 +00009
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
Richard Kennere38992e2000-04-18 20:42:00 +000022Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
Zack Weinbergadd70911998-10-29 11:54:13 +000023
24#include "config.h"
25#include "system.h"
Zack Weinbergadd70911998-10-29 11:54:13 +000026#include "cpplib.h"
Paolo Bonzini4f4e53dd2004-05-24 10:50:45 +000027#include "internal.h"
Zack Weinberg168d3732000-03-14 06:34:11 +000028#include "mkdeps.h"
Neil Boothbf42e452003-08-01 14:04:02 +000029#include "hashtab.h"
Geoffrey Keating73e61092004-01-17 00:37:47 +000030#include "md5.h"
Neil Booth8f9b4002003-07-29 22:26:13 +000031#include <dirent.h>
Neil Booth642ce432000-12-07 23:17:56 +000032
Douglas B Ruppae1139f2001-11-21 17:03:27 -050033/* Variable length record files on VMS will have a stat size that includes
Kazu Hirata3ef42a02002-01-18 13:40:36 +000034 record control characters that won't be included in the read size. */
Douglas B Ruppae1139f2001-11-21 17:03:27 -050035#ifdef VMS
36# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
Neil Booth8f9b4002003-07-29 22:26:13 +000037# define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
Douglas B Ruppae1139f2001-11-21 17:03:27 -050038#else
Neil Booth8f9b4002003-07-29 22:26:13 +000039# define STAT_SIZE_RELIABLE(ST) true
Douglas B Ruppae1139f2001-11-21 17:03:27 -050040#endif
41
Neil Booth8f9b4002003-07-29 22:26:13 +000042#ifdef __DJGPP__
43 /* For DJGPP redirected input is opened in text mode. */
44# define set_stdin_to_binary_mode() \
45 if (! isatty (0)) setmode (0, O_BINARY)
46#else
47# define set_stdin_to_binary_mode() /* Nothing */
48#endif
Neil Booth28e0f042000-12-09 12:06:37 +000049
Neil Booth8f9b4002003-07-29 22:26:13 +000050/* This structure represents a file searched for by CPP, whether it
51 exists or not. An instance may be pointed to by more than one
52 file_hash_entry; at present no reference count is kept. */
Neil Booth8f9b4002003-07-29 22:26:13 +000053struct _cpp_file
Zack Weinbergd35364d2000-03-12 23:46:05 +000054{
Neil Booth8f9b4002003-07-29 22:26:13 +000055 /* Filename as given to #include or command line switch. */
56 const char *name;
Zack Weinberg0b3d7761998-11-25 11:56:54 +000057
Neil Booth8f9b4002003-07-29 22:26:13 +000058 /* The full path used to find the file. */
59 const char *path;
60
61 /* The full path of the pch file. */
62 const char *pchname;
63
Neil Boothbf42e452003-08-01 14:04:02 +000064 /* The file's path with the basename stripped. NULL if it hasn't
65 been calculated yet. */
Neil Booth8f9b4002003-07-29 22:26:13 +000066 const char *dir_name;
67
Neil Booth49634b32003-08-02 16:29:46 +000068 /* Chain through all files. */
69 struct _cpp_file *next_file;
Neil Booth8f9b4002003-07-29 22:26:13 +000070
71 /* The contents of NAME after calling read_file(). */
72 const uchar *buffer;
73
74 /* The macro, if any, preventing re-inclusion. */
75 const cpp_hashnode *cmacro;
76
77 /* The directory in the search path where FILE was found. Used for
78 #include_next and determining whether a header is a system
Neil Boothbf42e452003-08-01 14:04:02 +000079 header. */
Neil Booth8f9b4002003-07-29 22:26:13 +000080 cpp_dir *dir;
81
82 /* As filled in by stat(2) for the file. */
83 struct stat st;
84
85 /* File descriptor. Invalid if -1, otherwise open. */
86 int fd;
87
88 /* Zero if this file was successfully opened and stat()-ed,
89 otherwise errno obtained from failure. */
90 int err_no;
91
92 /* Number of times the file has been stacked for preprocessing. */
93 unsigned short stack_count;
94
Neil Booth49634b32003-08-02 16:29:46 +000095 /* If opened with #import or contains #pragma once. */
96 bool once_only;
Neil Booth8f9b4002003-07-29 22:26:13 +000097
98 /* If read() failed before. */
99 bool dont_read;
100
101 /* If this file is the main file. */
102 bool main_file;
103
104 /* If BUFFER above contains the true contents of the file. */
105 bool buffer_valid;
106
Kazu Hirataa1105612004-02-27 07:09:43 +0000107 /* File is a PCH (on return from find_include_file). */
Per Bothner22234f52004-02-18 14:02:39 -0800108 bool pch;
Neil Booth8f9b4002003-07-29 22:26:13 +0000109};
110
111/* A singly-linked list for all searches for a given file name, with
112 its head pointed to by a slot in FILE_HASH. The file name is what
113 appeared between the quotes in a #include directive; it can be
Kazu Hirataa98ebe22003-08-19 23:22:00 +0000114 determined implicitly from the hash table location or explicitly
Neil Boothbf42e452003-08-01 14:04:02 +0000115 from FILE->name.
Neil Booth8f9b4002003-07-29 22:26:13 +0000116
117 FILE is a structure containing details about the file that was
118 found with that search, or details of how the search failed.
119
120 START_DIR is the starting location of the search in the include
121 chain. The current directories for "" includes are also hashed in
Neil Boothbf42e452003-08-01 14:04:02 +0000122 the hash table and therefore unique. Files that are looked up
123 without using a search path, such as absolute filenames and file
124 names from the command line share a special starting directory so
125 they don't cause cache hits with normal include-chain lookups.
Neil Booth8f9b4002003-07-29 22:26:13 +0000126
127 If START_DIR is NULL then the entry is for a directory, not a file,
128 and the directory is in DIR. Since the starting point in a file
129 lookup chain is never NULL, this means that simple pointer
130 comparisons against START_DIR can be made to determine cache hits
131 in file lookups.
Neil Boothbf42e452003-08-01 14:04:02 +0000132
133 If a cache lookup fails because of e.g. an extra "./" in the path,
134 then nothing will break. It is just less efficient as CPP will
135 have to do more work re-preprocessing the file, and/or comparing
136 its contents against earlier once-only files.
Neil Booth8f9b4002003-07-29 22:26:13 +0000137*/
138struct file_hash_entry
Zack Weinbergc71f8352000-07-05 05:33:57 +0000139{
Neil Booth8f9b4002003-07-29 22:26:13 +0000140 struct file_hash_entry *next;
141 cpp_dir *start_dir;
142 union
143 {
144 _cpp_file *file;
145 cpp_dir *dir;
146 } u;
147};
Zack Weinbergc71f8352000-07-05 05:33:57 +0000148
Neil Booth8f9b4002003-07-29 22:26:13 +0000149static bool open_file (_cpp_file *file);
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000150static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
151 bool *invalid_pch);
152static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
153 bool *invalid_pch);
Neil Booth8f9b4002003-07-29 22:26:13 +0000154static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
155static bool read_file (cpp_reader *pfile, _cpp_file *file);
Neil Boothcf1ee302003-08-02 12:44:27 +0000156static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
Neil Booth8f9b4002003-07-29 22:26:13 +0000157static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
158 int angle_brackets, enum include_type);
159static const char *dir_name_of_file (_cpp_file *file);
160static void open_file_failed (cpp_reader *pfile, _cpp_file *file);
161static struct file_hash_entry *search_cache (struct file_hash_entry *head,
162 const cpp_dir *start_dir);
163static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
164static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
165static void allocate_file_hash_entries (cpp_reader *pfile);
166static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
167static int report_missing_guard (void **slot, void *b);
Per Bothnerb92be662003-12-05 22:50:53 +0000168static hashval_t file_hash_hash (const void *p);
169static int file_hash_eq (const void *p, const void *q);
Neil Booth8f9b4002003-07-29 22:26:13 +0000170static char *read_filename_string (int ch, FILE *f);
171static void read_name_map (cpp_dir *dir);
172static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
173static char *append_file_to_dir (const char *fname, cpp_dir *dir);
174static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
Geoffrey Keating73e61092004-01-17 00:37:47 +0000175static int pchf_adder (void **slot, void *data);
176static int pchf_save_compare (const void *e1, const void *e2);
177static int pchf_compare (const void *d_p, const void *e_p);
178static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
Neil Booth8f9b4002003-07-29 22:26:13 +0000179
180/* Given a filename in FILE->PATH, with the empty string interpreted
181 as <stdin>, open it.
182
183 On success FILE contains an open file descriptor and stat
184 information for the file. On failure the file descriptor is -1 and
185 the appropriate errno is also stored in FILE. Returns TRUE iff
186 successful.
187
188 We used to open files in nonblocking mode, but that caused more
189 problems than it solved. Do take care not to acquire a controlling
190 terminal by mistake (this can't happen on sane systems, but
191 paranoia is a virtue).
192
193 Use the three-argument form of open even though we aren't
194 specifying O_CREAT, to defend against broken system headers.
195
196 O_BINARY tells some runtime libraries (notably DJGPP) not to do
197 newline translation; we can handle DOS line breaks just fine
198 ourselves. */
199static bool
200open_file (_cpp_file *file)
Neil Bootha36c54f2001-03-12 19:33:08 +0000201{
Neil Booth8f9b4002003-07-29 22:26:13 +0000202 if (file->path[0] == '\0')
Andris Pavenis85be8c22002-05-13 23:28:28 +0300203 {
204 file->fd = 0;
Neil Booth8f9b4002003-07-29 22:26:13 +0000205 set_stdin_to_binary_mode ();
Andris Pavenis85be8c22002-05-13 23:28:28 +0300206 }
Zack Weinbergc31a6502000-06-21 18:33:51 +0000207 else
Neil Booth8f9b4002003-07-29 22:26:13 +0000208 file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
Zack Weinbergd4506962000-06-28 19:03:08 +0000209
Neil Booth8f9b4002003-07-29 22:26:13 +0000210 if (file->fd != -1)
Neil Booth2047e262000-09-21 18:01:22 +0000211 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000212 if (fstat (file->fd, &file->st) == 0)
213 {
214 if (!S_ISDIR (file->st.st_mode))
215 {
216 file->err_no = 0;
217 return true;
218 }
Zack Weinberg55485cd2001-12-06 16:41:18 +0000219
Neil Booth8f9b4002003-07-29 22:26:13 +0000220 /* Ignore a directory and continue the search. The file we're
221 looking for may be elsewhere in the search path. */
222 errno = ENOENT;
223 }
224
Zack Weinberg55485cd2001-12-06 16:41:18 +0000225 close (file->fd);
226 file->fd = -1;
Neil Booth2047e262000-09-21 18:01:22 +0000227 }
Neil Bootha54c5502003-08-09 08:53:02 +0000228 else if (errno == ENOTDIR)
229 errno = ENOENT;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000230
Neil Boothf277b5e2001-05-05 11:12:19 +0000231 file->err_no = errno;
Neil Booth8f9b4002003-07-29 22:26:13 +0000232
233 return false;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000234}
235
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000236/* Temporary PCH intercept of opening a file. Try to find a PCH file
237 based on FILE->name and FILE->dir, and test those found for
238 validity using PFILE->cb.valid_pch. Return true iff a valid file is
239 found. Set *INVALID_PCH if a PCH file is found but wasn't valid. */
240
Neil Boothe5eba702001-08-21 19:23:24 +0000241static bool
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000242pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000243{
Neil Booth8f9b4002003-07-29 22:26:13 +0000244 static const char extension[] = ".gch";
245 const char *path = file->path;
246 size_t len, flen;
247 char *pchname;
248 struct stat st;
249 bool valid = false;
Neil Booth51d0f322001-02-19 19:50:21 +0000250
Neil Booth8f9b4002003-07-29 22:26:13 +0000251 /* No PCH on <stdin> or if not requested. */
252 if (file->name[0] == '\0' || !pfile->cb.valid_pch)
Neil Boothe5eba702001-08-21 19:23:24 +0000253 return false;
254
Neil Booth8f9b4002003-07-29 22:26:13 +0000255 flen = strlen (path);
256 len = flen + sizeof (extension);
257 pchname = xmalloc (len);
258 memcpy (pchname, path, flen);
259 memcpy (pchname + flen, extension, sizeof (extension));
Neil Booth51d0f322001-02-19 19:50:21 +0000260
Neil Booth8f9b4002003-07-29 22:26:13 +0000261 if (stat (pchname, &st) == 0)
Neil Booth182d89a2002-08-14 22:34:50 +0000262 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000263 DIR *pchdir;
264 struct dirent *d;
265 size_t dlen, plen = len;
266
267 if (!S_ISDIR (st.st_mode))
268 valid = validate_pch (pfile, file, pchname);
269 else if ((pchdir = opendir (pchname)) != NULL)
270 {
271 pchname[plen - 1] = '/';
272 while ((d = readdir (pchdir)) != NULL)
273 {
274 dlen = strlen (d->d_name) + 1;
Phil Edwards230fcd32003-09-25 04:46:44 +0000275 if ((strcmp (d->d_name, ".") == 0)
276 || (strcmp (d->d_name, "..") == 0))
277 continue;
Neil Booth8f9b4002003-07-29 22:26:13 +0000278 if (dlen + plen > len)
279 {
280 len += dlen + 64;
281 pchname = xrealloc (pchname, len);
282 }
283 memcpy (pchname + plen, d->d_name, dlen);
284 valid = validate_pch (pfile, file, pchname);
285 if (valid)
286 break;
287 }
288 closedir (pchdir);
289 }
Roger Saylebcad4ca2003-12-31 05:11:44 +0000290 if (valid)
291 file->pch = true;
292 else
293 *invalid_pch = true;
Neil Booth182d89a2002-08-14 22:34:50 +0000294 }
Neil Booth51d0f322001-02-19 19:50:21 +0000295
Neil Booth8f9b4002003-07-29 22:26:13 +0000296 if (valid)
297 file->pchname = pchname;
298 else
299 free (pchname);
300
301 return valid;
302}
303
304/* Try to open the path FILE->name appended to FILE->dir. This is
Neil Boothcf1ee302003-08-02 12:44:27 +0000305 where remap and PCH intercept the file lookup process. Return true
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000306 if the file was found, whether or not the open was successful.
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000307 Set *INVALID_PCH to true if a PCH file is found but wasn't valid. */
308
Neil Booth8f9b4002003-07-29 22:26:13 +0000309static bool
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000310find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
Neil Booth8f9b4002003-07-29 22:26:13 +0000311{
312 char *path;
313
314 if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
315 ;
316 else
Mike Stump94d16132004-03-04 00:18:54 +0000317 if (file->dir->construct)
318 path = file->dir->construct (file->name, file->dir);
319 else
320 path = append_file_to_dir (file->name, file->dir);
Neil Booth8f9b4002003-07-29 22:26:13 +0000321
Mike Stump94d16132004-03-04 00:18:54 +0000322 if (path)
Neil Boothcf1ee302003-08-02 12:44:27 +0000323 {
Mike Stump94d16132004-03-04 00:18:54 +0000324 file->path = path;
325 if (pch_open_file (pfile, file, invalid_pch))
326 return true;
327
328 if (open_file (file))
329 return true;
330
331 if (file->err_no != ENOENT)
332 {
333 open_file_failed (pfile, file);
334 return true;
335 }
336
337 free (path);
338 file->path = file->name;
339 }
340 else
341 {
342 file->err_no = ENOENT;
343 file->path = NULL;
Neil Boothcf1ee302003-08-02 12:44:27 +0000344 }
345
Mike Stump94d16132004-03-04 00:18:54 +0000346 return false;
347}
348
349/* Return tue iff the missing_header callback found the given HEADER. */
350static bool
351search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
352{
353 missing_header_cb func = pfile->cb.missing_header;
354
355 /* When the regular search path doesn't work, try context dependent
356 headers search paths. */
357 if (func
358 && file->dir == NULL)
359 {
Mike Stumpe3c287c2004-05-05 18:25:52 +0000360 if ((file->path = func (pfile, header, &file->dir)) != NULL)
Mike Stump94d16132004-03-04 00:18:54 +0000361 {
362 if (open_file (file))
363 return true;
364 free ((void *)file->path);
365 }
366 file->path = file->name;
367 }
368
Neil Booth8f9b4002003-07-29 22:26:13 +0000369 return false;
370}
371
Per Bothner4dc299f2003-10-02 07:23:27 +0000372bool
373_cpp_find_failed (_cpp_file *file)
374{
375 return file->err_no != 0;
376}
377
Neil Booth8f9b4002003-07-29 22:26:13 +0000378/* Given a filename FNAME search for such a file in the include path
379 starting from START_DIR. If FNAME is the empty string it is
Kazu Hirata1ae58c32004-04-30 16:27:30 +0000380 interpreted as STDIN if START_DIR is PFILE->no_search_path.
Neil Booth8f9b4002003-07-29 22:26:13 +0000381
382 If the file is not found in the file cache fall back to the O/S and
383 add the result to our cache.
384
385 If the file was not found in the filesystem, or there was an error
Kazu Hirata02fa63c2003-08-19 21:09:36 +0000386 opening it, then ERR_NO is nonzero and FD is -1. If the file was
Neil Booth8f9b4002003-07-29 22:26:13 +0000387 found, then ERR_NO is zero and FD could be -1 or an open file
388 descriptor. FD can be -1 if the file was found in the cache and
389 had previously been closed. To open it again pass the return value
390 to open_file().
391*/
Per Bothner4dc299f2003-10-02 07:23:27 +0000392_cpp_file *
393_cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake)
Neil Booth8f9b4002003-07-29 22:26:13 +0000394{
395 struct file_hash_entry *entry, **hash_slot;
396 _cpp_file *file;
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000397 bool invalid_pch = false;
Neil Booth8f9b4002003-07-29 22:26:13 +0000398
399 /* Ensure we get no confusion between cached files and directories. */
400 if (start_dir == NULL)
John David Anglin0527bc42003-11-01 22:56:54 +0000401 cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
Neil Booth8f9b4002003-07-29 22:26:13 +0000402
403 hash_slot = (struct file_hash_entry **)
Per Bothnerb92be662003-12-05 22:50:53 +0000404 htab_find_slot_with_hash (pfile->file_hash, fname,
405 htab_hash_string (fname),
406 INSERT);
Neil Booth8f9b4002003-07-29 22:26:13 +0000407
408 /* First check the cache before we resort to memory allocation. */
409 entry = search_cache (*hash_slot, start_dir);
410 if (entry)
411 return entry->u.file;
412
413 file = make_cpp_file (pfile, start_dir, fname);
414
415 /* Try each path in the include chain. */
416 for (; !fake ;)
Geoffrey Keating17211ab2003-01-10 02:22:34 +0000417 {
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000418 if (find_file_in_dir (pfile, file, &invalid_pch))
Neil Booth8f9b4002003-07-29 22:26:13 +0000419 break;
420
Neil Boothcf1ee302003-08-02 12:44:27 +0000421 file->dir = file->dir->next;
422 if (file->dir == NULL)
Neil Booth8f9b4002003-07-29 22:26:13 +0000423 {
Mike Stump94d16132004-03-04 00:18:54 +0000424 if (search_path_exhausted (pfile, fname, file))
425 return file;
426
Neil Booth8f9b4002003-07-29 22:26:13 +0000427 open_file_failed (pfile, file);
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000428 if (invalid_pch)
429 {
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000430 cpp_error (pfile, CPP_DL_ERROR,
Geoffrey Keatinge235d8b2003-11-14 19:00:04 +0000431 "one or more PCH files were found, but they were invalid");
432 if (!cpp_get_options (pfile)->warn_invalid_pch)
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000433 cpp_error (pfile, CPP_DL_ERROR,
Geoffrey Keatinge235d8b2003-11-14 19:00:04 +0000434 "use -Winvalid-pch for more information");
Geoffrey Keating3d67ba12003-11-08 02:17:51 +0000435 }
Neil Booth8f9b4002003-07-29 22:26:13 +0000436 break;
437 }
438
439 /* Only check the cache for the starting location (done above)
440 and the quote and bracket chain heads because there are no
441 other possible starting points for searches. */
442 if (file->dir != pfile->bracket_include
443 && file->dir != pfile->quote_include)
444 continue;
445
446 entry = search_cache (*hash_slot, file->dir);
447 if (entry)
Neil Booth49634b32003-08-02 16:29:46 +0000448 break;
449 }
450
451 if (entry)
452 {
453 /* Cache for START_DIR too, sharing the _cpp_file structure. */
454 free ((char *) file->name);
455 free (file);
456 file = entry->u.file;
457 }
458 else
459 {
460 /* This is a new file; put it in the list. */
461 file->next_file = pfile->all_files;
462 pfile->all_files = file;
Neil Booth8f9b4002003-07-29 22:26:13 +0000463 }
464
465 /* Store this new result in the hash table. */
466 entry = new_file_hash_entry (pfile);
467 entry->next = *hash_slot;
468 entry->start_dir = start_dir;
469 entry->u.file = file;
470 *hash_slot = entry;
471
472 return file;
473}
474
475/* Read a file into FILE->buffer, returning true on success.
476
477 If FILE->fd is something weird, like a block device, we don't want
478 to read it at all. Don't even try to figure out what something is,
479 except for plain files and block devices, since there is no
480 reliable portable way of doing this.
481
482 FIXME: Flush file cache and try again if we run out of memory. */
483static bool
484read_file_guts (cpp_reader *pfile, _cpp_file *file)
485{
486 ssize_t size, total, count;
487 uchar *buf;
488 bool regular;
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000489
Neil Booth8f9b4002003-07-29 22:26:13 +0000490 if (S_ISBLK (file->st.st_mode))
491 {
John David Anglin0527bc42003-11-01 22:56:54 +0000492 cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
Geoffrey Keating17211ab2003-01-10 02:22:34 +0000493 return false;
494 }
495
Neil Booth8f9b4002003-07-29 22:26:13 +0000496 regular = S_ISREG (file->st.st_mode);
497 if (regular)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000498 {
499 /* off_t might have a wider range than ssize_t - in other words,
500 the max size of a file might be bigger than the address
501 space. We can't handle a file that large. (Anyone with
502 a single source file bigger than 2GB needs to rethink
503 their coding style.) Some systems (e.g. AIX 4.1) define
504 SSIZE_MAX to be much smaller than the actual range of the
505 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
506 does not bite us. */
Neil Booth8f9b4002003-07-29 22:26:13 +0000507 if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
Zack Weinberga58d32c2000-09-12 03:42:30 +0000508 {
John David Anglin0527bc42003-11-01 22:56:54 +0000509 cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000510 return false;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000511 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000512
Neil Booth8f9b4002003-07-29 22:26:13 +0000513 size = file->st.st_size;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000514 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000515 else
Neil Booth8f9b4002003-07-29 22:26:13 +0000516 /* 8 kilobytes is a sensible starting size. It ought to be bigger
517 than the kernel pipe buffer, and it's definitely bigger than
518 the majority of C source files. */
519 size = 8 * 1024;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000520
Neil Booth8f9b4002003-07-29 22:26:13 +0000521 buf = xmalloc (size + 1);
522 total = 0;
523 while ((count = read (file->fd, buf + total, size - total)) > 0)
524 {
525 total += count;
526
527 if (total == size)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000528 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000529 if (regular)
530 break;
531 size *= 2;
532 buf = xrealloc (buf, size + 1);
Zack Weinberga58d32c2000-09-12 03:42:30 +0000533 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000534 }
535
Neil Booth8f9b4002003-07-29 22:26:13 +0000536 if (count < 0)
537 {
John David Anglin0527bc42003-11-01 22:56:54 +0000538 cpp_errno (pfile, CPP_DL_ERROR, file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000539 return false;
540 }
Zack Weinberga58d32c2000-09-12 03:42:30 +0000541
Neil Booth8f9b4002003-07-29 22:26:13 +0000542 if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
John David Anglin0527bc42003-11-01 22:56:54 +0000543 cpp_error (pfile, CPP_DL_WARNING,
544 "%s is shorter than expected", file->path);
Neil Booth8f9b4002003-07-29 22:26:13 +0000545
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000546 file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
547 buf, size, total, &file->st.st_size);
Neil Booth8f9b4002003-07-29 22:26:13 +0000548 file->buffer_valid = true;
549
550 return true;
Zack Weinberga58d32c2000-09-12 03:42:30 +0000551}
552
Neil Booth8f9b4002003-07-29 22:26:13 +0000553/* Convenience wrapper around read_file_guts that opens the file if
Kazu Hirataa98ebe22003-08-19 23:22:00 +0000554 necessary and closes the file descriptor after reading. FILE must
Neil Booth8f9b4002003-07-29 22:26:13 +0000555 have been passed through find_file() at some stage. */
556static bool
557read_file (cpp_reader *pfile, _cpp_file *file)
Zack Weinberga58d32c2000-09-12 03:42:30 +0000558{
Neil Booth8f9b4002003-07-29 22:26:13 +0000559 /* If we already have its contents in memory, succeed immediately. */
560 if (file->buffer_valid)
561 return true;
562
563 /* If an earlier read failed for some reason don't try again. */
564 if (file->dont_read || file->err_no)
565 return false;
566
567 if (file->fd == -1 && !open_file (file))
568 {
569 open_file_failed (pfile, file);
570 return false;
571 }
572
573 file->dont_read = !read_file_guts (pfile, file);
574 close (file->fd);
575 file->fd = -1;
576
577 return !file->dont_read;
Zack Weinbergadd70911998-10-29 11:54:13 +0000578}
579
Neil Boothcf1ee302003-08-02 12:44:27 +0000580/* Returns TRUE if FILE's contents have been successfully placed in
581 FILE->buffer and the file should be stacked, otherwise false. */
582static bool
583should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
584{
585 _cpp_file *f;
586
Neil Booth49634b32003-08-02 16:29:46 +0000587 /* Skip once-only files. */
588 if (file->once_only)
589 return false;
590
Eric Christopher16dd5cf2004-02-02 20:20:58 +0000591 /* We must mark the file once-only if #import now, before header
Neil Booth49634b32003-08-02 16:29:46 +0000592 guard checks. Otherwise, undefining the header guard might
593 cause the file to be re-stacked. */
594 if (import)
595 {
596 _cpp_mark_file_once_only (pfile, file);
597
598 /* Don't stack files that have been stacked before. */
599 if (file->stack_count)
600 return false;
601 }
602
Neil Boothcf1ee302003-08-02 12:44:27 +0000603 /* Skip if the file had a header guard and the macro is defined.
604 PCH relies on this appearing before the PCH handler below. */
605 if (file->cmacro && file->cmacro->type == NT_MACRO)
606 return false;
607
608 /* Handle PCH files immediately; don't stack them. */
Per Bothner22234f52004-02-18 14:02:39 -0800609 if (file->pch)
Neil Boothcf1ee302003-08-02 12:44:27 +0000610 {
611 pfile->cb.read_pch (pfile, file->path, file->fd, file->pchname);
612 close (file->fd);
613 file->fd = -1;
614 return false;
615 }
616
Neil Boothcf1ee302003-08-02 12:44:27 +0000617 if (!read_file (pfile, file))
618 return false;
619
Geoffrey Keating73e61092004-01-17 00:37:47 +0000620 /* Check the file against the PCH file. This is done before
621 checking against files we've already seen, since it may save on
622 I/O. */
623 if (check_file_against_entries (pfile, file, import))
624 {
625 /* If this isn't a #import, but yet we can't include the file,
626 that means that it was #import-ed in the PCH file,
627 so we can never include it again. */
628 if (! import)
629 _cpp_mark_file_once_only (pfile, file);
630 return false;
631 }
632
Neil Booth49634b32003-08-02 16:29:46 +0000633 /* Now we've read the file's contents, we can stack it if there
634 are no once-only files. */
635 if (!pfile->seen_once_only)
Neil Boothcf1ee302003-08-02 12:44:27 +0000636 return true;
637
Neil Booth49634b32003-08-02 16:29:46 +0000638 /* We may have read the file under a different name. Look
Neil Boothcf1ee302003-08-02 12:44:27 +0000639 for likely candidates and compare file contents to be sure. */
Neil Booth49634b32003-08-02 16:29:46 +0000640 for (f = pfile->all_files; f; f = f->next_file)
Neil Boothcf1ee302003-08-02 12:44:27 +0000641 {
642 if (f == file)
643 continue;
644
Neil Booth49634b32003-08-02 16:29:46 +0000645 if ((import || f->once_only)
646 && f->err_no == 0
Neil Boothcf1ee302003-08-02 12:44:27 +0000647 && f->st.st_mtime == file->st.st_mtime
648 && f->st.st_size == file->st.st_size
649 && read_file (pfile, f)
650 /* Size might have changed in read_file(). */
651 && f->st.st_size == file->st.st_size
652 && !memcmp (f->buffer, file->buffer, f->st.st_size))
653 break;
654 }
655
Neil Boothcf1ee302003-08-02 12:44:27 +0000656 return f == NULL;
657}
658
Neil Booth8f9b4002003-07-29 22:26:13 +0000659/* Place the file referenced by FILE into a new buffer on the buffer
660 stack if possible. IMPORT is true if this stacking attempt is
661 because of a #import directive. Returns true if a buffer is
662 stacked. */
Per Bothner4dc299f2003-10-02 07:23:27 +0000663bool
664_cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
Zack Weinbergb0699da2000-03-07 20:58:47 +0000665{
Neil Booth8f9b4002003-07-29 22:26:13 +0000666 cpp_buffer *buffer;
667 int sysp;
Zack Weinbergb0699da2000-03-07 20:58:47 +0000668
Neil Boothcf1ee302003-08-02 12:44:27 +0000669 if (!should_stack_file (pfile, file, import))
Neil Booth8f9b4002003-07-29 22:26:13 +0000670 return false;
671
Per Bothner12f9df42004-02-11 07:29:30 -0800672 if (pfile->buffer == NULL || file->dir == NULL)
673 sysp = 0;
674 else
675 sysp = MAX (pfile->buffer->sysp, file->dir->sysp);
Neil Booth8f9b4002003-07-29 22:26:13 +0000676
677 /* Add the file to the dependencies on its first inclusion. */
678 if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +0000679 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000680 if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file))
Neil Boothf0babc92003-07-30 22:30:40 +0000681 deps_add_dep (pfile->deps, file->path);
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +0000682 }
Kazu Hiratadf383482002-05-22 22:02:16 +0000683
Neil Booth8f9b4002003-07-29 22:26:13 +0000684 /* Clear buffer_valid since _cpp_clean_line messes it up. */
685 file->buffer_valid = false;
686 file->stack_count++;
Zack Weinberge576beb2000-03-15 22:03:37 +0000687
Neil Booth8f9b4002003-07-29 22:26:13 +0000688 /* Stack the buffer. */
689 buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
Per Bothner4dc299f2003-10-02 07:23:27 +0000690 CPP_OPTION (pfile, preprocessed));
Neil Booth8f9b4002003-07-29 22:26:13 +0000691 buffer->file = file;
Per Bothner12f9df42004-02-11 07:29:30 -0800692 buffer->sysp = sysp;
Zack Weinbergadd70911998-10-29 11:54:13 +0000693
Neil Booth8f9b4002003-07-29 22:26:13 +0000694 /* Initialize controlling macro state. */
695 pfile->mi_valid = true;
696 pfile->mi_cmacro = 0;
697
698 /* Generate the call back. */
Neil Booth76bf2c92003-08-03 09:28:25 +0000699 _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
Neil Booth8f9b4002003-07-29 22:26:13 +0000700
701 return true;
702}
703
Neil Booth49634b32003-08-02 16:29:46 +0000704/* Mark FILE to be included once only. */
Neil Booth8f9b4002003-07-29 22:26:13 +0000705void
Neil Booth49634b32003-08-02 16:29:46 +0000706_cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
Neil Booth8f9b4002003-07-29 22:26:13 +0000707{
Neil Booth49634b32003-08-02 16:29:46 +0000708 pfile->seen_once_only = true;
709 file->once_only = true;
Neil Booth8f9b4002003-07-29 22:26:13 +0000710}
711
712/* Return the directory from which searching for FNAME should start,
Kazu Hirata2067c112003-10-05 19:50:56 +0000713 considering the directive TYPE and ANGLE_BRACKETS. If there is
Neil Booth8f9b4002003-07-29 22:26:13 +0000714 nothing left in the path, returns NULL. */
715static struct cpp_dir *
716search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
717 enum include_type type)
718{
719 cpp_dir *dir;
720 _cpp_file *file;
721
Zack Weinberg3dce1402003-07-03 04:24:01 +0000722 if (IS_ABSOLUTE_PATH (fname))
Neil Booth8f9b4002003-07-29 22:26:13 +0000723 return &pfile->no_search_path;
724
Per Bothner4dc299f2003-10-02 07:23:27 +0000725 /* pfile->buffer is NULL when processing an -include command-line flag. */
726 file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
Neil Booth41947a52001-03-13 23:55:10 +0000727
728 /* For #include_next, skip in the search path past the dir in which
Neil Boothe7182662001-03-14 19:35:08 +0000729 the current file was found, but if it was found via an absolute
730 path use the normal search logic. */
Neil Booth8f9b4002003-07-29 22:26:13 +0000731 if (type == IT_INCLUDE_NEXT && file->dir)
732 dir = file->dir->next;
Neil Booth74eb4b32003-04-21 19:21:59 +0000733 else if (angle_brackets)
Neil Booth8f9b4002003-07-29 22:26:13 +0000734 dir = pfile->bracket_include;
735 else if (type == IT_CMDLINE)
736 /* -include and -imacros use the #include "" chain with the
737 preprocessor's cwd prepended. */
738 return make_cpp_dir (pfile, "./", false);
739 else if (pfile->quote_ignores_source_dir)
740 dir = pfile->quote_include;
Neil Booth41947a52001-03-13 23:55:10 +0000741 else
Per Bothner12f9df42004-02-11 07:29:30 -0800742 return make_cpp_dir (pfile, dir_name_of_file (file),
743 pfile->buffer ? pfile->buffer->sysp : 0);
Neil Booth41947a52001-03-13 23:55:10 +0000744
Neil Booth8f9b4002003-07-29 22:26:13 +0000745 if (dir == NULL)
John David Anglin0527bc42003-11-01 22:56:54 +0000746 cpp_error (pfile, CPP_DL_ERROR,
Neil Booth8f9b4002003-07-29 22:26:13 +0000747 "no include path in which to search for %s", fname);
748
749 return dir;
750}
751
752/* Strip the basename from the file's path. It ends with a slash if
Kazu Hirata02fa63c2003-08-19 21:09:36 +0000753 of nonzero length. Note that this procedure also works for
Neil Booth8f9b4002003-07-29 22:26:13 +0000754 <stdin>, which is represented by the empty string. */
755static const char *
756dir_name_of_file (_cpp_file *file)
757{
758 if (!file->dir_name)
Neil Booth41947a52001-03-13 23:55:10 +0000759 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000760 size_t len = lbasename (file->path) - file->path;
761 char *dir_name = xmalloc (len + 1);
762
763 memcpy (dir_name, file->path, len);
764 dir_name[len] = '\0';
765 file->dir_name = dir_name;
Neil Booth41947a52001-03-13 23:55:10 +0000766 }
767
Neil Booth8f9b4002003-07-29 22:26:13 +0000768 return file->dir_name;
769}
770
Neil Booth8f9b4002003-07-29 22:26:13 +0000771/* Handles #include-family directives (distinguished by TYPE),
772 including HEADER, and the command line -imacros and -include.
773 Returns true if a buffer was stacked. */
774bool
775_cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
776 enum include_type type)
777{
778 struct cpp_dir *dir;
Per Bothner22234f52004-02-18 14:02:39 -0800779 _cpp_file *file;
Neil Booth8f9b4002003-07-29 22:26:13 +0000780
781 dir = search_path_head (pfile, fname, angle_brackets, type);
782 if (!dir)
783 return false;
784
Per Bothner22234f52004-02-18 14:02:39 -0800785 file = _cpp_find_file (pfile, fname, dir, false);
786
787 /* Compensate for the increment in linemap_add. In the case of a
788 normal #include, we're currently at the start of the line
789 *following* the #include. A separate source_location for this
790 location makes no sense (until we do the LC_LEAVE), and
791 complicates LAST_SOURCE_LINE_LOCATION. This does not apply if we
792 found a PCH file (in which case linemap_add is not called) or we
793 were included from the command-line. */
794 if (! file->pch && file->err_no == 0 && type != IT_CMDLINE)
795 pfile->line_table->highest_location--;
796
797 return _cpp_stack_file (pfile, file, type == IT_IMPORT);
Neil Booth8f9b4002003-07-29 22:26:13 +0000798}
799
800/* Could not open FILE. The complication is dependency output. */
801static void
802open_file_failed (cpp_reader *pfile, _cpp_file *file)
803{
Per Bothner500bee02004-04-22 19:22:27 -0700804 int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
Neil Booth8f9b4002003-07-29 22:26:13 +0000805 bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
806
807 errno = file->err_no;
808 if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
Neil Boothbf42e452003-08-01 14:04:02 +0000809 deps_add_dep (pfile->deps, file->name);
Neil Booth8f9b4002003-07-29 22:26:13 +0000810 else
Zack Weinbergadd70911998-10-29 11:54:13 +0000811 {
Neil Booth8f9b4002003-07-29 22:26:13 +0000812 /* If we are outputting dependencies but not for this file then
813 don't error because we can still produce correct output. */
814 if (CPP_OPTION (pfile, deps.style) && ! print_dep)
John David Anglin0527bc42003-11-01 22:56:54 +0000815 cpp_errno (pfile, CPP_DL_WARNING, file->path);
Neil Boothe7182662001-03-14 19:35:08 +0000816 else
John David Anglin0527bc42003-11-01 22:56:54 +0000817 cpp_errno (pfile, CPP_DL_ERROR, file->path);
Zack Weinbergd35364d2000-03-12 23:46:05 +0000818 }
Neil Booth8f9b4002003-07-29 22:26:13 +0000819}
Neil Booth591e15a2001-03-02 07:35:12 +0000820
Neil Booth8f9b4002003-07-29 22:26:13 +0000821/* Search in the chain beginning at HEAD for a file whose search path
822 started at START_DIR != NULL. */
823static struct file_hash_entry *
824search_cache (struct file_hash_entry *head, const cpp_dir *start_dir)
825{
826 while (head && head->start_dir != start_dir)
827 head = head->next;
828
829 return head;
830}
831
832/* Allocate a new _cpp_file structure. */
833static _cpp_file *
834make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
835{
836 _cpp_file *file;
837
838 file = xcalloc (1, sizeof (_cpp_file));
839 file->main_file = !pfile->buffer;
840 file->fd = -1;
841 file->dir = dir;
842 file->name = xstrdup (fname);
843
844 return file;
845}
846
847/* A hash of directory names. The directory names are the path names
848 of files which contain a #include "", the included file name is
849 appended to this directories.
850
851 To avoid duplicate entries we follow the convention that all
852 non-empty directory names should end in a '/'. DIR_NAME must be
853 stored in permanently allocated memory. */
854static cpp_dir *
855make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
856{
857 struct file_hash_entry *entry, **hash_slot;
858 cpp_dir *dir;
859
860 hash_slot = (struct file_hash_entry **)
Per Bothnerb92be662003-12-05 22:50:53 +0000861 htab_find_slot_with_hash (pfile->file_hash, dir_name,
862 htab_hash_string (dir_name),
863 INSERT);
Neil Booth8f9b4002003-07-29 22:26:13 +0000864
865 /* Have we already hashed this directory? */
866 for (entry = *hash_slot; entry; entry = entry->next)
867 if (entry->start_dir == NULL)
868 return entry->u.dir;
869
870 dir = xcalloc (1, sizeof (cpp_dir));
871 dir->next = pfile->quote_include;
872 dir->name = (char *) dir_name;
873 dir->len = strlen (dir_name);
874 dir->sysp = sysp;
Mike Stump94d16132004-03-04 00:18:54 +0000875 dir->construct = 0;
Neil Booth8f9b4002003-07-29 22:26:13 +0000876
877 /* Store this new result in the hash table. */
878 entry = new_file_hash_entry (pfile);
879 entry->next = *hash_slot;
880 entry->start_dir = NULL;
881 entry->u.dir = dir;
882 *hash_slot = entry;
883
884 return dir;
885}
886
887/* Create a new block of memory for file hash entries. */
888static void
889allocate_file_hash_entries (cpp_reader *pfile)
890{
891 pfile->file_hash_entries_used = 0;
892 pfile->file_hash_entries_allocated = 127;
893 pfile->file_hash_entries = xmalloc
894 (pfile->file_hash_entries_allocated * sizeof (struct file_hash_entry));
895}
896
897/* Return a new file hash entry. */
898static struct file_hash_entry *
899new_file_hash_entry (cpp_reader *pfile)
900{
901 if (pfile->file_hash_entries_used == pfile->file_hash_entries_allocated)
902 allocate_file_hash_entries (pfile);
903
904 return &pfile->file_hash_entries[pfile->file_hash_entries_used++];
905}
906
907/* Returns TRUE if a file FNAME has ever been successfully opened.
908 This routine is not intended to correctly handle filenames aliased
909 by links or redundant . or .. traversals etc. */
910bool
911cpp_included (cpp_reader *pfile, const char *fname)
912{
913 struct file_hash_entry *entry;
914
Per Bothnerb92be662003-12-05 22:50:53 +0000915 entry = htab_find_with_hash (pfile->file_hash, fname,
916 htab_hash_string (fname));
Neil Booth8f9b4002003-07-29 22:26:13 +0000917
918 while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
919 entry = entry->next;
920
921 return entry != NULL;
922}
923
Kazu Hirata6614fd42003-12-21 14:08:35 +0000924/* Calculate the hash value of a file hash entry P. */
Per Bothnerb92be662003-12-05 22:50:53 +0000925
926static hashval_t
927file_hash_hash (const void *p)
928{
929 struct file_hash_entry *entry = (struct file_hash_entry *) p;
930 const char *hname;
931 if (entry->start_dir)
932 hname = entry->u.file->name;
933 else
934 hname = entry->u.dir->name;
935
936 return htab_hash_string (hname);
937}
938
Neil Booth8f9b4002003-07-29 22:26:13 +0000939/* Compare a string Q against a file hash entry P. */
940static int
Per Bothnerb92be662003-12-05 22:50:53 +0000941file_hash_eq (const void *p, const void *q)
Neil Booth8f9b4002003-07-29 22:26:13 +0000942{
943 struct file_hash_entry *entry = (struct file_hash_entry *) p;
944 const char *fname = (const char *) q;
945 const char *hname;
946
947 if (entry->start_dir)
948 hname = entry->u.file->name;
949 else
950 hname = entry->u.dir->name;
951
952 return strcmp (hname, fname) == 0;
953}
954
955/* Initialize everything in this source file. */
956void
957_cpp_init_files (cpp_reader *pfile)
958{
Per Bothnerb92be662003-12-05 22:50:53 +0000959 pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
Neil Booth8f9b4002003-07-29 22:26:13 +0000960 NULL, xcalloc, free);
961 allocate_file_hash_entries (pfile);
962}
963
964/* Finalize everything in this source file. */
965void
966_cpp_cleanup_files (cpp_reader *pfile)
967{
968 htab_delete (pfile->file_hash);
969}
970
971/* Enter a file name in the hash for the sake of cpp_included. */
972void
973_cpp_fake_include (cpp_reader *pfile, const char *fname)
974{
Per Bothner4dc299f2003-10-02 07:23:27 +0000975 _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true);
Zack Weinbergadd70911998-10-29 11:54:13 +0000976}
977
Zack Weinberge605b042000-06-21 23:08:17 +0000978/* Not everyone who wants to set system-header-ness on a buffer can
Neil Booth642ce432000-12-07 23:17:56 +0000979 see the details of a buffer. This is an exported interface because
980 fix-header needs it. */
Zack Weinberge605b042000-06-21 23:08:17 +0000981void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +0000982cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
Zack Weinberge605b042000-06-21 23:08:17 +0000983{
Neil Booth614c7d32000-12-04 07:32:04 +0000984 int flags = 0;
Per Bothner500bee02004-04-22 19:22:27 -0700985 const struct line_maps *line_table = pfile->line_table;
986 const struct line_map *map = &line_table->maps[line_table->used-1];
Neil Booth614c7d32000-12-04 07:32:04 +0000987
988 /* 1 = system header, 2 = system header to be treated as C. */
989 if (syshdr)
990 flags = 1 + (externc != 0);
Per Bothner12f9df42004-02-11 07:29:30 -0800991 pfile->buffer->sysp = flags;
992 _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
Per Bothner500bee02004-04-22 19:22:27 -0700993 SOURCE_LINE (map, pfile->line_table->highest_line), flags);
Zack Weinberge605b042000-06-21 23:08:17 +0000994}
995
Per Bothnerb4e46ce2003-03-20 16:46:18 +0000996/* Allow the client to change the current file. Used by the front end
997 to achieve pseudo-file names like <built-in>.
998 If REASON is LC_LEAVE, then NEW_NAME must be NULL. */
Neil Boothc19b12c2003-03-12 21:31:51 +0000999void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001000cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1001 const char *new_name)
Neil Boothc19b12c2003-03-12 21:31:51 +00001002{
Per Bothnerb4e46ce2003-03-20 16:46:18 +00001003 _cpp_do_file_change (pfile, reason, new_name, 1, 0);
Neil Boothc19b12c2003-03-12 21:31:51 +00001004}
1005
Neil Booth8f9b4002003-07-29 22:26:13 +00001006/* Callback function for htab_traverse. */
1007static int
1008report_missing_guard (void **slot, void *b)
1009{
1010 struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
1011 int *bannerp = (int *) b;
1012
1013 /* Skip directories. */
1014 if (entry->start_dir != NULL)
1015 {
1016 _cpp_file *file = entry->u.file;
1017
1018 /* We don't want MI guard advice for the main file. */
1019 if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
1020 {
1021 if (*bannerp == 0)
1022 {
1023 fputs (_("Multiple include guards may be useful for:\n"),
1024 stderr);
1025 *bannerp = 1;
1026 }
1027
1028 fputs (entry->u.file->path, stderr);
1029 putc ('\n', stderr);
1030 }
1031 }
1032
1033 return 0;
1034}
1035
Zack Weinbergc71f8352000-07-05 05:33:57 +00001036/* Report on all files that might benefit from a multiple include guard.
1037 Triggered by -H. */
1038void
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001039_cpp_report_missing_guards (cpp_reader *pfile)
Zack Weinbergc71f8352000-07-05 05:33:57 +00001040{
1041 int banner = 0;
Zack Weinbergc71f8352000-07-05 05:33:57 +00001042
Neil Booth8f9b4002003-07-29 22:26:13 +00001043 htab_traverse (pfile->file_hash, report_missing_guard, &banner);
Zack Weinbergc31a6502000-06-21 18:33:51 +00001044}
1045
Neil Booth41947a52001-03-13 23:55:10 +00001046/* Locate HEADER, and determine whether it is newer than the current
Martin Schaffner48c47212003-06-25 23:01:10 +02001047 file. If it cannot be located or dated, return -1, if it is
Neil Booth41947a52001-03-13 23:55:10 +00001048 newer, return 1, otherwise 0. */
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001049int
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001050_cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1051 int angle_brackets)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001052{
Neil Booth8f9b4002003-07-29 22:26:13 +00001053 _cpp_file *file;
1054 struct cpp_dir *dir;
Kazu Hiratadf383482002-05-22 22:02:16 +00001055
Neil Booth8f9b4002003-07-29 22:26:13 +00001056 dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1057 if (!dir)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001058 return -1;
Neil Booth41947a52001-03-13 23:55:10 +00001059
Per Bothner4dc299f2003-10-02 07:23:27 +00001060 file = _cpp_find_file (pfile, fname, dir, false);
Neil Booth8f9b4002003-07-29 22:26:13 +00001061 if (file->err_no)
1062 return -1;
1063
1064 if (file->fd != -1)
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001065 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001066 close (file->fd);
1067 file->fd = -1;
Nathan Sidwellf3f751a2000-06-30 09:47:49 +00001068 }
Kazu Hiratadf383482002-05-22 22:02:16 +00001069
Neil Booth8f9b4002003-07-29 22:26:13 +00001070 return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
Zack Weinbergc31a6502000-06-21 18:33:51 +00001071}
Zack Weinbergf2d5f0c2000-04-14 23:29:45 +00001072
Neil Boothc19b12c2003-03-12 21:31:51 +00001073/* Pushes the given file onto the buffer stack. Returns nonzero if
1074 successful. */
1075bool
Neil Booth8f9b4002003-07-29 22:26:13 +00001076cpp_push_include (cpp_reader *pfile, const char *fname)
Neil Boothc19b12c2003-03-12 21:31:51 +00001077{
Neil Booth8f9b4002003-07-29 22:26:13 +00001078 return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
Neil Boothc19b12c2003-03-12 21:31:51 +00001079}
1080
Neil Booth5d8ebbd2002-01-03 21:43:09 +00001081/* Do appropriate cleanup when a file INC's buffer is popped off the
Neil Boothaf0d16c2002-04-22 17:48:02 +00001082 input stack. */
1083void
Neil Booth8f9b4002003-07-29 22:26:13 +00001084_cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
Zack Weinbergf9a0e962000-07-13 02:32:41 +00001085{
Neil Boothba133c92001-03-15 07:57:13 +00001086 /* Record the inclusion-preventing macro, which could be NULL
Neil Booth6d18adb2001-07-29 17:27:57 +00001087 meaning no controlling macro. */
Neil Booth8f9b4002003-07-29 22:26:13 +00001088 if (pfile->mi_valid && file->cmacro == NULL)
1089 file->cmacro = pfile->mi_cmacro;
Neil Booth93c803682000-10-28 17:59:06 +00001090
1091 /* Invalidate control macros in the #including file. */
Neil Booth6d18adb2001-07-29 17:27:57 +00001092 pfile->mi_valid = false;
Neil Booth93c803682000-10-28 17:59:06 +00001093
Neil Booth8f9b4002003-07-29 22:26:13 +00001094 if (file->buffer)
Neil Booth591e15a2001-03-02 07:35:12 +00001095 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001096 free ((void *) file->buffer);
1097 file->buffer = NULL;
Neil Boothba133c92001-03-15 07:57:13 +00001098 }
Neil Booth591e15a2001-03-02 07:35:12 +00001099}
1100
Neil Booth8f9b4002003-07-29 22:26:13 +00001101/* Set the include chain for "" to QUOTE, for <> to BRACKET. If
1102 QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1103 directory of the including file.
Zack Weinbergadd70911998-10-29 11:54:13 +00001104
Neil Booth8f9b4002003-07-29 22:26:13 +00001105 If BRACKET does not lie in the QUOTE chain, it is set to QUOTE. */
1106void
1107cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1108 int quote_ignores_source_dir)
1109{
1110 pfile->quote_include = quote;
1111 pfile->bracket_include = quote;
1112 pfile->quote_ignores_source_dir = quote_ignores_source_dir;
1113
1114 for (; quote; quote = quote->next)
1115 {
1116 quote->name_map = NULL;
1117 quote->len = strlen (quote->name);
1118 if (quote == bracket)
1119 pfile->bracket_include = bracket;
1120 }
1121}
1122
1123/* Append the file name to the directory to create the path, but don't
1124 turn / into // or // into ///; // may be a namespace escape. */
1125static char *
1126append_file_to_dir (const char *fname, cpp_dir *dir)
1127{
1128 size_t dlen, flen;
1129 char *path;
1130
1131 dlen = dir->len;
1132 flen = strlen (fname);
1133 path = xmalloc (dlen + 1 + flen + 1);
1134 memcpy (path, dir->name, dlen);
1135 if (dlen && path[dlen - 1] != '/')
1136 path[dlen++] = '/';
1137 memcpy (&path[dlen], fname, flen + 1);
1138
1139 return path;
1140}
Zack Weinbergadd70911998-10-29 11:54:13 +00001141
1142/* Read a space delimited string of unlimited length from a stdio
Neil Booth5d8ebbd2002-01-03 21:43:09 +00001143 file F. */
Zack Weinbergadd70911998-10-29 11:54:13 +00001144static char *
Zack Weinberg6cf87ca2003-06-17 06:17:44 +00001145read_filename_string (int ch, FILE *f)
Zack Weinbergadd70911998-10-29 11:54:13 +00001146{
1147 char *alloc, *set;
1148 int len;
1149
1150 len = 20;
1151 set = alloc = xmalloc (len + 1);
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001152 if (! is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001153 {
1154 *set++ = ch;
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001155 while ((ch = getc (f)) != EOF && ! is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001156 {
1157 if (set - alloc == len)
1158 {
1159 len *= 2;
1160 alloc = xrealloc (alloc, len + 1);
1161 set = alloc + len / 2;
1162 }
1163 *set++ = ch;
1164 }
1165 }
1166 *set = '\0';
1167 ungetc (ch, f);
1168 return alloc;
1169}
1170
Neil Booth8f9b4002003-07-29 22:26:13 +00001171/* Read the file name map file for DIR. */
1172static void
1173read_name_map (cpp_dir *dir)
Zack Weinbergadd70911998-10-29 11:54:13 +00001174{
Neil Booth8f9b4002003-07-29 22:26:13 +00001175 static const char FILE_NAME_MAP_FILE[] = "header.gcc";
Zack Weinbergadd70911998-10-29 11:54:13 +00001176 char *name;
1177 FILE *f;
Neil Booth8f9b4002003-07-29 22:26:13 +00001178 size_t len, count = 0, room = 9;
Zack Weinbergadd70911998-10-29 11:54:13 +00001179
Neil Booth8f9b4002003-07-29 22:26:13 +00001180 len = dir->len;
1181 name = alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
1182 memcpy (name, dir->name, len);
1183 if (len && name[len - 1] != '/')
1184 name[len++] = '/';
1185 strcpy (name + len, FILE_NAME_MAP_FILE);
Zack Weinbergadd70911998-10-29 11:54:13 +00001186 f = fopen (name, "r");
Neil Booth8767c892000-12-13 19:20:14 +00001187
Neil Booth8f9b4002003-07-29 22:26:13 +00001188 dir->name_map = xmalloc (room * sizeof (char *));
1189
Neil Booth8767c892000-12-13 19:20:14 +00001190 /* Silently return NULL if we cannot open. */
1191 if (f)
Zack Weinbergadd70911998-10-29 11:54:13 +00001192 {
1193 int ch;
Zack Weinbergadd70911998-10-29 11:54:13 +00001194
1195 while ((ch = getc (f)) != EOF)
1196 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001197 char *to;
Zack Weinbergadd70911998-10-29 11:54:13 +00001198
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001199 if (is_space (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001200 continue;
Neil Booth8f9b4002003-07-29 22:26:13 +00001201
1202 if (count + 2 > room)
1203 {
1204 room += 8;
1205 dir->name_map = xrealloc (dir->name_map, room * sizeof (char *));
1206 }
1207
1208 dir->name_map[count] = read_filename_string (ch, f);
Kazu Hiratadc65cd62002-11-19 06:55:04 +00001209 while ((ch = getc (f)) != EOF && is_hspace (ch))
Zack Weinbergadd70911998-10-29 11:54:13 +00001210 ;
Neil Booth8f9b4002003-07-29 22:26:13 +00001211
Zack Weinbergadd70911998-10-29 11:54:13 +00001212 to = read_filename_string (ch, f);
Zack Weinberg3dce1402003-07-03 04:24:01 +00001213 if (IS_ABSOLUTE_PATH (to))
Neil Booth8f9b4002003-07-29 22:26:13 +00001214 dir->name_map[count + 1] = to;
Zack Weinbergadd70911998-10-29 11:54:13 +00001215 else
1216 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001217 dir->name_map[count + 1] = append_file_to_dir (to, dir);
Zack Weinbergadd70911998-10-29 11:54:13 +00001218 free (to);
Kazu Hiratadf383482002-05-22 22:02:16 +00001219 }
Zack Weinbergadd70911998-10-29 11:54:13 +00001220
Neil Booth8f9b4002003-07-29 22:26:13 +00001221 count += 2;
Zack Weinbergadd70911998-10-29 11:54:13 +00001222 while ((ch = getc (f)) != '\n')
1223 if (ch == EOF)
1224 break;
1225 }
Neil Booth8f9b4002003-07-29 22:26:13 +00001226
Zack Weinbergadd70911998-10-29 11:54:13 +00001227 fclose (f);
1228 }
Kazu Hiratadf383482002-05-22 22:02:16 +00001229
Neil Booth8f9b4002003-07-29 22:26:13 +00001230 /* Terminate the list of maps. */
1231 dir->name_map[count] = NULL;
Kazu Hiratadf383482002-05-22 22:02:16 +00001232}
Zack Weinbergadd70911998-10-29 11:54:13 +00001233
Neil Booth8f9b4002003-07-29 22:26:13 +00001234/* Remap a FILE's name based on the file_name_map, if any, for
1235 FILE->dir. If the file name has any directory separators,
1236 recursively check those directories too. */
Zack Weinberg0b3d7761998-11-25 11:56:54 +00001237static char *
Neil Booth8f9b4002003-07-29 22:26:13 +00001238remap_filename (cpp_reader *pfile, _cpp_file *file)
Zack Weinbergadd70911998-10-29 11:54:13 +00001239{
Neil Booth8f9b4002003-07-29 22:26:13 +00001240 const char *fname, *p;
1241 char *new_dir;
1242 cpp_dir *dir;
1243 size_t index, len;
Zack Weinberg0b3d7761998-11-25 11:56:54 +00001244
Neil Booth8f9b4002003-07-29 22:26:13 +00001245 dir = file->dir;
1246 fname = file->name;
Neil Boothe7182662001-03-14 19:35:08 +00001247
Neil Booth986b1f12003-03-02 17:44:18 +00001248 for (;;)
1249 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001250 if (!dir->name_map)
1251 read_name_map (dir);
Neil Booth986b1f12003-03-02 17:44:18 +00001252
Neil Booth8f9b4002003-07-29 22:26:13 +00001253 for (index = 0; dir->name_map[index]; index += 2)
1254 if (!strcmp (dir->name_map[index], fname))
1255 return xstrdup (dir->name_map[index + 1]);
Neil Booth986b1f12003-03-02 17:44:18 +00001256
Neil Booth8f9b4002003-07-29 22:26:13 +00001257 p = strchr (fname, '/');
1258 if (!p || p == fname)
1259 return NULL;
Neil Booth986b1f12003-03-02 17:44:18 +00001260
Neil Booth8f9b4002003-07-29 22:26:13 +00001261 len = dir->len + (p - fname + 1);
1262 new_dir = xmalloc (len + 1);
1263 memcpy (new_dir, dir->name, dir->len);
1264 memcpy (new_dir + dir->len, fname, p - fname + 1);
1265 new_dir[len] = '\0';
1266
1267 dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1268 fname = p + 1;
1269 }
1270}
1271
Neil Booth8f9b4002003-07-29 22:26:13 +00001272/* Returns true if PCHNAME is a valid PCH file for FILE. */
1273static bool
1274validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
1275{
1276 const char *saved_path = file->path;
Phil Edwards230fcd32003-09-25 04:46:44 +00001277 bool valid = false;
Neil Booth8f9b4002003-07-29 22:26:13 +00001278
1279 file->path = pchname;
1280 if (open_file (file))
1281 {
Phil Edwards230fcd32003-09-25 04:46:44 +00001282 valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
Neil Booth8f9b4002003-07-29 22:26:13 +00001283
Phil Edwards230fcd32003-09-25 04:46:44 +00001284 if (!valid)
Neil Booth986b1f12003-03-02 17:44:18 +00001285 {
Neil Booth8f9b4002003-07-29 22:26:13 +00001286 close (file->fd);
1287 file->fd = -1;
Neil Booth986b1f12003-03-02 17:44:18 +00001288 }
1289
Neil Booth8f9b4002003-07-29 22:26:13 +00001290 if (CPP_OPTION (pfile, print_include_names))
1291 {
1292 unsigned int i;
Per Bothner54020b22004-01-19 23:35:21 -08001293 for (i = 1; i < pfile->line_table->depth; i++)
Neil Booth8f9b4002003-07-29 22:26:13 +00001294 putc ('.', stderr);
1295 fprintf (stderr, "%c %s\n",
Phil Edwards230fcd32003-09-25 04:46:44 +00001296 valid ? '!' : 'x', pchname);
Neil Booth8f9b4002003-07-29 22:26:13 +00001297 }
Neil Booth986b1f12003-03-02 17:44:18 +00001298 }
1299
Neil Booth8f9b4002003-07-29 22:26:13 +00001300 file->path = saved_path;
Phil Edwards230fcd32003-09-25 04:46:44 +00001301 return valid;
Neil Booth986b1f12003-03-02 17:44:18 +00001302}
Mike Stump94d16132004-03-04 00:18:54 +00001303
1304/* Get the path associated with the _cpp_file F. The path includes
1305 the base name from the include directive and the directory it was
1306 found in via the search path. */
1307
1308const char *
1309cpp_get_path (struct _cpp_file *f)
1310{
1311 return f->path;
1312}
1313
Mike Stumpe3c287c2004-05-05 18:25:52 +00001314/* Get the directory associated with the _cpp_file F. */
1315
1316cpp_dir *
1317cpp_get_dir (struct _cpp_file *f)
1318{
1319 return f->dir;
1320}
1321
Mike Stump94d16132004-03-04 00:18:54 +00001322/* Get the cpp_buffer currently associated with the cpp_reader
1323 PFILE. */
1324
1325cpp_buffer *
1326cpp_get_buffer (cpp_reader *pfile)
1327{
1328 return pfile->buffer;
1329}
1330
1331/* Get the _cpp_file associated with the cpp_buffer B. */
1332
1333_cpp_file *
1334cpp_get_file (cpp_buffer *b)
1335{
1336 return b->file;
1337}
1338
1339/* Get the previous cpp_buffer given a cpp_buffer B. The previous
1340 buffer is the buffer that included the given buffer. */
1341
1342cpp_buffer *
1343cpp_get_prev (cpp_buffer *b)
1344{
1345 return b->prev;
1346}
Geoffrey Keating73e61092004-01-17 00:37:47 +00001347
Kazu Hirata1ae58c32004-04-30 16:27:30 +00001348/* This data structure holds the list of header files that were seen
Geoffrey Keating73e61092004-01-17 00:37:47 +00001349 while the PCH was being built. The 'entries' field is kept sorted
1350 in memcmp() order; yes, this means that on little-endian systems,
1351 it's sorted initially by the least-significant byte of 'size', but
1352 that's OK. The code does rely on having entries with the same size
1353 next to each other. */
1354
1355struct pchf_data {
1356 /* Number of pchf_entry structures. */
1357 size_t count;
1358
1359 /* Are there any values with once_only set?
1360 This is used as an optimisation, it means we don't have to search
1361 the structure if we're processing a regular #include. */
1362 bool have_once_only;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001363
Geoffrey Keating73e61092004-01-17 00:37:47 +00001364 struct pchf_entry {
1365 /* The size of this file. This is used to save running a MD5 checksum
1366 if the sizes don't match. */
1367 off_t size;
1368 /* The MD5 checksum of this file. */
1369 unsigned char sum[16];
1370 /* Is this file to be included only once? */
1371 bool once_only;
1372 } entries[1];
1373};
1374
1375static struct pchf_data *pchf;
1376
1377/* Data for pchf_addr. */
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001378struct pchf_adder_info
Geoffrey Keating73e61092004-01-17 00:37:47 +00001379{
1380 cpp_reader *pfile;
1381 struct pchf_data *d;
1382};
1383
1384/* A hash traversal function to add entries into DATA->D. */
1385
1386static int
1387pchf_adder (void **slot, void *data)
1388{
1389 struct file_hash_entry *h = (struct file_hash_entry *) *slot;
1390 struct pchf_adder_info *i = (struct pchf_adder_info *) data;
1391
1392 if (h->start_dir != NULL && h->u.file->stack_count != 0)
1393 {
1394 struct pchf_data *d = i->d;
1395 _cpp_file *f = h->u.file;
1396 size_t count = d->count++;
1397
1398 /* This should probably never happen, since if a read error occurred
1399 the PCH file shouldn't be written... */
1400 if (f->dont_read || f->err_no)
1401 return 1;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001402
Geoffrey Keating73e61092004-01-17 00:37:47 +00001403 d->entries[count].once_only = f->once_only;
Joe Buck97d62312004-05-03 22:59:50 +00001404 /* |= is avoided in the next line because of an HP C compiler bug */
1405 d->have_once_only = d->have_once_only | f->once_only;
Geoffrey Keating73e61092004-01-17 00:37:47 +00001406 if (f->buffer_valid)
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001407 md5_buffer ((const char *)f->buffer,
Geoffrey Keating73e61092004-01-17 00:37:47 +00001408 f->st.st_size, d->entries[count].sum);
1409 else
1410 {
1411 FILE *ff;
1412 int oldfd = f->fd;
1413
1414 if (!open_file (f))
1415 {
1416 open_file_failed (i->pfile, f);
1417 return 0;
1418 }
1419 ff = fdopen (f->fd, "rb");
1420 md5_stream (ff, d->entries[count].sum);
1421 fclose (ff);
1422 f->fd = oldfd;
1423 }
1424 d->entries[count].size = f->st.st_size;
1425 }
1426 return 1;
1427}
1428
1429/* A qsort ordering function for pchf_entry structures. */
1430
1431static int
1432pchf_save_compare (const void *e1, const void *e2)
1433{
1434 return memcmp (e1, e2, sizeof (struct pchf_entry));
1435}
1436
1437/* Create and write to F a pchf_data structure. */
1438
1439bool
1440_cpp_save_file_entries (cpp_reader *pfile, FILE *f)
1441{
1442 size_t count = 0;
1443 struct pchf_data *result;
1444 size_t result_size;
1445 struct pchf_adder_info pai;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001446
Geoffrey Keating73e61092004-01-17 00:37:47 +00001447 count = htab_elements (pfile->file_hash);
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001448 result_size = (sizeof (struct pchf_data)
Geoffrey Keating73e61092004-01-17 00:37:47 +00001449 + sizeof (struct pchf_entry) * (count - 1));
1450 result = xcalloc (result_size, 1);
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001451
Geoffrey Keating73e61092004-01-17 00:37:47 +00001452 result->count = 0;
1453 result->have_once_only = false;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001454
Geoffrey Keating73e61092004-01-17 00:37:47 +00001455 pai.pfile = pfile;
1456 pai.d = result;
1457 htab_traverse (pfile->file_hash, pchf_adder, &pai);
1458
1459 result_size = (sizeof (struct pchf_data)
1460 + sizeof (struct pchf_entry) * (result->count - 1));
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001461
Geoffrey Keating73e61092004-01-17 00:37:47 +00001462 qsort (result->entries, result->count, sizeof (struct pchf_entry),
1463 pchf_save_compare);
1464
1465 return fwrite (result, result_size, 1, f) == 1;
1466}
1467
1468/* Read the pchf_data structure from F. */
1469
1470bool
1471_cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1472{
1473 struct pchf_data d;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001474
Geoffrey Keating73e61092004-01-17 00:37:47 +00001475 if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1476 != 1)
1477 return false;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001478
Geoffrey Keating73e61092004-01-17 00:37:47 +00001479 pchf = xmalloc (sizeof (struct pchf_data)
1480 + sizeof (struct pchf_entry) * (d.count - 1));
1481 memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1482 if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1483 != d.count)
1484 return false;
1485 return true;
1486}
1487
1488/* The parameters for pchf_compare. */
1489
1490struct pchf_compare_data
1491{
1492 /* The size of the file we're looking for. */
1493 off_t size;
1494
1495 /* The MD5 checksum of the file, if it's been computed. */
1496 unsigned char sum[16];
1497
1498 /* Is SUM valid? */
1499 bool sum_computed;
1500
1501 /* Do we need to worry about entries that don't have ONCE_ONLY set? */
1502 bool check_included;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001503
Geoffrey Keating73e61092004-01-17 00:37:47 +00001504 /* The file that we're searching for. */
1505 _cpp_file *f;
1506};
1507
1508/* bsearch comparison function; look for D_P in E_P. */
1509
1510static int
1511pchf_compare (const void *d_p, const void *e_p)
1512{
1513 const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1514 struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1515 int result;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001516
Geoffrey Keating73e61092004-01-17 00:37:47 +00001517 result = memcmp (&d->size, &e->size, sizeof (off_t));
1518 if (result != 0)
1519 return result;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001520
Geoffrey Keating73e61092004-01-17 00:37:47 +00001521 if (! d->sum_computed)
1522 {
1523 _cpp_file *const f = d->f;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001524
Geoffrey Keating73e61092004-01-17 00:37:47 +00001525 md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1526 d->sum_computed = true;
1527 }
1528
1529 result = memcmp (d->sum, e->sum, 16);
1530 if (result != 0)
1531 return result;
1532
1533 if (d->check_included || e->once_only)
1534 return 0;
1535 else
1536 return 1;
1537}
1538
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001539/* Check that F is not in a list read from a PCH file (if any).
Geoffrey Keating73e61092004-01-17 00:37:47 +00001540 Assumes that f->buffer_valid is true. Return TRUE if the file
1541 should not be read. */
1542
1543static bool
1544check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1545 _cpp_file *f,
1546 bool check_included)
1547{
1548 struct pchf_compare_data d;
Eric Christopher16dd5cf2004-02-02 20:20:58 +00001549
Geoffrey Keating73e61092004-01-17 00:37:47 +00001550 if (pchf == NULL
1551 || (! check_included && ! pchf->have_once_only))
1552 return false;
1553
1554 d.size = f->st.st_size;
1555 d.sum_computed = false;
1556 d.f = f;
1557 d.check_included = check_included;
1558 return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1559 pchf_compare) != NULL;
1560}