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