This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

yesterday's bag of cpplib updates


This was meant to be a simple patch cleaning up the logic in
cpp_start_read, and it was meant to go out yesterday.  Unfortunately,
a whole pile of interdependent bug reports came in while I was
testing, so it was delayed and is now a grab bag.

Someone filed a bug report awhile back saying that files included with
-include and/or -imacros shouldn't be named in the output of -M.  This
is what the code was intended to do, but nothing looked at the
relevant flag.  I've changed it, but I'm not at all convinced that
this is the proper behavior.  Note that cpp from 2.95 lists them, and
files included _by_ files named with -include/-imacros will still show
up.

zw

	* cppfiles.c (cpp_read_file): New function.

	* cpphash.c (collect_expansion): Make sure to reset last_token
	to NORM when we hit a string.  Handle trailing whitespace
	properly when the expansion is empty.
	(create_definition): Disable line commands while parsing the
	directive line.
	(dump_definition): If pfile->lineno == 0, output a line
	command ahead of the dump, and add a trailing newline.

	* cppinit.c (append_include_chain): Add fifth argument, which
	indicates whether or not system headers are C++ aware.
	(initialize_standard_includes): New function,
	broken out of read_and_prescan.  Pass 'cxx_aware' value from
	the include_defaults_array on to append_include_chain.
	(dump_special_to_buffer): Const-ify char array.
	(builtin_array): Don't dump __BASE_FILE__.
	(cpp_start_read): Use cpp_read_file.  Reorder code for
	clarity.  Don't output line commands here for -D/-A/-U
	switches.  Don't call deps_output for files included with
	-include or -imacros.

	* cpplib.c (do_define): Don't pay any attention to the second
	argument.
	(cpp_expand_to_buffer): Disable line commands while scanning.
	(output_line_command): Work in the file buffer.
	* cpplib.h: Remove no_record_file flag from struct cpp_reader.
	Fix formatting of comments.  Prototype cpp_read_file.


===================================================================
Index: cppfiles.c
--- cppfiles.c	2000/02/26 05:59:30	1.38
+++ cppfiles.c	2000/03/02 19:59:49
@@ -609,6 +609,62 @@ remap_filename (pfile, name, loc)
   return name;
 }
 
+/* Push an input buffer and load it up with the contents of FNAME.
+   If FNAME is "" or NULL, read standard input.  */
+int
+cpp_read_file (pfile, fname)
+     cpp_reader *pfile;
+     const char *fname;
+{
+  struct include_hash *ih_fake;
+  int f;
+
+  if (fname == NULL || *fname == 0)
+    {
+      fname = "";
+      f = 0;
+    }
+
+  /* Open the file in nonblocking mode, so we don't get stuck if
+     someone clever has asked cpp to process /dev/rmt0.  finclude()
+     will check that we have a real file to work with.  Also take
+     care not to acquire a controlling terminal by mistake (this can't
+     happen on sane systems, but paranoia is a virtue).  */
+  else if ((f = open (fname, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666)) < 0)
+    {
+      cpp_notice_from_errno (pfile, fname);
+      return 0;
+    }
+
+  /* Push the buffer.  */
+  if (!cpp_push_buffer (pfile, NULL, 0))
+    goto failed_push;
+  
+  /* Gin up an include_hash structure for this file and feed it
+     to finclude.  */
+
+  ih_fake = (struct include_hash *) xmalloc (sizeof (struct include_hash));
+  ih_fake->next = 0;
+  ih_fake->next_this_file = 0;
+  ih_fake->foundhere = ABSOLUTE_PATH;  /* well sort of ... */
+  ih_fake->name = fname;
+  ih_fake->control_macro = 0;
+  ih_fake->buf = (char *)-1;
+  ih_fake->limit = 0;
+  if (!finclude (pfile, f, ih_fake))
+    goto failed_finclude;
+
+  return 1;
+
+ failed_finclude:
+  /* If finclude fails, it pops the buffer.  */
+  free (ih_fake);
+ failed_push:
+  if (f)
+    close (f);
+  return 0;
+}
+
 /* Read the contents of FD into the buffer on the top of PFILE's stack.
    IHASH points to the include hash entry for the file associated with
    FD.
===================================================================
Index: cpphash.c
--- cpphash.c	2000/03/01 19:12:17	1.43
+++ cpphash.c	2000/03/02 19:59:49
@@ -424,6 +424,7 @@ collect_expansion (pfile, arglist)
       continue;
 
     maybe_trad_stringify:
+      last_token = NORM;
       {
 	U_CHAR *base, *p, *limit;
 	struct reflist *tpat;
@@ -487,21 +488,31 @@ collect_expansion (pfile, arglist)
   else if (last_token == PASTE)
     cpp_error (pfile, "`##' at end of macro definition");
 
-  /* Trim trailing white space from definition.  */
-  here = CPP_WRITTEN (pfile);
-  while (here > last && is_hspace (pfile->token_buffer [here-1]))
-    here--;
-  CPP_SET_WRITTEN (pfile, here);
+  if (last_token == START)
+    {
+      /* Empty macro definition.  */
+      exp = xstrdup ("\r \r ");
+      len = 1;
+    }
+  else
+    {
+      /* Trim trailing white space from definition.  */
+      here = CPP_WRITTEN (pfile);
+      while (here > last && is_hspace (pfile->token_buffer [here-1]))
+	here--;
+      CPP_SET_WRITTEN (pfile, here);
   
-  CPP_NUL_TERMINATE (pfile);
-  len = CPP_WRITTEN (pfile) - start + 1;
-  exp = xmalloc (len + 4); /* space for no-concat markers at either end */
-  exp[0] = '\r';
-  exp[1] = ' ';
-  exp[len + 1] = '\r';
-  exp[len + 2] = ' ';
-  exp[len + 3] = '\0';
-  memcpy (&exp[2], pfile->token_buffer + start, len - 1);
+      CPP_NUL_TERMINATE (pfile);
+      len = CPP_WRITTEN (pfile) - start + 1;
+      exp = xmalloc (len + 4); /* space for no-concat markers at either end */
+      exp[0] = '\r';
+      exp[1] = ' ';
+      exp[len + 1] = '\r';
+      exp[len + 2] = ' ';
+      exp[len + 3] = '\0';
+      memcpy (&exp[2], pfile->token_buffer + start, len - 1);
+    }
+
   CPP_SET_WRITTEN (pfile, start);
 
   defn = (DEFINITION *) xmalloc (sizeof (DEFINITION));
@@ -700,6 +711,7 @@ create_definition (pfile, funlike)
   pfile->no_macro_expand++;
   pfile->parsing_define_directive++;
   CPP_OPTIONS (pfile)->discard_comments++;
+  CPP_OPTIONS (pfile)->no_line_commands++;
   
   if (funlike)
     {
@@ -719,12 +731,14 @@ create_definition (pfile, funlike)
   pfile->no_macro_expand--;
   pfile->parsing_define_directive--;
   CPP_OPTIONS (pfile)->discard_comments--;
+  CPP_OPTIONS (pfile)->no_line_commands--;
   return defn;
 
  err:
   pfile->no_macro_expand--;
   pfile->parsing_define_directive--;
   CPP_OPTIONS (pfile)->discard_comments--;
+  CPP_OPTIONS (pfile)->no_line_commands--;
   return 0;
 }
 
@@ -1560,6 +1574,9 @@ dump_definition (pfile, sym, len, defn)
      long len;
      DEFINITION *defn;
 {
+  if (pfile->lineno == 0)
+    output_line_command (pfile, same_file);
+
   CPP_RESERVE (pfile, len + sizeof "#define ");
   CPP_PUTS_Q (pfile, "#define ", sizeof "#define " -1);
   CPP_PUTS_Q (pfile, sym, len);
@@ -1573,7 +1590,6 @@ dump_definition (pfile, sym, len, defn)
 	 So we need length-4 chars of space, plus one for the NUL.  */
       CPP_RESERVE (pfile, defn->length - 4 + 1);
       CPP_PUTS_Q (pfile, defn->expansion + 2, defn->length - 4);
-      CPP_NUL_TERMINATE_Q (pfile);
     }
   else
     {
@@ -1644,6 +1660,9 @@ dump_definition (pfile, sym, len, defn)
       i = defn->length - (x - defn->expansion) - 2;
       if (*x == '\r') x += 2, i -= 2;
       if (i > 0) CPP_PUTS (pfile, x, i);
-      CPP_NUL_TERMINATE (pfile);
     }
+
+  if (pfile->lineno == 0)
+    CPP_PUTC (pfile, '\n');
+  CPP_NUL_TERMINATE (pfile);
 }
