]> gcc.gnu.org Git - gcc.git/blob - gcc/cppfiles.c
cppfiles.c (find_position, [...]): Use `unsigned long' variables consistently to...
[gcc.git] / gcc / cppfiles.c
1 /* Part of CPP library. (include file handling)
2 Copyright (C) 1986, 87, 89, 92 - 95, 98, 1999 Free Software Foundation, Inc.
3 Written by Per Bothner, 1994.
4 Based on CCCP program by Paul Rubin, June 1986
5 Adapted to ANSI C, Richard Stallman, Jan 1987
6 Split out of cpplib.c, Zack Weinberg, Oct 1998
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
22 In other words, you are welcome to use, share and improve this program.
23 You are forbidden to forbid anyone else to use, share and improve
24 what you give them. Help stamp out software-hoarding! */
25
26 #include "config.h"
27 #include "system.h"
28 #include "cpplib.h"
29
30 /* The entry points to this file are: find_include_file, finclude,
31 include_hash, append_include_chain, deps_output, and file_cleanup.
32 file_cleanup is only called through CPP_BUFFER(pfile)->cleanup,
33 so it's static anyway. */
34
35 static struct include_hash *redundant_include_p
36 PROTO ((cpp_reader *,
37 struct include_hash *,
38 struct file_name_list *));
39 static struct file_name_map *read_name_map PROTO ((cpp_reader *,
40 const char *));
41 static char *read_filename_string PROTO ((int, FILE *));
42 static char *remap_filename PROTO ((cpp_reader *, char *,
43 struct file_name_list *));
44 static long read_and_prescan PROTO ((cpp_reader *, cpp_buffer *,
45 int, size_t));
46 static struct file_name_list *actual_directory PROTO ((cpp_reader *, char *));
47
48 #if 0
49 static void hack_vms_include_specification PROTO ((char *));
50 #endif
51
52 /* Windows does not natively support inodes, and neither does MSDOS.
53 VMS has non-numeric inodes. */
54 #ifdef VMS
55 #define INO_T_EQ(a, b) (!bcmp((char *) &(a), (char *) &(b), sizeof (a)))
56 #elif (defined _WIN32 && !defined CYGWIN && ! defined (_UWIN)) \
57 || defined __MSDOS__
58 #define INO_T_EQ(a, b) 0
59 #else
60 #define INO_T_EQ(a, b) ((a) == (b))
61 #endif
62
63 /* Merge the four include chains together in the order quote, bracket,
64 system, after. Remove duplicate dirs (as determined by
65 INO_T_EQ()). The system_include and after_include chains are never
66 referred to again after this function; all access is through the
67 bracket_include path.
68
69 For the future: Check if the directory is empty (but
70 how?) and possibly preload the include hash. */
71
72 void
73 merge_include_chains (opts)
74 struct cpp_options *opts;
75 {
76 struct file_name_list *prev, *cur, *other;
77 struct file_name_list *quote, *brack, *systm, *after;
78 struct file_name_list *qtail, *btail, *stail, *atail;
79
80 qtail = opts->pending->quote_tail;
81 btail = opts->pending->brack_tail;
82 stail = opts->pending->systm_tail;
83 atail = opts->pending->after_tail;
84
85 quote = opts->pending->quote_head;
86 brack = opts->pending->brack_head;
87 systm = opts->pending->systm_head;
88 after = opts->pending->after_head;
89
90 /* Paste together bracket, system, and after include chains. */
91 if (stail)
92 stail->next = after;
93 else
94 systm = after;
95 if (btail)
96 btail->next = systm;
97 else
98 brack = systm;
99
100 /* This is a bit tricky.
101 First we drop dupes from the quote-include list.
102 Then we drop dupes from the bracket-include list.
103 Finally, if qtail and brack are the same directory,
104 we cut out qtail.
105
106 We can't just merge the lists and then uniquify them because
107 then we may lose directories from the <> search path that should
108 be there; consider -Ifoo -Ibar -I- -Ifoo -Iquux. It is however
109 safe to treat -Ibar -Ifoo -I- -Ifoo -Iquux as if written
110 -Ibar -I- -Ifoo -Iquux.
111
112 Note that this algorithm is quadratic in the number of -I switches,
113 which is acceptable since there aren't usually that many of them. */
114
115 for (cur = quote, prev = NULL; cur; cur = cur->next)
116 {
117 for (other = quote; other != cur; other = other->next)
118 if (INO_T_EQ (cur->ino, other->ino)
119 && cur->dev == other->dev)
120 {
121 if (opts->verbose)
122 cpp_notice ("ignoring duplicate directory `%s'\n", cur->name);
123
124 prev->next = cur->next;
125 free (cur->name);
126 free (cur);
127 cur = prev;
128 break;
129 }
130 prev = cur;
131 }
132 qtail = prev;
133
134 for (cur = brack; cur; cur = cur->next)
135 {
136 for (other = brack; other != cur; other = other->next)
137 if (INO_T_EQ (cur->ino, other->ino)
138 && cur->dev == other->dev)
139 {
140 if (opts->verbose)
141 cpp_notice ("ignoring duplicate directory `%s'\n", cur->name);
142
143 prev->next = cur->next;
144 free (cur->name);
145 free (cur);
146 cur = prev;
147 break;
148 }
149 prev = cur;
150 }
151
152 if (quote)
153 {
154 if (INO_T_EQ (qtail->ino, brack->ino) && qtail->dev == brack->dev)
155 {
156 if (quote == qtail)
157 {
158 if (opts->verbose)
159 cpp_notice ("ignoring duplicate directory `%s'\n",
160 quote->name);
161
162 free (quote->name);
163 free (quote);
164 quote = brack;
165 }
166 else
167 {
168 cur = quote;
169 while (cur->next != qtail)
170 cur = cur->next;
171 cur->next = brack;
172 if (opts->verbose)
173 cpp_notice ("ignoring duplicate directory `%s'\n",
174 qtail->name);
175
176 free (qtail->name);
177 free (qtail);
178 }
179 }
180 else
181 qtail->next = brack;
182 }
183 else
184 quote = brack;
185
186 opts->quote_include = quote;
187 opts->bracket_include = brack;
188 }
189
190 /* Look up or add an entry to the table of all includes. This table
191 is indexed by the name as it appears in the #include line. The
192 ->next_this_file chain stores all different files with the same
193 #include name (there are at least three ways this can happen). The
194 hash function could probably be improved a bit. */
195
196 struct include_hash *
197 include_hash (pfile, fname, add)
198 cpp_reader *pfile;
199 char *fname;
200 int add;
201 {
202 unsigned int hash = 0;
203 struct include_hash *l, *m;
204 char *f = fname;
205
206 while (*f)
207 hash += *f++;
208
209 l = pfile->all_include_files[hash % ALL_INCLUDE_HASHSIZE];
210 m = 0;
211 for (; l; m = l, l = l->next)
212 if (!strcmp (l->nshort, fname))
213 return l;
214
215 if (!add)
216 return 0;
217
218 l = (struct include_hash *) xmalloc (sizeof (struct include_hash));
219 l->next = NULL;
220 l->next_this_file = NULL;
221 l->foundhere = NULL;
222 l->buf = NULL;
223 l->limit = NULL;
224 if (m)
225 m->next = l;
226 else
227 pfile->all_include_files[hash % ALL_INCLUDE_HASHSIZE] = l;
228
229 return l;
230 }
231
232 /* Return 0 if the file pointed to by IHASH has never been included before,
233 -1 if it has been included before and need not be again,
234 or a pointer to an IHASH entry which is the file to be reread.
235 "Never before" is with respect to the position in ILIST.
236
237 This will not detect redundancies involving odd uses of the
238 `current directory' rule for "" includes. They aren't quite
239 pathological, but I think they are rare enough not to worry about.
240 The simplest example is:
241
242 top.c:
243 #include "a/a.h"
244 #include "b/b.h"
245
246 a/a.h:
247 #include "../b/b.h"
248
249 and the problem is that for `current directory' includes,
250 ihash->foundhere is not on any of the global include chains,
251 so the test below (i->foundhere == l) may be false even when
252 the directories are in fact the same. */
253
254 static struct include_hash *
255 redundant_include_p (pfile, ihash, ilist)
256 cpp_reader *pfile;
257 struct include_hash *ihash;
258 struct file_name_list *ilist;
259 {
260 struct file_name_list *l;
261 struct include_hash *i;
262
263 if (! ihash->foundhere)
264 return 0;
265
266 for (i = ihash; i; i = i->next_this_file)
267 for (l = ilist; l; l = l->next)
268 if (i->foundhere == l)
269 /* The control_macro works like this: If it's NULL, the file
270 is to be included again. If it's "", the file is never to
271 be included again. If it's a string, the file is not to be
272 included again if the string is the name of a defined macro. */
273 return (i->control_macro
274 && (i->control_macro[0] == '\0'
275 || cpp_lookup (pfile, i->control_macro, -1, -1)))
276 ? (struct include_hash *)-1 : i;
277
278 return 0;
279 }
280
281 static int
282 file_cleanup (pbuf, pfile)
283 cpp_buffer *pbuf;
284 cpp_reader *pfile;
285 {
286 if (pbuf->buf)
287 {
288 free (pbuf->buf);
289 pbuf->buf = 0;
290 }
291 if (pfile->system_include_depth)
292 pfile->system_include_depth--;
293 return 0;
294 }
295
296 /* Search for include file FNAME in the include chain starting at
297 SEARCH_START. Return -2 if this file doesn't need to be included
298 (because it was included already and it's marked idempotent),
299 -1 if an error occurred, or a file descriptor open on the file.
300 *IHASH is set to point to the include hash entry for this file, and
301 *BEFORE is 1 if the file was included before (but needs to be read
302 again). */
303 int
304 find_include_file (pfile, fname, search_start, ihash, before)
305 cpp_reader *pfile;
306 char *fname;
307 struct file_name_list *search_start;
308 struct include_hash **ihash;
309 int *before;
310 {
311 struct file_name_list *l;
312 struct include_hash *ih, *jh;
313 int f, len;
314 char *name;
315
316 ih = include_hash (pfile, fname, 1);
317 jh = redundant_include_p (pfile, ih,
318 fname[0] == '/' ? ABSOLUTE_PATH : search_start);
319
320 if (jh != 0)
321 {
322 *before = 1;
323 *ihash = jh;
324
325 if (jh == (struct include_hash *)-1)
326 return -2;
327 else
328 return open (jh->name, O_RDONLY, 0666);
329 }
330
331 if (ih->foundhere)
332 /* A file is already known by this name, but it's not the same file.
333 Allocate another include_hash block and add it to the next_this_file
334 chain. */
335 {
336 jh = (struct include_hash *)xmalloc (sizeof (struct include_hash));
337 while (ih->next_this_file) ih = ih->next_this_file;
338
339 ih->next_this_file = jh;
340 jh = ih;
341 ih = ih->next_this_file;
342
343 ih->next = NULL;
344 ih->next_this_file = NULL;
345 ih->buf = NULL;
346 ih->limit = NULL;
347 }
348 *before = 0;
349 *ihash = ih;
350 ih->nshort = xstrdup (fname);
351 ih->control_macro = NULL;
352
353 /* If the pathname is absolute, just open it. */
354 if (fname[0] == '/')
355 {
356 ih->foundhere = ABSOLUTE_PATH;
357 ih->name = ih->nshort;
358 return open (ih->name, O_RDONLY, 0666);
359 }
360
361 /* Search directory path, trying to open the file. */
362
363 len = strlen (fname);
364 name = xmalloc (len + pfile->max_include_len + 2 + INCLUDE_LEN_FUDGE);
365
366 for (l = search_start; l; l = l->next)
367 {
368 bcopy (l->name, name, l->nlen);
369 name[l->nlen] = '/';
370 strcpy (&name[l->nlen+1], fname);
371 simplify_pathname (name);
372 if (CPP_OPTIONS (pfile)->remap)
373 name = remap_filename (pfile, name, l);
374
375 f = open (name, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
376 #ifdef EACCES
377 if (f == -1 && errno == EACCES)
378 {
379 cpp_error(pfile, "included file `%s' exists but is not readable",
380 name);
381 return -1;
382 }
383 #endif
384
385 if (f >= 0)
386 {
387 ih->foundhere = l;
388 ih->name = xrealloc (name, strlen (name)+1);
389 return f;
390 }
391 }
392
393 if (jh)
394 {
395 jh->next_this_file = NULL;
396 free (ih);
397 }
398 free (name);
399 *ihash = (struct include_hash *)-1;
400 return -1;
401 }
402
403 /* The file_name_map structure holds a mapping of file names for a
404 particular directory. This mapping is read from the file named
405 FILE_NAME_MAP_FILE in that directory. Such a file can be used to
406 map filenames on a file system with severe filename restrictions,
407 such as DOS. The format of the file name map file is just a series
408 of lines with two tokens on each line. The first token is the name
409 to map, and the second token is the actual name to use. */
410
411 struct file_name_map
412 {
413 struct file_name_map *map_next;
414 char *map_from;
415 char *map_to;
416 };
417
418 #define FILE_NAME_MAP_FILE "header.gcc"
419
420 /* Read a space delimited string of unlimited length from a stdio
421 file. */
422
423 static char *
424 read_filename_string (ch, f)
425 int ch;
426 FILE *f;
427 {
428 char *alloc, *set;
429 int len;
430
431 len = 20;
432 set = alloc = xmalloc (len + 1);
433 if (! is_space[ch])
434 {
435 *set++ = ch;
436 while ((ch = getc (f)) != EOF && ! is_space[ch])
437 {
438 if (set - alloc == len)
439 {
440 len *= 2;
441 alloc = xrealloc (alloc, len + 1);
442 set = alloc + len / 2;
443 }
444 *set++ = ch;
445 }
446 }
447 *set = '\0';
448 ungetc (ch, f);
449 return alloc;
450 }
451
452 /* This structure holds a linked list of file name maps, one per directory. */
453
454 struct file_name_map_list
455 {
456 struct file_name_map_list *map_list_next;
457 char *map_list_name;
458 struct file_name_map *map_list_map;
459 };
460
461 /* Read the file name map file for DIRNAME. */
462
463 static struct file_name_map *
464 read_name_map (pfile, dirname)
465 cpp_reader *pfile;
466 const char *dirname;
467 {
468 register struct file_name_map_list *map_list_ptr;
469 char *name;
470 FILE *f;
471
472 for (map_list_ptr = CPP_OPTIONS (pfile)->map_list; map_list_ptr;
473 map_list_ptr = map_list_ptr->map_list_next)
474 if (! strcmp (map_list_ptr->map_list_name, dirname))
475 return map_list_ptr->map_list_map;
476
477 map_list_ptr = ((struct file_name_map_list *)
478 xmalloc (sizeof (struct file_name_map_list)));
479 map_list_ptr->map_list_name = xstrdup (dirname);
480
481 name = (char *) alloca (strlen (dirname) + strlen (FILE_NAME_MAP_FILE) + 2);
482 strcpy (name, dirname);
483 if (*dirname)
484 strcat (name, "/");
485 strcat (name, FILE_NAME_MAP_FILE);
486 f = fopen (name, "r");
487 if (!f)
488 map_list_ptr->map_list_map = (struct file_name_map *)-1;
489 else
490 {
491 int ch;
492 int dirlen = strlen (dirname);
493
494 while ((ch = getc (f)) != EOF)
495 {
496 char *from, *to;
497 struct file_name_map *ptr;
498
499 if (is_space[ch])
500 continue;
501 from = read_filename_string (ch, f);
502 while ((ch = getc (f)) != EOF && is_hor_space[ch])
503 ;
504 to = read_filename_string (ch, f);
505
506 ptr = ((struct file_name_map *)
507 xmalloc (sizeof (struct file_name_map)));
508 ptr->map_from = from;
509
510 /* Make the real filename absolute. */
511 if (*to == '/')
512 ptr->map_to = to;
513 else
514 {
515 ptr->map_to = xmalloc (dirlen + strlen (to) + 2);
516 strcpy (ptr->map_to, dirname);
517 ptr->map_to[dirlen] = '/';
518 strcpy (ptr->map_to + dirlen + 1, to);
519 free (to);
520 }
521
522 ptr->map_next = map_list_ptr->map_list_map;
523 map_list_ptr->map_list_map = ptr;
524
525 while ((ch = getc (f)) != '\n')
526 if (ch == EOF)
527 break;
528 }
529 fclose (f);
530 }
531
532 map_list_ptr->map_list_next = CPP_OPTIONS (pfile)->map_list;
533 CPP_OPTIONS (pfile)->map_list = map_list_ptr;
534
535 return map_list_ptr->map_list_map;
536 }
537
538 /* Remap NAME based on the file_name_map (if any) for LOC. */
539
540 static char *
541 remap_filename (pfile, name, loc)
542 cpp_reader *pfile;
543 char *name;
544 struct file_name_list *loc;
545 {
546 struct file_name_map *map;
547 const char *from, *p, *dir;
548
549 if (! loc->name_map)
550 loc->name_map = read_name_map (pfile,
551 loc->name
552 ? loc->name : ".");
553
554 if (loc->name_map == (struct file_name_map *)-1)
555 return name;
556
557 from = name + strlen (loc->name) + 1;
558
559 for (map = loc->name_map; map; map = map->map_next)
560 if (!strcmp (map->map_from, from))
561 return map->map_to;
562
563 /* Try to find a mapping file for the particular directory we are
564 looking in. Thus #include <sys/types.h> will look up sys/types.h
565 in /usr/include/header.gcc and look up types.h in
566 /usr/include/sys/header.gcc. */
567 p = rindex (name, '/');
568 if (!p)
569 p = name;
570 if (loc && loc->name
571 && strlen (loc->name) == (size_t) (p - name)
572 && !strncmp (loc->name, name, p - name))
573 /* FILENAME is in SEARCHPTR, which we've already checked. */
574 return name;
575
576 if (p == name)
577 {
578 dir = ".";
579 from = name;
580 }
581 else
582 {
583 char * newdir = (char *) alloca (p - name + 1);
584 bcopy (name, newdir, p - name);
585 newdir[p - name] = '\0';
586 dir = newdir;
587 from = p + 1;
588 }
589
590 for (map = read_name_map (pfile, dir); map; map = map->map_next)
591 if (! strcmp (map->map_from, name))
592 return map->map_to;
593
594 return name;
595 }
596
597 /* Read the contents of FD into the buffer on the top of PFILE's stack.
598 IHASH points to the include hash entry for the file associated with
599 FD.
600
601 The caller is responsible for the cpp_push_buffer. */
602
603 int
604 finclude (pfile, fd, ihash)
605 cpp_reader *pfile;
606 int fd;
607 struct include_hash *ihash;
608 {
609 struct stat st;
610 size_t st_size;
611 long length;
612 cpp_buffer *fp;
613
614 if (fstat (fd, &st) < 0)
615 goto perror_fail;
616 if (fcntl (fd, F_SETFL, 0) == -1) /* turn off nonblocking mode */
617 goto perror_fail;
618
619 fp = CPP_BUFFER (pfile);
620
621 /* If fd points to a plain file, we know how big it is, so we can
622 allocate the buffer all at once. If fd is a pipe or terminal, we
623 can't. Most C source files are 4k or less, so we guess that. If
624 fd is something weird, like a block device or a directory, we
625 don't want to read it at all.
626
627 Unfortunately, different systems use different st.st_mode values
628 for pipes: some have S_ISFIFO, some S_ISSOCK, some are buggy and
629 zero the entire struct stat except a couple fields. Hence the
630 mess below.
631
632 In all cases, read_and_prescan will resize the buffer if it
633 turns out there's more data than we thought. */
634
635 if (S_ISREG (st.st_mode))
636 {
637 /* off_t might have a wider range than size_t - in other words,
638 the max size of a file might be bigger than the address
639 space. We can't handle a file that large. (Anyone with
640 a single source file bigger than 4GB needs to rethink
641 their coding style.) */
642 st_size = (size_t) st.st_size;
643 if ((unsigned HOST_WIDEST_INT) st_size
644 != (unsigned HOST_WIDEST_INT) st.st_size)
645 {
646 cpp_error (pfile, "file `%s' is too large", ihash->name);
647 goto fail;
648 }
649 }
650 else if (S_ISFIFO (st.st_mode) || S_ISSOCK (st.st_mode)
651 /* Some 4.x (x<4) derivatives have a bug that makes fstat() of a
652 socket or pipe return a stat struct with most fields zeroed. */
653 || (st.st_mode == 0 && st.st_nlink == 0 && st.st_size == 0)
654 || (S_ISCHR (st.st_mode) && isatty (fd)))
655 {
656 /* Cannot get its file size before reading. 4k is a decent
657 first guess. */
658 st_size = 4096;
659 }
660 else
661 {
662 cpp_error (pfile, "`%s' is not a file, pipe, or tty", ihash->name);
663 goto fail;
664 }
665
666 /* Read the file, converting end-of-line characters and trigraphs
667 (if enabled). */
668 fp->ihash = ihash;
669 fp->nominal_fname = fp->fname = ihash->name;
670 length = read_and_prescan (pfile, fp, fd, st_size);
671 if (length < 0)
672 goto fail;
673 if (length == 0)
674 ihash->control_macro = ""; /* never re-include */
675
676 close (fd);
677 fp->rlimit = fp->alimit = fp->buf + length;
678 fp->cur = fp->buf;
679 if (ihash->foundhere != ABSOLUTE_PATH)
680 fp->system_header_p = ihash->foundhere->sysp;
681 fp->lineno = 1;
682 fp->colno = 1;
683 fp->line_base = fp->buf;
684 fp->cleanup = file_cleanup;
685
686 /* The ->actual_dir field is only used when ignore_srcdir is not in effect;
687 see do_include */
688 if (!CPP_OPTIONS (pfile)->ignore_srcdir)
689 fp->actual_dir = actual_directory (pfile, fp->fname);
690
691 pfile->input_stack_listing_current = 0;
692 return 1;
693
694 perror_fail:
695 cpp_error_from_errno (pfile, ihash->name);
696 fail:
697 cpp_pop_buffer (pfile);
698 close (fd);
699 return 0;
700 }
701
702 /* Given a path FNAME, extract the directory component and place it
703 onto the actual_dirs list. Return a pointer to the allocated
704 file_name_list structure. These structures are used to implement
705 current-directory "" include searching. */
706
707 static struct file_name_list *
708 actual_directory (pfile, fname)
709 cpp_reader *pfile;
710 char *fname;
711 {
712 char *last_slash, *dir;
713 size_t dlen;
714 struct file_name_list *x;
715
716 dir = xstrdup (fname);
717 last_slash = rindex (dir, '/');
718 if (last_slash)
719 {
720 if (last_slash == dir)
721 {
722 dlen = 1;
723 last_slash[1] = '\0';
724 }
725 else
726 {
727 dlen = last_slash - dir;
728 *last_slash = '\0';
729 }
730 }
731 else
732 {
733 dir[0] = '.';
734 dir[1] = '\0';
735 dlen = 1;
736 }
737
738 if (dlen > pfile->max_include_len)
739 pfile->max_include_len = dlen;
740
741 for (x = pfile->actual_dirs; x; x = x->alloc)
742 if (!strcmp (x->name, dir))
743 {
744 free (dir);
745 return x;
746 }
747
748 /* Not found, make a new one. */
749 x = (struct file_name_list *) xmalloc (sizeof (struct file_name_list));
750 x->name = dir;
751 x->nlen = dlen;
752 x->next = CPP_OPTIONS (pfile)->quote_include;
753 x->alloc = pfile->actual_dirs;
754 x->sysp = CPP_BUFFER (pfile)->system_header_p;
755 x->name_map = NULL;
756
757 pfile->actual_dirs = x;
758 return x;
759 }
760
761 /* Almost but not quite the same as adjust_position in cpplib.c.
762 Used only by read_and_prescan. */
763 static void
764 find_position (start, limit, linep, colp)
765 U_CHAR *start;
766 U_CHAR *limit;
767 unsigned long *linep;
768 unsigned long *colp;
769 {
770 unsigned long line = *linep, col = 0;
771 while (start < limit)
772 {
773 U_CHAR ch = *start++;
774 if (ch == '\n' || ch == '\r')
775 line++, col = 1;
776 else
777 col++;
778 }
779 *linep = line, *colp = col;
780 }
781
782 /* Read the entire contents of file DESC into buffer BUF. LEN is how
783 much memory to allocate initially; more will be allocated if
784 necessary. Convert end-of-line markers (\n, \r, \r\n, \n\r) to
785 canonical form (\n). If enabled, convert and/or warn about
786 trigraphs. Convert backslash-newline to a one-character escape
787 (\r) and remove it from "embarrassing" places (i.e. the middle of a
788 token). If there is no newline at the end of the file, add one and
789 warn. Returns -1 on failure, or the actual length of the data to
790 be scanned.
791
792 This function does a lot of work, and can be a serious performance
793 bottleneck. It has been tuned heavily; make sure you understand it
794 before hacking. The common case - no trigraphs, Unix style line
795 breaks, backslash-newline set off by whitespace, newline at EOF -
796 has been optimized at the expense of the others. The performance
797 penalty for DOS style line breaks (\r\n) is about 15%.
798
799 Warnings lose particularly heavily since we have to determine the
800 line number, which involves scanning from the beginning of the file
801 or from the last warning. The penalty for the absence of a newline
802 at the end of reload1.c is about 60%. (reload1.c is 329k.)
803
804 If your file has more than one kind of end-of-line marker, you
805 will get messed-up line numbering. */
806
807 #ifndef PIPE_BUF
808 #define PIPE_BUF 4096
809 #endif
810
811 static long
812 read_and_prescan (pfile, fp, desc, len)
813 cpp_reader *pfile;
814 cpp_buffer *fp;
815 int desc;
816 size_t len;
817 {
818 U_CHAR *buf = (U_CHAR *) xmalloc (len);
819 U_CHAR *ip, *op, *line_base;
820 U_CHAR *ibase;
821 unsigned long line;
822 unsigned int deferred_newlines;
823 int count;
824 size_t offset;
825 /* PIPE_BUF bytes of buffer proper, 2 to detect running off the end
826 without address arithmetic all the time, and 2 for pushback in
827 the case there's a potential trigraph or end-of-line digraph at
828 the end of a block. */
829 U_CHAR intermed[PIPE_BUF + 2 + 2];
830
831 /* Table of characters that can't be handled in the inner loop.
832 Keep these contiguous to optimize the performance of the code generated
833 for the switch that uses them. */
834 #define SPECCASE_EMPTY 0
835 #define SPECCASE_NUL 1
836 #define SPECCASE_CR 2
837 #define SPECCASE_BACKSLASH 3
838 #define SPECCASE_QUESTION 4
839 U_CHAR speccase[256];
840
841 offset = 0;
842 op = buf;
843 line_base = buf;
844 line = 1;
845 ibase = intermed + 2;
846 deferred_newlines = 0;
847
848 memset (speccase, SPECCASE_EMPTY, sizeof (speccase));
849 speccase['\0'] = SPECCASE_NUL;
850 speccase['\r'] = SPECCASE_CR;
851 speccase['\\'] = SPECCASE_BACKSLASH;
852 if (CPP_OPTIONS (pfile)->trigraphs || CPP_OPTIONS (pfile)->warn_trigraphs)
853 speccase['?'] = SPECCASE_QUESTION;
854
855 for (;;)
856 {
857 read_next:
858
859 count = read (desc, intermed + 2, PIPE_BUF);
860 if (count < 0)
861 goto error;
862 else if (count == 0)
863 break;
864
865 offset += count;
866 ip = ibase;
867 ibase = intermed + 2;
868 ibase[count] = ibase[count+1] = '\0';
869
870 if (offset > len)
871 {
872 size_t delta_op;
873 size_t delta_line_base;
874 len *= 2;
875 if (offset > len)
876 /* len overflowed.
877 This could happen if the file is larger than half the
878 maximum address space of the machine. */
879 goto too_big;
880
881 delta_op = op - buf;
882 delta_line_base = line_base - buf;
883 buf = (U_CHAR *) xrealloc (buf, len);
884 op = buf + delta_op;
885 line_base = buf + delta_line_base;
886 }
887
888 for (;;)
889 {
890 unsigned int span = 0;
891
892 /* Deal with \-newline in the middle of a token. */
893 if (deferred_newlines)
894 {
895 while (speccase[ip[span]] == SPECCASE_EMPTY
896 && ip[span] != '\n'
897 && ip[span] != '\t'
898 && ip[span] != ' ')
899 span++;
900 memcpy (op, ip, span);
901 op += span;
902 ip += span;
903 if (*ip == '\n' || *ip == '\t'
904 || *ip == ' ' || *ip == ' ')
905 while (deferred_newlines)
906 deferred_newlines--, *op++ = '\r';
907 span = 0;
908 }
909
910 /* Copy as much as we can without special treatment. */
911 while (speccase[ip[span]] == SPECCASE_EMPTY) span++;
912 memcpy (op, ip, span);
913 op += span;
914 ip += span;
915
916 switch (speccase[*ip++])
917 {
918 case SPECCASE_NUL: /* \0 */
919 ibase[-1] = op[-1];
920 goto read_next;
921
922 case SPECCASE_CR: /* \r */
923 if (*ip == '\n')
924 ip++;
925 else if (*ip == '\0')
926 {
927 --ibase;
928 intermed[1] = '\r';
929 goto read_next;
930 }
931 else if (ip[-2] == '\n')
932 continue;
933 *op++ = '\n';
934 break;
935
936 case SPECCASE_BACKSLASH: /* \ */
937 backslash:
938 {
939 /* If we're at the end of the intermediate buffer,
940 we have to shift the backslash down to the start
941 and come back next pass. */
942 if (*ip == '\0')
943 {
944 --ibase;
945 intermed[1] = '\\';
946 goto read_next;
947 }
948 else if (*ip == '\n')
949 {
950 ip++;
951 if (*ip == '\r') ip++;
952 if (*ip == '\n' || *ip == '\t' || *ip == ' ')
953 *op++ = '\r';
954 else if (op[-1] == '\t' || op[-1] == ' '
955 || op[-1] == '\r' || op[-1] == '\n')
956 *op++ = '\r';
957 else
958 deferred_newlines++;
959 line++;
960 line_base = op;
961 }
962 else if (*ip == '\r')
963 {
964 ip++;
965 if (*ip == '\n') ip++;
966 else if (*ip == '\0')
967 {
968 ibase -= 2;
969 intermed[0] = '\\';
970 intermed[1] = '\r';
971 goto read_next;
972 }
973 else if (*ip == '\r' || *ip == '\t' || *ip == ' ')
974 *op++ = '\r';
975 else
976 deferred_newlines++;
977 line++;
978 line_base = op;
979 }
980 else
981 *op++ = '\\';
982 }
983 break;
984
985 case SPECCASE_QUESTION: /* ? */
986 {
987 unsigned int d;
988 /* If we're at the end of the intermediate buffer,
989 we have to shift the ?'s down to the start and
990 come back next pass. */
991 d = ip[0];
992 if (d == '\0')
993 {
994 --ibase;
995 intermed[1] = '?';
996 goto read_next;
997 }
998 if (d != '?')
999 {
1000 *op++ = '?';
1001 break;
1002 }
1003 d = ip[1];
1004 if (d == '\0')
1005 {
1006 ibase -= 2;
1007 intermed[0] = intermed[1] = '?';
1008 goto read_next;
1009 }
1010 if (!trigraph_table[d])
1011 {
1012 *op++ = '?';
1013 break;
1014 }
1015
1016 if (CPP_OPTIONS (pfile)->warn_trigraphs)
1017 {
1018 unsigned long col;
1019 find_position (line_base, op, &line, &col);
1020 line_base = op - col;
1021 cpp_warning_with_line (pfile, line, col,
1022 "trigraph ??%c encountered", d);
1023 }
1024 if (CPP_OPTIONS (pfile)->trigraphs)
1025 {
1026 if (trigraph_table[d] == '\\')
1027 goto backslash;
1028 else
1029 *op++ = trigraph_table[d];
1030 }
1031 else
1032 {
1033 *op++ = '?';
1034 *op++ = '?';
1035 *op++ = d;
1036 }
1037 ip += 2;
1038 }
1039 }
1040 }
1041 }
1042
1043 if (offset == 0)
1044 return 0;
1045
1046 /* Deal with pushed-back chars at true EOF.
1047 This may be any of: ?? ? \ \r \n \\r \\n.
1048 \r must become \n, \\r or \\n must become \r.
1049 We know we have space already. */
1050 if (ibase == intermed)
1051 {
1052 if (*ibase == '?')
1053 {
1054 *op++ = '?';
1055 *op++ = '?';
1056 }
1057 else
1058 *op++ = '\r';
1059 }
1060 else if (ibase == intermed + 1)
1061 {
1062 if (*ibase == '\r')
1063 *op++ = '\n';
1064 else
1065 *op++ = *ibase;
1066 }
1067
1068 if (op[-1] != '\n')
1069 {
1070 unsigned long col;
1071 find_position (line_base, op, &line, &col);
1072 cpp_warning_with_line (pfile, line, col, "no newline at end of file\n");
1073 if (offset + 1 > len)
1074 {
1075 len += 1;
1076 if (offset + 1 > len)
1077 goto too_big;
1078 buf = (U_CHAR *) xrealloc (buf, len);
1079 op = buf + offset;
1080 }
1081 *op++ = '\n';
1082 }
1083
1084 fp->buf = ((len - offset < 20) ? buf : (U_CHAR *)xrealloc (buf, op - buf));
1085 return op - buf;
1086
1087 too_big:
1088 cpp_error (pfile, "file is too large (>%lu bytes)\n", (unsigned long)offset);
1089 free (buf);
1090 return -1;
1091
1092 error:
1093 cpp_error_from_errno (pfile, fp->fname);
1094 free (buf);
1095 return -1;
1096 }
1097
1098 /* Add output to `deps_buffer' for the -M switch.
1099 STRING points to the text to be output.
1100 SPACER is ':' for targets, ' ' for dependencies, zero for text
1101 to be inserted literally. */
1102
1103 void
1104 deps_output (pfile, string, spacer)
1105 cpp_reader *pfile;
1106 char *string;
1107 int spacer;
1108 {
1109 int size;
1110 int cr = 0;
1111
1112 if (!*string)
1113 return;
1114
1115 size = strlen (string);
1116
1117 #ifndef MAX_OUTPUT_COLUMNS
1118 #define MAX_OUTPUT_COLUMNS 72
1119 #endif
1120 if (pfile->deps_column > 0
1121 && (pfile->deps_column + size) > MAX_OUTPUT_COLUMNS)
1122 {
1123 cr = 5;
1124 pfile->deps_column = 0;
1125 }
1126
1127 if (pfile->deps_size + size + cr + 8 > pfile->deps_allocated_size)
1128 {
1129 pfile->deps_allocated_size = (pfile->deps_size + size + 50) * 2;
1130 pfile->deps_buffer = (char *) xrealloc (pfile->deps_buffer,
1131 pfile->deps_allocated_size);
1132 }
1133
1134 if (cr)
1135 {
1136 bcopy (" \\\n ", &pfile->deps_buffer[pfile->deps_size], 5);
1137 pfile->deps_size += 5;
1138 }
1139
1140 if (spacer == ' ' && pfile->deps_column > 0)
1141 pfile->deps_buffer[pfile->deps_size++] = ' ';
1142 bcopy (string, &pfile->deps_buffer[pfile->deps_size], size);
1143 pfile->deps_size += size;
1144 pfile->deps_column += size;
1145 if (spacer == ':')
1146 pfile->deps_buffer[pfile->deps_size++] = ':';
1147 pfile->deps_buffer[pfile->deps_size] = 0;
1148 }
1149
1150 /* Simplify a path name in place, deleting redundant components. This
1151 reduces OS overhead and guarantees that equivalent paths compare
1152 the same (modulo symlinks).
1153
1154 Transforms made:
1155 foo/bar/../quux foo/quux
1156 foo/./bar foo/bar
1157 foo//bar foo/bar
1158 /../quux /quux
1159 //quux //quux (POSIX allows leading // as a namespace escape)
1160
1161 Guarantees no trailing slashes. All transforms reduce the length
1162 of the string.
1163 */
1164 void
1165 simplify_pathname (path)
1166 char *path;
1167 {
1168 char *from, *to;
1169 char *base;
1170 int absolute = 0;
1171
1172 #if defined (HAVE_DOS_BASED_FILE_SYSTEM)
1173 /* Convert all backslashes to slashes. */
1174 for (from = path; *from; from++)
1175 if (*from == '\\') *from = '/';
1176
1177 /* Skip over leading drive letter if present. */
1178 if (ISALPHA (path[0]) && path[1] == ':')
1179 from = to = &path[2];
1180 else
1181 from = to = path;
1182 #else
1183 from = to = path;
1184 #endif
1185
1186 /* Remove redundant initial /s. */
1187 if (*from == '/')
1188 {
1189 absolute = 1;
1190 to++;
1191 from++;
1192 if (*from == '/')
1193 {
1194 if (*++from == '/')
1195 /* 3 or more initial /s are equivalent to 1 /. */
1196 while (*++from == '/');
1197 else
1198 /* On some hosts // differs from /; Posix allows this. */
1199 to++;
1200 }
1201 }
1202 base = to;
1203
1204 for (;;)
1205 {
1206 while (*from == '/')
1207 from++;
1208
1209 if (from[0] == '.' && from[1] == '/')
1210 from += 2;
1211 else if (from[0] == '.' && from[1] == '\0')
1212 goto done;
1213 else if (from[0] == '.' && from[1] == '.' && from[2] == '/')
1214 {
1215 if (base == to)
1216 {
1217 if (absolute)
1218 from += 3;
1219 else
1220 {
1221 *to++ = *from++;
1222 *to++ = *from++;
1223 *to++ = *from++;
1224 base = to;
1225 }
1226 }
1227 else
1228 {
1229 to -= 2;
1230 while (to > base && *to != '/') to--;
1231 if (*to == '/')
1232 to++;
1233 from += 3;
1234 }
1235 }
1236 else if (from[0] == '.' && from[1] == '.' && from[2] == '\0')
1237 {
1238 if (base == to)
1239 {
1240 if (!absolute)
1241 {
1242 *to++ = *from++;
1243 *to++ = *from++;
1244 }
1245 }
1246 else
1247 {
1248 to -= 2;
1249 while (to > base && *to != '/') to--;
1250 if (*to == '/')
1251 to++;
1252 }
1253 goto done;
1254 }
1255 else
1256 /* Copy this component and trailing /, if any. */
1257 while ((*to++ = *from++) != '/')
1258 {
1259 if (!to[-1])
1260 {
1261 to--;
1262 goto done;
1263 }
1264 }
1265
1266 }
1267
1268 done:
1269 /* Trim trailing slash */
1270 if (to[0] == '/' && (!absolute || to > path+1))
1271 to--;
1272
1273 /* Change the empty string to "." so that stat() on the result
1274 will always work. */
1275 if (to == path)
1276 *to++ = '.';
1277
1278 *to = '\0';
1279
1280 return;
1281 }
1282
1283 /* It is not clear when this should be used if at all, so I've
1284 disabled it until someone who understands VMS can look at it. */
1285 #if 0
1286
1287 /* Under VMS we need to fix up the "include" specification filename.
1288
1289 Rules for possible conversions
1290
1291 fullname tried paths
1292
1293 name name
1294 ./dir/name [.dir]name
1295 /dir/name dir:name
1296 /name [000000]name, name
1297 dir/name dir:[000000]name, dir:name, dir/name
1298 dir1/dir2/name dir1:[dir2]name, dir1:[000000.dir2]name
1299 path:/name path:[000000]name, path:name
1300 path:/dir/name path:[000000.dir]name, path:[dir]name
1301 path:dir/name path:[dir]name
1302 [path]:[dir]name [path.dir]name
1303 path/[dir]name [path.dir]name
1304
1305 The path:/name input is constructed when expanding <> includes. */
1306
1307
1308 static void
1309 hack_vms_include_specification (fullname)
1310 char *fullname;
1311 {
1312 register char *basename, *unixname, *local_ptr, *first_slash;
1313 int f, check_filename_before_returning, must_revert;
1314 char Local[512];
1315
1316 check_filename_before_returning = 0;
1317 must_revert = 0;
1318 /* See if we can find a 1st slash. If not, there's no path information. */
1319 first_slash = index (fullname, '/');
1320 if (first_slash == 0)
1321 return 0; /* Nothing to do!!! */
1322
1323 /* construct device spec if none given. */
1324
1325 if (index (fullname, ':') == 0)
1326 {
1327
1328 /* If fullname has a slash, take it as device spec. */
1329
1330 if (first_slash == fullname)
1331 {
1332 first_slash = index (fullname+1, '/'); /* 2nd slash ? */
1333 if (first_slash)
1334 *first_slash = ':'; /* make device spec */
1335 for (basename = fullname; *basename != 0; basename++)
1336 *basename = *(basename+1); /* remove leading slash */
1337 }
1338 else if ((first_slash[-1] != '.') /* keep ':/', './' */
1339 && (first_slash[-1] != ':')
1340 && (first_slash[-1] != ']')) /* or a vms path */
1341 {
1342 *first_slash = ':';
1343 }
1344 else if ((first_slash[1] == '[') /* skip './' in './[dir' */
1345 && (first_slash[-1] == '.'))
1346 fullname += 2;
1347 }
1348
1349 /* Get part after first ':' (basename[-1] == ':')
1350 or last '/' (basename[-1] == '/'). */
1351
1352 basename = base_name (fullname);
1353
1354 local_ptr = Local; /* initialize */
1355
1356 /* We are trying to do a number of things here. First of all, we are
1357 trying to hammer the filenames into a standard format, such that later
1358 processing can handle them.
1359
1360 If the file name contains something like [dir.], then it recognizes this
1361 as a root, and strips the ".]". Later processing will add whatever is
1362 needed to get things working properly.
1363
1364 If no device is specified, then the first directory name is taken to be
1365 a device name (or a rooted logical). */
1366
1367 /* Point to the UNIX filename part (which needs to be fixed!)
1368 but skip vms path information.
1369 [basename != fullname since first_slash != 0]. */
1370
1371 if ((basename[-1] == ':') /* vms path spec. */
1372 || (basename[-1] == ']')
1373 || (basename[-1] == '>'))
1374 unixname = basename;
1375 else
1376 unixname = fullname;
1377
1378 if (*unixname == '/')
1379 unixname++;
1380
1381 /* If the directory spec is not rooted, we can just copy
1382 the UNIX filename part and we are done. */
1383
1384 if (((basename - fullname) > 1)
1385 && ( (basename[-1] == ']')
1386 || (basename[-1] == '>')))
1387 {
1388 if (basename[-2] != '.')
1389 {
1390
1391 /* The VMS part ends in a `]', and the preceding character is not a `.'.
1392 -> PATH]:/name (basename = '/name', unixname = 'name')
1393 We strip the `]', and then splice the two parts of the name in the
1394 usual way. Given the default locations for include files in cccp.c,
1395 we will only use this code if the user specifies alternate locations
1396 with the /include (-I) switch on the command line. */
1397
1398 basename -= 1; /* Strip "]" */
1399 unixname--; /* backspace */
1400 }
1401 else
1402 {
1403
1404 /* The VMS part has a ".]" at the end, and this will not do. Later
1405 processing will add a second directory spec, and this would be a syntax
1406 error. Thus we strip the ".]", and thus merge the directory specs.
1407 We also backspace unixname, so that it points to a '/'. This inhibits the
1408 generation of the 000000 root directory spec (which does not belong here
1409 in this case). */
1410
1411 basename -= 2; /* Strip ".]" */
1412 unixname--; /* backspace */
1413 }
1414 }
1415
1416 else
1417
1418 {
1419
1420 /* We drop in here if there is no VMS style directory specification yet.
1421 If there is no device specification either, we make the first dir a
1422 device and try that. If we do not do this, then we will be essentially
1423 searching the users default directory (as if they did a #include "asdf.h").
1424
1425 Then all we need to do is to push a '[' into the output string. Later
1426 processing will fill this in, and close the bracket. */
1427
1428 if ((unixname != fullname) /* vms path spec found. */
1429 && (basename[-1] != ':'))
1430 *local_ptr++ = ':'; /* dev not in spec. take first dir */
1431
1432 *local_ptr++ = '['; /* Open the directory specification */
1433 }
1434
1435 if (unixname == fullname) /* no vms dir spec. */
1436 {
1437 must_revert = 1;
1438 if ((first_slash != 0) /* unix dir spec. */
1439 && (*unixname != '/') /* not beginning with '/' */
1440 && (*unixname != '.')) /* or './' or '../' */
1441 *local_ptr++ = '.'; /* dir is local ! */
1442 }
1443
1444 /* at this point we assume that we have the device spec, and (at least
1445 the opening "[" for a directory specification. We may have directories
1446 specified already.
1447
1448 If there are no other slashes then the filename will be
1449 in the "root" directory. Otherwise, we need to add
1450 directory specifications. */
1451
1452 if (index (unixname, '/') == 0)
1453 {
1454 /* if no directories specified yet and none are following. */
1455 if (local_ptr[-1] == '[')
1456 {
1457 /* Just add "000000]" as the directory string */
1458 strcpy (local_ptr, "000000]");
1459 local_ptr += strlen (local_ptr);
1460 check_filename_before_returning = 1; /* we might need to fool with this later */
1461 }
1462 }
1463 else
1464 {
1465
1466 /* As long as there are still subdirectories to add, do them. */
1467 while (index (unixname, '/') != 0)
1468 {
1469 /* If this token is "." we can ignore it
1470 if it's not at the beginning of a path. */
1471 if ((unixname[0] == '.') && (unixname[1] == '/'))
1472 {
1473 /* remove it at beginning of path. */
1474 if ( ((unixname == fullname) /* no device spec */
1475 && (fullname+2 != basename)) /* starts with ./ */
1476 /* or */
1477 || ((basename[-1] == ':') /* device spec */
1478 && (unixname-1 == basename))) /* and ./ afterwards */
1479 *local_ptr++ = '.'; /* make '[.' start of path. */
1480 unixname += 2;
1481 continue;
1482 }
1483
1484 /* Add a subdirectory spec. Do not duplicate "." */
1485 if ( local_ptr[-1] != '.'
1486 && local_ptr[-1] != '['
1487 && local_ptr[-1] != '<')
1488 *local_ptr++ = '.';
1489
1490 /* If this is ".." then the spec becomes "-" */
1491 if ( (unixname[0] == '.')
1492 && (unixname[1] == '.')
1493 && (unixname[2] == '/'))
1494 {
1495 /* Add "-" and skip the ".." */
1496 if ((local_ptr[-1] == '.')
1497 && (local_ptr[-2] == '['))
1498 local_ptr--; /* prevent [.- */
1499 *local_ptr++ = '-';
1500 unixname += 3;
1501 continue;
1502 }
1503
1504 /* Copy the subdirectory */
1505 while (*unixname != '/')
1506 *local_ptr++= *unixname++;
1507
1508 unixname++; /* Skip the "/" */
1509 }
1510
1511 /* Close the directory specification */
1512 if (local_ptr[-1] == '.') /* no trailing periods */
1513 local_ptr--;
1514
1515 if (local_ptr[-1] == '[') /* no dir needed */
1516 local_ptr--;
1517 else
1518 *local_ptr++ = ']';
1519 }
1520
1521 /* Now add the filename. */
1522
1523 while (*unixname)
1524 *local_ptr++ = *unixname++;
1525 *local_ptr = 0;
1526
1527 /* Now append it to the original VMS spec. */
1528
1529 strcpy ((must_revert==1)?fullname:basename, Local);
1530
1531 /* If we put a [000000] in the filename, try to open it first. If this fails,
1532 remove the [000000], and return that name. This provides flexibility
1533 to the user in that they can use both rooted and non-rooted logical names
1534 to point to the location of the file. */
1535
1536 if (check_filename_before_returning)
1537 {
1538 f = open (fullname, O_RDONLY, 0666);
1539 if (f >= 0)
1540 {
1541 /* The file name is OK as it is, so return it as is. */
1542 close (f);
1543 return 1;
1544 }
1545
1546 /* The filename did not work. Try to remove the [000000] from the name,
1547 and return it. */
1548
1549 basename = index (fullname, '[');
1550 local_ptr = index (fullname, ']') + 1;
1551 strcpy (basename, local_ptr); /* this gets rid of it */
1552
1553 }
1554
1555 return 1;
1556 }
1557 #endif /* VMS */
This page took 2.391601 seconds and 6 git commands to generate.