OSDN Git Service

* fr.po: Update.
[pf3gnuchains/gcc-fork.git] / libcpp / files.c
1 /* Part of CPP library.  File handling.
2    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004 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    Reimplemented, Neil Booth, Jul 2003
9
10 This program is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2, or (at your option) any
13 later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
23
24 #include "config.h"
25 #include "system.h"
26 #include "cpplib.h"
27 #include "internal.h"
28 #include "mkdeps.h"
29 #include "hashtab.h"
30 #include "md5.h"
31 #include <dirent.h>
32
33 /* Variable length record files on VMS will have a stat size that includes
34    record control characters that won't be included in the read size.  */
35 #ifdef VMS
36 # define FAB_C_VAR 2 /* variable length records (see Starlet fabdef.h) */
37 # define STAT_SIZE_RELIABLE(ST) ((ST).st_fab_rfm != FAB_C_VAR)
38 #else
39 # define STAT_SIZE_RELIABLE(ST) true
40 #endif
41
42 #ifdef __DJGPP__
43   /* For DJGPP redirected input is opened in text mode.  */
44 #  define set_stdin_to_binary_mode() \
45      if (! isatty (0)) setmode (0, O_BINARY)
46 #else
47 #  define set_stdin_to_binary_mode() /* Nothing */
48 #endif
49
50 /* This structure represents a file searched for by CPP, whether it
51    exists or not.  An instance may be pointed to by more than one
52    file_hash_entry; at present no reference count is kept.  */
53 struct _cpp_file
54 {
55   /* Filename as given to #include or command line switch.  */
56   const char *name;
57
58   /* The full path used to find the file.  */
59   const char *path;
60
61   /* The full path of the pch file.  */
62   const char *pchname;
63
64   /* The file's path with the basename stripped.  NULL if it hasn't
65      been calculated yet.  */
66   const char *dir_name;
67
68   /* Chain through all files.  */
69   struct _cpp_file *next_file;
70
71   /* The contents of NAME after calling read_file().  */
72   const uchar *buffer;
73
74   /* The macro, if any, preventing re-inclusion.  */
75   const cpp_hashnode *cmacro;
76
77   /* The directory in the search path where FILE was found.  Used for
78      #include_next and determining whether a header is a system
79      header.  */
80   cpp_dir *dir;
81
82   /* As filled in by stat(2) for the file.  */
83   struct stat st;
84
85   /* File descriptor.  Invalid if -1, otherwise open.  */
86   int fd;
87
88   /* Zero if this file was successfully opened and stat()-ed,
89      otherwise errno obtained from failure.  */
90   int err_no;
91
92   /* Number of times the file has been stacked for preprocessing.  */
93   unsigned short stack_count;
94
95   /* If opened with #import or contains #pragma once.  */
96   bool once_only;
97
98   /* If read() failed before.  */
99   bool dont_read;
100
101   /* If this file is the main file.  */
102   bool main_file;
103
104   /* If BUFFER above contains the true contents of the file.  */
105   bool buffer_valid;
106
107   /* File is a PCH (on return from find_include_file).  */
108   bool pch;
109 };
110
111 /* A singly-linked list for all searches for a given file name, with
112    its head pointed to by a slot in FILE_HASH.  The file name is what
113    appeared between the quotes in a #include directive; it can be
114    determined implicitly from the hash table location or explicitly
115    from FILE->name.
116
117    FILE is a structure containing details about the file that was
118    found with that search, or details of how the search failed.
119
120    START_DIR is the starting location of the search in the include
121    chain.  The current directories for "" includes are also hashed in
122    the hash table and therefore unique.  Files that are looked up
123    without using a search path, such as absolute filenames and file
124    names from the command line share a special starting directory so
125    they don't cause cache hits with normal include-chain lookups.
126
127    If START_DIR is NULL then the entry is for a directory, not a file,
128    and the directory is in DIR.  Since the starting point in a file
129    lookup chain is never NULL, this means that simple pointer
130    comparisons against START_DIR can be made to determine cache hits
131    in file lookups.
132
133    If a cache lookup fails because of e.g. an extra "./" in the path,
134    then nothing will break.  It is just less efficient as CPP will
135    have to do more work re-preprocessing the file, and/or comparing
136    its contents against earlier once-only files.
137 */
138 struct file_hash_entry
139 {
140   struct file_hash_entry *next;
141   cpp_dir *start_dir;
142   union
143   {
144     _cpp_file *file;
145     cpp_dir *dir;
146   } u;
147 };
148
149 static bool open_file (_cpp_file *file);
150 static bool pch_open_file (cpp_reader *pfile, _cpp_file *file,
151                            bool *invalid_pch);
152 static bool find_file_in_dir (cpp_reader *pfile, _cpp_file *file,
153                               bool *invalid_pch);
154 static bool read_file_guts (cpp_reader *pfile, _cpp_file *file);
155 static bool read_file (cpp_reader *pfile, _cpp_file *file);
156 static bool should_stack_file (cpp_reader *, _cpp_file *file, bool import);
157 static struct cpp_dir *search_path_head (cpp_reader *, const char *fname,
158                                  int angle_brackets, enum include_type);
159 static const char *dir_name_of_file (_cpp_file *file);
160 static void open_file_failed (cpp_reader *pfile, _cpp_file *file);
161 static struct file_hash_entry *search_cache (struct file_hash_entry *head,
162                                              const cpp_dir *start_dir);
163 static _cpp_file *make_cpp_file (cpp_reader *, cpp_dir *, const char *fname);
164 static void destroy_cpp_file (_cpp_file *);
165 static cpp_dir *make_cpp_dir (cpp_reader *, const char *dir_name, int sysp);
166 static void allocate_file_hash_entries (cpp_reader *pfile);
167 static struct file_hash_entry *new_file_hash_entry (cpp_reader *pfile);
168 static int report_missing_guard (void **slot, void *b);
169 static hashval_t file_hash_hash (const void *p);
170 static int file_hash_eq (const void *p, const void *q);
171 static char *read_filename_string (int ch, FILE *f);
172 static void read_name_map (cpp_dir *dir);
173 static char *remap_filename (cpp_reader *pfile, _cpp_file *file);
174 static char *append_file_to_dir (const char *fname, cpp_dir *dir);
175 static bool validate_pch (cpp_reader *, _cpp_file *file, const char *pchname);
176 static int pchf_adder (void **slot, void *data);
177 static int pchf_save_compare (const void *e1, const void *e2);
178 static int pchf_compare (const void *d_p, const void *e_p);
179 static bool check_file_against_entries (cpp_reader *, _cpp_file *, bool);
180
181 /* Given a filename in FILE->PATH, with the empty string interpreted
182    as <stdin>, open it.
183
184    On success FILE contains an open file descriptor and stat
185    information for the file.  On failure the file descriptor is -1 and
186    the appropriate errno is also stored in FILE.  Returns TRUE iff
187    successful.
188
189    We used to open files in nonblocking mode, but that caused more
190    problems than it solved.  Do take care not to acquire a controlling
191    terminal by mistake (this can't happen on sane systems, but
192    paranoia is a virtue).
193
194    Use the three-argument form of open even though we aren't
195    specifying O_CREAT, to defend against broken system headers.
196
197    O_BINARY tells some runtime libraries (notably DJGPP) not to do
198    newline translation; we can handle DOS line breaks just fine
199    ourselves.  */
200 static bool
201 open_file (_cpp_file *file)
202 {
203   if (file->path[0] == '\0')
204     {
205       file->fd = 0;
206       set_stdin_to_binary_mode ();
207     }
208   else
209     file->fd = open (file->path, O_RDONLY | O_NOCTTY | O_BINARY, 0666);
210
211   if (file->fd != -1)
212     {
213       if (fstat (file->fd, &file->st) == 0)
214         {
215           if (!S_ISDIR (file->st.st_mode))
216             {
217               file->err_no = 0;
218               return true;
219             }
220
221           /* Ignore a directory and continue the search.  The file we're
222              looking for may be elsewhere in the search path.  */
223           errno = ENOENT;
224         }
225
226       close (file->fd);
227       file->fd = -1;
228     }
229   else if (errno == ENOTDIR)
230     errno = ENOENT;
231
232   file->err_no = errno;
233
234   return false;
235 }
236
237 /* Temporary PCH intercept of opening a file.  Try to find a PCH file
238    based on FILE->name and FILE->dir, and test those found for
239    validity using PFILE->cb.valid_pch.  Return true iff a valid file is
240    found.  Set *INVALID_PCH if a PCH file is found but wasn't valid.  */
241
242 static bool
243 pch_open_file (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
244 {
245   static const char extension[] = ".gch";
246   const char *path = file->path;
247   size_t len, flen;
248   char *pchname;
249   struct stat st;
250   bool valid = false;
251
252   /* No PCH on <stdin> or if not requested.  */
253   if (file->name[0] == '\0' || !pfile->cb.valid_pch)
254     return false;
255
256   flen = strlen (path);
257   len = flen + sizeof (extension);
258   pchname = xmalloc (len);
259   memcpy (pchname, path, flen);
260   memcpy (pchname + flen, extension, sizeof (extension));
261
262   if (stat (pchname, &st) == 0)
263     {
264       DIR *pchdir;
265       struct dirent *d;
266       size_t dlen, plen = len;
267
268       if (!S_ISDIR (st.st_mode))
269         valid = validate_pch (pfile, file, pchname);
270       else if ((pchdir = opendir (pchname)) != NULL)
271         {
272           pchname[plen - 1] = '/';
273           while ((d = readdir (pchdir)) != NULL)
274             {
275               dlen = strlen (d->d_name) + 1;
276               if ((strcmp (d->d_name, ".") == 0)
277                   || (strcmp (d->d_name, "..") == 0))
278                 continue;
279               if (dlen + plen > len)
280                 {
281                   len += dlen + 64;
282                   pchname = xrealloc (pchname, len);
283                 }
284               memcpy (pchname + plen, d->d_name, dlen);
285               valid = validate_pch (pfile, file, pchname);
286               if (valid)
287                 break;
288             }
289           closedir (pchdir);
290         }
291       if (valid)
292         file->pch = true;
293       else
294         *invalid_pch = true;
295     }
296
297   if (valid)
298     file->pchname = pchname;
299   else
300     free (pchname);
301
302   return valid;
303 }
304
305 /* Try to open the path FILE->name appended to FILE->dir.  This is
306    where remap and PCH intercept the file lookup process.  Return true
307    if the file was found, whether or not the open was successful.
308    Set *INVALID_PCH to true if a PCH file is found but wasn't valid.  */
309
310 static bool
311 find_file_in_dir (cpp_reader *pfile, _cpp_file *file, bool *invalid_pch)
312 {
313   char *path;
314
315   if (CPP_OPTION (pfile, remap) && (path = remap_filename (pfile, file)))
316     ;
317   else
318     if (file->dir->construct)
319       path = file->dir->construct (file->name, file->dir);
320     else
321       path = append_file_to_dir (file->name, file->dir);
322
323   if (path)
324     {
325       file->path = path;
326       if (pch_open_file (pfile, file, invalid_pch))
327         return true;
328
329       if (open_file (file))
330         return true;
331
332       if (file->err_no != ENOENT)
333         {
334           open_file_failed (pfile, file);
335           return true;
336         }
337
338       free (path);
339       file->path = file->name;
340     }
341   else
342     {
343       file->err_no = ENOENT; 
344       file->path = NULL;
345     }
346
347   return false;
348 }
349
350 /* Return tue iff the missing_header callback found the given HEADER.  */
351 static bool
352 search_path_exhausted (cpp_reader *pfile, const char *header, _cpp_file *file)
353 {
354   missing_header_cb func = pfile->cb.missing_header;
355
356   /* When the regular search path doesn't work, try context dependent
357      headers search paths.  */
358   if (func
359       && file->dir == NULL)
360     {
361       if ((file->path = func (pfile, header, &file->dir)) != NULL)
362         {
363           if (open_file (file))
364             return true;
365           free ((void *)file->path);
366         }
367       file->path = file->name;
368     }
369
370   return false;
371 }
372
373 bool
374 _cpp_find_failed (_cpp_file *file)
375 {
376   return file->err_no != 0;
377 }
378
379 /* Given a filename FNAME search for such a file in the include path
380    starting from START_DIR.  If FNAME is the empty string it is
381    interpreted as STDIN if START_DIR is PFILE->no_search_path.
382
383    If the file is not found in the file cache fall back to the O/S and
384    add the result to our cache.
385
386    If the file was not found in the filesystem, or there was an error
387    opening it, then ERR_NO is nonzero and FD is -1.  If the file was
388    found, then ERR_NO is zero and FD could be -1 or an open file
389    descriptor.  FD can be -1 if the file was found in the cache and
390    had previously been closed.  To open it again pass the return value
391    to open_file().
392 */
393 _cpp_file *
394 _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool fake)
395 {
396   struct file_hash_entry *entry, **hash_slot;
397   _cpp_file *file;
398   bool invalid_pch = false;
399
400   /* Ensure we get no confusion between cached files and directories.  */
401   if (start_dir == NULL)
402     cpp_error (pfile, CPP_DL_ICE, "NULL directory in find_file");
403
404   hash_slot = (struct file_hash_entry **)
405     htab_find_slot_with_hash (pfile->file_hash, fname,
406                               htab_hash_string (fname),
407                               INSERT);
408
409   /* First check the cache before we resort to memory allocation.  */
410   entry = search_cache (*hash_slot, start_dir);
411   if (entry)
412     return entry->u.file;
413
414   file = make_cpp_file (pfile, start_dir, fname);
415
416   /* Try each path in the include chain.  */
417   for (; !fake ;)
418     {
419       if (file->dir == pfile->quote_include
420           || file->dir == pfile->bracket_include)
421         {
422           entry = search_cache (*hash_slot, file->dir);
423           if (entry)
424             {
425               /* Found the same file again.  Record it as reachable
426                  from this position, too.  */
427               free ((char *) file->name);
428               free (file);
429               file = entry->u.file;
430               goto found;
431             }
432         }
433
434       if (find_file_in_dir (pfile, file, &invalid_pch))
435         break;
436
437       file->dir = file->dir->next;
438       if (file->dir == NULL)
439         {
440           if (search_path_exhausted (pfile, fname, file))
441             return file;
442
443           open_file_failed (pfile, file);
444           if (invalid_pch)
445             {
446               cpp_error (pfile, CPP_DL_ERROR,
447                "one or more PCH files were found, but they were invalid");
448               if (!cpp_get_options (pfile)->warn_invalid_pch)
449                 cpp_error (pfile, CPP_DL_ERROR,
450                            "use -Winvalid-pch for more information");
451             }
452           break;
453         }
454     }
455
456   /* This is a new file; put it in the list.  */
457   file->next_file = pfile->all_files;
458   pfile->all_files = file;
459
460   /* If this file was found in the directory-of-the-current-file,
461      check whether that directory is reachable via one of the normal
462      search paths.  If so, we must record this entry as being
463      reachable that way, otherwise we will mistakenly reprocess this
464      file if it is included later from the normal search path.  */
465   if (file->dir && start_dir->next == pfile->quote_include)
466     {
467       cpp_dir *d;
468       cpp_dir *proper_start_dir = pfile->quote_include;
469
470       for (d = proper_start_dir;; d = d->next)
471         {
472           if (d == pfile->bracket_include)
473             proper_start_dir = d;
474           if (d == 0)
475             {
476               proper_start_dir = 0;
477               break;
478             }
479           /* file->dir->name will have a trailing slash.  */
480           if (!strncmp (d->name, file->dir->name, file->dir->len - 1))
481             break;
482         }
483       if (proper_start_dir)
484         start_dir = proper_start_dir;
485     }
486
487  found:
488   /* Store this new result in the hash table.  */
489   entry = new_file_hash_entry (pfile);
490   entry->next = *hash_slot;
491   entry->start_dir = start_dir;
492   entry->u.file = file;
493   *hash_slot = entry;
494
495   return file;
496 }
497
498 /* Read a file into FILE->buffer, returning true on success.
499
500    If FILE->fd is something weird, like a block device, we don't want
501    to read it at all.  Don't even try to figure out what something is,
502    except for plain files and block devices, since there is no
503    reliable portable way of doing this.
504
505    FIXME: Flush file cache and try again if we run out of memory.  */
506 static bool
507 read_file_guts (cpp_reader *pfile, _cpp_file *file)
508 {
509   ssize_t size, total, count;
510   uchar *buf;
511   bool regular;
512
513   if (S_ISBLK (file->st.st_mode))
514     {
515       cpp_error (pfile, CPP_DL_ERROR, "%s is a block device", file->path);
516       return false;
517     }
518
519   regular = S_ISREG (file->st.st_mode);
520   if (regular)
521     {
522       /* off_t might have a wider range than ssize_t - in other words,
523          the max size of a file might be bigger than the address
524          space.  We can't handle a file that large.  (Anyone with
525          a single source file bigger than 2GB needs to rethink
526          their coding style.)  Some systems (e.g. AIX 4.1) define
527          SSIZE_MAX to be much smaller than the actual range of the
528          type.  Use INTTYPE_MAXIMUM unconditionally to ensure this
529          does not bite us.  */
530       if (file->st.st_size > INTTYPE_MAXIMUM (ssize_t))
531         {
532           cpp_error (pfile, CPP_DL_ERROR, "%s is too large", file->path);
533           return false;
534         }
535
536       size = file->st.st_size;
537     }
538   else
539     /* 8 kilobytes is a sensible starting size.  It ought to be bigger
540        than the kernel pipe buffer, and it's definitely bigger than
541        the majority of C source files.  */
542     size = 8 * 1024;
543
544   buf = xmalloc (size + 1);
545   total = 0;
546   while ((count = read (file->fd, buf + total, size - total)) > 0)
547     {
548       total += count;
549
550       if (total == size)
551         {
552           if (regular)
553             break;
554           size *= 2;
555           buf = xrealloc (buf, size + 1);
556         }
557     }
558
559   if (count < 0)
560     {
561       cpp_errno (pfile, CPP_DL_ERROR, file->path);
562       return false;
563     }
564
565   if (regular && total != size && STAT_SIZE_RELIABLE (file->st))
566     cpp_error (pfile, CPP_DL_WARNING,
567                "%s is shorter than expected", file->path);
568
569   file->buffer = _cpp_convert_input (pfile, CPP_OPTION (pfile, input_charset),
570                                      buf, size, total, &file->st.st_size);
571   file->buffer_valid = true;
572
573   return true;
574 }
575
576 /* Convenience wrapper around read_file_guts that opens the file if
577    necessary and closes the file descriptor after reading.  FILE must
578    have been passed through find_file() at some stage.  */
579 static bool
580 read_file (cpp_reader *pfile, _cpp_file *file)
581 {
582   /* If we already have its contents in memory, succeed immediately.  */
583   if (file->buffer_valid)
584     return true;
585
586   /* If an earlier read failed for some reason don't try again.  */
587   if (file->dont_read || file->err_no)
588     return false;
589
590   if (file->fd == -1 && !open_file (file))
591     {
592       open_file_failed (pfile, file);
593       return false;
594     }
595
596   file->dont_read = !read_file_guts (pfile, file);
597   close (file->fd);
598   file->fd = -1;
599
600   return !file->dont_read;
601 }
602
603 /* Returns TRUE if FILE's contents have been successfully placed in
604    FILE->buffer and the file should be stacked, otherwise false.  */
605 static bool
606 should_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
607 {
608   _cpp_file *f;
609
610   /* Skip once-only files.  */
611   if (file->once_only)
612     return false;
613
614   /* We must mark the file once-only if #import now, before header
615      guard checks.  Otherwise, undefining the header guard might
616      cause the file to be re-stacked.  */
617   if (import)
618     {
619       _cpp_mark_file_once_only (pfile, file);
620
621       /* Don't stack files that have been stacked before.  */
622       if (file->stack_count)
623         return false;
624     }
625
626   /* Skip if the file had a header guard and the macro is defined.
627      PCH relies on this appearing before the PCH handler below.  */
628   if (file->cmacro && file->cmacro->type == NT_MACRO)
629     return false;
630
631   /* Handle PCH files immediately; don't stack them.  */
632   if (file->pch)
633     {
634       pfile->cb.read_pch (pfile, file->pchname, file->fd, file->path);
635       close (file->fd);
636       file->fd = -1;
637       return false;
638     }
639
640   if (!read_file (pfile, file))
641     return false;
642
643   /* Check the file against the PCH file.  This is done before
644      checking against files we've already seen, since it may save on
645      I/O.  */
646   if (check_file_against_entries (pfile, file, import))
647     {
648       /* If this isn't a #import, but yet we can't include the file,
649          that means that it was #import-ed in the PCH file,
650          so we can never include it again.  */
651       if (! import)
652         _cpp_mark_file_once_only (pfile, file);
653       return false;
654     }
655
656   /* Now we've read the file's contents, we can stack it if there
657      are no once-only files.  */
658   if (!pfile->seen_once_only)
659     return true;
660
661   /* We may have read the file under a different name.  Look
662      for likely candidates and compare file contents to be sure.  */
663   for (f = pfile->all_files; f; f = f->next_file)
664     {
665       if (f == file)
666         continue;
667
668       if ((import || f->once_only)
669           && f->err_no == 0
670           && f->st.st_mtime == file->st.st_mtime
671           && f->st.st_size == file->st.st_size)
672         {
673           _cpp_file *ref_file;
674           bool same_file_p = false;
675
676           if (f->buffer && !f->buffer_valid)
677             {
678               /* We already have a buffer but it is not valid, because
679                  the file is still stacked.  Make a new one.  */
680               ref_file = make_cpp_file (pfile, f->dir, f->name);
681               ref_file->path = f->path;
682             }
683           else
684             /* The file is not stacked anymore.  We can reuse it.  */
685             ref_file = f;
686
687           same_file_p = read_file (pfile, ref_file)
688                         /* Size might have changed in read_file().  */
689                         && ref_file->st.st_size == file->st.st_size
690                         && !memcmp (ref_file->buffer,
691                                     file->buffer,
692                                     file->st.st_size);
693
694           if (f->buffer && !f->buffer_valid)
695             {
696               ref_file->path = 0;
697               destroy_cpp_file (ref_file);
698             }
699
700           if (same_file_p)
701             break;
702         }
703     }
704
705   return f == NULL;
706 }
707
708 /* Place the file referenced by FILE into a new buffer on the buffer
709    stack if possible.  IMPORT is true if this stacking attempt is
710    because of a #import directive.  Returns true if a buffer is
711    stacked.  */
712 bool
713 _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, bool import)
714 {
715   cpp_buffer *buffer;
716   int sysp;
717
718   if (!should_stack_file (pfile, file, import))
719       return false;
720
721   if (pfile->buffer == NULL || file->dir == NULL)
722     sysp = 0;
723   else
724     sysp = MAX (pfile->buffer->sysp,  file->dir->sysp);
725
726   /* Add the file to the dependencies on its first inclusion.  */
727   if (CPP_OPTION (pfile, deps.style) > !!sysp && !file->stack_count)
728     {
729       if (!file->main_file || !CPP_OPTION (pfile, deps.ignore_main_file))
730         deps_add_dep (pfile->deps, file->path);
731     }
732
733   /* Clear buffer_valid since _cpp_clean_line messes it up.  */
734   file->buffer_valid = false;
735   file->stack_count++;
736
737   /* Stack the buffer.  */
738   buffer = cpp_push_buffer (pfile, file->buffer, file->st.st_size,
739                             CPP_OPTION (pfile, preprocessed));
740   buffer->file = file;
741   buffer->sysp = sysp;
742
743   /* Initialize controlling macro state.  */
744   pfile->mi_valid = true;
745   pfile->mi_cmacro = 0;
746
747   /* Generate the call back.  */
748   _cpp_do_file_change (pfile, LC_ENTER, file->path, 1, sysp);
749
750   return true;
751 }
752
753 /* Mark FILE to be included once only.  */
754 void
755 _cpp_mark_file_once_only (cpp_reader *pfile, _cpp_file *file)
756 {
757   pfile->seen_once_only = true;
758   file->once_only = true;
759 }
760
761 /* Return the directory from which searching for FNAME should start,
762    considering the directive TYPE and ANGLE_BRACKETS.  If there is
763    nothing left in the path, returns NULL.  */
764 static struct cpp_dir *
765 search_path_head (cpp_reader *pfile, const char *fname, int angle_brackets,
766                   enum include_type type)
767 {
768   cpp_dir *dir;
769   _cpp_file *file;
770
771   if (IS_ABSOLUTE_PATH (fname))
772     return &pfile->no_search_path;
773
774   /* pfile->buffer is NULL when processing an -include command-line flag.  */
775   file = pfile->buffer == NULL ? pfile->main_file : pfile->buffer->file;
776
777   /* For #include_next, skip in the search path past the dir in which
778      the current file was found, but if it was found via an absolute
779      path use the normal search logic.  */
780   if (type == IT_INCLUDE_NEXT && file->dir)
781     dir = file->dir->next;
782   else if (angle_brackets)
783     dir = pfile->bracket_include;
784   else if (type == IT_CMDLINE)
785     /* -include and -imacros use the #include "" chain with the
786        preprocessor's cwd prepended.  */
787     return make_cpp_dir (pfile, "./", false);
788   else if (pfile->quote_ignores_source_dir)
789     dir = pfile->quote_include;
790   else
791     return make_cpp_dir (pfile, dir_name_of_file (file),
792                          pfile->buffer ? pfile->buffer->sysp : 0);
793
794   if (dir == NULL)
795     cpp_error (pfile, CPP_DL_ERROR,
796                "no include path in which to search for %s", fname);
797
798   return dir;
799 }
800
801 /* Strip the basename from the file's path.  It ends with a slash if
802    of nonzero length.  Note that this procedure also works for
803    <stdin>, which is represented by the empty string.  */
804 static const char *
805 dir_name_of_file (_cpp_file *file)
806 {
807   if (!file->dir_name)
808     {
809       size_t len = lbasename (file->path) - file->path;
810       char *dir_name = xmalloc (len + 1);
811
812       memcpy (dir_name, file->path, len);
813       dir_name[len] = '\0';
814       file->dir_name = dir_name;
815     }
816
817   return file->dir_name;
818 }
819
820 /* Handles #include-family directives (distinguished by TYPE),
821    including HEADER, and the command line -imacros and -include.
822    Returns true if a buffer was stacked.  */
823 bool
824 _cpp_stack_include (cpp_reader *pfile, const char *fname, int angle_brackets,
825                     enum include_type type)
826 {
827   struct cpp_dir *dir;
828   _cpp_file *file;
829
830   dir = search_path_head (pfile, fname, angle_brackets, type);
831   if (!dir)
832     return false;
833
834   file = _cpp_find_file (pfile, fname, dir, false);
835
836   /* Compensate for the increment in linemap_add.  In the case of a
837      normal #include, we're currently at the start of the line
838      *following* the #include.  A separate source_location for this
839      location makes no sense (until we do the LC_LEAVE), and
840      complicates LAST_SOURCE_LINE_LOCATION.  This does not apply if we
841      found a PCH file (in which case linemap_add is not called) or we
842      were included from the command-line.  */
843   if (! file->pch && file->err_no == 0 && type != IT_CMDLINE)
844     pfile->line_table->highest_location--;
845
846   return _cpp_stack_file (pfile, file, type == IT_IMPORT);
847 }
848
849 /* Could not open FILE.  The complication is dependency output.  */
850 static void
851 open_file_failed (cpp_reader *pfile, _cpp_file *file)
852 {
853   int sysp = pfile->line_table->highest_line > 1 && pfile->buffer ? pfile->buffer->sysp : 0;
854   bool print_dep = CPP_OPTION (pfile, deps.style) > !!sysp;
855
856   errno = file->err_no;
857   if (print_dep && CPP_OPTION (pfile, deps.missing_files) && errno == ENOENT)
858     deps_add_dep (pfile->deps, file->name);
859   else
860     {
861       /* If we are outputting dependencies but not for this file then
862          don't error because we can still produce correct output.  */
863       if (CPP_OPTION (pfile, deps.style) && ! print_dep)
864         cpp_errno (pfile, CPP_DL_WARNING, file->path);
865       else
866         cpp_errno (pfile, CPP_DL_ERROR, file->path);
867     }
868 }
869
870 /* Search in the chain beginning at HEAD for a file whose search path
871    started at START_DIR != NULL.  */
872 static struct file_hash_entry *
873 search_cache (struct file_hash_entry *head, const cpp_dir *start_dir)
874 {
875   struct file_hash_entry *p;
876
877   /* Look for a file that was found from a search starting at the
878      given location.  */
879   for (p = head; p; p = p->next)
880     if (p->start_dir == start_dir)
881       return p;
882   return 0;
883 }
884
885 /* Allocate a new _cpp_file structure.  */
886 static _cpp_file *
887 make_cpp_file (cpp_reader *pfile, cpp_dir *dir, const char *fname)
888 {
889   _cpp_file *file;
890
891   file = xcalloc (1, sizeof (_cpp_file));
892   file->main_file = !pfile->buffer;
893   file->fd = -1;
894   file->dir = dir;
895   file->name = xstrdup (fname);
896
897   return file;
898 }
899
900 /* Release a _cpp_file structure.  */
901 static void
902 destroy_cpp_file (_cpp_file *file)
903 {
904   if (file->buffer)
905     free ((void *) file->buffer);
906   free ((void *) file->name);
907   free (file);
908 }
909
910 /* A hash of directory names.  The directory names are the path names
911    of files which contain a #include "", the included file name is
912    appended to this directories.
913
914    To avoid duplicate entries we follow the convention that all
915    non-empty directory names should end in a '/'.  DIR_NAME must be
916    stored in permanently allocated memory.  */
917 static cpp_dir *
918 make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
919 {
920   struct file_hash_entry *entry, **hash_slot;
921   cpp_dir *dir;
922
923   hash_slot = (struct file_hash_entry **)
924     htab_find_slot_with_hash (pfile->dir_hash, dir_name,
925                               htab_hash_string (dir_name),
926                               INSERT);
927
928   /* Have we already hashed this directory?  */
929   for (entry = *hash_slot; entry; entry = entry->next)
930     if (entry->start_dir == NULL)
931       return entry->u.dir;
932
933   dir = xcalloc (1, sizeof (cpp_dir));
934   dir->next = pfile->quote_include;
935   dir->name = (char *) dir_name;
936   dir->len = strlen (dir_name);
937   dir->sysp = sysp;
938   dir->construct = 0;
939
940   /* Store this new result in the hash table.  */
941   entry = new_file_hash_entry (pfile);
942   entry->next = *hash_slot;
943   entry->start_dir = NULL;
944   entry->u.dir = dir;
945   *hash_slot = entry;
946
947   return dir;
948 }
949
950 /* Create a new block of memory for file hash entries.  */
951 static void
952 allocate_file_hash_entries (cpp_reader *pfile)
953 {
954   pfile->file_hash_entries_used = 0;
955   pfile->file_hash_entries_allocated = 127;
956   pfile->file_hash_entries = xmalloc
957     (pfile->file_hash_entries_allocated * sizeof (struct file_hash_entry));
958 }
959
960 /* Return a new file hash entry.  */
961 static struct file_hash_entry *
962 new_file_hash_entry (cpp_reader *pfile)
963 {
964   if (pfile->file_hash_entries_used == pfile->file_hash_entries_allocated)
965     allocate_file_hash_entries (pfile);
966
967   return &pfile->file_hash_entries[pfile->file_hash_entries_used++];
968 }
969
970 /* Returns TRUE if a file FNAME has ever been successfully opened.
971    This routine is not intended to correctly handle filenames aliased
972    by links or redundant . or .. traversals etc.  */
973 bool
974 cpp_included (cpp_reader *pfile, const char *fname)
975 {
976   struct file_hash_entry *entry;
977
978   entry = htab_find_with_hash (pfile->file_hash, fname,
979                                htab_hash_string (fname));
980
981   while (entry && (entry->start_dir == NULL || entry->u.file->err_no))
982     entry = entry->next;
983
984   return entry != NULL;
985 }
986
987 /* Calculate the hash value of a file hash entry P.  */
988
989 static hashval_t
990 file_hash_hash (const void *p)
991 {
992   struct file_hash_entry *entry = (struct file_hash_entry *) p;
993   const char *hname;
994   if (entry->start_dir)
995     hname = entry->u.file->name;
996   else
997     hname = entry->u.dir->name;
998
999   return htab_hash_string (hname);
1000 }
1001
1002 /* Compare a string Q against a file hash entry P.  */
1003 static int
1004 file_hash_eq (const void *p, const void *q)
1005 {
1006   struct file_hash_entry *entry = (struct file_hash_entry *) p;
1007   const char *fname = (const char *) q;
1008   const char *hname;
1009
1010   if (entry->start_dir)
1011     hname = entry->u.file->name;
1012   else
1013     hname = entry->u.dir->name;
1014
1015   return strcmp (hname, fname) == 0;
1016 }
1017
1018 /* Initialize everything in this source file.  */
1019 void
1020 _cpp_init_files (cpp_reader *pfile)
1021 {
1022   pfile->file_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1023                                         NULL, xcalloc, free);
1024   pfile->dir_hash = htab_create_alloc (127, file_hash_hash, file_hash_eq,
1025                                         NULL, xcalloc, free);
1026   allocate_file_hash_entries (pfile);
1027 }
1028
1029 /* Finalize everything in this source file.  */
1030 void
1031 _cpp_cleanup_files (cpp_reader *pfile)
1032 {
1033   htab_delete (pfile->file_hash);
1034   htab_delete (pfile->dir_hash);
1035 }
1036
1037 /* Enter a file name in the hash for the sake of cpp_included.  */
1038 void
1039 _cpp_fake_include (cpp_reader *pfile, const char *fname)
1040 {
1041   _cpp_find_file (pfile, fname, pfile->buffer->file->dir, true);
1042 }
1043
1044 /* Not everyone who wants to set system-header-ness on a buffer can
1045    see the details of a buffer.  This is an exported interface because
1046    fix-header needs it.  */
1047 void
1048 cpp_make_system_header (cpp_reader *pfile, int syshdr, int externc)
1049 {
1050   int flags = 0;
1051   const struct line_maps *line_table = pfile->line_table;
1052   const struct line_map *map = &line_table->maps[line_table->used-1];
1053
1054   /* 1 = system header, 2 = system header to be treated as C.  */
1055   if (syshdr)
1056     flags = 1 + (externc != 0);
1057   pfile->buffer->sysp = flags;
1058   _cpp_do_file_change (pfile, LC_RENAME, map->to_file,
1059                        SOURCE_LINE (map, pfile->line_table->highest_line), flags);
1060 }
1061
1062 /* Allow the client to change the current file.  Used by the front end
1063    to achieve pseudo-file names like <built-in>.
1064    If REASON is LC_LEAVE, then NEW_NAME must be NULL.  */
1065 void
1066 cpp_change_file (cpp_reader *pfile, enum lc_reason reason,
1067                  const char *new_name)
1068 {
1069   _cpp_do_file_change (pfile, reason, new_name, 1, 0);
1070 }
1071
1072 /* Callback function for htab_traverse.  */
1073 static int
1074 report_missing_guard (void **slot, void *b)
1075 {
1076   struct file_hash_entry *entry = (struct file_hash_entry *) *slot;
1077   int *bannerp = (int *) b;
1078
1079   /* Skip directories.  */
1080   if (entry->start_dir != NULL)
1081     {
1082       _cpp_file *file = entry->u.file;
1083
1084       /* We don't want MI guard advice for the main file.  */
1085       if (file->cmacro == NULL && file->stack_count == 1 && !file->main_file)
1086         {
1087           if (*bannerp == 0)
1088             {
1089               fputs (_("Multiple include guards may be useful for:\n"),
1090                      stderr);
1091               *bannerp = 1;
1092             }
1093
1094           fputs (entry->u.file->path, stderr);
1095           putc ('\n', stderr);
1096         }
1097     }
1098
1099   return 0;
1100 }
1101
1102 /* Report on all files that might benefit from a multiple include guard.
1103    Triggered by -H.  */
1104 void
1105 _cpp_report_missing_guards (cpp_reader *pfile)
1106 {
1107   int banner = 0;
1108
1109   htab_traverse (pfile->file_hash, report_missing_guard, &banner);
1110 }
1111
1112 /* Locate HEADER, and determine whether it is newer than the current
1113    file.  If it cannot be located or dated, return -1, if it is
1114    newer, return 1, otherwise 0.  */
1115 int
1116 _cpp_compare_file_date (cpp_reader *pfile, const char *fname,
1117                         int angle_brackets)
1118 {
1119   _cpp_file *file;
1120   struct cpp_dir *dir;
1121
1122   dir = search_path_head (pfile, fname, angle_brackets, IT_INCLUDE);
1123   if (!dir)
1124     return -1;
1125
1126   file = _cpp_find_file (pfile, fname, dir, false);
1127   if (file->err_no)
1128     return -1;
1129
1130   if (file->fd != -1)
1131     {
1132       close (file->fd);
1133       file->fd = -1;
1134     }
1135
1136   return file->st.st_mtime > pfile->buffer->file->st.st_mtime;
1137 }
1138
1139 /* Pushes the given file onto the buffer stack.  Returns nonzero if
1140    successful.  */
1141 bool
1142 cpp_push_include (cpp_reader *pfile, const char *fname)
1143 {
1144   return _cpp_stack_include (pfile, fname, false, IT_CMDLINE);
1145 }
1146
1147 /* Do appropriate cleanup when a file INC's buffer is popped off the
1148    input stack.  */
1149 void
1150 _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
1151 {
1152   /* Record the inclusion-preventing macro, which could be NULL
1153      meaning no controlling macro.  */
1154   if (pfile->mi_valid && file->cmacro == NULL)
1155     file->cmacro = pfile->mi_cmacro;
1156
1157   /* Invalidate control macros in the #including file.  */
1158   pfile->mi_valid = false;
1159
1160   if (file->buffer)
1161     {
1162       free ((void *) file->buffer);
1163       file->buffer = NULL;
1164     }
1165 }
1166
1167 /* Set the include chain for "" to QUOTE, for <> to BRACKET.  If
1168    QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
1169    directory of the including file.
1170
1171    If BRACKET does not lie in the QUOTE chain, it is set to QUOTE.  */
1172 void
1173 cpp_set_include_chains (cpp_reader *pfile, cpp_dir *quote, cpp_dir *bracket,
1174                         int quote_ignores_source_dir)
1175 {
1176   pfile->quote_include = quote;
1177   pfile->bracket_include = quote;
1178   pfile->quote_ignores_source_dir = quote_ignores_source_dir;
1179
1180   for (; quote; quote = quote->next)
1181     {
1182       quote->name_map = NULL;
1183       quote->len = strlen (quote->name);
1184       if (quote == bracket)
1185         pfile->bracket_include = bracket;
1186     }
1187 }
1188
1189 /* Append the file name to the directory to create the path, but don't
1190    turn / into // or // into ///; // may be a namespace escape.  */
1191 static char *
1192 append_file_to_dir (const char *fname, cpp_dir *dir)
1193 {
1194   size_t dlen, flen;
1195   char *path;
1196
1197   dlen = dir->len;
1198   flen = strlen (fname);
1199   path = xmalloc (dlen + 1 + flen + 1);
1200   memcpy (path, dir->name, dlen);
1201   if (dlen && path[dlen - 1] != '/')
1202     path[dlen++] = '/';
1203   memcpy (&path[dlen], fname, flen + 1);
1204
1205   return path;
1206 }
1207
1208 /* Read a space delimited string of unlimited length from a stdio
1209    file F.  */
1210 static char *
1211 read_filename_string (int ch, FILE *f)
1212 {
1213   char *alloc, *set;
1214   int len;
1215
1216   len = 20;
1217   set = alloc = xmalloc (len + 1);
1218   if (! is_space (ch))
1219     {
1220       *set++ = ch;
1221       while ((ch = getc (f)) != EOF && ! is_space (ch))
1222         {
1223           if (set - alloc == len)
1224             {
1225               len *= 2;
1226               alloc = xrealloc (alloc, len + 1);
1227               set = alloc + len / 2;
1228             }
1229           *set++ = ch;
1230         }
1231     }
1232   *set = '\0';
1233   ungetc (ch, f);
1234   return alloc;
1235 }
1236
1237 /* Read the file name map file for DIR.  */
1238 static void
1239 read_name_map (cpp_dir *dir)
1240 {
1241   static const char FILE_NAME_MAP_FILE[] = "header.gcc";
1242   char *name;
1243   FILE *f;
1244   size_t len, count = 0, room = 9;
1245
1246   len = dir->len;
1247   name = alloca (len + sizeof (FILE_NAME_MAP_FILE) + 1);
1248   memcpy (name, dir->name, len);
1249   if (len && name[len - 1] != '/')
1250     name[len++] = '/';
1251   strcpy (name + len, FILE_NAME_MAP_FILE);
1252   f = fopen (name, "r");
1253
1254   dir->name_map = xmalloc (room * sizeof (char *));
1255
1256   /* Silently return NULL if we cannot open.  */
1257   if (f)
1258     {
1259       int ch;
1260
1261       while ((ch = getc (f)) != EOF)
1262         {
1263           char *to;
1264
1265           if (is_space (ch))
1266             continue;
1267
1268           if (count + 2 > room)
1269             {
1270               room += 8;
1271               dir->name_map = xrealloc (dir->name_map, room * sizeof (char *));
1272             }
1273
1274           dir->name_map[count] = read_filename_string (ch, f);
1275           while ((ch = getc (f)) != EOF && is_hspace (ch))
1276             ;
1277
1278           to = read_filename_string (ch, f);
1279           if (IS_ABSOLUTE_PATH (to))
1280             dir->name_map[count + 1] = to;
1281           else
1282             {
1283               dir->name_map[count + 1] = append_file_to_dir (to, dir);
1284               free (to);
1285             }
1286
1287           count += 2;
1288           while ((ch = getc (f)) != '\n')
1289             if (ch == EOF)
1290               break;
1291         }
1292
1293       fclose (f);
1294     }
1295
1296   /* Terminate the list of maps.  */
1297   dir->name_map[count] = NULL;
1298 }
1299
1300 /* Remap a FILE's name based on the file_name_map, if any, for
1301    FILE->dir.  If the file name has any directory separators,
1302    recursively check those directories too.  */
1303 static char *
1304 remap_filename (cpp_reader *pfile, _cpp_file *file)
1305 {
1306   const char *fname, *p;
1307   char *new_dir;
1308   cpp_dir *dir;
1309   size_t index, len;
1310
1311   dir = file->dir;
1312   fname = file->name;
1313
1314   for (;;)
1315     {
1316       if (!dir->name_map)
1317         read_name_map (dir);
1318
1319       for (index = 0; dir->name_map[index]; index += 2)
1320         if (!strcmp (dir->name_map[index], fname))
1321             return xstrdup (dir->name_map[index + 1]);
1322
1323       p = strchr (fname, '/');
1324       if (!p || p == fname)
1325         return NULL;
1326
1327       len = dir->len + (p - fname + 1);
1328       new_dir = xmalloc (len + 1);
1329       memcpy (new_dir, dir->name, dir->len);
1330       memcpy (new_dir + dir->len, fname, p - fname + 1);
1331       new_dir[len] = '\0';
1332
1333       dir = make_cpp_dir (pfile, new_dir, dir->sysp);
1334       fname = p + 1;
1335     }
1336 }
1337
1338 /* Returns true if PCHNAME is a valid PCH file for FILE.  */
1339 static bool
1340 validate_pch (cpp_reader *pfile, _cpp_file *file, const char *pchname)
1341 {
1342   const char *saved_path = file->path;
1343   bool valid = false;
1344
1345   file->path = pchname;
1346   if (open_file (file))
1347     {
1348       valid = 1 & pfile->cb.valid_pch (pfile, pchname, file->fd);
1349
1350       if (!valid)
1351         {
1352           close (file->fd);
1353           file->fd = -1;
1354         }
1355
1356       if (CPP_OPTION (pfile, print_include_names))
1357         {
1358           unsigned int i;
1359           for (i = 1; i < pfile->line_table->depth; i++)
1360             putc ('.', stderr);
1361           fprintf (stderr, "%c %s\n",
1362                    valid ? '!' : 'x', pchname);
1363         }
1364     }
1365
1366   file->path = saved_path;
1367   return valid;
1368 }
1369
1370 /* Get the path associated with the _cpp_file F.  The path includes
1371    the base name from the include directive and the directory it was
1372    found in via the search path.  */
1373
1374 const char *
1375 cpp_get_path (struct _cpp_file *f)
1376 {
1377   return f->path;
1378 }
1379
1380 /* Get the directory associated with the _cpp_file F.  */
1381
1382 cpp_dir *
1383 cpp_get_dir (struct _cpp_file *f)
1384 {
1385   return f->dir;
1386 }
1387
1388 /* Get the cpp_buffer currently associated with the cpp_reader
1389    PFILE.  */
1390
1391 cpp_buffer *
1392 cpp_get_buffer (cpp_reader *pfile)
1393 {
1394   return pfile->buffer;
1395 }
1396
1397 /* Get the _cpp_file associated with the cpp_buffer B.  */
1398
1399 _cpp_file *
1400 cpp_get_file (cpp_buffer *b)
1401 {
1402   return b->file;
1403 }
1404
1405 /* Get the previous cpp_buffer given a cpp_buffer B.  The previous
1406    buffer is the buffer that included the given buffer.  */
1407
1408 cpp_buffer *
1409 cpp_get_prev (cpp_buffer *b)
1410 {
1411   return b->prev;
1412 }
1413 \f
1414 /* This data structure holds the list of header files that were seen
1415    while the PCH was being built.  The 'entries' field is kept sorted
1416    in memcmp() order; yes, this means that on little-endian systems,
1417    it's sorted initially by the least-significant byte of 'size', but
1418    that's OK.  The code does rely on having entries with the same size
1419    next to each other.  */
1420
1421 struct pchf_data {
1422   /* Number of pchf_entry structures.  */
1423   size_t count;
1424
1425   /* Are there any values with once_only set?
1426      This is used as an optimisation, it means we don't have to search
1427      the structure if we're processing a regular #include.  */
1428   bool have_once_only;
1429
1430   struct pchf_entry {
1431     /* The size of this file.  This is used to save running a MD5 checksum
1432        if the sizes don't match.  */
1433     off_t size;
1434     /* The MD5 checksum of this file.  */
1435     unsigned char sum[16];
1436     /* Is this file to be included only once?  */
1437     bool once_only;
1438   } entries[1];
1439 };
1440
1441 static struct pchf_data *pchf;
1442
1443 /* Data for pchf_addr.  */
1444 struct pchf_adder_info
1445 {
1446   cpp_reader *pfile;
1447   struct pchf_data *d;
1448 };
1449
1450 /* A hash traversal function to add entries into DATA->D.  */
1451
1452 static int
1453 pchf_adder (void **slot, void *data)
1454 {
1455   struct file_hash_entry *h = (struct file_hash_entry *) *slot;
1456   struct pchf_adder_info *i = (struct pchf_adder_info *) data;
1457
1458   if (h->start_dir != NULL && h->u.file->stack_count != 0)
1459     {
1460       struct pchf_data *d = i->d;
1461       _cpp_file *f = h->u.file;
1462       size_t count = d->count++;
1463
1464       /* This should probably never happen, since if a read error occurred
1465          the PCH file shouldn't be written...  */
1466       if (f->dont_read || f->err_no)
1467         return 1;
1468
1469       d->entries[count].once_only = f->once_only;
1470       /* |= is avoided in the next line because of an HP C compiler bug */
1471       d->have_once_only = d->have_once_only | f->once_only; 
1472       if (f->buffer_valid)
1473           md5_buffer ((const char *)f->buffer,
1474                       f->st.st_size, d->entries[count].sum);
1475       else
1476         {
1477           FILE *ff;
1478           int oldfd = f->fd;
1479
1480           if (!open_file (f))
1481             {
1482               open_file_failed (i->pfile, f);
1483               return 0;
1484             }
1485           ff = fdopen (f->fd, "rb");
1486           md5_stream (ff, d->entries[count].sum);
1487           fclose (ff);
1488           f->fd = oldfd;
1489         }
1490       d->entries[count].size = f->st.st_size;
1491     }
1492   return 1;
1493 }
1494
1495 /* A qsort ordering function for pchf_entry structures.  */
1496
1497 static int
1498 pchf_save_compare (const void *e1, const void *e2)
1499 {
1500   return memcmp (e1, e2, sizeof (struct pchf_entry));
1501 }
1502
1503 /* Create and write to F a pchf_data structure.  */
1504
1505 bool
1506 _cpp_save_file_entries (cpp_reader *pfile, FILE *f)
1507 {
1508   size_t count = 0;
1509   struct pchf_data *result;
1510   size_t result_size;
1511   struct pchf_adder_info pai;
1512
1513   count = htab_elements (pfile->file_hash);
1514   result_size = (sizeof (struct pchf_data)
1515                  + sizeof (struct pchf_entry) * (count - 1));
1516   result = xcalloc (result_size, 1);
1517
1518   result->count = 0;
1519   result->have_once_only = false;
1520
1521   pai.pfile = pfile;
1522   pai.d = result;
1523   htab_traverse (pfile->file_hash, pchf_adder, &pai);
1524
1525   result_size = (sizeof (struct pchf_data)
1526                  + sizeof (struct pchf_entry) * (result->count - 1));
1527
1528   qsort (result->entries, result->count, sizeof (struct pchf_entry),
1529          pchf_save_compare);
1530
1531   return fwrite (result, result_size, 1, f) == 1;
1532 }
1533
1534 /* Read the pchf_data structure from F.  */
1535
1536 bool
1537 _cpp_read_file_entries (cpp_reader *pfile ATTRIBUTE_UNUSED, FILE *f)
1538 {
1539   struct pchf_data d;
1540
1541   if (fread (&d, sizeof (struct pchf_data) - sizeof (struct pchf_entry), 1, f)
1542        != 1)
1543     return false;
1544
1545   pchf = xmalloc (sizeof (struct pchf_data)
1546                   + sizeof (struct pchf_entry) * (d.count - 1));
1547   memcpy (pchf, &d, sizeof (struct pchf_data) - sizeof (struct pchf_entry));
1548   if (fread (pchf->entries, sizeof (struct pchf_entry), d.count, f)
1549       != d.count)
1550     return false;
1551   return true;
1552 }
1553
1554 /* The parameters for pchf_compare.  */
1555
1556 struct pchf_compare_data
1557 {
1558   /* The size of the file we're looking for.  */
1559   off_t size;
1560
1561   /* The MD5 checksum of the file, if it's been computed.  */
1562   unsigned char sum[16];
1563
1564   /* Is SUM valid?  */
1565   bool sum_computed;
1566
1567   /* Do we need to worry about entries that don't have ONCE_ONLY set?  */
1568   bool check_included;
1569
1570   /* The file that we're searching for.  */
1571   _cpp_file *f;
1572 };
1573
1574 /* bsearch comparison function; look for D_P in E_P.  */
1575
1576 static int
1577 pchf_compare (const void *d_p, const void *e_p)
1578 {
1579   const struct pchf_entry *e = (const struct pchf_entry *)e_p;
1580   struct pchf_compare_data *d = (struct pchf_compare_data *)d_p;
1581   int result;
1582
1583   result = memcmp (&d->size, &e->size, sizeof (off_t));
1584   if (result != 0)
1585     return result;
1586
1587   if (! d->sum_computed)
1588     {
1589       _cpp_file *const f = d->f;
1590
1591       md5_buffer ((const char *)f->buffer, f->st.st_size, d->sum);
1592       d->sum_computed = true;
1593     }
1594
1595   result = memcmp (d->sum, e->sum, 16);
1596   if (result != 0)
1597     return result;
1598
1599   if (d->check_included || e->once_only)
1600     return 0;
1601   else
1602     return 1;
1603 }
1604
1605 /* Check that F is not in a list read from a PCH file (if any).
1606    Assumes that f->buffer_valid is true.  Return TRUE if the file
1607    should not be read.  */
1608
1609 static bool
1610 check_file_against_entries (cpp_reader *pfile ATTRIBUTE_UNUSED,
1611                             _cpp_file *f,
1612                             bool check_included)
1613 {
1614   struct pchf_compare_data d;
1615
1616   if (pchf == NULL
1617       || (! check_included && ! pchf->have_once_only))
1618     return false;
1619
1620   d.size = f->st.st_size;
1621   d.sum_computed = false;
1622   d.f = f;
1623   d.check_included = check_included;
1624   return bsearch (&d, pchf->entries, pchf->count, sizeof (struct pchf_entry),
1625                   pchf_compare) != NULL;
1626 }