===================================================================
Index: cppinit.c
--- cppinit.c	2000/03/01 00:57:09	1.45
+++ cppinit.c	2000/03/02 19:59:50
@@ -111,7 +111,7 @@ static struct default_include
   int cplusplus;		/* Only look here if we're compiling C++.  */
   int cxx_aware;		/* Includes in this directory don't need to
 				   be wrapped in extern "C" when compiling
-				   C++.  This is not used anymore.  */
+				   C++.  */
 }
 include_defaults_array[]
 #ifdef INCLUDE_DEFAULTS
@@ -193,14 +193,15 @@ static void path_include		PARAMS ((cpp_r
 static void initialize_builtins		PARAMS ((cpp_reader *));
 static void append_include_chain	PARAMS ((cpp_reader *,
 						 struct cpp_pending *,
-						 char *, int));
+						 char *, int, int));
 static char *base_name			PARAMS ((const char *));
 static void dump_special_to_buffer	PARAMS ((cpp_reader *, const char *));
 static void initialize_dependency_output PARAMS ((cpp_reader *));
+static void initialize_standard_includes PARAMS ((cpp_reader *));
 static void new_pending_define		PARAMS ((struct cpp_options *,
 						 const char *));
 
-/* Last argument to append_include_chain: chain to use */
+/* Fourth argument to append_include_chain: chain to use */
 enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
 
 /* If gcc is in use (stage2/stage3) we can make this table initialized data. */
@@ -289,7 +290,7 @@ path_include (pfile, pend, list, path)
 	  name[q - p] = 0;
 	}
 
-      append_include_chain (pfile, pend, name, path);
+      append_include_chain (pfile, pend, name, path, 0);
 
       /* Advance past this name.  */
       if (*q == 0)
@@ -325,11 +326,12 @@ base_name (fname)
 /* Append DIR to include path PATH.  DIR must be permanently allocated
    and writable. */
 static void
-append_include_chain (pfile, pend, dir, path)
+append_include_chain (pfile, pend, dir, path, cxx_aware)
      cpp_reader *pfile;
      struct cpp_pending *pend;
      char *dir;
      int path;
