* cppfiles.c (cpp_read_file): New function.
authorzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Mar 2000 20:14:32 +0000 (20:14 +0000)
committerzack <zack@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 Mar 2000 20:14:32 +0000 (20:14 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@32293 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cppfiles.c
gcc/cpphash.c
gcc/cppinit.c
gcc/cpplib.c
gcc/cpplib.h

index 0d08e6b..00485c6 100644 (file)
@@ -1,3 +1,34 @@
+2000-03-02  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * 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.
+
 Thu Mar  2 13:29:46 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * c-common.c (c_common_nodes_and_builtins): Make sizetype_endlink
index 6b0d919..add6272 100644 (file)
@@ -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 d44bdcb..ae5df16 100644 (file)
@@ -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 d6fbad2..4ec4ea5 100644 (file)
@@ -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_reader *,
 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, path)
   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_name)
      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_array[] =
   { "__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;
 
-  /* Install __LINE__, etc.  Must follow initialize_char_syntax
-     and option processing.  */
+  if (!cpp_read_file (pfile, fname))
+    return 0;
+
+  /* -D and friends may produce output, which should be identified
+     as line 0.  */
+
+  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,152 +872,8 @@ 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
@@ -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;
-
-      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);
+      if (cpp_read_file (pfile, p->arg))
+       output_line_command (pfile, enter_file);
+
       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 8cdc241..c5cf674 100644 (file)
@@ -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 6c16494..60d0eed 100644 (file)
@@ -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,18 +215,13 @@ 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.  */
-
-  char no_record_file;
+     2: Only seen white space so far in this file.  */
+  char only_seen_white;
 
   long lineno;
 
@@ -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 ((cpp_reader *, const char *,
                                                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));