aboutsummaryrefslogtreecommitdiff
path: root/gcc/cppfiles.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@codesourcery.com>2000-06-30 09:47:49 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2000-06-30 09:47:49 +0000
commitf3f751adcb318b6f5183f94686dc108715981e6a (patch)
tree4970a3469f1e57aa1f8e1516bdd8be5ca7391d38 /gcc/cppfiles.c
parent34f9943ef73797e5db1039d888785b0bc5f220e0 (diff)
downloadgcc-f3f751adcb318b6f5183f94686dc108715981e6a.zip
gcc-f3f751adcb318b6f5183f94686dc108715981e6a.tar.gz
gcc-f3f751adcb318b6f5183f94686dc108715981e6a.tar.bz2
cpp.texi: Document #pragma GCC dependency
* cpp.texi: Document #pragma GCC dependency * cppfiles.c (open_include_file): Set date to unknown. (_cpp_compare_file_date): New function. (read_include_file): Set file date. * cpphash.h (struct include_file): Add date member. (_cpp_compare_file_date): Prototype. * cpplib.c (parse_include): Add trail parameter. Adjust. (do_include): Adjust parse_include call. (do_import): Likewise. (do_include_next): Likewise. (gcc_pragmas): Add dependency pragma. (do_pragma_dependancy): New pragma. From-SVN: r34808
Diffstat (limited to 'gcc/cppfiles.c')
-rw-r--r--gcc/cppfiles.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/cppfiles.c b/gcc/cppfiles.c
index 35d1aa6..4e14aae 100644
--- a/gcc/cppfiles.c
+++ b/gcc/cppfiles.c
@@ -227,6 +227,7 @@ open_include_file (pfile, filename)
}
file->fd = fd;
+ file->date = (time_t) -1;
return file;
}
@@ -465,6 +466,60 @@ _cpp_execute_include (pfile, f, len, no_reinclude, search_start)
cpp_error_from_errno (pfile, fname);
}
+/* Locate file F, and determine whether it is newer than PFILE. Return -1,
+ if F cannot be located or dated, 1, if it is newer and 0 if older. */
+
+int
+_cpp_compare_file_date (pfile, f, len, search_start)
+ cpp_reader *pfile;
+ U_CHAR *f;
+ unsigned int len;
+ struct file_name_list *search_start;
+{
+ char *fname = (char *)f;
+ int angle_brackets = fname[0] == '<';
+ struct include_file *inc;
+ struct include_file *current_include = cpp_file_buffer (pfile)->inc;
+
+ if (!search_start)
+ {
+ if (angle_brackets)
+ search_start = CPP_OPTION (pfile, bracket_include);
+ else if (CPP_OPTION (pfile, ignore_srcdir))
+ search_start = CPP_OPTION (pfile, quote_include);
+ else
+ search_start = CPP_BUFFER (pfile)->actual_dir;
+ }
+
+ /* Remove quote marks. */
+ fname++;
+ len -= 2;
+ fname[len] = '\0';
+
+ inc = find_include_file (pfile, fname, search_start);
+
+ if (!inc)
+ return -1;
+ if (inc->fd >= 0)
+ {
+ struct stat source;
+
+ if (fstat (inc->fd, &source) < 0)
+ {
+ close (inc->fd);
+ inc->fd = -1;
+ return -1;
+ }
+ inc->date = source.st_mtime;
+ close (inc->fd);
+ inc->fd = -1;
+ }
+ if (inc->date == (time_t)-1 || current_include->date == (time_t)-1)
+ return -1;
+ return inc->date > current_include->date;
+}
+
+
/* Push an input buffer and load it up with the contents of FNAME.
If FNAME is "" or NULL, read standard input. */
int
@@ -502,6 +557,8 @@ read_include_file (pfile, inc)
if (fstat (fd, &st) < 0)
goto perror_fail;
+
+ inc->date = st.st_mtime;
/* If fd points to a plain file, we might be able to mmap it; we can
definitely allocate the buffer all at once. If fd is a pipe or