+     int cxx_aware;
 {
   struct file_name_list *new;
   struct stat st;
@@ -361,7 +363,10 @@ append_include_chain (pfile, pend, dir, 
   new->nlen = len;
   new->ino  = st.st_ino;
   new->dev  = st.st_dev;
-  new->sysp = (path == SYSTEM);
+  if (path == SYSTEM)
+    new->sysp = cxx_aware ? 1 : 2;
+  else
+    new->sysp = 0;
   new->name_map = NULL;
   new->next = NULL;
   new->alloc = NULL;
@@ -384,7 +389,7 @@ dump_special_to_buffer (pfile, macro_nam
      cpp_reader *pfile;
      const char *macro_name;
 {
-  static char define_directive[] = "#define ";
+  static const char define_directive[] = "#define ";
   int macro_name_length = strlen (macro_name);
   output_line_command (pfile, same_file);
   CPP_RESERVE (pfile, sizeof(define_directive) + macro_name_length);
@@ -513,7 +518,7 @@ static const struct builtin builtin_arra
   { "__TIME__",			0, T_TIME,		DUMP },
   { "__DATE__",			0, T_DATE,		DUMP },
   { "__FILE__",			0, T_FILE,		0    },
-  { "__BASE_FILE__",		0, T_BASE_FILE,		DUMP },
+  { "__BASE_FILE__",		0, T_BASE_FILE,		0    },
   { "__LINE__",			0, T_SPECLINE,		0    },
   { "__INCLUDE_LEVEL__",	0, T_INCLUDE_LEVEL,	0    },
   { "__VERSION__",		0, T_VERSION,		DUMP },
@@ -656,6 +661,99 @@ initialize_dependency_output (pfile)
     }
 }
 
+/* And another subroutine.  This one sets up the standard include path.  */
+static void
+initialize_standard_includes (pfile)
+     cpp_reader *pfile;
+{
+  cpp_options *opts = CPP_OPTIONS (pfile);
+  char *path;
+  struct default_include *p = include_defaults_array;
+  char *specd_prefix = opts->include_prefix;
+
+  /* Several environment variables may add to the include search path.
+     CPATH specifies an additional list of directories to be searched
+     as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
+     etc. specify an additional list of directories to be searched as
+     if specified with -isystem, for the language indicated.  */
+
+  GET_ENV_PATH_LIST (path, "CPATH");
+  if (path != 0 && *path != 0)
+    path_include (pfile, opts->pending, path, BRACKET);
+
+  switch ((opts->objc << 1) + opts->cplusplus)
+    {
+    case 0:
+      GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
+      break;
+    case 1:
+      GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
+      break;
+    case 2:
+      GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
+      break;
+    case 3:
+      GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
+      break;
+    }
+  if (path != 0 && *path != 0)
+    path_include (pfile, opts->pending, path, SYSTEM);
+
+  /* Search "translated" versions of GNU directories.
+     These have /usr/local/lib/gcc... replaced by specd_prefix.  */
+  if (specd_prefix != 0)
+    {
+      char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7);
+      /* Remove the `include' from /usr/local/lib/gcc.../include.
+	 GCC_INCLUDE_DIR will always end in /include. */
+      int default_len = sizeof GCC_INCLUDE_DIR - 8;
+      int specd_len = strlen (specd_prefix);
+
+      memcpy (default_prefix, GCC_INCLUDE_DIR, default_len);
+      default_prefix[default_len] = '\0';
+
+      for (p = include_defaults_array; p->fname; p++)
+	{
+	  /* Some standard dirs are only for C++.  */
+	  if (!p->cplusplus
+	      || (opts->cplusplus
+		  && !opts->no_standard_cplusplus_includes))
+	    {
+	      /* Does this dir start with the prefix?  */
+	      if (!strncmp (p->fname, default_prefix, default_len))
+		{
+		  /* Yes; change prefix and add to search list.  */
+		  int flen = strlen (p->fname);
+		  int this_len = specd_len + flen - default_len;
+		  char *str = (char *) xmalloc (this_len + 1);
+		  memcpy (str, specd_prefix, specd_len);
+		  memcpy (str + specd_len,
+			  p->fname + default_len,
+			  flen - default_len + 1);
+
+		  append_include_chain (pfile, opts->pending,
+					str, SYSTEM, p->cxx_aware);
+		}
+	    }
+	}
+    }
+
+  /* Search ordinary names for GNU include directories.  */
+  for (p = include_defaults_array; p->fname; p++)
+    {
+      /* Some standard dirs are only for C++.  */
+      if (!p->cplusplus
+	  || (opts->cplusplus
+	      && !opts->no_standard_cplusplus_includes))
+	{
+	  /* XXX Potential memory leak! */
+	  char *str = xstrdup (update_path (p->fname, p->component));
+	  append_include_chain (pfile, opts->pending, str, SYSTEM,
+				p->cxx_aware);
+	}
+    }
+}
+
 /* This is called after options have been processed.
  * Check options for consistency, and setup for processing input
  * from the file named FNAME.  (Use standard input if FNAME==NULL.)
@@ -669,9 +767,6 @@ cpp_start_read (pfile, fname)
 {
   struct cpp_options *opts = CPP_OPTIONS (pfile);
   struct pending_option *p, *q;
-  int f;
-  cpp_buffer *fp;
-  struct include_hash *ih_fake;
 
   /* -MG doesn't select the form of output and must be specified with one of
      -M or -MM.  -MG doesn't make sense with -MD or -MMD since they don't
@@ -693,6 +788,11 @@ cpp_start_read (pfile, fname)
   /* Set this if it hasn't been set already. */
   if (user_label_prefix == NULL)
     user_label_prefix = USER_LABEL_PREFIX;
+
+  /* Don't bother trying to do macro expansion if we've already done
+     preprocessing.  */
+  if (opts->preprocessed)
+    pfile->no_macro_expand++;
   
   /* Now that we know dollars_in_ident, we can initialize the syntax
      tables. */
@@ -702,30 +802,52 @@ cpp_start_read (pfile, fname)
   if (opts->dollars_in_ident)
     IStable['$'] = ISidstart|ISidnum;
 
-  /* Do partial setup of input buffer for the sake of generating
-     early #line directives (when -g is in effect).  */
-  fp = cpp_push_buffer (pfile, NULL, 0);
-  if (!fp)
-    return 0;
+  /* Set up the include search path now.  */
+  if (! opts->no_standard_includes)
+    initialize_standard_includes (pfile);
+
+  merge_include_chains (opts);
+
+  /* With -v, print the list of dirs to search.  */
+  if (opts->verbose)
+    {
+      struct file_name_list *l;
+      fprintf (stderr, _("#include \"...\" search starts here:\n"));
+      for (l = opts->quote_include; l; l = l->next)
+	{
+	  if (l == opts->bracket_include)
+	    fprintf (stderr, _("#include <...> search starts here:\n"));
+	  fprintf (stderr, " %s\n", l->name);
+	}
+      fprintf (stderr, _("End of search list.\n"));
+    }
+
+  initialize_dependency_output (pfile);
+  
+  /* Open the main input file.  This must be done before -D processing
+     so we have a buffer to stand on.  */
   if (opts->in_fname == NULL || *opts->in_fname == 0)
     {
       opts->in_fname = fname;
       if (opts->in_fname == NULL)
 	opts->in_fname = "";
     }
-  fp->nominal_fname = fp->fname = opts->in_fname;
-  fp->lineno = 0;
+
+  if (!cpp_read_file (pfile, fname))
+    return 0;
+
+  /* -D and friends may produce output, which should be identified
+     as line 0.  */
 
-  /* Install __LINE__, etc.  Must follow initialize_char_syntax
-     and option processing.  */
+  CPP_BUFFER (pfile)->lineno = 0;
+
+  /* Install __LINE__, etc.  */
   initialize_builtins (pfile);
 
   /* Do -U's, -D's and -A's in the order they were seen.  */
   p = opts->pending->define_head;
   while (p)
     {
-      if (opts->debug_output)
-	output_line_command (pfile, same_file);
       if (p->undef)
 	cpp_undef (pfile, p->arg);
       else
@@ -739,8 +861,6 @@ cpp_start_read (pfile, fname)
   p = opts->pending->assert_head;
   while (p)
     {
-      if (opts->debug_output)
-	output_line_command (pfile, same_file);
       if (p->undef)
 	cpp_unassert (pfile, p->arg);
       else
@@ -752,153 +872,9 @@ cpp_start_read (pfile, fname)
     }
   
   opts->done_initializing = 1;
+  CPP_BUFFER (pfile)->lineno = 1;
 
-  /* Several environment variables may add to the include search path.
-     CPATH specifies an additional list of directories to be searched
-     as if specified with -I, while C_INCLUDE_PATH, CPLUS_INCLUDE_PATH,
-     etc. specify an additional list of directories to be searched as
-     if specified with -isystem, for the language indicated.
-
-     These variables are ignored if -nostdinc is on.  */
-  if (! opts->no_standard_includes)
-    {
-      char *path;
-      GET_ENV_PATH_LIST (path, "CPATH");
-      if (path != 0 && *path != 0)
-	path_include (pfile, opts->pending, path, BRACKET);
-
-      switch ((opts->objc << 1) + opts->cplusplus)
-	{
-	case 0:
-	  GET_ENV_PATH_LIST (path, "C_INCLUDE_PATH");
-	  break;
-	case 1:
-	  GET_ENV_PATH_LIST (path, "CPLUS_INCLUDE_PATH");
-	  break;
-	case 2:
-	  GET_ENV_PATH_LIST (path, "OBJC_INCLUDE_PATH");
-	  break;
-	case 3:
-	  GET_ENV_PATH_LIST (path, "OBJCPLUS_INCLUDE_PATH");
-	  break;
-	}
-      if (path != 0 && *path != 0)
-	path_include (pfile, opts->pending, path, SYSTEM);
-    }
-
-  /* Unless -nostdinc, add the compiled-in include path to the list,
-     translating prefixes. */
-  if (!opts->no_standard_includes)
-    {
-      struct default_include *p = include_defaults_array;
-      char *specd_prefix = opts->include_prefix;
-
-      /* Search "translated" versions of GNU directories.
-	 These have /usr/local/lib/gcc... replaced by specd_prefix.  */
-      if (specd_prefix != 0)
-	{
-	  char *default_prefix = alloca (sizeof GCC_INCLUDE_DIR - 7);
-	  /* Remove the `include' from /usr/local/lib/gcc.../include.
-	     GCC_INCLUDE_DIR will always end in /include. */
-	  int default_len = sizeof GCC_INCLUDE_DIR - 8;
-	  int specd_len = strlen (specd_prefix);
-
-	  memcpy (default_prefix, GCC_INCLUDE_DIR, default_len);
-	  default_prefix[default_len] = '\0';
-
-	  for (p = include_defaults_array; p->fname; p++)
-	    {
-	      /* Some standard dirs are only for C++.  */
-	      if (!p->cplusplus
-		  || (opts->cplusplus
-		      && !opts->no_standard_cplusplus_includes))
-		{
-		  /* Does this dir start with the prefix?  */
-		  if (!strncmp (p->fname, default_prefix, default_len))
-		    {
-		      /* Yes; change prefix and add to search list.  */
-		      int flen = strlen (p->fname);
-		      int this_len = specd_len + flen - default_len;
-		      char *str = (char *) xmalloc (this_len + 1);
-		      memcpy (str, specd_prefix, specd_len);
-		      memcpy (str + specd_len,
-			      p->fname + default_len,
-			      flen - default_len + 1);
-
-		      append_include_chain (pfile, opts->pending,
-					    str, SYSTEM);
-		    }
-		}
-	    }
-	}
-
-      /* Search ordinary names for GNU include directories.  */
-      for (p = include_defaults_array; p->fname; p++)
-	{
-	  /* Some standard dirs are only for C++.  */
-	  if (!p->cplusplus
-	      || (opts->cplusplus
-		  && !opts->no_standard_cplusplus_includes))
-	    {
-	      /* XXX Potential memory leak! */
-	      char *str = xstrdup (update_path (p->fname, p->component));
-	      append_include_chain (pfile, opts->pending, str, SYSTEM);
-	    }
-	}
-    }
-
-  merge_include_chains (opts);
-
-  /* With -v, print the list of dirs to search.  */
-  if (opts->verbose)
-    {
-      struct file_name_list *p;
-      fprintf (stderr, _("#include \"...\" search starts here:\n"));
-      for (p = opts->quote_include; p; p = p->next)
-	{
-	  if (p == opts->bracket_include)
-	    fprintf (stderr, _("#include <...> search starts here:\n"));
-	  fprintf (stderr, " %s\n", p->name);
-	}
-      fprintf (stderr, _("End of search list.\n"));
-    }
-
-  /* Don't bother trying to do macro expansion if we've already done
-     preprocessing.  */
   if (opts->preprocessed)
-    pfile->no_macro_expand++;
-
-  /* Open the main input file.
-     We do this in nonblocking mode so we don't get stuck here if
-     someone clever has asked cpp to process /dev/rmt0;
-     finclude() will check that we have a real file to work with.  */
-  if (fname == NULL || *fname == 0)
-    {
-      fname = "";
-      f = 0;
-    }
-  else if ((f = open (fname, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666)) < 0)
-    {
-      cpp_notice_from_errno (pfile, fname);
-      return 0;
-    }
-
-  initialize_dependency_output (pfile);
-
-  /* Must call finclude() on the main input before processing
-     -include switches; otherwise the -included text winds up
-     after the main input. */
-  ih_fake = (struct include_hash *) xmalloc (sizeof (struct include_hash));
-  ih_fake->next = 0;
-  ih_fake->next_this_file = 0;
-  ih_fake->foundhere = ABSOLUTE_PATH;  /* well sort of ... */
-  ih_fake->name = fname;
-  ih_fake->control_macro = 0;
-  ih_fake->buf = (char *)-1;
-  ih_fake->limit = 0;
-  if (!finclude (pfile, f, ih_fake))
-    return 0;
-  if (opts->preprocessed)
     /* If we've already processed this code, we want to trust the #line
        directives in the input.  But we still need to update our line
        counter accordingly.  */
@@ -911,82 +887,29 @@ cpp_start_read (pfile, fname)
      have to be pushed onto the include stack and processed later,
      in the main loop calling cpp_get_token.  */
   
-  pfile->no_record_file++;
   opts->no_output++;
   p = opts->pending->imacros_head;
   while (p)
     {
-      int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
-      if (fd < 0)
-	{
-	  cpp_notice_from_errno (pfile, p->arg);
-	  return 0;
-	}
-      if (!cpp_push_buffer (pfile, NULL, 0))
-	return 0;
-
-      ih_fake = (struct include_hash *)
-	xmalloc (sizeof (struct include_hash));
-      ih_fake->next = 0;
-      ih_fake->next_this_file = 0;
-      ih_fake->foundhere = ABSOLUTE_PATH;  /* well sort of ... */
-      ih_fake->name = p->arg;
-      ih_fake->control_macro = 0;
-      ih_fake->buf = (char *)-1;
-      ih_fake->limit = 0;
-      if (finclude (pfile, fd, ih_fake))
-	{
-	  if (CPP_PRINT_DEPS (pfile))
-	    deps_output (pfile, ih_fake->name, ' ');
-
-	  cpp_scan_buffer (pfile);
-	}
-      else
-	cpp_pop_buffer (pfile);
-      free (ih_fake);
+      if (cpp_read_file (pfile, p->arg))
+	cpp_scan_buffer (pfile);
 
       q = p->next;
       free (p);
       p = q;
     }
-
   opts->no_output--;
 
   p = opts->pending->include_head;
   while (p)
     {
-      int fd = open (p->arg, O_RDONLY|O_NONBLOCK|O_NOCTTY, 0666);
-      if (fd < 0)
-	{
-	  cpp_notice_from_errno (pfile, p->arg);
-	  return 0;
-	}
-      if (!cpp_push_buffer (pfile, NULL, 0))
-	return 0;
+      if (cpp_read_file (pfile, p->arg))
+	output_line_command (pfile, enter_file);
 
-      ih_fake = (struct include_hash *)
-	xmalloc (sizeof (struct include_hash));
-      ih_fake->next = 0;
-      ih_fake->next_this_file = 0;
-      ih_fake->foundhere = ABSOLUTE_PATH;  /* well sort of ... */
-      ih_fake->name = p->arg;
-      ih_fake->control_macro = 0;
-      ih_fake->buf = (char *)-1;
-      ih_fake->limit = 0;
-      if (finclude (pfile, fd, ih_fake))
-	{
-	  if (CPP_PRINT_DEPS (pfile))
-	    deps_output (pfile, ih_fake->name, ' ');
-	  
-	  output_line_command (pfile, enter_file);
-	}
-      else
-	cpp_pop_buffer (pfile);
       q = p->next;
       free (p);
       p = q;
     }
-  pfile->no_record_file--;
 
   free (opts->pending);
   opts->pending = NULL;
@@ -1141,7 +1064,7 @@ cpp_handle_option (pfile, argc, argv)
 	    else
 	      fname = argv[++i];
 	    append_include_chain (pfile, opts->pending,
-				  xstrdup (fname), BRACKET);
+				  xstrdup (fname), BRACKET, 0);
 	  }
 	break;
 
