diff options
author | Nathan Sidwell <nathan@codesourcery.com> | 2000-06-30 09:47:49 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2000-06-30 09:47:49 +0000 |
commit | f3f751adcb318b6f5183f94686dc108715981e6a (patch) | |
tree | 4970a3469f1e57aa1f8e1516bdd8be5ca7391d38 /gcc/cppfiles.c | |
parent | 34f9943ef73797e5db1039d888785b0bc5f220e0 (diff) | |
download | gcc-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.c | 57 |
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 |