Add D30V options
[official-gcc.git] / gcc / cppfiles.c
blobfe9f0262e3b3528321bd4c1cfafe50ead25abd21
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
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.
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.
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. */
23 #include "config.h"
24 #include "system.h"
25 #include "cpplib.h"
26 #include "cpphash.h"
27 #include "intl.h"
28 #include "mkdeps.h"
29 #include "splay-tree.h"
31 #ifdef HAVE_MMAP_FILE
32 # include <sys/mman.h>
33 # ifndef MMAP_THRESHOLD
34 # define MMAP_THRESHOLD 3 /* Minimum page count to mmap the file. */
35 # endif
37 #else /* No MMAP_FILE */
38 # undef MMAP_THRESHOLD
39 # define MMAP_THRESHOLD 0
40 #endif
42 #ifndef O_BINARY
43 # define O_BINARY 0
44 #endif
46 /* Suppress warning about function macros used w/o arguments in traditional
47 C. It is unlikely that glibc's strcmp macro helps this file at all. */
48 #undef strcmp
50 static struct file_name_map *read_name_map
51 PARAMS ((cpp_reader *, const char *));
52 static char *read_filename_string PARAMS ((int, FILE *));
53 static char *remap_filename PARAMS ((cpp_reader *, char *,
54 struct file_name_list *));
55 static struct file_name_list *actual_directory
56 PARAMS ((cpp_reader *, const char *));
57 static struct include_file *find_include_file
58 PARAMS ((cpp_reader *, const char *,
59 struct file_name_list *));
60 static struct include_file *open_include_file
61 PARAMS ((cpp_reader *, const char *));
62 static int read_include_file PARAMS ((cpp_reader *, struct include_file *));
63 static ssize_t read_with_read PARAMS ((cpp_buffer *, int, ssize_t));
64 static ssize_t read_file PARAMS ((cpp_buffer *, int, ssize_t));
66 static void destroy_include_file_node PARAMS ((splay_tree_value));
67 static int close_cached_fd PARAMS ((splay_tree_node, void *));
68 static int report_missing_guard PARAMS ((splay_tree_node, void *));
70 #if 0
71 static void hack_vms_include_specification PARAMS ((char *));
72 #endif
74 #ifndef INCLUDE_LEN_FUDGE
75 #define INCLUDE_LEN_FUDGE 0
76 #endif
78 /* We use a splay tree to store information about all the include
79 files seen in this compilation. The key of each tree node is the
80 physical path to the file. The value is 0 if the file does not
81 exist, or a struct include_file pointer. */
83 static void
84 destroy_include_file_node (v)
85 splay_tree_value v;
87 struct include_file *f = (struct include_file *)v;
88 if (f)
90 if (f->fd != -1)
91 close (f->fd);
92 free (f);
96 static int
97 close_cached_fd (n, dummy)
98 splay_tree_node n;
99 void *dummy ATTRIBUTE_UNUSED;
101 struct include_file *f = (struct include_file *)n->value;
102 if (f && f->fd != -1)
104 close (f->fd);
105 f->fd = -1;
107 return 0;
110 void
111 _cpp_init_includes (pfile)
112 cpp_reader *pfile;
114 pfile->all_include_files
115 = splay_tree_new ((splay_tree_compare_fn) strcmp,
116 (splay_tree_delete_key_fn) free,
117 destroy_include_file_node);
120 void
121 _cpp_cleanup_includes (pfile)
122 cpp_reader *pfile;
124 splay_tree_delete (pfile->all_include_files);
127 /* Given a filename, look it up and possibly open it. If the file
128 does not exist, return NULL. If the file does exist but doesn't
129 need to be reread, return an include_file entry with fd == -1.
130 If it needs to be (re)read, return an include_file entry with
131 fd a file descriptor open on the file. */
133 static struct include_file *
134 open_include_file (pfile, filename)
135 cpp_reader *pfile;
136 const char *filename;
138 splay_tree_node nd;
139 struct include_file *file = 0;
140 int fd;
142 nd = splay_tree_lookup (pfile->all_include_files,
143 (splay_tree_key) filename);
145 if (nd)
147 if (nd->value == 0)
148 return 0;
150 file = (struct include_file *)nd->value;
152 if (DO_NOT_REREAD (file))
154 if (file->fd != -1)
156 close (file->fd);
157 file->fd = -1;
159 return file;
162 /* File descriptors are cached for files that might be reread. */
163 if (file->fd != -1)
165 lseek (file->fd, 0, SEEK_SET);
166 return file;
170 /* We used to open files in nonblocking mode, but that caused more
171 problems than it solved. Do take care not to acquire a
172 controlling terminal by mistake (this can't happen on sane
173 systems, but paranoia is a virtue).
175 Use the three-argument form of open even though we aren't
176 specifying O_CREAT, to defend against broken system headers.
178 O_BINARY tells some runtime libraries (notably DJGPP) not to do
179 newline translation; we can handle DOS line breaks just fine
180 ourselves.
182 Special case: the empty string is translated to stdin. */
183 retry:
185 if (filename[0] == '\0')
186 fd = 0;
187 else
188 fd = open (filename, O_RDONLY|O_NOCTTY|O_BINARY, 0666);
190 if (fd == -1)
192 #ifdef EACCES
193 if (errno == EACCES)
195 cpp_error (pfile, "included file \"%s\" exists but is not readable",
196 filename);
198 #endif
199 if (0
200 #ifdef EMFILE
201 || errno == EMFILE
202 #endif
203 #ifdef ENFILE
204 || errno == ENFILE
205 #endif
208 /* Too many files open. Close all cached file descriptors and
209 try again. */
210 splay_tree_foreach (pfile->all_include_files, close_cached_fd, 0);
211 goto retry;
214 /* Nonexistent or inaccessible file. Create a negative node for it. */
215 if (nd)
217 cpp_ice (pfile,
218 "node for '%s' exists, open failed, error '%s', value %lx\n",
219 filename, strerror (errno), nd->value);
220 destroy_include_file_node (nd->value);
222 splay_tree_insert (pfile->all_include_files,
223 (splay_tree_key) xstrdup (filename), 0);
224 return 0;
227 /* If we haven't seen this file before, create a positive node for it. */
228 if (!nd)
230 file = xnew (struct include_file);
231 file->cmacro = 0;
232 file->include_count = 0;
233 file->sysp = 0;
234 file->foundhere = 0;
235 file->name = xstrdup (filename);
236 splay_tree_insert (pfile->all_include_files,
237 (splay_tree_key) file->name,
238 (splay_tree_value) file);
241 file->fd = fd;
242 file->date = (time_t) -1;
243 return file;
246 /* Return 1 if the file named by FNAME has been included before in
247 any context, 0 otherwise. */
249 cpp_included (pfile, fname)
250 cpp_reader *pfile;
251 const char *fname;
253 struct file_name_list *path;
254 char *name;
255 splay_tree_node nd;
257 if (fname[0] == '/')
259 /* Just look it up. */
260 nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) fname);
261 return (nd && nd->value);
264 /* Search directory path for the file. */
265 name = (char *) alloca (strlen (fname) + pfile->max_include_len
266 + 2 + INCLUDE_LEN_FUDGE);
267 for (path = CPP_OPTION (pfile, quote_include); path; path = path->next)
269 memcpy (name, path->name, path->nlen);
270 name[path->nlen] = '/';
271 strcpy (&name[path->nlen+1], fname);
272 _cpp_simplify_pathname (name);
273 if (CPP_OPTION (pfile, remap))
274 name = remap_filename (pfile, name, path);
276 nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
277 if (nd && nd->value)
278 return 1;
280 return 0;
283 /* Search for include file FNAME in the include chain starting at
284 SEARCH_START. Return 0 if there is no such file (or it's un-openable),
285 otherwise an include_file structure, possibly with a file descriptor
286 open on the file. */
288 static struct include_file *
289 find_include_file (pfile, fname, search_start)
290 cpp_reader *pfile;
291 const char *fname;
292 struct file_name_list *search_start;
294 struct file_name_list *path;
295 char *name;
296 struct include_file *file;
298 if (fname[0] == '/')
299 return open_include_file (pfile, fname);
301 /* Search directory path for the file. */
302 name = (char *) alloca (strlen (fname) + pfile->max_include_len
303 + 2 + INCLUDE_LEN_FUDGE);
304 for (path = search_start; path; path = path->next)
306 memcpy (name, path->name, path->nlen);
307 name[path->nlen] = '/';
308 strcpy (&name[path->nlen+1], fname);
309 _cpp_simplify_pathname (name);
310 if (CPP_OPTION (pfile, remap))
311 name = remap_filename (pfile, name, path);
313 file = open_include_file (pfile, name);
314 if (file)
316 file->sysp = path->sysp;
317 file->foundhere = path;
318 return file;
321 return 0;
324 /* #line uses this to save artificial file names. We have to try
325 opening the file because an all_include_files entry is always
326 either + or -, there's no 'I don't know' value. */
327 const char *
328 _cpp_fake_include (pfile, fname)
329 cpp_reader *pfile;
330 const char *fname;
332 splay_tree_node nd;
333 struct include_file *file;
334 char *name;
336 file = find_include_file (pfile, fname, CPP_OPTION (pfile, quote_include));
337 if (file)
338 return file->name;
340 name = xstrdup (fname);
341 _cpp_simplify_pathname (name);
343 /* We cannot just blindly insert a node, because there's still the
344 chance that the node already exists but isn't on the search path. */
345 nd = splay_tree_lookup (pfile->all_include_files, (splay_tree_key) name);
346 if (nd)
348 free (name);
349 return (const char *) nd->key;
352 splay_tree_insert (pfile->all_include_files, (splay_tree_key) name, 0);
353 return (const char *)name;
356 /* Not everyone who wants to set system-header-ness on a buffer can
357 see the details of struct include_file. This is an exported interface
358 because fix-header needs it. */
359 void
360 cpp_make_system_header (pfile, pbuf, flag)
361 cpp_reader *pfile;
362 cpp_buffer *pbuf;
363 int flag;
365 if (flag < 0 || flag > 2)
366 cpp_ice (pfile, "cpp_make_system_header: bad flag %d\n", flag);
367 else if (!pbuf->inc)
368 cpp_ice (pfile, "cpp_make_system_header called on non-file buffer");
369 else
370 pbuf->inc->sysp = flag;
373 /* Report on all files that might benefit from a multiple include guard.
374 Triggered by -H. */
375 void
376 _cpp_report_missing_guards (pfile)
377 cpp_reader *pfile;
379 int banner = 0;
380 splay_tree_foreach (pfile->all_include_files, report_missing_guard,
381 (PTR) &banner);
384 static int
385 report_missing_guard (n, b)
386 splay_tree_node n;
387 void *b;
389 struct include_file *f = (struct include_file *) n->value;
390 int *bannerp = (int *)b;
392 if (f && f->cmacro == 0 && f->include_count == 1)
394 if (*bannerp == 0)
396 fputs (_("Multiple include guards may be useful for:\n"), stderr);
397 *bannerp = 1;
399 fputs (f->name, stderr);
400 putc ('\n', stderr);
402 return 0;
405 #define PRINT_THIS_DEP(p, b) (CPP_PRINT_DEPS(p) > (b||p->system_include_depth))
406 void
407 _cpp_execute_include (pfile, f, len, no_reinclude, search_start, angle_brackets)
408 cpp_reader *pfile;
409 const U_CHAR *f;
410 unsigned int len;
411 int no_reinclude;
412 struct file_name_list *search_start;
413 int angle_brackets;
415 struct include_file *inc;
416 char *fname;
418 if (!search_start)
420 if (angle_brackets)
421 search_start = CPP_OPTION (pfile, bracket_include);
422 else if (CPP_OPTION (pfile, ignore_srcdir))
423 search_start = CPP_OPTION (pfile, quote_include);
424 else
425 search_start = CPP_BUFFER (pfile)->actual_dir;
428 if (!search_start)
430 cpp_error (pfile, "No include path in which to find %s", f);
431 return;
434 fname = alloca (len + 1);
435 memcpy (fname, f, len);
436 fname[len] = '\0';
438 inc = find_include_file (pfile, fname, search_start);
440 if (inc)
442 if (inc->fd == -1)
443 return;
445 /* For -M, add the file to the dependencies on its first inclusion. */
446 if (!inc->include_count && PRINT_THIS_DEP (pfile, angle_brackets))
447 deps_add_dep (pfile->deps, inc->name);
448 inc->include_count++;
450 /* Handle -H option. */
451 if (CPP_OPTION (pfile, print_include_names))
453 cpp_buffer *fp = CPP_BUFFER (pfile);
454 while ((fp = CPP_PREV_BUFFER (fp)) != NULL)
455 putc ('.', stderr);
456 fprintf (stderr, " %s\n", inc->name);
459 /* Actually process the file. */
460 if (no_reinclude)
461 inc->cmacro = NEVER_REREAD;
463 if (read_include_file (pfile, inc))
465 if (angle_brackets)
466 pfile->system_include_depth++;
468 return;
471 if (CPP_OPTION (pfile, print_deps_missing_files)
472 && PRINT_THIS_DEP (pfile, angle_brackets))
474 if (!angle_brackets)
475 deps_add_dep (pfile->deps, fname);
476 else
478 char *p;
479 struct file_name_list *ptr;
480 /* If requested as a system header, assume it belongs in
481 the first system header directory. */
482 if (CPP_OPTION (pfile, bracket_include))
483 ptr = CPP_OPTION (pfile, bracket_include);
484 else
485 ptr = CPP_OPTION (pfile, quote_include);
487 p = (char *) alloca (strlen (ptr->name)
488 + strlen (fname) + 2);
489 if (*ptr->name != '\0')
491 strcpy (p, ptr->name);
492 strcat (p, "/");
494 strcat (p, fname);
495 _cpp_simplify_pathname (p);
496 deps_add_dep (pfile->deps, p);
499 /* If -M was specified, and this header file won't be added to
500 the dependency list, then don't count this as an error,
501 because we can still produce correct output. Otherwise, we
502 can't produce correct output, because there may be
503 dependencies we need inside the missing file, and we don't
504 know what directory this missing file exists in. */
505 else if (CPP_PRINT_DEPS (pfile)
506 && ! PRINT_THIS_DEP (pfile, angle_brackets))
507 cpp_warning (pfile, "No include path in which to find %s", fname);
508 else
509 cpp_error_from_errno (pfile, fname);
512 /* Locate file F, and determine whether it is newer than PFILE. Return -1,
513 if F cannot be located or dated, 1, if it is newer and 0 if older. */
516 _cpp_compare_file_date (pfile, f, len, angle_brackets)
517 cpp_reader *pfile;
518 const U_CHAR *f;
519 unsigned int len;
520 int angle_brackets;
522 char *fname;
523 struct file_name_list *search_start;
524 struct include_file *inc;
525 struct include_file *current_include = CPP_BUFFER (pfile)->inc;
527 if (angle_brackets)
528 search_start = CPP_OPTION (pfile, bracket_include);
529 else if (CPP_OPTION (pfile, ignore_srcdir))
530 search_start = CPP_OPTION (pfile, quote_include);
531 else
532 search_start = CPP_BUFFER (pfile)->actual_dir;
534 fname = alloca (len + 1);
535 memcpy (fname, f, len);
536 fname[len] = '\0';
537 inc = find_include_file (pfile, fname, search_start);
539 if (!inc)
540 return -1;
541 if (inc->fd >= 0)
543 struct stat source;
545 if (fstat (inc->fd, &source) < 0)
547 close (inc->fd);
548 inc->fd = -1;
549 return -1;
551 inc->date = source.st_mtime;
552 close (inc->fd);
553 inc->fd = -1;
555 if (inc->date == (time_t)-1 || current_include->date == (time_t)-1)
556 return -1;
557 return inc->date > current_include->date;
561 /* Push an input buffer and load it up with the contents of FNAME.
562 If FNAME is "" or NULL, read standard input. */
564 cpp_read_file (pfile, fname)
565 cpp_reader *pfile;
566 const char *fname;
568 struct include_file *f;
570 if (fname == NULL)
571 fname = "";
573 f = open_include_file (pfile, fname);
575 if (f == NULL)
577 cpp_error_from_errno (pfile, fname);
578 return 0;
581 return read_include_file (pfile, f);
584 /* Read the file referenced by INC into a new buffer on PFILE's stack.
585 Return 1 if successful, 0 if not. */
587 static int
588 read_include_file (pfile, inc)
589 cpp_reader *pfile;
590 struct include_file *inc;
592 struct stat st;
593 ssize_t length;
594 cpp_buffer *fp;
595 int fd = inc->fd;
597 /* Ensures we dump our current line before entering an include file. */
598 if (CPP_BUFFER (pfile) && pfile->printer)
599 cpp_output_tokens (pfile, pfile->printer,
600 CPP_BUF_LINE (CPP_BUFFER (pfile)));
602 fp = cpp_push_buffer (pfile, NULL, 0);
604 if (fp == 0)
605 goto push_fail;
607 if (fd < 0 || fstat (fd, &st) < 0)
608 goto perror_fail;
610 inc->date = st.st_mtime;
612 /* If fd points to a plain file, we might be able to mmap it; we can
613 definitely allocate the buffer all at once. If fd is a pipe or
614 terminal, we can't do either. If fd is something weird, like a
615 block device or a directory, we don't want to read it at all.
617 Unfortunately, different systems use different st.st_mode values
618 for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
619 zero the entire struct stat except a couple fields. Hence we don't
620 even try to figure out what something is, except for plain files,
621 directories, and block devices. */
623 if (S_ISREG (st.st_mode))
625 ssize_t st_size;
627 /* off_t might have a wider range than ssize_t - in other words,
628 the max size of a file might be bigger than the address
629 space. We can't handle a file that large. (Anyone with
630 a single source file bigger than 2GB needs to rethink
631 their coding style.) Some systems (e.g. AIX 4.1) define
632 SSIZE_MAX to be much smaller than the actual range of the
633 type. Use INTTYPE_MAXIMUM unconditionally to ensure this
634 does not bite us. */
635 if (st.st_size > INTTYPE_MAXIMUM (ssize_t))
637 cpp_error (pfile, "%s is too large", inc->name);
638 goto fail;
640 st_size = st.st_size;
641 length = read_file (fp, fd, st_size);
642 if (length == -1)
643 goto perror_fail;
644 if (length < st_size)
645 cpp_warning (pfile, "%s is shorter than expected\n", inc->name);
647 else if (S_ISBLK (st.st_mode))
649 cpp_error (pfile, "%s is a block device", inc->name);
650 goto fail;
652 else if (S_ISDIR (st.st_mode))
654 cpp_error (pfile, "%s is a directory", inc->name);
655 goto fail;
657 else
659 /* 8 kilobytes is a sensible starting size. It ought to be
660 bigger than the kernel pipe buffer, and it's definitely
661 bigger than the majority of C source files. */
662 length = read_with_read (fp, fd, 8 * 1024);
663 if (length == -1)
664 goto perror_fail;
667 /* These must be set before prescan. */
668 fp->inc = inc;
669 fp->nominal_fname = inc->name;
670 pfile->include_depth++;
672 if (length == 0)
673 inc->cmacro = NEVER_REREAD;
675 fp->rlimit = fp->buf + length;
676 fp->cur = fp->buf;
677 fp->lineno = 1;
678 fp->line_base = fp->buf;
680 /* The ->actual_dir field is only used when ignore_srcdir is not in effect;
681 see do_include */
682 if (!CPP_OPTION (pfile, ignore_srcdir))
683 fp->actual_dir = actual_directory (pfile, inc->name);
685 pfile->input_stack_listing_current = 0;
686 return 1;
688 perror_fail:
689 cpp_error_from_errno (pfile, inc->name);
690 /* Do not try to read this file again. */
691 if (fd != -1)
692 close (fd);
693 inc->fd = -1;
694 inc->cmacro = NEVER_REREAD;
695 fail:
696 cpp_pop_buffer (pfile);
697 push_fail:
698 return 0;
701 static ssize_t
702 read_file (fp, fd, size)
703 cpp_buffer *fp;
704 int fd;
705 ssize_t size;
707 static int pagesize = -1;
709 if (size == 0)
710 return 0;
712 if (pagesize == -1)
713 pagesize = getpagesize ();
715 #if MMAP_THRESHOLD
716 if (size / pagesize >= MMAP_THRESHOLD)
718 const U_CHAR *result
719 = (const U_CHAR *) mmap (0, size, PROT_READ, MAP_PRIVATE, fd, 0);
720 if (result != (const U_CHAR *)-1)
722 fp->buf = result;
723 fp->mapped = 1;
724 return size;
727 /* If mmap fails, try read. If there's really a problem, read will
728 fail too. */
729 #endif
731 return read_with_read (fp, fd, size);
734 static ssize_t
735 read_with_read (fp, fd, size)
736 cpp_buffer *fp;
737 int fd;
738 ssize_t size;
740 ssize_t offset, count;
741 U_CHAR *buf;
743 buf = (U_CHAR *) xmalloc (size);
744 offset = 0;
745 while ((count = read (fd, buf + offset, size - offset)) > 0)
747 offset += count;
748 if (offset == size)
749 buf = xrealloc (buf, (size *= 2));
751 if (count < 0)
753 free (buf);
754 return -1;
756 if (offset == 0)
758 free (buf);
759 return 0;
762 if (offset < size)
763 buf = xrealloc (buf, offset);
764 fp->buf = buf;
765 fp->mapped = 0;
766 return offset;
769 /* Do appropriate cleanup when a file buffer is popped off the input
770 stack. */
771 void
772 _cpp_pop_file_buffer (pfile, buf)
773 cpp_reader *pfile;
774 cpp_buffer *buf;
776 struct include_file *inc = buf->inc;
778 if (pfile->system_include_depth)
779 pfile->system_include_depth--;
780 if (pfile->include_depth)
781 pfile->include_depth--;
782 if (pfile->potential_control_macro)
784 if (inc->cmacro != NEVER_REREAD)
785 inc->cmacro = pfile->potential_control_macro;
786 pfile->potential_control_macro = 0;
788 pfile->input_stack_listing_current = 0;
790 /* Discard file buffer. XXX Would be better to cache these instead
791 of the file descriptors. */
792 #ifdef HAVE_MMAP_FILE
793 if (buf->mapped)
794 munmap ((caddr_t) buf->buf, buf->rlimit - buf->buf);
795 else
796 #endif
797 free ((PTR) buf->buf);
799 /* If the file will not be included again, close it. */
800 if (DO_NOT_REREAD (inc))
802 close (inc->fd);
803 inc->fd = -1;
807 /* The file_name_map structure holds a mapping of file names for a
808 particular directory. This mapping is read from the file named
809 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
810 map filenames on a file system with severe filename restrictions,
811 such as DOS. The format of the file name map file is just a series
812 of lines with two tokens on each line. The first token is the name
813 to map, and the second token is the actual name to use. */
815 struct file_name_map
817 struct file_name_map *map_next;
818 char *map_from;
819 char *map_to;
822 #define FILE_NAME_MAP_FILE "header.gcc"
824 /* Read a space delimited string of unlimited length from a stdio
825 file. */
827 static char *
828 read_filename_string (ch, f)
829 int ch;
830 FILE *f;
832 char *alloc, *set;
833 int len;
835 len = 20;
836 set = alloc = xmalloc (len + 1);
837 if (! is_space(ch))
839 *set++ = ch;
840 while ((ch = getc (f)) != EOF && ! is_space(ch))
842 if (set - alloc == len)
844 len *= 2;
845 alloc = xrealloc (alloc, len + 1);
846 set = alloc + len / 2;
848 *set++ = ch;
851 *set = '\0';
852 ungetc (ch, f);
853 return alloc;
856 /* This structure holds a linked list of file name maps, one per directory. */
858 struct file_name_map_list
860 struct file_name_map_list *map_list_next;
861 char *map_list_name;
862 struct file_name_map *map_list_map;
865 /* Read the file name map file for DIRNAME. */
867 static struct file_name_map *
868 read_name_map (pfile, dirname)
869 cpp_reader *pfile;
870 const char *dirname;
872 register struct file_name_map_list *map_list_ptr;
873 char *name;
874 FILE *f;
876 for (map_list_ptr = CPP_OPTION (pfile, map_list); map_list_ptr;
877 map_list_ptr = map_list_ptr->map_list_next)
878 if (! strcmp (map_list_ptr->map_list_name, dirname))
879 return map_list_ptr->map_list_map;
881 map_list_ptr = ((struct file_name_map_list *)
882 xmalloc (sizeof (struct file_name_map_list)));
883 map_list_ptr->map_list_name = xstrdup (dirname);
884 map_list_ptr->map_list_map = NULL;
886 name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
887 strcpy (name, dirname);
888 if (*dirname)
889 strcat (name, "/");
890 strcat (name, FILE_NAME_MAP_FILE);
891 f = fopen (name, "r");
892 if (!f)
893 map_list_ptr->map_list_map = (struct file_name_map *)-1;
894 else
896 int ch;
897 int dirlen = strlen (dirname);
899 while ((ch = getc (f)) != EOF)
901 char *from, *to;
902 struct file_name_map *ptr;
904 if (is_space(ch))
905 continue;
906 from = read_filename_string (ch, f);
907 while ((ch = getc (f)) != EOF && is_hspace(ch))
909 to = read_filename_string (ch, f);
911 ptr = ((struct file_name_map *)
912 xmalloc (sizeof (struct file_name_map)));
913 ptr->map_from = from;
915 /* Make the real filename absolute. */
916 if (*to == '/')
917 ptr->map_to = to;
918 else
920 ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
921 strcpy (ptr->map_to, dirname);
922 ptr->map_to[dirlen] = '/';
923 strcpy (ptr->map_to + dirlen + 1, to);
924 free (to);
927 ptr->map_next = map_list_ptr->map_list_map;
928 map_list_ptr->map_list_map = ptr;
930 while ((ch = getc (f)) != '\n')
931 if (ch == EOF)
932 break;
934 fclose (f);
937 map_list_ptr->map_list_next = CPP_OPTION (pfile, map_list);
938 CPP_OPTION (pfile, map_list) = map_list_ptr;
940 return map_list_ptr->map_list_map;
943 /* Remap NAME based on the file_name_map (if any) for LOC. */
945 static char *
946 remap_filename (pfile, name, loc)
947 cpp_reader *pfile;
948 char *name;
949 struct file_name_list *loc;
951 struct file_name_map *map;
952 const char *from, *p, *dir;
954 if (! loc->name_map)
955 loc->name_map = read_name_map (pfile,
956 loc->name
957 ? loc->name : ".");
959 if (loc->name_map == (struct file_name_map *)-1)
960 return name;
962 from = name + strlen (loc->name) + 1;
964 for (map = loc->name_map; map; map = map->map_next)
965 if (!strcmp (map->map_from, from))
966 return map->map_to;
968 /* Try to find a mapping file for the particular directory we are
969 looking in. Thus #include <sys/types.h> will look up sys/types.h
970 in /usr/include/header.gcc and look up types.h in
971 /usr/include/sys/header.gcc. */
972 p = strrchr (name, '/');
973 if (!p)
974 p = name;
975 if (loc && loc->name
976 && strlen (loc->name) == (size_t) (p - name)
977 && !strncmp (loc->name, name, p - name))
978 /* FILENAME is in SEARCHPTR, which we've already checked. */
979 return name;
981 if (p == name)
983 dir = ".";
984 from = name;
986 else
988 char * newdir = (char *) alloca (p - name + 1);
989 memcpy (newdir, name, p - name);
990 newdir[p - name] = '\0';
991 dir = newdir;
992 from = p + 1;
995 for (map = read_name_map (pfile, dir); map; map = map->map_next)
996 if (! strcmp (map->map_from, name))
997 return map->map_to;
999 return name;
1002 /* Given a path FNAME, extract the directory component and place it
1003 onto the actual_dirs list. Return a pointer to the allocated
1004 file_name_list structure. These structures are used to implement
1005 current-directory "" include searching. */
1007 static struct file_name_list *
1008 actual_directory (pfile, fname)
1009 cpp_reader *pfile;
1010 const char *fname;
1012 char *last_slash, *dir;
1013 size_t dlen;
1014 struct file_name_list *x;
1016 dir = xstrdup (fname);
1017 last_slash = strrchr (dir, '/');
1018 if (last_slash)
1020 if (last_slash == dir)
1022 dlen = 1;
1023 last_slash[1] = '\0';
1025 else
1027 dlen = last_slash - dir;
1028 *last_slash = '\0';
1031 else
1033 dir[0] = '.';
1034 dir[1] = '\0';
1035 dlen = 1;
1038 if (dlen > pfile->max_include_len)
1039 pfile->max_include_len = dlen;
1041 for (x = pfile->actual_dirs; x; x = x->alloc)
1042 if (!strcmp (x->name, dir))
1044 free (dir);
1045 return x;
1048 /* Not found, make a new one. */
1049 x = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
1050 x->name = dir;
1051 x->nlen = dlen;
1052 x->next = CPP_OPTION (pfile, quote_include);
1053 x->alloc = pfile->actual_dirs;
1054 x->sysp = CPP_BUFFER (pfile)->inc->sysp;
1055 x->name_map = NULL;
1057 pfile->actual_dirs = x;
1058 return x;
1061 /* Simplify a path name in place, deleting redundant components. This
1062 reduces OS overhead and guarantees that equivalent paths compare
1063 the same (modulo symlinks).
1065 Transforms made:
1066 foo/bar/../quux foo/quux
1067 foo/./bar foo/bar
1068 foo//bar foo/bar
1069 /../quux /quux
1070 //quux //quux (POSIX allows leading // as a namespace escape)
1072 Guarantees no trailing slashes. All transforms reduce the length
1073 of the string.
1075 void
1076 _cpp_simplify_pathname (path)
1077 char *path;
1079 char *from, *to;
1080 char *base;
1081 int absolute = 0;
1083 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
1084 /* Convert all backslashes to slashes. */
1085 for (from = path; *from; from++)
1086 if (*from == '\\') *from = '/';
1088 /* Skip over leading drive letter if present. */
1089 if (ISALPHA (path[0]) && path[1] == ':')
1090 from = to = &path[2];
1091 else
1092 from = to = path;
1093 #else
1094 from = to = path;
1095 #endif
1097 /* Remove redundant initial /s. */
1098 if (*from == '/')
1100 absolute = 1;
1101 to++;
1102 from++;
1103 if (*from == '/')
1105 if (*++from == '/')
1106 /* 3 or more initial /s are equivalent to 1 /. */
1107 while (*++from == '/');
1108 else
1109 /* On some hosts // differs from /; Posix allows this. */
1110 to++;
1113 base = to;
1115 for (;;)
1117 while (*from == '/')
1118 from++;
1120 if (from[0] == '.' && from[1] == '/')
1121 from += 2;
1122 else if (from[0] == '.' && from[1] == '\0')
1123 goto done;
1124 else if (from[0] == '.' && from[1] == '.' && from[2] == '/')
1126 if (base == to)
1128 if (absolute)
1129 from += 3;
1130 else
1132 *to++ = *from++;
1133 *to++ = *from++;
1134 *to++ = *from++;
1135 base = to;
1138 else
1140 to -= 2;
1141 while (to > base && *to != '/') to--;
1142 if (*to == '/')
1143 to++;
1144 from += 3;
1147 else if (from[0] == '.' && from[1] == '.' && from[2] == '\0')
1149 if (base == to)
1151 if (!absolute)
1153 *to++ = *from++;
1154 *to++ = *from++;
1157 else
1159 to -= 2;
1160 while (to > base && *to != '/') to--;
1161 if (*to == '/')
1162 to++;
1164 goto done;
1166 else
1167 /* Copy this component and trailing /, if any. */
1168 while ((*to++ = *from++) != '/')
1170 if (!to[-1])
1172 to--;
1173 goto done;
1179 done:
1180 /* Trim trailing slash */
1181 if (to[0] == '/' && (!absolute || to > path+1))
1182 to--;
1184 /* Change the empty string to "." so that stat() on the result
1185 will always work. */
1186 if (to == path)
1187 *to++ = '.';
1189 *to = '\0';
1191 return;
1194 /* It is not clear when this should be used if at all, so I've
1195 disabled it until someone who understands VMS can look at it. */
1196 #if 0
1198 /* Under VMS we need to fix up the "include" specification filename.
1200 Rules for possible conversions
1202 fullname tried paths
1204 name name
1205 ./dir/name [.dir]name
1206 /dir/name dir:name
1207 /name [000000]name, name
1208 dir/name dir:[000000]name, dir:name, dir/name
1209 dir1/dir2/name dir1:[dir2]name, dir1:[000000.dir2]name
1210 path:/name path:[000000]name, path:name
1211 path:/dir/name path:[000000.dir]name, path:[dir]name
1212 path:dir/name path:[dir]name
1213 [path]:[dir]name [path.dir]name
1214 path/[dir]name [path.dir]name
1216 The path:/name input is constructed when expanding <> includes. */
1219 static void
1220 hack_vms_include_specification (fullname)
1221 char *fullname;
1223 register char *basename, *unixname, *local_ptr, *first_slash;
1224 int f, check_filename_before_returning, must_revert;
1225 char Local[512];
1227 check_filename_before_returning = 0;
1228 must_revert = 0;
1229 /* See if we can find a 1st slash. If not, there's no path information. */
1230 first_slash = strchr (fullname, '/');
1231 if (first_slash == 0)
1232 return 0; /* Nothing to do!!! */
1234 /* construct device spec if none given. */
1236 if (strchr (fullname, ':') == 0)
1239 /* If fullname has a slash, take it as device spec. */
1241 if (first_slash == fullname)
1243 first_slash = strchr (fullname + 1, '/'); /* 2nd slash ? */
1244 if (first_slash)
1245 *first_slash = ':'; /* make device spec */
1246 for (basename = fullname; *basename != 0; basename++)
1247 *basename = *(basename+1); /* remove leading slash */
1249 else if ((first_slash[-1] != '.') /* keep ':/', './' */
1250 && (first_slash[-1] != ':')
1251 && (first_slash[-1] != ']')) /* or a vms path */
1253 *first_slash = ':';
1255 else if ((first_slash[1] == '[') /* skip './' in './[dir' */
1256 && (first_slash[-1] == '.'))
1257 fullname += 2;
1260 /* Get part after first ':' (basename[-1] == ':')
1261 or last '/' (basename[-1] == '/'). */
1263 basename = base_name (fullname);
1265 local_ptr = Local; /* initialize */
1267 /* We are trying to do a number of things here. First of all, we are
1268 trying to hammer the filenames into a standard format, such that later
1269 processing can handle them.
1271 If the file name contains something like [dir.], then it recognizes this
1272 as a root, and strips the ".]". Later processing will add whatever is
1273 needed to get things working properly.
1275 If no device is specified, then the first directory name is taken to be
1276 a device name (or a rooted logical). */
1278 /* Point to the UNIX filename part (which needs to be fixed!)
1279 but skip vms path information.
1280 [basename != fullname since first_slash != 0]. */
1282 if ((basename[-1] == ':') /* vms path spec. */
1283 || (basename[-1] == ']')
1284 || (basename[-1] == '>'))
1285 unixname = basename;
1286 else
1287 unixname = fullname;
1289 if (*unixname == '/')
1290 unixname++;
1292 /* If the directory spec is not rooted, we can just copy
1293 the UNIX filename part and we are done. */
1295 if (((basename - fullname) > 1)
1296 && ( (basename[-1] == ']')
1297 || (basename[-1] == '>')))
1299 if (basename[-2] != '.')
1302 /* The VMS part ends in a `]', and the preceding character is not a `.'.
1303 -> PATH]:/name (basename = '/name', unixname = 'name')
1304 We strip the `]', and then splice the two parts of the name in the
1305 usual way. Given the default locations for include files,
1306 we will only use this code if the user specifies alternate locations
1307 with the /include (-I) switch on the command line. */
1309 basename -= 1; /* Strip "]" */
1310 unixname--; /* backspace */
1312 else
1315 /* The VMS part has a ".]" at the end, and this will not do. Later
1316 processing will add a second directory spec, and this would be a syntax
1317 error. Thus we strip the ".]", and thus merge the directory specs.
1318 We also backspace unixname, so that it points to a '/'. This inhibits the
1319 generation of the 000000 root directory spec (which does not belong here
1320 in this case). */
1322 basename -= 2; /* Strip ".]" */
1323 unixname--; /* backspace */
1327 else
1331 /* We drop in here if there is no VMS style directory specification yet.
1332 If there is no device specification either, we make the first dir a
1333 device and try that. If we do not do this, then we will be essentially
1334 searching the users default directory (as if they did a #include "asdf.h").
1336 Then all we need to do is to push a '[' into the output string. Later
1337 processing will fill this in, and close the bracket. */
1339 if ((unixname != fullname) /* vms path spec found. */
1340 && (basename[-1] != ':'))
1341 *local_ptr++ = ':'; /* dev not in spec. take first dir */
1343 *local_ptr++ = '['; /* Open the directory specification */
1346 if (unixname == fullname) /* no vms dir spec. */
1348 must_revert = 1;
1349 if ((first_slash != 0) /* unix dir spec. */
1350 && (*unixname != '/') /* not beginning with '/' */
1351 && (*unixname != '.')) /* or './' or '../' */
1352 *local_ptr++ = '.'; /* dir is local ! */
1355 /* at this point we assume that we have the device spec, and (at least
1356 the opening "[" for a directory specification. We may have directories
1357 specified already.
1359 If there are no other slashes then the filename will be
1360 in the "root" directory. Otherwise, we need to add
1361 directory specifications. */
1363 if (strchr (unixname, '/') == 0)
1365 /* if no directories specified yet and none are following. */
1366 if (local_ptr[-1] == '[')
1368 /* Just add "000000]" as the directory string */
1369 strcpy (local_ptr, "000000]");
1370 local_ptr += strlen (local_ptr);
1371 check_filename_before_returning = 1; /* we might need to fool with this later */
1374 else
1377 /* As long as there are still subdirectories to add, do them. */
1378 while (strchr (unixname, '/') != 0)
1380 /* If this token is "." we can ignore it
1381 if it's not at the beginning of a path. */
1382 if ((unixname[0] == '.') && (unixname[1] == '/'))
1384 /* remove it at beginning of path. */
1385 if ( ((unixname == fullname) /* no device spec */
1386 && (fullname+2 != basename)) /* starts with ./ */
1387 /* or */
1388 || ((basename[-1] == ':') /* device spec */
1389 && (unixname-1 == basename))) /* and ./ afterwards */
1390 *local_ptr++ = '.'; /* make '[.' start of path. */
1391 unixname += 2;
1392 continue;
1395 /* Add a subdirectory spec. Do not duplicate "." */
1396 if ( local_ptr[-1] != '.'
1397 && local_ptr[-1] != '['
1398 && local_ptr[-1] != '<')
1399 *local_ptr++ = '.';
1401 /* If this is ".." then the spec becomes "-" */
1402 if ( (unixname[0] == '.')
1403 && (unixname[1] == '.')
1404 && (unixname[2] == '/'))
1406 /* Add "-" and skip the ".." */
1407 if ((local_ptr[-1] == '.')
1408 && (local_ptr[-2] == '['))
1409 local_ptr--; /* prevent [.- */
1410 *local_ptr++ = '-';
1411 unixname += 3;
1412 continue;
1415 /* Copy the subdirectory */
1416 while (*unixname != '/')
1417 *local_ptr++= *unixname++;
1419 unixname++; /* Skip the "/" */
1422 /* Close the directory specification */
1423 if (local_ptr[-1] == '.') /* no trailing periods */
1424 local_ptr--;
1426 if (local_ptr[-1] == '[') /* no dir needed */
1427 local_ptr--;
1428 else
1429 *local_ptr++ = ']';
1432 /* Now add the filename. */
1434 while (*unixname)
1435 *local_ptr++ = *unixname++;
1436 *local_ptr = 0;
1438 /* Now append it to the original VMS spec. */
1440 strcpy ((must_revert==1)?fullname:basename, Local);
1442 /* If we put a [000000] in the filename, try to open it first. If this fails,
1443 remove the [000000], and return that name. This provides flexibility
1444 to the user in that they can use both rooted and non-rooted logical names
1445 to point to the location of the file. */
1447 if (check_filename_before_returning)
1449 f = open (fullname, O_RDONLY|O_NONBLOCK);
1450 if (f >= 0)
1452 /* The file name is OK as it is, so return it as is. */
1453 close (f);
1454 return 1;
1457 /* The filename did not work. Try to remove the [000000] from the name,
1458 and return it. */
1460 basename = strchr (fullname, '[');
1461 local_ptr = strchr (fullname, ']') + 1;
1462 strcpy (basename, local_ptr); /* this gets rid of it */
1466 return 1;
1468 #endif /* VMS */