diff options
author | Richard Stallman <rms@gnu.org> | 1992-03-23 03:45:33 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-03-23 03:45:33 +0000 |
commit | 3ed8294e3200bbc003211f9b7eeb64a9c407a626 (patch) | |
tree | d971a969518fd5cd9a630a59db3007657ad1d268 /gcc | |
parent | 36d747f619192d604ccb56d9dbf34bc31719cc50 (diff) | |
download | gcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.zip gcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.tar.gz gcc-3ed8294e3200bbc003211f9b7eeb64a9c407a626.tar.bz2 |
*** empty log message ***
From-SVN: r574
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cccp.c | 38 |
1 files changed, 24 insertions, 14 deletions
@@ -201,6 +201,7 @@ static void pfatal_with_name (); static void perror_with_name (); static void print_containing_files (); static int lookup_import (); +static int lookup_include (); static int check_preconditions (); static void pcfinclude (); static void pcstring_used (); @@ -3730,25 +3731,13 @@ get_filename: fname = (char *) xmalloc (max_include_len + flen + 2); /* + 2 above for slash and terminating null. */ - /* See if we already included this file and we can tell in advance - (from a #ifndef around its contents last time) - that there is no need to include it again. */ - { - struct file_name_list *l = all_include_files; - strncpy (fname, fbeg, flen); - fname[flen] = 0; - for (; l; l = l->next) - if (! strcmp (fname, l->fname) - && l->control_macro - && lookup (l->control_macro, -1, -1)) - return 0; - } - /* If specified file name is absolute, just open it. */ if (*fbeg == '/') { strncpy (fname, fbeg, flen); fname[flen] = 0; + if (lookup_include (fname)) + return 0; if (importing) f = lookup_import (fname); else @@ -3791,6 +3780,10 @@ get_filename: f = open (fname, O_RDONLY, 0666); if (f == -2) return 0; /* Already included this file */ + if (lookup_include (fname)) { + close (f); + return 0; + } if (f >= 0) break; } @@ -3921,6 +3914,23 @@ get_filename: return 0; } +/* Return nonzero if there is no need to include file NAME + because it has already been included and it contains a conditional + to make a repeated include do nothing. */ + +static int +lookup_include (name) + char *name; +{ + struct file_name_list *l = all_include_files; + for (; l; l = l->next) + if (! strcmp (name, l->fname) + && l->control_macro + && lookup (l->control_macro, -1, -1)) + return 1; + return 0; +} + /* Process the contents of include file FNAME, already open on descriptor F, with output to OP. SYSTEM_HEADER_P is 1 if this file was specified using <...>. |