cpphash.c (CPP_IS_MACRO_BUFFER, [...]): Delete.
[gcc.git] / gcc / cppfiles.c
1 /* Part of CPP library. (include file handling)
2 Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
3 1999, 2000 Free Software Foundation, Inc.
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
9 This program is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23 In other words, you are welcome to use, share and improve this program.
24 You are forbidden to forbid anyone else to use, share and improve
25 what you give them. Help stamp out software-hoarding! */
26
27 #include "config.h"
28 #include "system.h"
29 #include "cpplib.h"
30 #include "cpphash.h"
31 #include "hashtab.h"
32 #include "intl.h"
33 #include "mkdeps.h"
34
35 static IHASH *redundant_include_p PARAMS ((cpp_reader *, IHASH *,
36 struct file_name_list *));
37 static struct file_name_map *read_name_map
38 PARAMS ((cpp_reader *, const char *));
39 static char *read_filename_string PARAMS ((int, FILE *));
40 static char *remap_filename PARAMS ((cpp_reader *, char *,
41 struct file_name_list *));
42 static struct file_name_list *actual_directory
43 PARAMS ((cpp_reader *, const char *));
44 static unsigned int hash_IHASH PARAMS ((const void *));
45 static int eq_IHASH PARAMS ((const void *, const void *));
46 static int file_cleanup PARAMS ((cpp_buffer *, cpp_reader *));
47 static int find_include_file PARAMS ((cpp_reader *, const char *,
48 struct file_name_list *,
49 IHASH **, int *));
50 static int read_include_file PARAMS ((cpp_reader *, int, IHASH *));
51 static inline int open_include_file PARAMS ((cpp_reader *, const char *));
52
53 #if 0
54 static void hack_vms_include_specification PARAMS ((char *));
55 #endif
56
57 /* Initial size of include hash table. */
58 #define IHASHSIZE 50
59
60 #ifndef INCLUDE_LEN_FUDGE
61 #define INCLUDE_LEN_FUDGE 0
62 #endif
63
64 /* Calculate hash of an IHASH entry. */
65 static unsigned int
66 hash_IHASH (x)
67 const void *x;
68 {
69 const IHASH *i = (const IHASH *)x;
70 return i->hash;
71 }
72
73 /* Compare an existing IHASH structure with a potential one. */
74 static int
75 eq_IHASH (x, y)
76 const void *x;
77 const void *y;
78 {
79 const U_CHAR *a = ((const IHASH *)x)->nshort;
80 const U_CHAR *b = ((const IHASH *)y)->nshort;
81 return !strcmp (a, b);
82 }
83
84 /* Init the hash table. In here so it can see the hash and eq functions. */
85 void
86 _cpp_init_include_hash (pfile)
87 cpp_reader *pfile;
88 {
89 pfile->all_include_files
90 = htab_create (IHASHSIZE, hash_IHASH, eq_IHASH, free);
91 }
92
93 /* Return 0 if the file pointed to by IHASH has never been included before,
94 -1 if it has been included before and need not be again,
95 or a pointer to an IHASH entry which is the file to be reread.
96 "Never before" is with respect to the position in ILIST.
97
98 This will not detect redundancies involving odd uses of the
99 `current directory' rule for "" includes. They aren't quite
100 pathological, but I think they are rare enough not to worry about.
101 The simplest example is:
102
103 top.c:
104 #include "a/a.h"
105 #include "b/b.h"
106
107 a/a.h:
108 #include "../b/b.h"
109
110 and the problem is that for `current directory' includes,
111 ihash->foundhere is not on any of the global include chains,
112 so the test below (i->foundhere == l) may be false even when
113 the directories are in fact the same. */
114
115 static IHASH *
116 redundant_include_p (pfile, ihash, ilist)
117 cpp_reader *pfile;
118 IHASH *ihash;
119 struct file_name_list *ilist;
120 {
121 struct file_name_list *l;
122 IHASH *i;
123
124 if (! ihash->foundhere)
125 return 0;
126
127 for (i = ihash; i; i = i->next_this_file)
128 for (l = ilist; l; l = l->next)
129 if (i->foundhere == l)
130 /* The control_macro works like this: If it's NULL, the file
131 is to be included again. If it's "", the file is never to
132 be included again. If it's a string, the file is not to be
133 included again if the string is the name of a defined macro. */
134 return (i->control_macro
135 && (i->control_macro[0] == '\0'
136 || cpp_defined (pfile, i->control_macro, -1)))
137 ? (IHASH *)-1 : i;
138
139 return 0;
140 }
141
142 /* Return 1 if the file named by FNAME has been included before in
143 any context, 0 otherwise. */
144 int
145 cpp_included (pfile, fname)
146 cpp_reader *pfile;
147 const char *fname;
148 {
149 IHASH dummy, *ptr;
150 dummy.nshort = fname;
151 dummy.hash = _cpp_calc_hash (fname, strlen (fname));
152 ptr = htab_find_with_hash (pfile->all_include_files,
153 (const void *)&dummy, dummy.hash);
154 return (ptr != NULL);
155 }
156
157 static int
158 file_cleanup (pbuf, pfile)
159 cpp_buffer *pbuf;
160 cpp_reader *pfile;
161 {
162 if (pbuf->buf)
163 free ((PTR) pbuf->buf);
164 if (pfile->system_include_depth)
165 pfile->system_include_depth--;
166 return 0;
167 }
168
169 /* Centralize calls to open(2) here. This provides a hook for future
170 changes which might, e.g. look for and open a precompiled version
171 of the header. It also means all the magic currently associated
172 with calling open is in one place, and if we ever need more, it'll
173 be in one place too.
174
175 Open files in nonblocking mode, so we don't get stuck if someone
176 clever has asked cpp to process /dev/rmt0. read_include_file
177 will check that we have a real file to work with. Also take care
178 not to acquire a controlling terminal by mistake (this can't happen
179 on sane systems, but paranoia is a virtue).
180
181 Use the three-argument form of open even though we aren't
182 specifying O_CREAT, to defend against broken system headers. */
183
184 static inline int
185 open_include_file (pfile, filename)
186 cpp_reader *pfile ATTRIBUTE_UNUSED;
187 const char *filename;
188 {
189 return open (filename, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
190 }
191
192 /* Search for include file FNAME in the include chain starting at
193 SEARCH_START. Return -2 if this file doesn't need to be included
194 (because it was included already and it's marked idempotent),
195 -1 if an error occurred, or a file descriptor open on the file.
196 *IHASH is set to point to the include hash entry for this file, and
197 *BEFORE is set to 1 if the file was included before (but needs to be read
198 again). */
199 static int
200 find_include_file (pfile, fname, search_start, ihash, before)
201 cpp_reader *pfile;
202 const char *fname;
203 struct file_name_list *search_start;
204 IHASH **ihash;
205 int *before;
206 {
207 struct file_name_list *path;
208 IHASH *ih, **slot;
209 IHASH dummy;
210 int f;
211 char *name;
212
213 dummy.nshort = fname;
214 dummy.hash = _cpp_calc_hash (fname, strlen (fname));
215 path = (fname[0] == '/') ? ABSOLUTE_PATH : search_start;
216 slot = (IHASH **) htab_find_slot_with_hash (pfile->all_include_files,
217 (const void *)&dummy,
218 dummy.hash, 1);
219
220 if (*slot && (ih = redundant_include_p (pfile, *slot, path)))
221 {
222 if (ih == (IHASH *)-1)
223 return -2;
224
225 *before = 1;
226 *ihash = ih;
227 return open_include_file (pfile, ih->name);
228 }
229
230 if (path == ABSOLUTE_PATH)
231 {
232 name = (char *) fname;
233 f = open_include_file (pfile, name);
234 }
235 else
236 {
237 /* Search directory path, trying to open the file. */
238 name = alloca (strlen (fname) + pfile->max_include_len
239 + 2 + INCLUDE_LEN_FUDGE);
240 do
241 {
242 memcpy (name, path->name, path->nlen);
243 name[path->nlen] = '/';
244 strcpy (&name[path->nlen+1], fname);
245 _cpp_simplify_pathname (name);
246 if (CPP_OPTION (pfile, remap))
247 name = remap_filename (pfile, name, path);
248
249 f = open_include_file (pfile, name);
250 #ifdef EACCES
251 if (f == -1 && errno == EACCES)
252 {
253 cpp_error (pfile,
254 "included file `%s' exists but is not readable",
255 name);
256 return -1;
257 }
258 #endif
259 if (f >= 0)
260 break;
261 path = path->next;
262 }
263 while (path);
264 }
265 if (f == -1)
266 return -1;
267
268 if (path == ABSOLUTE_PATH)
269 {
270 ih = (IHASH *) xmalloc (sizeof (IHASH) + strlen (name));
271 ih->nshort = ih->name;
272 }
273 else
274 {
275 char *s;
276
277 if ((s = strstr (name, fname)) != NULL)
278 {
279 ih = (IHASH *) xmalloc (sizeof (IHASH) + strlen (name));
280 ih->nshort = ih->name + (s - name);
281 }
282 else
283 {
284 ih = (IHASH *) xmalloc (sizeof (IHASH) + strlen (name)
285 + strlen (fname) + 1);
286 ih->nshort = ih->name + strlen (name) + 1;
287 strcpy ((char *)ih->nshort, fname);
288 }
289 }
290 strcpy ((char *)ih->name, name);
291 ih->foundhere = path;
292 ih->control_macro = NULL;
293 ih->hash = dummy.hash;
294
295 ih->next_this_file = *slot;
296 *slot = ih;
297
298 *before = 0;
299 *ihash = ih;
300 return f;
301 }
302
303 /* The file_name_map structure holds a mapping of file names for a
304 particular directory. This mapping is read from the file named
305 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
306 map filenames on a file system with severe filename restrictions,
307 such as DOS. The format of the file name map file is just a series
308 of lines with two tokens on each line. The first token is the name
309 to map, and the second token is the actual name to use. */
310
311 struct file_name_map
312 {
313 struct file_name_map *map_next;
314 char *map_from;
315 char *map_to;
316 };
317
318 #define FILE_NAME_MAP_FILE "header.gcc"
319
320 /* Read a space delimited string of unlimited length from a stdio
321 file. */
322
323 static char *
324 read_filename_string (ch, f)
325 int ch;
326 FILE *f;
327 {
328 char *alloc, *set;
329 int len;
330
331 len = 20;
332 set = alloc = xmalloc (len + 1);
333 if (! is_space(ch))
334 {
335 *set++ = ch;
336 while ((ch = getc (f)) != EOF && ! is_space(ch))
337 {
338 if (set - alloc == len)
339 {
340 len *= 2;
341 alloc = xrealloc (alloc, len + 1);
342 set = alloc + len / 2;
343 }
344 *set++ = ch;
345 }
346 }
347 *set = '\0';
348 ungetc (ch, f);
349 return alloc;
350 }
351
352 /* This structure holds a linked list of file name maps, one per directory. */
353
354 struct file_name_map_list
355 {
356 struct file_name_map_list *map_list_next;
357 char *map_list_name;
358 struct file_name_map *map_list_map;
359 };
360
361 /* Read the file name map file for DIRNAME. */
362
363 static struct file_name_map *
364 read_name_map (pfile, dirname)
365 cpp_reader *pfile;
366 const char *dirname;
367 {
368 register struct file_name_map_list *map_list_ptr;
369 char *name;
370 FILE *f;
371
372 for (map_list_ptr = CPP_OPTION (pfile, map_list); map_list_ptr;
373 map_list_ptr = map_list_ptr->map_list_next)
374 if (! strcmp (map_list_ptr->map_list_name, dirname))
375 return map_list_ptr->map_list_map;
376
377 map_list_ptr = ((struct file_name_map_list *)
378 xmalloc (sizeof (struct file_name_map_list)));
379 map_list_ptr->map_list_name = xstrdup (dirname);
380
381 name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
382 strcpy (name, dirname);
383 if (*dirname)
384 strcat (name, "/");
385 strcat (name, FILE_NAME_MAP_FILE);
386 f = fopen (name, "r");
387 if (!f)
388 map_list_ptr->map_list_map = (struct file_name_map *)-1;
389 else
390 {
391 int ch;
392 int dirlen = strlen (dirname);
393
394 while ((ch = getc (f)) != EOF)
395 {
396 char *from, *to;
397 struct file_name_map *ptr;
398
399 if (is_space(ch))
400 continue;
401 from = read_filename_string (ch, f);
402 while ((ch = getc (f)) != EOF && is_hspace(ch))
403 ;
404 to = read_filename_string (ch, f);
405
406 ptr = ((struct file_name_map *)
407 xmalloc (sizeof (struct file_name_map)));
408 ptr->map_from = from;
409
410 /* Make the real filename absolute. */
411 if (*to == '/')
412 ptr->map_to = to;
413 else
414 {
415 ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
416 strcpy (ptr->map_to, dirname);
417 ptr->map_to[dirlen] = '/';
418 strcpy (ptr->map_to + dirlen + 1, to);
419 free (to);
420 }
421
422 ptr->map_next = map_list_ptr->map_list_map;
423 map_list_ptr->map_list_map = ptr;
424
425 while ((ch = getc (f)) != '\n')
426 if (ch == EOF)
427 break;
428 }
429 fclose (f);
430 }
431
432 map_list_ptr->map_list_next = CPP_OPTION (pfile, map_list);
433 CPP_OPTION (pfile, map_list) = map_list_ptr;
434
435 return map_list_ptr->map_list_map;
436 }
437
438 /* Remap NAME based on the file_name_map (if any) for LOC. */
439
440 static char *
441 remap_filename (pfile, name, loc)
442 cpp_reader *pfile;
443 char *name;
444 struct file_name_list *loc;
445 {
446 struct file_name_map *map;
447 const char *from, *p, *dir;
448
449 if (! loc->name_map)
450 loc->name_map = read_name_map (pfile,
451 loc->name
452 ? loc->name : ".");
453
454 if (loc->name_map == (struct file_name_map *)-1)
455 return name;
456
457 from = name + strlen (loc->name) + 1;
458
459 for (map = loc->name_map; map; map = map->map_next)
460 if (!strcmp (map->map_from, from))
461 return map->map_to;
462
463 /* Try to find a mapping file for the particular directory we are
464 looking in. Thus #include <sys/types.h> will look up sys/types.h
465 in /usr/include/header.gcc and look up types.h in
466 /usr/include/sys/header.gcc. */
467 p = strrchr (name, '/');
468 if (!p)
469 p = name;
470 if (loc && loc->name
471 && strlen (loc->name) == (size_t) (p - name)
472 && !strncmp (loc->name, name, p - name))
473 /* FILENAME is in SEARCHPTR, which we've already checked. */
474 return name;
475
476 if (p == name)
477 {
478 dir = ".";
479 from = name;
480 }
481 else
482 {
483 char * newdir = (char *) alloca (p - name + 1);
484 memcpy (newdir, name, p - name);
485 newdir[p - name] = '\0';
486 dir = newdir;
487 from = p + 1;
488 }
489
490 for (map = read_name_map (pfile, dir); map; map = map->map_next)
491 if (! strcmp (map->map_from, name))
492 return map->map_to;
493
494 return name;
495 }
496
497
498 void
499 _cpp_execute_include (pfile, fname, len, no_reinclude, search_start)
500 cpp_reader *pfile;
501 char *fname;
502 unsigned int len;
503 int no_reinclude;
504 struct file_name_list *search_start;
505 {
506 IHASH *ihash;
507 int fd;
508 int angle_brackets = fname[0] == '<';
509 int before;
510
511 if (!search_start)
512 {
513 if (angle_brackets)
514 search_start = CPP_OPTION (pfile, bracket_include);
515 else if (CPP_OPTION (pfile, ignore_srcdir))
516 search_start = CPP_OPTION (pfile, quote_include);
517 else
518 search_start = CPP_BUFFER (pfile)->actual_dir;
519 }
520
521 if (!search_start)
522 {
523 cpp_error (pfile, "No include path in which to find %s", fname);
524 return;
525 }
526
527 /* Remove quote marks. */
528 fname++;
529 len -= 2;
530 fname[len] = '\0';
531
532 fd = find_include_file (pfile, fname, search_start, &ihash, &before);
533
534 if (fd == -2)
535 return;
536
537 if (fd == -1)
538 {
539 if (CPP_OPTION (pfile, print_deps_missing_files)
540 && CPP_PRINT_DEPS (pfile) > (angle_brackets ||
541 (pfile->system_include_depth > 0)))
542 {
543 if (!angle_brackets)
544 deps_add_dep (pfile->deps, fname);
545 else
546 {
547 char *p;
548 struct file_name_list *ptr;
549 /* If requested as a system header, assume it belongs in
550 the first system header directory. */
551 if (CPP_OPTION (pfile, bracket_include))
552 ptr = CPP_OPTION (pfile, bracket_include);
553 else
554 ptr = CPP_OPTION (pfile, quote_include);
555
556 p = (char *) alloca (strlen (ptr->name)
557 + strlen (fname) + 2);
558 if (*ptr->name != '\0')
559 {
560 strcpy (p, ptr->name);
561 strcat (p, "/");
562 }
563 strcat (p, fname);
564 deps_add_dep (pfile->deps, p);
565 }
566 }
567 /* If -M was specified, and this header file won't be added to
568 the dependency list, then don't count this as an error,
569 because we can still produce correct output. Otherwise, we
570 can't produce correct output, because there may be
571 dependencies we need inside the missing file, and we don't
572 know what directory this missing file exists in. */
573 else if (CPP_PRINT_DEPS (pfile)
574 && (CPP_PRINT_DEPS (pfile)
575 <= (angle_brackets || (pfile->system_include_depth > 0))))
576 cpp_warning (pfile, "No include path in which to find %s", fname);
577 else
578 cpp_error_from_errno (pfile, fname);
579
580 return;
581 }
582
583 /* For -M, add the file to the dependencies on its first inclusion. */
584 if (!before && (CPP_PRINT_DEPS (pfile)
585 > (angle_brackets || (pfile->system_include_depth > 0))))
586 deps_add_dep (pfile->deps, ihash->name);
587
588 /* Handle -H option. */
589 if (CPP_OPTION (pfile, print_include_names))
590 {
591 cpp_buffer *fp = CPP_BUFFER (pfile);
592 while ((fp = CPP_PREV_BUFFER (fp)) != NULL)
593 putc ('.', stderr);
594 fprintf (stderr, " %s\n", ihash->name);
595 }
596
597 /* Actually process the file */
598
599 if (no_reinclude)
600 ihash->control_macro = (const U_CHAR *) "";
601
602 if (read_include_file (pfile, fd, ihash))
603 {
604 _cpp_output_line_command (pfile, enter_file);
605 if (angle_brackets)
606 pfile->system_include_depth++; /* Decremented in file_cleanup. */
607 }
608 }
609
610
611 /* Push an input buffer and load it up with the contents of FNAME.
612 If FNAME is "" or NULL, read standard input. */
613 int
614 cpp_read_file (pfile, fname)
615 cpp_reader *pfile;
616 const char *fname;
617 {
618 IHASH *ih, **slot;
619 IHASH dummy;
620 int f;
621
622 if (fname == NULL)
623 fname = "";
624
625 dummy.nshort = fname;
626 /* _cpp_calc_hash doesn't like zero-length strings. */
627 if (*fname == 0)
628 dummy.hash = 0;
629 else
630 dummy.hash = _cpp_calc_hash (fname, strlen (fname));
631 slot = (IHASH **) htab_find_slot_with_hash (pfile->all_include_files,
632 (const void *) &dummy,
633 dummy.hash, 1);
634 if (*slot && (ih = redundant_include_p (pfile, *slot, ABSOLUTE_PATH)))
635 {
636 if (ih == (IHASH *)-1)
637 return 1; /* Already included. */
638 }
639 else
640 {
641 ih = (IHASH *) xmalloc (sizeof (IHASH) + strlen (fname));
642 ih->control_macro = 0;
643 ih->foundhere = ABSOLUTE_PATH; /* well sort of ... */
644 ih->hash = dummy.hash;
645 strcpy ((char *)ih->name, fname);
646 ih->nshort = ih->name;
647
648 ih->next_this_file = *slot;
649 *slot = ih;
650 }
651
652 if (*fname == '\0')
653 f = 0;
654 else
655 f = open_include_file (pfile, fname);
656
657 return read_include_file (pfile, f, ih);
658 }
659
660 /* Read the contents of FD into the buffer on the top of PFILE's stack.
661 IHASH points to the include hash entry for the file associated with
662 FD.
663
664 The caller is responsible for the cpp_push_buffer. */
665
666 static int
667 read_include_file (pfile, fd, ihash)
668 cpp_reader *pfile;
669 int fd;
670 IHASH *ihash;
671 {
672 struct stat st;
673 size_t st_size;
674 long length;
675 cpp_buffer *fp;
676
677 fp = cpp_push_buffer (pfile, NULL, 0);
678
679 if (fp == 0)
680 goto push_fail;
681
682 if (fstat (fd, &st) < 0)
683 goto perror_fail;
684 if (fcntl (fd, F_SETFL, 0) == -1) /* turn off nonblocking mode */
685 goto perror_fail;
686
687 /* If fd points to a plain file, we know how big it is, so we can
688 allocate the buffer all at once. If fd is a pipe or terminal, we
689 can't. Most C source files are 4k or less, so we guess that. If
690 fd is something weird, like a block device or a directory, we
691 don't want to read it at all.
692
693 Unfortunately, different systems use different st.st_mode values
694 for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
695 zero the entire struct stat except a couple fields. Hence the
696 mess below.
697
698 In all cases, read_and_prescan will resize the buffer if it
699 turns out there's more data than we thought. */
700
701 if (S_ISREG (st.st_mode))
702 {
703 /* off_t might have a wider range than size_t - in other words,
704 the max size of a file might be bigger than the address
705 space. We can't handle a file that large. (Anyone with
706 a single source file bigger than 4GB needs to rethink
707 their coding style.) */
708 st_size = (size_t) st.st_size;
709 if ((unsigned HOST_WIDEST_INT) st_size
710 != (unsigned HOST_WIDEST_INT) st.st_size)
711 {
712 cpp_error (pfile, "file `%s' is too large", ihash->name);
713 goto fail;
714 }
715 }
716 else if (S_ISFIFO (st.st_mode) || S_ISSOCK (st.st_mode)
717 /* Permit any kind of character device: the sensible ones are
718 ttys and /dev/null, but weeding out the others is too hard. */
719 || S_ISCHR (st.st_mode)
720 /* Some 4.x (x<4) derivatives have a bug that makes fstat() of a
721 socket or pipe return a stat struct with most fields zeroed. */
722 || (st.st_mode == 0 && st.st_nlink == 0 && st.st_size == 0))
723 {
724 /* Cannot get its file size before reading. 4k is a decent
725 first guess. */
726 st_size = 4096;
727 }
728 else
729 {
730 cpp_error (pfile, "`%s' is not a file, pipe, or tty", ihash->name);
731 goto fail;
732 }
733
734 /* Read the file, converting end-of-line characters and trigraphs
735 (if enabled). */
736 fp->ihash = ihash;
737 fp->nominal_fname = ihash->name;
738 length = _cpp_read_and_prescan (pfile, fp, fd, st_size);
739 if (length < 0)
740 goto fail;
741 if (length == 0)
742 ihash->control_macro = (const U_CHAR *) ""; /* never re-include */
743
744 close (fd);
745 fp->rlimit = fp->buf + length;
746 fp->cur = fp->buf;
747 if (ihash->foundhere != ABSOLUTE_PATH)
748 fp->system_header_p = ihash->foundhere->sysp;
749 fp->lineno = 1;
750 fp->line_base = fp->buf;
751 fp->cleanup = file_cleanup;
752
753 /* The ->actual_dir field is only used when ignore_srcdir is not in effect;
754 see do_include */
755 if (!CPP_OPTION (pfile, ignore_srcdir))
756 fp->actual_dir = actual_directory (pfile, ihash->name);
757
758 pfile->input_stack_listing_current = 0;
759 pfile->only_seen_white = 2;
760 return 1;
761
762 perror_fail:
763 cpp_error_from_errno (pfile, ihash->name);
764 fail:
765 cpp_pop_buffer (pfile);
766 push_fail:
767 close (fd);
768 return 0;
769 }
770
771 /* Given a path FNAME, extract the directory component and place it
772 onto the actual_dirs list. Return a pointer to the allocated
773 file_name_list structure. These structures are used to implement
774 current-directory "" include searching. */
775
776 static struct file_name_list *
777 actual_directory (pfile, fname)
778 cpp_reader *pfile;
779 const char *fname;
780 {
781 char *last_slash, *dir;
782 size_t dlen;
783 struct file_name_list *x;
784
785 dir = xstrdup (fname);
786 last_slash = strrchr (dir, '/');
787 if (last_slash)
788 {
789 if (last_slash == dir)
790 {
791 dlen = 1;
792 last_slash[1] = '\0';
793 }
794 else
795 {
796 dlen = last_slash - dir;
797 *last_slash = '\0';
798 }
799 }
800 else
801 {
802 dir[0] = '.';
803 dir[1] = '\0';
804 dlen = 1;
805 }
806
807 if (dlen > pfile->max_include_len)
808 pfile->max_include_len = dlen;
809
810 for (x = pfile->actual_dirs; x; x = x->alloc)
811 if (!strcmp (x->name, dir))
812 {
813 free (dir);
814 return x;
815 }
816
817 /* Not found, make a new one. */
818 x = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
819 x->name = dir;
820 x->nlen = dlen;
821 x->next = CPP_OPTION (pfile, quote_include);
822 x->alloc = pfile->actual_dirs;
823 x->sysp = CPP_BUFFER (pfile)->system_header_p;
824 x->name_map = NULL;
825
826 pfile->actual_dirs = x;
827 return x;
828 }
829
830 /* Simplify a path name in place, deleting redundant components. This
831 reduces OS overhead and guarantees that equivalent paths compare
832 the same (modulo symlinks).
833
834 Transforms made:
835 foo/bar/../quux foo/quux
836 foo/./bar foo/bar
837 foo//bar foo/bar
838 /../quux /quux
839 //quux //quux (POSIX allows leading // as a namespace escape)
840
841 Guarantees no trailing slashes. All transforms reduce the length
842 of the string.
843 */
844 void
845 _cpp_simplify_pathname (path)
846 char *path;
847 {
848 char *from, *to;
849 char *base;
850 int absolute = 0;
851
852 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
853 /* Convert all backslashes to slashes. */
854 for (from = path; *from; from++)
855 if (*from == '\\') *from = '/';
856
857 /* Skip over leading drive letter if present. */
858 if (ISALPHA (path[0]) && path[1] == ':')
859 from = to = &path[2];
860 else
861 from = to = path;
862 #else
863 from = to = path;
864 #endif
865
866 /* Remove redundant initial /s. */
867 if (*from == '/')
868 {
869 absolute = 1;
870 to++;
871 from++;
872 if (*from == '/')
873 {
874 if (*++from == '/')
875 /* 3 or more initial /s are equivalent to 1 /. */
876 while (*++from == '/');
877 else
878 /* On some hosts // differs from /; Posix allows this. */
879 to++;
880 }
881 }
882 base = to;
883
884 for (;;)
885 {
886 while (*from == '/')
887 from++;
888
889 if (from[0] == '.' && from[1] == '/')
890 from += 2;
891 else if (from[0] == '.' && from[1] == '\0')
892 goto done;
893 else if (from[0] == '.' && from[1] == '.' && from[2] == '/')
894 {
895 if (base == to)
896 {
897 if (absolute)
898 from += 3;
899 else
900 {
901 *to++ = *from++;
902 *to++ = *from++;
903 *to++ = *from++;
904 base = to;
905 }
906 }
907 else
908 {
909 to -= 2;
910 while (to > base && *to != '/') to--;
911 if (*to == '/')
912 to++;
913 from += 3;
914 }
915 }
916 else if (from[0] == '.' && from[1] == '.' && from[2] == '\0')
917 {
918 if (base == to)
919 {
920 if (!absolute)
921 {
922 *to++ = *from++;
923 *to++ = *from++;
924 }
925 }
926 else
927 {
928 to -= 2;
929 while (to > base && *to != '/') to--;
930 if (*to == '/')
931 to++;
932 }
933 goto done;
934 }
935 else
936 /* Copy this component and trailing /, if any. */
937 while ((*to++ = *from++) != '/')
938 {
939 if (!to[-1])
940 {
941 to--;
942 goto done;
943 }
944 }
945
946 }
947
948 done:
949 /* Trim trailing slash */
950 if (to[0] == '/' && (!absolute || to > path+1))
951 to--;
952
953 /* Change the empty string to "." so that stat() on the result
954 will always work. */
955 if (to == path)
956 *to++ = '.';
957
958 *to = '\0';
959
960 return;
961 }
962
963 /* It is not clear when this should be used if at all, so I've
964 disabled it until someone who understands VMS can look at it. */
965 #if 0
966
967 /* Under VMS we need to fix up the "include" specification filename.
968
969 Rules for possible conversions
970
971 fullname tried paths
972
973 name name
974 ./dir/name [.dir]name
975 /dir/name dir:name
976 /name [000000]name, name
977 dir/name dir:[000000]name, dir:name, dir/name
978 dir1/dir2/name dir1:[dir2]name, dir1:[000000.dir2]name
979 path:/name path:[000000]name, path:name
980 path:/dir/name path:[000000.dir]name, path:[dir]name
981 path:dir/name path:[dir]name
982 [path]:[dir]name [path.dir]name
983 path/[dir]name [path.dir]name
984
985 The path:/name input is constructed when expanding <> includes. */
986
987
988 static void
989 hack_vms_include_specification (fullname)
990 char *fullname;
991 {
992 register char *basename, *unixname, *local_ptr, *first_slash;
993 int f, check_filename_before_returning, must_revert;
994 char Local[512];
995
996 check_filename_before_returning = 0;
997 must_revert = 0;
998 /* See if we can find a 1st slash. If not, there's no path information. */
999 first_slash = strchr (fullname, '/');
1000 if (first_slash == 0)
1001 return 0; /* Nothing to do!!! */
1002
1003 /* construct device spec if none given. */
1004
1005 if (strchr (fullname, ':') == 0)
1006 {
1007
1008 /* If fullname has a slash, take it as device spec. */
1009
1010 if (first_slash == fullname)
1011 {
1012 first_slash = strchr (fullname + 1, '/'); /* 2nd slash ? */
1013 if (first_slash)
1014 *first_slash = ':'; /* make device spec */
1015 for (basename = fullname; *basename != 0; basename++)
1016 *basename = *(basename+1); /* remove leading slash */
1017 }
1018 else if ((first_slash[-1] != '.') /* keep ':/', './' */
1019 && (first_slash[-1] != ':')
1020 && (first_slash[-1] != ']')) /* or a vms path */
1021 {
1022 *first_slash = ':';
1023 }
1024 else if ((first_slash[1] == '[') /* skip './' in './[dir' */
1025 && (first_slash[-1] == '.'))
1026 fullname += 2;
1027 }
1028
1029 /* Get part after first ':' (basename[-1] == ':')
1030 or last '/' (basename[-1] == '/'). */
1031
1032 basename = base_name (fullname);
1033
1034 local_ptr = Local; /* initialize */
1035
1036 /* We are trying to do a number of things here. First of all, we are
1037 trying to hammer the filenames into a standard format, such that later
1038 processing can handle them.
1039
1040 If the file name contains something like [dir.], then it recognizes this
1041 as a root, and strips the ".]". Later processing will add whatever is
1042 needed to get things working properly.
1043
1044 If no device is specified, then the first directory name is taken to be
1045 a device name (or a rooted logical). */
1046
1047 /* Point to the UNIX filename part (which needs to be fixed!)
1048 but skip vms path information.
1049 [basename != fullname since first_slash != 0]. */
1050
1051 if ((basename[-1] == ':') /* vms path spec. */
1052 || (basename[-1] == ']')
1053 || (basename[-1] == '>'))
1054 unixname = basename;
1055 else
1056 unixname = fullname;
1057
1058 if (*unixname == '/')
1059 unixname++;
1060
1061 /* If the directory spec is not rooted, we can just copy
1062 the UNIX filename part and we are done. */
1063
1064 if (((basename - fullname) > 1)
1065 && ( (basename[-1] == ']')
1066 || (basename[-1] == '>')))
1067 {
1068 if (basename[-2] != '.')
1069 {
1070
1071 /* The VMS part ends in a `]', and the preceding character is not a `.'.
1072 -> PATH]:/name (basename = '/name', unixname = 'name')
1073 We strip the `]', and then splice the two parts of the name in the
1074 usual way. Given the default locations for include files in cccp.c,
1075 we will only use this code if the user specifies alternate locations
1076 with the /include (-I) switch on the command line. */
1077
1078 basename -= 1; /* Strip "]" */
1079 unixname--; /* backspace */
1080 }
1081 else
1082 {
1083
1084 /* The VMS part has a ".]" at the end, and this will not do. Later
1085 processing will add a second directory spec, and this would be a syntax
1086 error. Thus we strip the ".]", and thus merge the directory specs.
1087 We also backspace unixname, so that it points to a '/'. This inhibits the
1088 generation of the 000000 root directory spec (which does not belong here
1089 in this case). */
1090
1091 basename -= 2; /* Strip ".]" */
1092 unixname--; /* backspace */
1093 }
1094 }
1095
1096 else
1097
1098 {
1099
1100 /* We drop in here if there is no VMS style directory specification yet.
1101 If there is no device specification either, we make the first dir a
1102 device and try that. If we do not do this, then we will be essentially
1103 searching the users default directory (as if they did a #include "asdf.h").
1104
1105 Then all we need to do is to push a '[' into the output string. Later
1106 processing will fill this in, and close the bracket. */
1107
1108 if ((unixname != fullname) /* vms path spec found. */
1109 && (basename[-1] != ':'))
1110 *local_ptr++ = ':'; /* dev not in spec. take first dir */
1111
1112 *local_ptr++ = '['; /* Open the directory specification */
1113 }
1114
1115 if (unixname == fullname) /* no vms dir spec. */
1116 {
1117 must_revert = 1;
1118 if ((first_slash != 0) /* unix dir spec. */
1119 && (*unixname != '/') /* not beginning with '/' */
1120 && (*unixname != '.')) /* or './' or '../' */
1121 *local_ptr++ = '.'; /* dir is local ! */
1122 }
1123
1124 /* at this point we assume that we have the device spec, and (at least
1125 the opening "[" for a directory specification. We may have directories
1126 specified already.
1127
1128 If there are no other slashes then the filename will be
1129 in the "root" directory. Otherwise, we need to add
1130 directory specifications. */
1131
1132 if (strchr (unixname, '/') == 0)
1133 {
1134 /* if no directories specified yet and none are following. */
1135 if (local_ptr[-1] == '[')
1136 {
1137 /* Just add "000000]" as the directory string */
1138 strcpy (local_ptr, "000000]");
1139 local_ptr += strlen (local_ptr);
1140 check_filename_before_returning = 1; /* we might need to fool with this later */
1141 }
1142 }
1143 else
1144 {
1145
1146 /* As long as there are still subdirectories to add, do them. */
1147 while (strchr (unixname, '/') != 0)
1148 {
1149 /* If this token is "." we can ignore it
1150 if it's not at the beginning of a path. */
1151 if ((unixname[0] == '.') && (unixname[1] == '/'))
1152 {
1153 /* remove it at beginning of path. */
1154 if ( ((unixname == fullname) /* no device spec */
1155 && (fullname+2 != basename)) /* starts with ./ */
1156 /* or */
1157 || ((basename[-1] == ':') /* device spec */
1158 && (unixname-1 == basename))) /* and ./ afterwards */
1159 *local_ptr++ = '.'; /* make '[.' start of path. */
1160 unixname += 2;
1161 continue;
1162 }
1163
1164 /* Add a subdirectory spec. Do not duplicate "." */
1165 if ( local_ptr[-1] != '.'
1166 && local_ptr[-1] != '['
1167 && local_ptr[-1] != '<')
1168 *local_ptr++ = '.';
1169
1170 /* If this is ".." then the spec becomes "-" */
1171 if ( (unixname[0] == '.')
1172 && (unixname[1] == '.')
1173 && (unixname[2] == '/'))
1174 {
1175 /* Add "-" and skip the ".." */
1176 if ((local_ptr[-1] == '.')
1177 && (local_ptr[-2] == '['))
1178 local_ptr--; /* prevent [.- */
1179 *local_ptr++ = '-';
1180 unixname += 3;
1181 continue;
1182 }
1183
1184 /* Copy the subdirectory */
1185 while (*unixname != '/')
1186 *local_ptr++= *unixname++;
1187
1188 unixname++; /* Skip the "/" */
1189 }
1190
1191 /* Close the directory specification */
1192 if (local_ptr[-1] == '.') /* no trailing periods */
1193 local_ptr--;
1194
1195 if (local_ptr[-1] == '[') /* no dir needed */
1196 local_ptr--;
1197 else
1198 *local_ptr++ = ']';
1199 }
1200
1201 /* Now add the filename. */
1202
1203 while (*unixname)
1204 *local_ptr++ = *unixname++;
1205 *local_ptr = 0;
1206
1207 /* Now append it to the original VMS spec. */
1208
1209 strcpy ((must_revert==1)?fullname:basename, Local);
1210
1211 /* If we put a [000000] in the filename, try to open it first. If this fails,
1212 remove the [000000], and return that name. This provides flexibility
1213 to the user in that they can use both rooted and non-rooted logical names
1214 to point to the location of the file. */
1215
1216 if (check_filename_before_returning)
1217 {
1218 f = open (fullname, O_RDONLY|O_NONBLOCK);
1219 if (f >= 0)
1220 {
1221 /* The file name is OK as it is, so return it as is. */
1222 close (f);
1223 return 1;
1224 }
1225
1226 /* The filename did not work. Try to remove the [000000] from the name,
1227 and return it. */
1228
1229 basename = strchr (fullname, '[');
1230 local_ptr = strchr (fullname, ']') + 1;
1231 strcpy (basename, local_ptr); /* this gets rid of it */
1232
1233 }
1234
1235 return 1;
1236 }
1237 #endif /* VMS */