]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cppfiles.c
* collect2.c (main): Use strcmp when testing for "-shared".
[thirdparty/gcc.git] / gcc / cppfiles.c
CommitLineData
add7091b 1/* Part of CPP library. (include file handling)
5e7b4e25 2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
d6d52dd6 3 1999, 2000, 2001 Free Software Foundation, Inc.
add7091b
ZW
4 Written by Per Bothner, 1994.
5 Based on CCCP program by Paul Rubin, June 1986
6 Adapted to ANSI C, Richard Stallman, Jan 1987
7 Split out of cpplib.c, Zack Weinberg, Oct 1998
8
9This program is free software; you can redistribute it and/or modify it
10under the terms of the GNU General Public License as published by the
11Free Software Foundation; either version 2, or (at your option) any
12later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
e38992e8 21Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
add7091b
ZW
22
23#include "config.h"
24#include "system.h"
add7091b 25#include "cpplib.h"
88ae23e7 26#include "cpphash.h"
c1212d2f 27#include "intl.h"
168d3732 28#include "mkdeps.h"
c31a6508 29#include "splay-tree.h"
add7091b 30
f8f769ea
ZW
31#ifdef HAVE_MMAP_FILE
32# include <sys/mman.h>
33# ifndef MMAP_THRESHOLD
34# define MMAP_THRESHOLD 3 /* Minimum page count to mmap the file. */
35# endif
36
37#else /* No MMAP_FILE */
38# undef MMAP_THRESHOLD
39# define MMAP_THRESHOLD 0
40#endif
41
d7a2e0f7
ZW
42#ifndef O_BINARY
43# define O_BINARY 0
44#endif
45
a58d32c2
ZW
46/* If errno is inspected immediately after a system call fails, it will be
47 nonzero, and no error number will ever be zero. */
48#ifndef ENOENT
49# define ENOENT 0
50#endif
51#ifndef ENOTDIR
52# define ENOTDIR 0
53#endif
a58d32c2 54
f9a0e96c
ZW
55/* Suppress warning about function macros used w/o arguments in traditional
56 C. It is unlikely that glibc's strcmp macro helps this file at all. */
57#undef strcmp
58
642ce434
NB
59/* This structure is used for the table of all includes. */
60struct include_file
61{
62 const char *name; /* actual path name of file */
63 const cpp_hashnode *cmacro; /* macro, if any, preventing reinclusion. */
591e15a1 64 const struct search_path *foundhere;
642ce434
NB
65 /* location in search path where file was
66 found, for #include_next and sysp. */
67 const unsigned char *buffer; /* pointer to cached file contents */
68 struct stat st; /* copy of stat(2) data for file */
69 int fd; /* fd open on file (short term storage only) */
f277b5e0 70 int err_no; /* errno obtained if opening a file failed */
642ce434
NB
71 unsigned short include_count; /* number of times file has been read */
72 unsigned short refcnt; /* number of stacked buffers using this file */
73 unsigned char mapped; /* file buffer is mmapped */
642ce434
NB
74};
75
ae1139f9
DR
76/* Variable length record files on VMS will have a stat size that includes
77 record control characters that won't be included in the read size. */
78#ifdef VMS
79# define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
80# define STAT_SIZE_TOO_BIG(ST) ((ST).st_fab_rfm == FAB_C_VAR)
81#else
82# define STAT_SIZE_TOO_BIG(ST) 0
83#endif
84
28e0f040
NB
85/* The cmacro works like this: If it's NULL, the file is to be
86 included again. If it's NEVER_REREAD, the file is never to be
87 included again. Otherwise it is a macro hashnode, and the file is
ba133c96 88 to be included again if the macro is defined. */
28e0f040
NB
89#define NEVER_REREAD ((const cpp_hashnode *)-1)
90#define DO_NOT_REREAD(inc) \
91((inc)->cmacro && ((inc)->cmacro == NEVER_REREAD \
ba133c96 92 || (inc)->cmacro->type == NT_MACRO))
41947a54 93#define NO_INCLUDE_PATH ((struct include_file *) -1)
28e0f040 94
a73ac7a5 95static struct file_name_map *read_name_map
38b24ee2
ZW
96 PARAMS ((cpp_reader *, const char *));
97static char *read_filename_string PARAMS ((int, FILE *));
98static char *remap_filename PARAMS ((cpp_reader *, char *,
591e15a1
NB
99 struct search_path *));
100static struct search_path *search_from PARAMS ((cpp_reader *,
ba133c96 101 enum include_type));
41947a54 102static struct include_file *
ba133c96
NB
103 find_include_file PARAMS ((cpp_reader *, const cpp_token *,
104 enum include_type));
2047e26f 105static struct include_file *open_file PARAMS ((cpp_reader *, const char *));
7c092714 106static int read_include_file PARAMS ((cpp_reader *, struct include_file *));
e5eba70a 107static bool stack_include_file PARAMS ((cpp_reader *, struct include_file *));
a58d32c2 108static void purge_cache PARAMS ((struct include_file *));
a36c54fa 109static void destroy_node PARAMS ((splay_tree_value));
c71f835b 110static int report_missing_guard PARAMS ((splay_tree_node, void *));
a36c54fa
NB
111static splay_tree_node find_or_create_entry PARAMS ((cpp_reader *,
112 const char *));
113static void handle_missing_header PARAMS ((cpp_reader *, const char *, int));
f9200da2 114static int remove_component_p PARAMS ((const char *));
a36c54fa
NB
115
116/* Set up the splay tree we use to store information about all the
117 file names seen in this compilation. We also have entries for each
118 file we tried to open but failed; this saves system calls since we
119 don't try to open it again in future.
120
121 The key of each node is the file name, after processing by
122 _cpp_simplify_pathname. The path name may or may not be absolute.
123 The path string has been malloced, as is automatically freed by
124 registering free () as the splay tree key deletion function.
125
126 A node's value is a pointer to a struct include_file, and is never
127 NULL. */
d35364d1 128void
c71f835b 129_cpp_init_includes (pfile)
d35364d1
ZW
130 cpp_reader *pfile;
131{
132 pfile->all_include_files
c31a6508
ZW
133 = splay_tree_new ((splay_tree_compare_fn) strcmp,
134 (splay_tree_delete_key_fn) free,
a36c54fa 135 destroy_node);
0b3d776a 136}
add7091b 137
a36c54fa 138/* Tear down the splay tree. */
c71f835b
ZW
139void
140_cpp_cleanup_includes (pfile)
141 cpp_reader *pfile;
142{
143 splay_tree_delete (pfile->all_include_files);
144}
145
a36c54fa
NB
146/* Free a node. The path string is automatically freed. */
147static void
148destroy_node (v)
149 splay_tree_value v;
150{
151 struct include_file *f = (struct include_file *)v;
152
153 if (f)
154 {
155 purge_cache (f);
156 free (f);
157 }
158}
159
642ce434
NB
160/* Mark a file to not be reread (e.g. #import, read failure). */
161void
162_cpp_never_reread (file)
163 struct include_file *file;
164{
165 file->cmacro = NEVER_REREAD;
166}
167
ba133c96 168/* Lookup a filename, which is simplified after making a copy, and
f9200da2
NB
169 create an entry if none exists. errno is nonzero iff a (reported)
170 stat() error occurred during simplification. */
a36c54fa
NB
171static splay_tree_node
172find_or_create_entry (pfile, fname)
d6d52dd6
NB
173 cpp_reader *pfile;
174 const char *fname;
175{
a36c54fa
NB
176 splay_tree_node node;
177 struct include_file *file;
ba133c96 178 char *name = xstrdup (fname);
d6d52dd6 179
ba133c96
NB
180 _cpp_simplify_pathname (name);
181 node = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
182 if (node)
183 free (name);
184 else
d6d52dd6 185 {
a36c54fa 186 file = xcnew (struct include_file);
ba133c96 187 file->name = name;
f277b5e0 188 file->err_no = errno;
a36c54fa
NB
189 node = splay_tree_insert (pfile->all_include_files,
190 (splay_tree_key) file->name,
191 (splay_tree_value) file);
d6d52dd6 192 }
a36c54fa
NB
193
194 return node;
195}
196
ba133c96 197/* Enter a file name in the splay tree, for the sake of cpp_included. */
a36c54fa
NB
198void
199_cpp_fake_include (pfile, fname)
200 cpp_reader *pfile;
201 const char *fname;
202{
203 find_or_create_entry (pfile, fname);
d6d52dd6
NB
204}
205
a58d32c2 206/* Given a file name, look it up in the cache; if there is no entry,
2047e26f
NB
207 create one with a non-NULL value (regardless of success in opening
208 the file). If the file doesn't exist or is inaccessible, this
209 entry is flagged so we don't attempt to open it again in the
373e2177
NB
210 future. If the file isn't open, open it. The empty string is
211 interpreted as stdin.
2047e26f
NB
212
213 Returns an include_file structure with an open file descriptor on
214 success, or NULL on failure. */
add7091b 215
c31a6508 216static struct include_file *
2047e26f 217open_file (pfile, filename)
c31a6508
ZW
218 cpp_reader *pfile;
219 const char *filename;
2047e26f 220{
a36c54fa
NB
221 splay_tree_node nd = find_or_create_entry (pfile, filename);
222 struct include_file *file = (struct include_file *) nd->value;
add7091b 223
f277b5e0
NB
224 if (file->err_no)
225 {
226 /* Ugh. handle_missing_header () needs errno to be set. */
227 errno = file->err_no;
228 return 0;
229 }
2047e26f 230
ec5c56db 231 /* Don't reopen an idempotent file. */
a36c54fa
NB
232 if (DO_NOT_REREAD (file))
233 return file;
def3263a 234
ec5c56db 235 /* Don't reopen one which is already loaded. */
a36c54fa
NB
236 if (file->buffer != NULL)
237 return file;
add7091b 238
c31a6508
ZW
239 /* We used to open files in nonblocking mode, but that caused more
240 problems than it solved. Do take care not to acquire a
241 controlling terminal by mistake (this can't happen on sane
242 systems, but paranoia is a virtue).
add7091b 243
c31a6508
ZW
244 Use the three-argument form of open even though we aren't
245 specifying O_CREAT, to defend against broken system headers.
add7091b 246
c31a6508
ZW
247 O_BINARY tells some runtime libraries (notably DJGPP) not to do
248 newline translation; we can handle DOS line breaks just fine
249 ourselves.
b0699dad 250
c31a6508 251 Special case: the empty string is translated to stdin. */
d4506961 252
c31a6508 253 if (filename[0] == '\0')
2047e26f 254 file->fd = 0;
f2d5f0cc 255 else
ba133c96 256 file->fd = open (file->name, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
a58d32c2 257
2047e26f
NB
258 if (file->fd != -1 && fstat (file->fd, &file->st) == 0)
259 {
c0bfe993
NB
260 if (!S_ISDIR (file->st.st_mode))
261 return file;
55485cd9 262
7c092714
NB
263 /* If it's a directory, we return null and continue the search
264 as the file we're looking for may appear elsewhere in the
265 search path. */
c0bfe993 266 errno = ENOENT;
55485cd9
ZW
267 close (file->fd);
268 file->fd = -1;
2047e26f 269 }
a58d32c2 270
f277b5e0 271 file->err_no = errno;
a58d32c2
ZW
272 return 0;
273}
274
e5eba70a
NB
275/* Place the file referenced by INC into a new buffer on the buffer
276 stack, unless there are errors, or the file is not re-included
277 because of e.g. multiple-include guards. Returns true if a buffer
278 is stacked. */
a58d32c2 279
e5eba70a 280static bool
a58d32c2
ZW
281stack_include_file (pfile, inc)
282 cpp_reader *pfile;
283 struct include_file *inc;
284{
285 cpp_buffer *fp;
e5eba70a 286 int sysp;
bb74c963 287 const char *filename;
51d0f328 288
e5eba70a
NB
289 if (DO_NOT_REREAD (inc))
290 return false;
291
47d89cf3 292 sysp = MAX ((pfile->map ? pfile->map->sysp : 0),
11bca309 293 (inc->foundhere ? inc->foundhere->sysp : 0));
51d0f328
NB
294
295 /* For -M, add the file to the dependencies on its first inclusion. */
e5eba70a 296 if (CPP_OPTION (pfile, print_deps) > sysp && !inc->include_count)
51d0f328
NB
297 deps_add_dep (pfile->deps, inc->name);
298
7c092714 299 /* Not in cache? */
e5eba70a 300 if (! inc->buffer)
7c092714 301 {
4d6baafa 302 if (read_include_file (pfile, inc))
e5eba70a 303 {
c0bfe993 304 /* If an error occurs, do not try to read this file again. */
e5eba70a
NB
305 _cpp_never_reread (inc);
306 return false;
307 }
4d6baafa
NB
308 /* Mark a regular, zero-length file never-reread. We read it,
309 NUL-terminate it, and stack it once, so preprocessing a main
310 file of zero length does not raise an error. */
311 if (S_ISREG (inc->st.st_mode) && inc->st.st_size == 0)
312 _cpp_never_reread (inc);
7c092714
NB
313 close (inc->fd);
314 inc->fd = -1;
315 }
316
e5eba70a 317 if (pfile->buffer)
5993019d
NB
318 /* We don't want MI guard advice for the main file. */
319 inc->include_count++;
eb1f4d9d
NB
320
321 /* Push a buffer. */
29401c30
NB
322 fp = cpp_push_buffer (pfile, inc->buffer, inc->st.st_size,
323 /* from_stage3 */ CPP_OPTION (pfile, preprocessed), 0);
eb1f4d9d 324 fp->inc = inc;
3cf3593f 325 fp->inc->refcnt++;
a58d32c2 326
3cf3593f 327 /* Initialise controlling macro state. */
6d18adbc 328 pfile->mi_valid = true;
3cf3593f 329 pfile->mi_cmacro = 0;
eb1f4d9d
NB
330
331 /* Generate the call back. */
bb74c963
NB
332 filename = inc->name;
333 if (*filename == '\0')
0b264069 334 filename = "<stdin>";
bb74c963 335 _cpp_do_file_change (pfile, LC_ENTER, filename, 1, sysp);
e5eba70a
NB
336
337 return true;
a58d32c2
ZW
338}
339
340/* Read the file referenced by INC into the file cache.
341
342 If fd points to a plain file, we might be able to mmap it; we can
343 definitely allocate the buffer all at once. If fd is a pipe or
344 terminal, we can't do either. If fd is something weird, like a
7c092714 345 block device, we don't want to read it at all.
a58d32c2
ZW
346
347 Unfortunately, different systems use different st.st_mode values
348 for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
349 zero the entire struct stat except a couple fields. Hence we don't
7c092714
NB
350 even try to figure out what something is, except for plain files
351 and block devices.
a58d32c2
ZW
352
353 FIXME: Flush file cache and try again if we run out of memory. */
354
7c092714 355static int
a58d32c2
ZW
356read_include_file (pfile, inc)
357 cpp_reader *pfile;
358 struct include_file *inc;
359{
360 ssize_t size, offset, count;
361 U_CHAR *buf;
362#if MMAP_THRESHOLD
363 static int pagesize = -1;
364#endif
365
366 if (S_ISREG (inc->st.st_mode))
f2d5f0cc 367 {
a58d32c2
ZW
368 /* off_t might have a wider range than ssize_t - in other words,
369 the max size of a file might be bigger than the address
370 space. We can't handle a file that large. (Anyone with
371 a single source file bigger than 2GB needs to rethink
372 their coding style.) Some systems (e.g. AIX 4.1) define
373 SSIZE_MAX to be much smaller than the actual range of the
374 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
375 does not bite us. */
376 if (inc->st.st_size > INTTYPE_MAXIMUM (ssize_t))
f2d5f0cc 377 {
a58d32c2
ZW
378 cpp_error (pfile, "%s is too large", inc->name);
379 goto fail;
f2d5f0cc 380 }
a58d32c2
ZW
381 size = inc->st.st_size;
382
ae0f4dee 383 inc->mapped = 0;
a58d32c2
ZW
384#if MMAP_THRESHOLD
385 if (pagesize == -1)
386 pagesize = getpagesize ();
387
07e96fc6
ZW
388 /* Use mmap if the file is big enough to be worth it (controlled
389 by MMAP_THRESHOLD) and if we can safely count on there being
390 at least one readable NUL byte after the end of the file's
391 contents. This is true for all tested operating systems when
392 the file size is not an exact multiple of the page size. */
4d6baafa
NB
393 if (size / pagesize >= MMAP_THRESHOLD
394 && (size % pagesize) != 0)
a58d32c2
ZW
395 {
396 buf = (U_CHAR *) mmap (0, size, PROT_READ, MAP_PRIVATE, inc->fd, 0);
397 if (buf == (U_CHAR *)-1)
398 goto perror_fail;
399 inc->mapped = 1;
400 }
401 else
c31a6508 402#endif
d4506961 403 {
4d6baafa 404 buf = (U_CHAR *) xmalloc (size + 1);
a58d32c2
ZW
405 offset = 0;
406 while (offset < size)
407 {
408 count = read (inc->fd, buf + offset, size - offset);
409 if (count < 0)
410 goto perror_fail;
411 if (count == 0)
412 {
ae1139f9
DR
413 if (!STAT_SIZE_TOO_BIG (inc->st))
414 cpp_warning
415 (pfile, "%s is shorter than expected", inc->name);
cdb29058
DR
416 size = offset;
417 buf = xrealloc (buf, size + 1);
418 inc->st.st_size = size;
a58d32c2
ZW
419 break;
420 }
421 offset += count;
422 }
4d6baafa
NB
423 /* The lexer requires that the buffer be NUL-terminated. */
424 buf[size] = '\0';
d4506961 425 }
a58d32c2
ZW
426 }
427 else if (S_ISBLK (inc->st.st_mode))
428 {
429 cpp_error (pfile, "%s is a block device", inc->name);
430 goto fail;
431 }
a58d32c2
ZW
432 else
433 {
434 /* 8 kilobytes is a sensible starting size. It ought to be
435 bigger than the kernel pipe buffer, and it's definitely
436 bigger than the majority of C source files. */
437 size = 8 * 1024;
d4506961 438
4d6baafa 439 buf = (U_CHAR *) xmalloc (size + 1);
a58d32c2
ZW
440 offset = 0;
441 while ((count = read (inc->fd, buf + offset, size - offset)) > 0)
f2d5f0cc 442 {
a58d32c2
ZW
443 offset += count;
444 if (offset == size)
4d6baafa
NB
445 {
446 size *= 2;
447 buf = xrealloc (buf, size + 1);
448 }
f2d5f0cc 449 }
a58d32c2
ZW
450 if (count < 0)
451 goto perror_fail;
452
4d6baafa
NB
453 if (offset + 1 < size)
454 buf = xrealloc (buf, offset + 1);
455
456 /* The lexer requires that the buffer be NUL-terminated. */
457 buf[offset] = '\0';
a58d32c2 458 inc->st.st_size = offset;
f2d5f0cc 459 }
d7a2e0f7 460
a58d32c2 461 inc->buffer = buf;
7c092714 462 return 0;
a58d32c2
ZW
463
464 perror_fail:
465 cpp_error_from_errno (pfile, inc->name);
466 fail:
7c092714 467 return 1;
a58d32c2
ZW
468}
469
470static void
471purge_cache (inc)
472 struct include_file *inc;
473{
474 if (inc->buffer)
c31a6508 475 {
ae0f4dee 476#if MMAP_THRESHOLD
a58d32c2 477 if (inc->mapped)
6f84c9bd 478 munmap ((PTR) inc->buffer, inc->st.st_size);
a58d32c2 479 else
ae0f4dee 480#endif
a58d32c2
ZW
481 free ((PTR) inc->buffer);
482 inc->buffer = NULL;
c31a6508 483 }
e576beb0
ZW
484}
485
c31a6508
ZW
486/* Return 1 if the file named by FNAME has been included before in
487 any context, 0 otherwise. */
488int
489cpp_included (pfile, fname)
add7091b 490 cpp_reader *pfile;
bcc5cac9 491 const char *fname;
add7091b 492{
591e15a1 493 struct search_path *path;
e7182666 494 char *name, *n;
c31a6508 495 splay_tree_node nd;
0b3d776a 496
05e81724 497 if (IS_ABSOLUTE_PATHNAME (fname))
0b3d776a 498 {
c31a6508
ZW
499 /* Just look it up. */
500 nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) fname);
501 return (nd && nd->value);
0b3d776a 502 }
c31a6508
ZW
503
504 /* Search directory path for the file. */
b6464a73 505 name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
c31a6508 506 for (path = CPP_OPTION (pfile, quote_include); path; path = path->next)
0b3d776a 507 {
591e15a1
NB
508 memcpy (name, path->name, path->len);
509 name[path->len] = '/';
510 strcpy (&name[path->len + 1], fname);
c31a6508 511 if (CPP_OPTION (pfile, remap))
e7182666
NB
512 n = remap_filename (pfile, name, path);
513 else
ba133c96 514 n = name;
c31a6508 515
e7182666 516 nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) n);
c31a6508
ZW
517 if (nd && nd->value)
518 return 1;
0b3d776a 519 }
c31a6508 520 return 0;
add7091b
ZW
521}
522
41947a54
NB
523/* Search for HEADER. Return 0 if there is no such file (or it's
524 un-openable), in which case an error code will be in errno. If
525 there is no include path to use it returns NO_INCLUDE_PATH,
526 otherwise an include_file structure. If this request originates
527 from a #include_next directive, set INCLUDE_NEXT to true. */
c31a6508
ZW
528
529static struct include_file *
ba133c96 530find_include_file (pfile, header, type)
f2d5f0cc 531 cpp_reader *pfile;
41947a54 532 const cpp_token *header;
ba133c96 533 enum include_type type;
f2d5f0cc 534{
41947a54 535 const char *fname = (const char *) header->val.str.text;
591e15a1 536 struct search_path *path;
c31a6508 537 struct include_file *file;
e7182666 538 char *name, *n;
add7091b 539
05e81724 540 if (IS_ABSOLUTE_PATHNAME (fname))
2047e26f 541 return open_file (pfile, fname);
41947a54
NB
542
543 /* For #include_next, skip in the search path past the dir in which
e7182666
NB
544 the current file was found, but if it was found via an absolute
545 path use the normal search logic. */
ba133c96 546 if (type == IT_INCLUDE_NEXT && pfile->buffer->inc->foundhere)
41947a54
NB
547 path = pfile->buffer->inc->foundhere->next;
548 else if (header->type == CPP_HEADER_NAME)
549 path = CPP_OPTION (pfile, bracket_include);
550 else
ba133c96 551 path = search_from (pfile, type);
41947a54
NB
552
553 if (path == NULL)
554 {
1f978f5f 555 cpp_error (pfile, "no include path in which to find %s", fname);
41947a54
NB
556 return NO_INCLUDE_PATH;
557 }
558
c31a6508 559 /* Search directory path for the file. */
b6464a73 560 name = (char *) alloca (strlen (fname) + pfile->max_include_len + 2);
41947a54 561 for (; path; path = path->next)
add7091b 562 {
55485cd9
ZW
563 int len = path->len;
564 memcpy (name, path->name, len);
565 /* Don't turn / into // or // into ///; // may be a namespace
566 escape. */
567 if (name[len-1] == '/')
568 len--;
569 name[len] = '/';
570 strcpy (&name[len + 1], fname);
c31a6508 571 if (CPP_OPTION (pfile, remap))
e7182666
NB
572 n = remap_filename (pfile, name, path);
573 else
ba133c96 574 n = name;
c31a6508 575
e7182666 576 file = open_file (pfile, n);
c31a6508 577 if (file)
add7091b 578 {
c31a6508
ZW
579 file->foundhere = path;
580 return file;
add7091b
ZW
581 }
582 }
591e15a1 583
c31a6508 584 return 0;
add7091b
ZW
585}
586
e605b040 587/* Not everyone who wants to set system-header-ness on a buffer can
642ce434
NB
588 see the details of a buffer. This is an exported interface because
589 fix-header needs it. */
e605b040 590void
614c7d37 591cpp_make_system_header (pfile, syshdr, externc)
e605b040 592 cpp_reader *pfile;
614c7d37 593 int syshdr, externc;
e605b040 594{
614c7d37
NB
595 int flags = 0;
596
597 /* 1 = system header, 2 = system header to be treated as C. */
598 if (syshdr)
599 flags = 1 + (externc != 0);
47d89cf3
NB
600 _cpp_do_file_change (pfile, LC_RENAME, pfile->map->to_file,
601 SOURCE_LINE (pfile->map, pfile->line), flags);
e605b040
ZW
602}
603
c71f835b
ZW
604/* Report on all files that might benefit from a multiple include guard.
605 Triggered by -H. */
606void
607_cpp_report_missing_guards (pfile)
608 cpp_reader *pfile;
609{
610 int banner = 0;
611 splay_tree_foreach (pfile->all_include_files, report_missing_guard,
612 (PTR) &banner);
613}
614
615static int
616report_missing_guard (n, b)
617 splay_tree_node n;
618 void *b;
619{
620 struct include_file *f = (struct include_file *) n->value;
621 int *bannerp = (int *)b;
622
623 if (f && f->cmacro == 0 && f->include_count == 1)
624 {
625 if (*bannerp == 0)
626 {
627 fputs (_("Multiple include guards may be useful for:\n"), stderr);
628 *bannerp = 1;
629 }
630 fputs (f->name, stderr);
631 putc ('\n', stderr);
632 }
633 return 0;
634}
635
6d2f8887 636/* Create a dependency, or issue an error message as appropriate. */
a36c54fa
NB
637static void
638handle_missing_header (pfile, fname, angle_brackets)
639 cpp_reader *pfile;
640 const char *fname;
641 int angle_brackets;
642{
d8693c6f 643 int print_dep = CPP_PRINT_DEPS(pfile) > (angle_brackets || pfile->map->sysp);
7c092714 644
a36c54fa
NB
645 if (CPP_OPTION (pfile, print_deps_missing_files) && print_dep)
646 {
647 if (!angle_brackets || IS_ABSOLUTE_PATHNAME (fname))
648 deps_add_dep (pfile->deps, fname);
649 else
650 {
651 /* If requested as a system header, assume it belongs in
652 the first system header directory. */
653 struct search_path *ptr = CPP_OPTION (pfile, bracket_include);
654 char *p;
655 int len = 0, fname_len = strlen (fname);
656
657 if (ptr)
658 len = ptr->len;
659
660 p = (char *) alloca (len + fname_len + 2);
661 if (len)
662 {
663 memcpy (p, ptr->name, len);
664 p[len++] = '/';
665 }
666 memcpy (p + len, fname, fname_len + 1);
a36c54fa
NB
667 deps_add_dep (pfile->deps, p);
668 }
669 }
e7182666
NB
670 /* If -M was specified, then don't count this as an error, because
671 we can still produce correct output. Otherwise, we can't produce
672 correct output, because there may be dependencies we need inside
673 the missing file, and we don't know what directory this missing
a1f300c0 674 file exists in. FIXME: Use a future cpp_diagnostic_with_errno ()
e7182666 675 for both of these cases. */
a36c54fa 676 else if (CPP_PRINT_DEPS (pfile) && ! print_dep)
e7182666 677 cpp_warning (pfile, "%s: %s", fname, xstrerror (errno));
a36c54fa
NB
678 else
679 cpp_error_from_errno (pfile, fname);
680}
681
e5eba70a
NB
682/* Handles #include-family directives, and the command line -imacros
683 and -include. Returns true if a buffer was stacked. */
684bool
ba133c96 685_cpp_execute_include (pfile, header, type)
168d3732 686 cpp_reader *pfile;
93c80368 687 const cpp_token *header;
ba133c96 688 enum include_type type;
168d3732 689{
e5eba70a 690 bool stacked = false;
ba133c96 691 struct include_file *inc = find_include_file (pfile, header, type);
642ce434 692
41947a54
NB
693 if (inc == 0)
694 handle_missing_header (pfile, (const char *) header->val.str.text,
695 header->type == CPP_HEADER_NAME);
696 else if (inc != NO_INCLUDE_PATH)
168d3732 697 {
e5eba70a 698 stacked = stack_include_file (pfile, inc);
51d0f328 699
ba133c96 700 if (type == IT_IMPORT)
e7182666 701 _cpp_never_reread (inc);
168d3732 702 }
ba133c96 703
e5eba70a 704 return stacked;
168d3732
ZW
705}
706
41947a54
NB
707/* Locate HEADER, and determine whether it is newer than the current
708 file. If it cannot be located or dated, return -1, if it is newer
709 newer, return 1, otherwise 0. */
f3f751ad 710int
41947a54 711_cpp_compare_file_date (pfile, header)
f3f751ad 712 cpp_reader *pfile;
41947a54 713 const cpp_token *header;
f3f751ad 714{
41947a54 715 struct include_file *inc = find_include_file (pfile, header, 0);
f3f751ad 716
41947a54 717 if (inc == NULL || inc == NO_INCLUDE_PATH)
f3f751ad 718 return -1;
41947a54 719
a58d32c2 720 if (inc->fd > 0)
f3f751ad 721 {
f3f751ad
NS
722 close (inc->fd);
723 inc->fd = -1;
724 }
a58d32c2 725
41947a54 726 return inc->st.st_mtime > pfile->buffer->inc->st.st_mtime;
f3f751ad
NS
727}
728
729
e5eba70a
NB
730/* Push an input buffer and load it up with the contents of FNAME. If
731 FNAME is "", read standard input. Return true if a buffer was
732 stacked. */
733bool
614c7d37 734_cpp_read_file (pfile, fname)
c45da1ca
ZW
735 cpp_reader *pfile;
736 const char *fname;
737{
373e2177 738 struct include_file *f = open_file (pfile, fname);
c45da1ca 739
041c3194 740 if (f == NULL)
c0bfe993
NB
741 {
742 cpp_error_from_errno (pfile, fname);
743 return false;
744 }
041c3194 745
c0bfe993 746 return stack_include_file (pfile, f);
f8f769ea
ZW
747}
748
f9a0e96c 749/* Do appropriate cleanup when a file buffer is popped off the input
29401c30 750 stack. Push the next -include file, if any remain. */
b7e30d8a 751bool
29401c30 752_cpp_pop_file_buffer (pfile, inc)
f9a0e96c 753 cpp_reader *pfile;
29401c30 754 struct include_file *inc;
f9a0e96c 755{
b7e30d8a
AS
756 bool pushed = false;
757
ba133c96 758 /* Record the inclusion-preventing macro, which could be NULL
6d18adbc
NB
759 meaning no controlling macro. */
760 if (pfile->mi_valid && inc->cmacro == NULL)
ba133c96 761 inc->cmacro = pfile->mi_cmacro;
93c80368
NB
762
763 /* Invalidate control macros in the #including file. */
6d18adbc 764 pfile->mi_valid = false;
f9a0e96c 765
a58d32c2
ZW
766 inc->refcnt--;
767 if (inc->refcnt == 0 && DO_NOT_REREAD (inc))
768 purge_cache (inc);
29401c30
NB
769
770 /* Don't generate a callback for popping the main file. */
771 if (pfile->buffer)
772 {
773 _cpp_do_file_change (pfile, LC_LEAVE, 0, 0, 0);
774
775 /* Finally, push the next -included file, if any. */
776 if (!pfile->buffer->prev)
b7e30d8a 777 pushed = _cpp_push_next_buffer (pfile);
29401c30 778 }
b7e30d8a
AS
779
780 return pushed;
f9a0e96c
ZW
781}
782
591e15a1
NB
783/* Returns the first place in the include chain to start searching for
784 "" includes. This involves stripping away the basename of the
ba133c96
NB
785 current file, unless -I- was specified.
786
787 If we're handling -include or -imacros, use the "" chain, but with
788 the preprocessor's cwd prepended. */
591e15a1 789static struct search_path *
ba133c96 790search_from (pfile, type)
591e15a1 791 cpp_reader *pfile;
ba133c96 792 enum include_type type;
591e15a1
NB
793{
794 cpp_buffer *buffer = pfile->buffer;
795 unsigned int dlen;
796
ba133c96
NB
797 /* Command line uses the cwd, and does not cache the result. */
798 if (type == IT_CMDLINE)
799 goto use_cwd;
800
591e15a1
NB
801 /* Ignore the current file's directory if -I- was given. */
802 if (CPP_OPTION (pfile, ignore_srcdir))
803 return CPP_OPTION (pfile, quote_include);
804
ba133c96 805 if (! buffer->search_cached)
591e15a1 806 {
ba133c96 807 buffer->search_cached = 1;
591e15a1 808
ba133c96 809 dlen = lbasename (buffer->inc->name) - buffer->inc->name;
591e15a1 810
ba133c96
NB
811 if (dlen)
812 {
813 /* We don't guarantee NAME is null-terminated. This saves
29401c30 814 allocating and freeing memory. Drop a trailing '/'. */
ba133c96
NB
815 buffer->dir.name = buffer->inc->name;
816 if (dlen > 1)
817 dlen--;
818 }
819 else
820 {
821 use_cwd:
822 buffer->dir.name = ".";
823 dlen = 1;
824 }
825
826 if (dlen > pfile->max_include_len)
827 pfile->max_include_len = dlen;
828
829 buffer->dir.len = dlen;
830 buffer->dir.next = CPP_OPTION (pfile, quote_include);
47d89cf3 831 buffer->dir.sysp = pfile->map->sysp;
ba133c96 832 }
591e15a1
NB
833
834 return &buffer->dir;
835}
836
c31a6508
ZW
837/* The file_name_map structure holds a mapping of file names for a
838 particular directory. This mapping is read from the file named
839 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
840 map filenames on a file system with severe filename restrictions,
841 such as DOS. The format of the file name map file is just a series
842 of lines with two tokens on each line. The first token is the name
843 to map, and the second token is the actual name to use. */
844
845struct file_name_map
846{
847 struct file_name_map *map_next;
848 char *map_from;
849 char *map_to;
850};
851
852#define FILE_NAME_MAP_FILE "header.gcc"
853
854/* Read a space delimited string of unlimited length from a stdio
855 file. */
856
857static char *
858read_filename_string (ch, f)
859 int ch;
860 FILE *f;
861{
862 char *alloc, *set;
863 int len;
864
865 len = 20;
866 set = alloc = xmalloc (len + 1);
867 if (! is_space(ch))
868 {
869 *set++ = ch;
870 while ((ch = getc (f)) != EOF && ! is_space(ch))
871 {
872 if (set - alloc == len)
873 {
874 len *= 2;
875 alloc = xrealloc (alloc, len + 1);
876 set = alloc + len / 2;
877 }
878 *set++ = ch;
879 }
880 }
881 *set = '\0';
882 ungetc (ch, f);
883 return alloc;
884}
885
886/* This structure holds a linked list of file name maps, one per directory. */
887
888struct file_name_map_list
889{
890 struct file_name_map_list *map_list_next;
891 char *map_list_name;
892 struct file_name_map *map_list_map;
893};
894
895/* Read the file name map file for DIRNAME. */
896
897static struct file_name_map *
898read_name_map (pfile, dirname)
899 cpp_reader *pfile;
900 const char *dirname;
901{
b3694847 902 struct file_name_map_list *map_list_ptr;
c31a6508
ZW
903 char *name;
904 FILE *f;
905
8767c894 906 /* Check the cache of directories, and mappings in their remap file. */
c31a6508
ZW
907 for (map_list_ptr = CPP_OPTION (pfile, map_list); map_list_ptr;
908 map_list_ptr = map_list_ptr->map_list_next)
909 if (! strcmp (map_list_ptr->map_list_name, dirname))
910 return map_list_ptr->map_list_map;
911
912 map_list_ptr = ((struct file_name_map_list *)
913 xmalloc (sizeof (struct file_name_map_list)));
914 map_list_ptr->map_list_name = xstrdup (dirname);
8767c894
NB
915
916 /* The end of the list ends in NULL. */
4b588241 917 map_list_ptr->map_list_map = NULL;
c31a6508
ZW
918
919 name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
920 strcpy (name, dirname);
921 if (*dirname)
922 strcat (name, "/");
923 strcat (name, FILE_NAME_MAP_FILE);
924 f = fopen (name, "r");
8767c894
NB
925
926 /* Silently return NULL if we cannot open. */
927 if (f)
c31a6508
ZW
928 {
929 int ch;
930 int dirlen = strlen (dirname);
931
932 while ((ch = getc (f)) != EOF)
933 {
934 char *from, *to;
935 struct file_name_map *ptr;
936
937 if (is_space(ch))
938 continue;
939 from = read_filename_string (ch, f);
940 while ((ch = getc (f)) != EOF && is_hspace(ch))
941 ;
942 to = read_filename_string (ch, f);
943
944 ptr = ((struct file_name_map *)
945 xmalloc (sizeof (struct file_name_map)));
946 ptr->map_from = from;
947
948 /* Make the real filename absolute. */
05e81724 949 if (IS_ABSOLUTE_PATHNAME (to))
c31a6508
ZW
950 ptr->map_to = to;
951 else
952 {
953 ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
954 strcpy (ptr->map_to, dirname);
955 ptr->map_to[dirlen] = '/';
956 strcpy (ptr->map_to + dirlen + 1, to);
957 free (to);
958 }
959
960 ptr->map_next = map_list_ptr->map_list_map;
961 map_list_ptr->map_list_map = ptr;
962
963 while ((ch = getc (f)) != '\n')
964 if (ch == EOF)
965 break;
966 }
967 fclose (f);
968 }
969
8767c894 970 /* Add this information to the cache. */
c31a6508
ZW
971 map_list_ptr->map_list_next = CPP_OPTION (pfile, map_list);
972 CPP_OPTION (pfile, map_list) = map_list_ptr;
973
974 return map_list_ptr->map_list_map;
975}
976
e7182666
NB
977/* Remap an unsimplified path NAME based on the file_name_map (if any)
978 for LOC. */
c31a6508
ZW
979static char *
980remap_filename (pfile, name, loc)
981 cpp_reader *pfile;
982 char *name;
591e15a1 983 struct search_path *loc;
c31a6508
ZW
984{
985 struct file_name_map *map;
8767c894 986 const char *from, *p;
e7182666 987 char *dir;
c31a6508
ZW
988
989 if (! loc->name_map)
8767c894 990 {
e7182666
NB
991 /* Get a null-terminated path. */
992 char *dname = alloca (loc->len + 1);
993 memcpy (dname, loc->name, loc->len);
994 dname[loc->len] = '\0';
995
591e15a1 996 loc->name_map = read_name_map (pfile, dname);
8767c894
NB
997 if (! loc->name_map)
998 return name;
999 }
c31a6508 1000
e7182666 1001 /* This works since NAME has not been simplified yet. */
591e15a1 1002 from = name + loc->len + 1;
c31a6508
ZW
1003
1004 for (map = loc->name_map; map; map = map->map_next)
1005 if (!strcmp (map->map_from, from))
1006 return map->map_to;
1007
1008 /* Try to find a mapping file for the particular directory we are
1009 looking in. Thus #include <sys/types.h> will look up sys/types.h
1010 in /usr/include/header.gcc and look up types.h in
1011 /usr/include/sys/header.gcc. */
1012 p = strrchr (name, '/');
1013 if (!p)
c31a6508
ZW
1014 return name;
1015
8767c894 1016 /* We know p != name as absolute paths don't call remap_filename. */
c31a6508 1017 if (p == name)
8767c894
NB
1018 cpp_ice (pfile, "absolute file name in remap_filename");
1019
1020 dir = (char *) alloca (p - name + 1);
1021 memcpy (dir, name, p - name);
1022 dir[p - name] = '\0';
1023 from = p + 1;
c31a6508
ZW
1024
1025 for (map = read_name_map (pfile, dir); map; map = map->map_next)
8767c894 1026 if (! strcmp (map->map_from, from))
c31a6508
ZW
1027 return map->map_to;
1028
1029 return name;
1030}
1031
f9200da2
NB
1032/* Returns true if it is safe to remove the final component of path,
1033 when it is followed by a ".." component. We use lstat to avoid
1034 symlinks if we have it. If not, we can still catch errors with
1035 stat (). */
1036static int
1037remove_component_p (path)
1038 const char *path;
1039{
1040 struct stat s;
1041 int result;
1042
1043#ifdef HAVE_LSTAT
1044 result = lstat (path, &s);
1045#else
1046 result = stat (path, &s);
1047#endif
1048
8d75ad04
AO
1049 /* There's no guarantee that errno will be unchanged, even on
1050 success. Cygwin's lstat(), for example, will often set errno to
1051 ENOSYS. In case of success, reset errno to zero. */
1052 if (result == 0)
1053 errno = 0;
1054
f9200da2
NB
1055 return result == 0 && S_ISDIR (s.st_mode);
1056}
1057
0b3d776a
ZW
1058/* Simplify a path name in place, deleting redundant components. This
1059 reduces OS overhead and guarantees that equivalent paths compare
1060 the same (modulo symlinks).
1061
1062 Transforms made:
1063 foo/bar/../quux foo/quux
1064 foo/./bar foo/bar
1065 foo//bar foo/bar
1066 /../quux /quux
1067 //quux //quux (POSIX allows leading // as a namespace escape)
1068
f9200da2
NB
1069 Guarantees no trailing slashes. All transforms reduce the length
1070 of the string. Returns PATH. errno is 0 if no error occurred;
1071 nonzero if an error occurred when using stat () or lstat (). */
1072
e7182666 1073char *
b0699dad 1074_cpp_simplify_pathname (path)
21380ab0 1075 char *path;
0b3d776a 1076{
f9200da2
NB
1077#ifndef VMS
1078 char *from, *to;
1079 char *base, *orig_base;
1080 int absolute = 0;
1081
1082 errno = 0;
1083 /* Don't overflow the empty path by putting a '.' in it below. */
1084 if (*path == '\0')
1085 return path;
0b3d776a 1086
509781a4 1087#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
ec5c56db 1088 /* Convert all backslashes to slashes. */
f9200da2
NB
1089 for (from = path; *from; from++)
1090 if (*from == '\\') *from = '/';
0b3d776a 1091
ec5c56db 1092 /* Skip over leading drive letter if present. */
f9200da2
NB
1093 if (ISALPHA (path[0]) && path[1] == ':')
1094 from = to = &path[2];
1095 else
0b3d776a 1096 from = to = path;
f9200da2
NB
1097#else
1098 from = to = path;
0b3d776a
ZW
1099#endif
1100
f9200da2
NB
1101 /* Remove redundant leading /s. */
1102 if (*from == '/')
0b3d776a 1103 {
f9200da2
NB
1104 absolute = 1;
1105 to++;
1106 from++;
1107 if (*from == '/')
0b3d776a 1108 {
f9200da2
NB
1109 if (*++from == '/')
1110 /* 3 or more initial /s are equivalent to 1 /. */
1111 while (*++from == '/');
1112 else
1113 /* On some hosts // differs from /; Posix allows this. */
1114 to++;
0b3d776a
ZW
1115 }
1116 }
f9200da2
NB
1117
1118 base = orig_base = to;
1119 for (;;)
0b3d776a 1120 {
f9200da2
NB
1121 int move_base = 0;
1122
1123 while (*from == '/')
1124 from++;
1125
1126 if (*from == '\0')
1127 break;
1128
1129 if (*from == '.')
0b3d776a 1130 {
f9200da2
NB
1131 if (from[1] == '\0')
1132 break;
1133 if (from[1] == '/')
0b3d776a 1134 {
f9200da2
NB
1135 from += 2;
1136 continue;
0b3d776a 1137 }
f9200da2 1138 else if (from[1] == '.' && (from[2] == '/' || from[2] == '\0'))
0b3d776a 1139 {
f9200da2
NB
1140 /* Don't simplify if there was no previous component. */
1141 if (absolute && orig_base == to)
0b3d776a 1142 {
f9200da2
NB
1143 from += 2;
1144 continue;
0b3d776a 1145 }
f9200da2
NB
1146 /* Don't simplify if the previous component was "../",
1147 or if an error has already occurred with (l)stat. */
1148 if (base != to && errno == 0)
0b3d776a 1149 {
f9200da2
NB
1150 /* We don't back up if it's a symlink. */
1151 *to = '\0';
1152 if (remove_component_p (path))
1153 {
1154 while (to > base && *to != '/')
1155 to--;
1156 from += 2;
1157 continue;
1158 }
0b3d776a 1159 }
f9200da2 1160 move_base = 1;
0b3d776a 1161 }
f9200da2
NB
1162 }
1163
1164 /* Add the component separator. */
1165 if (to > orig_base)
1166 *to++ = '/';
1167
1168 /* Copy this component until the trailing null or '/'. */
1169 while (*from != '\0' && *from != '/')
1170 *to++ = *from++;
1171
1172 if (move_base)
1173 base = to;
0b3d776a
ZW
1174 }
1175
f9200da2
NB
1176 /* Change the empty string to "." so that it is not treated as stdin.
1177 Null terminate. */
1178 if (to == path)
1179 *to++ = '.';
1180 *to = '\0';
1181
1182 return path;
1183#else /* VMS */
1184 errno = 0;
1185 return path;
1186#endif /* !VMS */
0b3d776a 1187}