@@ -1153,7 +1076,7 @@ cpp_handle_option (pfile, argc, argv)
 	    if (i + 1 == argc)
 	      goto missing_filename;
 	    append_include_chain (pfile, opts->pending,
-				  xstrdup (argv[++i]), SYSTEM);
+				  xstrdup (argv[++i]), SYSTEM, 0);
 	  }
 	else if (!strcmp (argv[i], "-include"))
 	  {
@@ -1210,7 +1133,7 @@ cpp_handle_option (pfile, argc, argv)
 		memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
 	      }
 	  
-	    append_include_chain (pfile, opts->pending, fname, SYSTEM);
+	    append_include_chain (pfile, opts->pending, fname, SYSTEM, 0);
 	  }
 	/* Add directory to main path for includes,
 	   with the default prefix at the front of its name.  */
@@ -1236,7 +1159,7 @@ cpp_handle_option (pfile, argc, argv)
 		memcpy (fname + sizeof GCC_INCLUDE_DIR - 9, argv[i], len + 1);
 	      }
 	  
-	    append_include_chain (pfile, opts->pending, fname, BRACKET);
+	    append_include_chain (pfile, opts->pending, fname, BRACKET, 0);
 	  }
 	/* Add directory to end of path for includes.  */
 	else if (!strcmp (argv[i], "-idirafter"))
