Commit 3ed8294e by Richard Stallman

*** empty log message ***

From-SVN: r574
parent 36d747f6
...@@ -201,6 +201,7 @@ static void pfatal_with_name (); ...@@ -201,6 +201,7 @@ static void pfatal_with_name ();
static void perror_with_name (); static void perror_with_name ();
static void print_containing_files (); static void print_containing_files ();
static int lookup_import (); static int lookup_import ();
static int lookup_include ();
static int check_preconditions (); static int check_preconditions ();
static void pcfinclude (); static void pcfinclude ();
static void pcstring_used (); static void pcstring_used ();
...@@ -3730,25 +3731,13 @@ get_filename: ...@@ -3730,25 +3731,13 @@ get_filename:
fname = (char *) xmalloc (max_include_len + flen + 2); fname = (char *) xmalloc (max_include_len + flen + 2);
/* + 2 above for slash and terminating null. */ /* + 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 specified file name is absolute, just open it. */
if (*fbeg == '/') { if (*fbeg == '/') {
strncpy (fname, fbeg, flen); strncpy (fname, fbeg, flen);
fname[flen] = 0; fname[flen] = 0;
if (lookup_include (fname))
return 0;
if (importing) if (importing)
f = lookup_import (fname); f = lookup_import (fname);
else else
...@@ -3791,6 +3780,10 @@ get_filename: ...@@ -3791,6 +3780,10 @@ get_filename:
f = open (fname, O_RDONLY, 0666); f = open (fname, O_RDONLY, 0666);
if (f == -2) if (f == -2)
return 0; /* Already included this file */ return 0; /* Already included this file */
if (lookup_include (fname)) {
close (f);
return 0;
}
if (f >= 0) if (f >= 0)
break; break;
} }
...@@ -3921,6 +3914,23 @@ get_filename: ...@@ -3921,6 +3914,23 @@ get_filename:
return 0; 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, /* Process the contents of include file FNAME, already open on descriptor F,
with output to OP. with output to OP.
SYSTEM_HEADER_P is 1 if this file was specified using <...>. SYSTEM_HEADER_P is 1 if this file was specified using <...>.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment