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