@@ -1244,7 +1167,7 @@ cpp_handle_option (pfile, argc, argv)
 	    if (i + 1 == argc)
 	      goto missing_dirname;
 	    append_include_chain (pfile, opts->pending,
-				  xstrdup (argv[++i]), AFTER);
+				  xstrdup (argv[++i]), AFTER, 0);
 	  }
 	else if (!strcmp (argv[i], "-iprefix"))
 	  {
===================================================================
Index: cpplib.c
--- cpplib.c	2000/03/01 00:57:09	1.121
+++ cpplib.c	2000/03/02 19:59:51
@@ -654,7 +654,7 @@ get_macro_name (pfile)
 static int
 do_define (pfile, keyword)
      cpp_reader *pfile;
-     const struct directive *keyword;
+     const struct directive *keyword ATTRIBUTE_UNUSED;
 {
   HASHNODE *hp;
   DEFINITION *def;
@@ -728,14 +728,11 @@ do_define (pfile, keyword)
   else
     cpp_install (pfile, sym, len, T_MACRO, (char *) def);
 
-  if (keyword != NULL && keyword->type == T_DEFINE)
-    {
-      if (CPP_OPTIONS (pfile)->debug_output
-	  || CPP_OPTIONS (pfile)->dump_macros == dump_definitions)
-	dump_definition (pfile, sym, len, def);
-      else if (CPP_OPTIONS (pfile)->dump_macros == dump_names)
-	pass_thru_directive (sym, len, pfile, keyword);
-    }
+  if (CPP_OPTIONS (pfile)->debug_output
+      || CPP_OPTIONS (pfile)->dump_macros == dump_definitions)
+    dump_definition (pfile, sym, len, def);
+  else if (CPP_OPTIONS (pfile)->dump_macros == dump_names)
+    pass_thru_directive (sym, len, pfile, keyword);
 
   return 0;
 }
@@ -876,7 +873,9 @@ cpp_expand_to_buffer (pfile, buf, length
   /* Scan the input, create the output.  */
   save_no_output = CPP_OPTIONS (pfile)->no_output;
   CPP_OPTIONS (pfile)->no_output = 0;
+  CPP_OPTIONS (pfile)->no_line_commands++;
   cpp_scan_buffer (pfile);
+  CPP_OPTIONS (pfile)->no_line_commands--;
   CPP_OPTIONS (pfile)->no_output = save_no_output;
 
   CPP_NUL_TERMINATE (pfile);
@@ -926,16 +925,14 @@ output_line_command (pfile, file_change)
      enum file_change_code file_change;
 {
   long line;
-  cpp_buffer *ip = CPP_BUFFER (pfile);
-
-  if (ip->fname == NULL)
-    return;
+  cpp_buffer *ip;
 
   if (CPP_OPTIONS (pfile)->no_line_commands
       || CPP_OPTIONS (pfile)->no_output)
     return;
 
-  cpp_buf_line_and_col (CPP_BUFFER (pfile), &line, NULL);
+  ip = cpp_file_buffer (pfile);
+  cpp_buf_line_and_col (ip, &line, NULL);
 
   /* If the current file has not changed, we omit the #line if it would
      appear to be a no-op, and we output a few newlines instead
===================================================================
Index: cpplib.h
--- cpplib.h	2000/03/01 00:57:09	1.59
+++ cpplib.h	2000/03/02 19:59:51
@@ -34,7 +34,8 @@ typedef struct cpp_reader cpp_reader;
 typedef struct cpp_buffer cpp_buffer;
 typedef struct cpp_options cpp_options;
 
-enum cpp_token {
+enum cpp_token
+{
   CPP_EOF = -1,
   CPP_OTHER = 0,
   CPP_COMMENT = 1,
@@ -188,23 +189,23 @@ struct cpp_reader
   struct if_stack *if_stack;
 
   /* Nonzero means we have printed (while error reporting) a list of
-     containing files that matches the current status. */
+     containing files that matches the current status.  */
   char input_stack_listing_current;
 
-  /* If non-zero, macros are not expanded. */
+  /* If non-zero, macros are not expanded.  */
   char no_macro_expand;
 
   /* If non-zero, directives cause a hard error.  Used when parsing
      macro arguments.  */
   char no_directives;
 
-  /* Print column number in error messages. */
+  /* Print column number in error messages.  */
   char show_column;
 
-  /* We're printed a warning recommending against using #import. */
+  /* We're printed a warning recommending against using #import.  */
   char import_warning;
 
-  /* If true, character between '<' and '>' are a single (string) token. */
+  /* If true, character between '<' and '>' are a single (string) token.  */
   char parsing_include_directive;
 
   /* If true, # introduces an assertion (see do_assert) */
@@ -214,19 +215,14 @@ struct cpp_reader
   char parsing_define_directive;
 
   /* True if escape sequences (as described for has_escapes in
-     parse_buffer) should be emitted. */
+     parse_buffer) should be emitted.  */
   char output_escapes;
 
   /* 0: Have seen non-white-space on this line.
      1: Only seen white space so far on this line.
-     2: Only seen white space so far in this file. */
-   char only_seen_white;
-
-  /* Nonzero means this file was included with a -imacros or -include
-     command line and should not be recorded as an include file.  */
+     2: Only seen white space so far in this file.  */
+  char only_seen_white;
 
-  char no_record_file;
-
   long lineno;
 
   struct tm *timebuf;
@@ -432,7 +428,6 @@ struct cpp_options {
   char remap;
 
   /* Nonzero means don't output line number information.  */
-
   char no_line_commands;
 
   /* Nonzero means -I- has been seen,
@@ -713,6 +708,7 @@ extern int find_include_file		PARAMS ((c
 						int *));
 extern int finclude			PARAMS ((cpp_reader *, int,
 					        struct include_hash *));
+extern int cpp_read_file		PARAMS ((cpp_reader *, const char *));
 extern void deps_output			PARAMS ((cpp_reader *,
 						const char *, int));
 extern struct include_hash *include_hash PARAMS ((cpp_reader *, const char *, int));

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]