OSDN Git Service

($(OBJC_O)): Also depend on $(GCC_PASSES).
[pf3gnuchains/gcc-fork.git] / gcc / protoize.c
index 823afcd..bf5cfc7 100644 (file)
@@ -1,5 +1,5 @@
-/* Protoize program - Original version by Ron Guilmette at MCC.
-   Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+/* Protoize program - Original version by Ron Guilmette (rfg@segfault.us.com).
+   Copyright (C) 1989, 92-96, 1997 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -15,11 +15,12 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU CC; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 /* Any reasonable C++ compiler should have all of the same features
    as __STDC__ plus more, so make sure that __STDC__ is defined if
-   __cplusplus is defined. */
+   __cplusplus is defined.  */
 
 #if defined(__cplusplus) && !defined(__STDC__)
 #define __STDC__ 1
@@ -64,13 +65,17 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <errno.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#if ! defined (_WIN32) || defined (__CYGWIN32__)
 #if defined(POSIX) || defined(CONCURRENT)
 #include <dirent.h>
 #else
 #include <sys/dir.h>
 #endif
+#endif
 #include <setjmp.h>
 
+#include "gansidecl.h"
+
 /* Include getopt.h for the sake of getopt_long.
    We don't need the declaration of getopt, and it could conflict
    with something from a system header file, so effectively nullify that.  */
@@ -78,12 +83,21 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "getopt.h"
 #undef getopt
 
+#ifndef errno
 extern int errno;
-#if defined(bsd4_4) || defined(__NetBSD__)
+#endif
+
+#ifndef HAVE_STRERROR
+extern int sys_nerr;
+#if defined(bsd4_4)
 extern const char *const sys_errlist[];
 #else
 extern char *sys_errlist[];
 #endif
+#else
+extern char *strerror();
+#endif
+
 extern char *version_string;
 
 /* Systems which are compatible only with POSIX 1003.1-1988 (but *not*
@@ -95,7 +109,6 @@ extern char *version_string;
 
 #define my_access(file,flag)   access((char *)file, flag)
 #define my_stat(file,pkt)      stat((char *)file, pkt)
-#define my_execvp(prog,argv)   execvp((char *)prog, (char **)argv)
 #define my_link(file1, file2)  link((char *)file1, (char *)file2)
 #define my_unlink(file)                unlink((char *)file)
 #define my_open(file, mode, flag)      open((char *)file, mode, flag)
@@ -103,6 +116,16 @@ extern char *version_string;
 
 extern char *getpwd ();
 
+extern char *choose_temp_base PROTO ((void));
+
+extern int pexecute PROTO ((const char *, char * const *, const char *,
+                           const char *, char **, char **, int));
+extern int pwait PROTO ((int, int *, int));
+/* Flag arguments to pexecute.  */
+#define PEXECUTE_FIRST  1
+#define PEXECUTE_LAST   2
+#define PEXECUTE_SEARCH 4
+
 /* Aliases for pointers to void.
    These were made to facilitate compilation with old brain-dead DEC C
    compilers which didn't properly grok `void*' types.  */
@@ -158,7 +181,6 @@ typedef char * const_pointer_type;
 typedef void voidfn ();
 extern VOLATILE voidfn abort;
 #endif
-extern int kill ();
 extern int creat ();
 #if 0 /* These conflict with stdio.h on some systems.  */
 extern int fprintf (FILE *, const char *, ...);
@@ -175,10 +197,11 @@ extern int atoi ();
 extern int puts ();
 extern int fputs ();
 extern int fputc ();
+#if !defined(_WIN32)
 extern int link ();
+#endif
 extern int unlink ();
 extern int access ();
-extern int execvp ();
 
 #if 0 /* size_t from sys/types.h may fail to match GCC.
         If so, we would get a warning from this.  */
@@ -240,7 +263,7 @@ static char * syscalls_absolute_filename;
 
 #endif /* !defined (UNPROTOIZE) */
 
-/* Type of the structure that holds information about macro unexpansions. */
+/* Type of the structure that holds information about macro unexpansions.  */
 
 struct unexpansion_struct {
   const char *expanded;
@@ -281,39 +304,39 @@ static const int hash_mask = (HASH_TABLE_SIZE - 1);
 #define LOCAL_INCLUDE_DIR "/usr/local/include"
 #endif
 
-struct default_include { const char *fname; int cplusplus; } include_defaults[]
+struct default_include { const char *fname; int x1, x2; } include_defaults[]
 #ifdef INCLUDE_DEFAULTS
   = INCLUDE_DEFAULTS;
 #else
   = {
     /* Pick up GNU C++ specific include files.  */
-    { GPLUSPLUS_INCLUDE_DIR, 1},
+    { GPLUSPLUS_INCLUDE_DIR, 1, 1 },
 #ifdef CROSS_COMPILE
     /* This is the dir for fixincludes.  Put it just before
        the files that we fix.  */
-    { GCC_INCLUDE_DIR, 0},
+    { GCC_INCLUDE_DIR, 0, 0 },
     /* For cross-compilation, this dir name is generated
        automatically in Makefile.in.  */
-    { CROSS_INCLUDE_DIR, 0 },
+    { CROSS_INCLUDE_DIR, 0, 0 },
     /* This is another place that the target system's headers might be.  */
-    { TOOL_INCLUDE_DIR, 0},
+    { TOOL_INCLUDE_DIR, 0, 0 },
 #else /* not CROSS_COMPILE */
     /* This should be /use/local/include and should come before
        the fixincludes-fixed header files.  */
-    { LOCAL_INCLUDE_DIR, 0},
+    { LOCAL_INCLUDE_DIR, 0, 1 },
     /* This is here ahead of GCC_INCLUDE_DIR because assert.h goes here.
        Likewise, behind LOCAL_INCLUDE_DIR, where glibc puts its assert.h.  */
-    { TOOL_INCLUDE_DIR, 0},
+    { TOOL_INCLUDE_DIR, 0, 0 },
     /* This is the dir for fixincludes.  Put it just before
        the files that we fix.  */
-    { GCC_INCLUDE_DIR, 0},
+    { GCC_INCLUDE_DIR, 0, 0 },
     /* Some systems have an extra dir of include files.  */
 #ifdef SYSTEM_INCLUDE_DIR
-    { SYSTEM_INCLUDE_DIR, 0},
+    { SYSTEM_INCLUDE_DIR, 0, 0 },
 #endif
-    { STANDARD_INCLUDE_DIR, 0},
+    { STANDARD_INCLUDE_DIR, 0, 0},
 #endif /* not CROSS_COMPILE */
-    { 0, 0}
+    { 0, 0, 0}
     };
 #endif /* no INCLUDE_DEFAULTS */
 
@@ -487,7 +510,7 @@ static const char *indent_string = "     "; /* Indentation for newly
 static int local_flag = 0;             /* Insert new local decls (when?).  */
 static int global_flag = 0;            /* set by -g option */
 static int cplusplus_flag = 0;         /* Rename converted files to *.C.  */
-static const charnondefault_syscalls_dir = 0; /* Dir to look for
+static const char *nondefault_syscalls_dir = 0; /* Dir to look for
                                                   SYSCALLS.c.X in.  */
 #endif /* !defined (UNPROTOIZE) */
 
@@ -522,7 +545,7 @@ static const char *convert_filename;
 
 /* Pointer to relative root string (taken from aux_info file) which indicates
    where directory the user was in when he did the compilation step that
-   produced the containing aux_info file. */
+   produced the containing aux_info file.  */
 
 static const char *invocation_filename;
 
@@ -610,6 +633,28 @@ static char * saved_repl_write_ptr;
 
 static const char *shortpath ();
 \f
+char *
+my_strerror(e)
+     int e;
+{
+
+#ifdef HAVE_STRERROR
+  return strerror(e);
+
+#else
+
+  static char buffer[30];
+  if (!e)
+    return "";
+
+  if (e > 0 && e < sys_nerr)
+    return sys_errlist[e];
+
+  sprintf (buffer, "Unknown error %d", e);
+  return buffer;
+#endif
+}
+\f
 /* Allocate some space, but check that the allocation was successful.  */
 /* alloca.c uses this, so don't make it static.  */
 
@@ -623,7 +668,7 @@ xmalloc (byte_count)
   if (rv == NULL)
     {
       fprintf (stderr, "\n%s: virtual memory exceeded\n", pname);
-      exit (1);
+      exit (FATAL_EXIT_CODE);
       return 0;                /* avoid warnings */
     }
   else
@@ -643,7 +688,7 @@ xrealloc (old_space, byte_count)
   if (rv == NULL)
     {
       fprintf (stderr, "\n%s: virtual memory exceeded\n", pname);
-      exit (1);
+      exit (FATAL_EXIT_CODE);
       return 0;                /* avoid warnings */
     }
   else
@@ -696,7 +741,7 @@ void
 fancy_abort ()
 {
   fprintf (stderr, "%s: internal abort\n", pname);
-  exit (1);
+  exit (FATAL_EXIT_CODE);
 }
 \f
 /* Make a duplicate of the first N bytes of a given string in a newly
@@ -785,7 +830,7 @@ safe_write (desc, ptr, len, out_fname)
          continue;
 #endif
        fprintf (stderr, "%s: error writing file `%s': %s\n",
-                pname, shortpath (NULL, out_fname), sys_errlist[errno]);
+                pname, shortpath (NULL, out_fname), my_strerror(errno));
        return;
       }
     ptr += written;
@@ -831,10 +876,10 @@ usage ()
   fprintf (stderr, "%s: usage '%s [ -VqfnkN ] [ -i <istring> ] [ filename ... ]'\n",
           pname, pname);
 #else /* !defined (UNPROTOIZE) */
-  fprintf (stderr, "%s: usage '%s [ -VqfnkNlgC ] [ -B <diname> ] [ filename ... ]'\n",
+  fprintf (stderr, "%s: usage '%s [ -VqfnkNlgC ] [ -B <dirname> ] [ filename ... ]'\n",
           pname, pname);
 #endif /* !defined (UNPROTOIZE) */
-  exit (1);
+  exit (FATAL_EXIT_CODE);
 }
 
 /* Return true if the given filename (assumed to be an absolute filename)
@@ -987,14 +1032,14 @@ needs_to_be_converted (file_p)
 
 #ifndef UNPROTOIZE
 
-      /* ... and if we a protoizing and this function is in old style ... */
+      /* ... and if we a protoizing and this function is in old style ...  */
       !ddp->prototyped
-      /* ... and if this a definition or is a decl with an associated def ... */
+      /* ... and if this a definition or is a decl with an associated def ...  */
       && (ddp->is_func_def || (!ddp->is_func_def && ddp->definition))
 
 #else /* defined (UNPROTOIZE) */
 
-      /* ... and if we are unprotoizing and this function is in new style ... */
+      /* ... and if we are unprotoizing and this function is in new style ...  */
       ddp->prototyped
 
 #endif /* defined (UNPROTOIZE) */
@@ -1180,7 +1225,7 @@ unexpand_if_needed (aux_info_line)
 {
   static char *line_buf = 0;
   static int line_buf_size = 0;
-  const unexpansionunexp_p;
+  const unexpansion *unexp_p;
   int got_unexpanded = 0;
   const char *s;
   char *copy_p = line_buf;
@@ -1321,18 +1366,18 @@ abspath (cwd, rel_filename)
                     while (outp >= abs_buffer && *outp != '/')
                outp--;
                     if (outp < abs_buffer)
-                {
-                  /* Catch cases like /.. where we try to backup to a
-                     point above the absolute root of the logical file
-                     system.  */
-
-                 fprintf (stderr, "%s: invalid file name: %s\n",
-                          pname, rel_filename);
-                 exit (1);
-               }
+                     {
+                       /* Catch cases like /.. where we try to backup to a
+                          point above the absolute root of the logical file
+                          system.  */
+
+                       fprintf (stderr, "%s: invalid file name: %s\n",
+                                pname, rel_filename);
+                       exit (FATAL_EXIT_CODE);
+                     }
                     *++outp = '\0';
                     continue;
-            }
+                 }
         }
       *outp++ = *inp++;
     }
@@ -1477,7 +1522,7 @@ find_file (filename, do_not_stat)
           if (my_stat (filename, &stat_buf) == -1)
             {
               fprintf (stderr, "%s: %s: can't get status: %s\n",
-                      pname, shortpath (NULL, filename), sys_errlist[errno]);
+                      pname, shortpath (NULL, filename), my_strerror(errno));
               stat_buf.st_mtime = (time_t) -1;
             }
         }
@@ -1498,7 +1543,7 @@ aux_info_corrupted ()
 {
   fprintf (stderr, "\n%s: fatal error: aux info file corrupted at line %d\n",
           pname, current_aux_info_lineno);
-  exit (1);
+  exit (FATAL_EXIT_CODE);
 }
 
 /* ??? This comment is vague.  Say what the condition is for.  */
@@ -1654,7 +1699,7 @@ save_def_or_dec (l, is_syscalls)
   /* Check that this record describes a new-style, old-style, or implicit
      definition or declaration.  */
 
-  p++; /* Skip over the `:'. */
+  p++; /* Skip over the `:'.  */
   check_aux_info ((*p == 'N') || (*p == 'O') || (*p == 'I'));
 
   /* Is this a new style (ANSI prototyped) definition or declaration? */
@@ -1745,8 +1790,8 @@ save_def_or_dec (l, is_syscalls)
       const char *left_paren_p = find_corresponding_lparen (p);
 #ifndef UNPROTOIZE
       {
-        f_list_chain_item *cip =
-          (f_list_chain_item *) xmalloc (sizeof (f_list_chain_item));
+        f_list_chain_item *cip
+         = (f_list_chain_item *) xmalloc (sizeof (f_list_chain_item));
 
         cip->formals_list
          = dupnstr (left_paren_p + 1, (size_t) (p - (left_paren_p+1)));
@@ -1824,7 +1869,7 @@ save_def_or_dec (l, is_syscalls)
                         def_dec_p->file->hash_entry->symbol,
                         def_dec_p->line,
                         def_dec_p->hash_entry->symbol);
-                exit (1);
+                exit (FATAL_EXIT_CODE);
               }
             free_def_dec (def_dec_p);
             return;
@@ -1860,7 +1905,7 @@ save_def_or_dec (l, is_syscalls)
       check_aux_info (*++p == '(');
 
       {
-        const char *kr_names_start = ++p;   /* Point just inside '('. */
+        const char *kr_names_start = ++p;   /* Point just inside '('.  */
 
         while (*p++ != ')')
           continue;
@@ -2049,14 +2094,14 @@ munge_compile_params (params_list)
 }
 
 /* Do a recompilation for the express purpose of generating a new aux_info
-   file to go with a specific base source file.  */
+   file to go with a specific base source file.
+
+   The result is a boolean indicating success.  */
 
 static int
 gen_aux_info_file (base_filename)
      const char *base_filename;
 {
-  int child_pid;
-
   if (!input_file_name_index)
     munge_compile_params ("");
 
@@ -2073,72 +2118,48 @@ gen_aux_info_file (base_filename)
     fprintf (stderr, "%s: compiling `%s'\n",
             pname, compile_params[input_file_name_index]);
 
-  if (child_pid = fork ())
-    {
-      if (child_pid == -1)
-        {
-          fprintf (stderr, "%s: could not fork process: %s\n",
-                  pname, sys_errlist[errno]);
-          return 0;
-        }
-
-#if 0
-      /* Print out the command line that the other process is now executing.  */
+  {
+    char *errmsg_fmt, *errmsg_arg;
+    int wait_status, pid;
+    char *temp_base = choose_temp_base ();
 
-      if (!quiet_flag)
-        {
-          const char **arg;
-  
-          fputs ("\t", stderr);
-          for (arg = compile_params; *arg; arg++)
-            {
-              fputs (*arg, stderr);
-              fputc (' ', stderr);
-            }
-          fputc ('\n', stderr);
-          fflush (stderr);
-        }
-#endif /* 0 */
+    pid = pexecute (compile_params[0], (char * const *) compile_params,
+                   pname, temp_base, &errmsg_fmt, &errmsg_arg,
+                   PEXECUTE_FIRST | PEXECUTE_LAST | PEXECUTE_SEARCH);
 
+    if (pid == -1)
       {
-        int wait_status;
+       int errno_val = errno;
+       fprintf (stderr, "%s: ", pname);
+       fprintf (stderr, errmsg_fmt, errmsg_arg);
+       fprintf (stderr, ": %s\n", my_strerror (errno_val));
+       return 0;
+      }
 
-        if (wait (&wait_status) == -1)
-          {
-            fprintf (stderr, "%s: wait failed: %s\n",
-                    pname, sys_errlist[errno]);
-            return 0;
-          }
-       if (WIFSIGNALED (wait_status))
-         {
-           fprintf (stderr, "%s: subprocess got fatal signal %d",
-                    pname, WTERMSIG (wait_status));
-           return 0;
-         }
-       if (WIFEXITED (wait_status) && WEXITSTATUS (wait_status) != 0)
+    pid = pwait (pid, &wait_status, 0);
+    if (pid == -1)
+      {
+       fprintf (stderr, "%s: wait: %s\n", pname, my_strerror (errno));
+       return 0;
+      }
+    if (WIFSIGNALED (wait_status))
+      {
+       fprintf (stderr, "%s: subprocess got fatal signal %d\n",
+                pname, WTERMSIG (wait_status));
+       return 0;
+      }
+    if (WIFEXITED (wait_status))
+      {
+       if (WEXITSTATUS (wait_status) != 0)
          {
            fprintf (stderr, "%s: %s exited with status %d\n",
-                    pname, base_filename, WEXITSTATUS (wait_status));
+                    pname, compile_params[0], WEXITSTATUS (wait_status));
            return 0;
          }
        return 1;
       }
-    }
-  else
-    {
-      if (my_execvp (compile_params[0], (char *const *) compile_params))
-        {
-         int e = errno, f = fileno (stderr);
-         write (f, pname, strlen (pname));
-         write (f, ": ", 2);
-         write (f, compile_params[0], strlen (compile_params[0]));
-         write (f, ": ", 2);
-         write (f, sys_errlist[e], strlen (sys_errlist[e]));
-         write (f, "\n", 1);
-          _exit (1);
-        }
-      return 1;                /* Never executed.  */
-    }
+    abort ();
+  }
 }
 \f
 /* Read in all of the information contained in a single aux_info file.
@@ -2193,7 +2214,7 @@ start_over: ;
        {
          fprintf (stderr, "%s: can't read aux info file `%s': %s\n",
                   pname, shortpath (NULL, aux_info_filename),
-                  sys_errlist[errno]);
+                  my_strerror(errno));
          errors++;
          return;
        }
@@ -2221,7 +2242,7 @@ start_over: ;
        {
          fprintf (stderr, "%s: can't read aux info file `%s': %s\n",
                   pname, shortpath (NULL, aux_info_filename),
-                  sys_errlist[errno]);
+                  my_strerror(errno));
          errors++;
          return;
        }
@@ -2236,7 +2257,7 @@ start_over: ;
       {
         fprintf (stderr, "%s: can't get status of aux info file `%s': %s\n",
                 pname, shortpath (NULL, aux_info_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         errors++;
         return;
       }
@@ -2263,7 +2284,7 @@ start_over: ;
          {
            fprintf (stderr, "%s: can't get status of aux info file `%s': %s\n",
                     pname, shortpath (NULL, base_source_filename),
-                    sys_errlist[errno]);
+                    my_strerror(errno));
            errors++;
            return;
          }
@@ -2284,7 +2305,7 @@ start_over: ;
       {
         fprintf (stderr, "%s: can't open aux info file `%s' for reading: %s\n",
                 pname, shortpath (NULL, aux_info_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         return;
       }
   
@@ -2300,7 +2321,7 @@ start_over: ;
       {
         fprintf (stderr, "%s: error reading aux info file `%s': %s\n",
                 pname, shortpath (NULL, aux_info_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         free (aux_info_base);
         close (aux_info_file);
         return;
@@ -2312,7 +2333,7 @@ start_over: ;
       {
         fprintf (stderr, "%s: error closing aux info file `%s': %s\n",
                 pname, shortpath (NULL, aux_info_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         free (aux_info_base);
         close (aux_info_file);
         return;
@@ -2326,7 +2347,7 @@ start_over: ;
     if (my_unlink (aux_info_filename) == -1)
       fprintf (stderr, "%s: can't delete aux info file `%s': %s\n",
               pname, shortpath (NULL, aux_info_filename),
-              sys_errlist[errno]);
+              my_strerror(errno));
 
   /* Save a pointer into the first line of the aux_info file which
      contains the filename of the directory from which the compiler
@@ -2392,7 +2413,7 @@ start_over: ;
                   {
                     fprintf (stderr, "%s: can't delete file `%s': %s\n",
                             pname, shortpath (NULL, aux_info_filename),
-                            sys_errlist[errno]);
+                            my_strerror(errno));
                     return;
                   }
                must_create = 1;
@@ -2468,7 +2489,7 @@ rename_c_file (hp)
     {
       fprintf (stderr, "%s: warning: can't link file `%s' to `%s': %s\n",
               pname, shortpath (NULL, filename),
-              shortpath (NULL, new_filename), sys_errlist[errno]);
+              shortpath (NULL, new_filename), my_strerror(errno));
       errors++;
       return;
     }
@@ -2476,7 +2497,7 @@ rename_c_file (hp)
   if (my_unlink (filename) == -1)
     {
       fprintf (stderr, "%s: warning: can't delete file `%s': %s\n",
-              pname, shortpath (NULL, filename), sys_errlist[errno]);
+              pname, shortpath (NULL, filename), my_strerror(errno));
       errors++;
       return;
     }
@@ -2497,23 +2518,23 @@ reverse_def_dec_list (hp)
      const hash_table_entry *hp;
 {
   file_info *file_p = hp->fip;
-  const def_dec_info *prev = NULL;
-  const def_dec_info *current = file_p->defs_decs;
+  def_dec_info *prev = NULL;
+  def_dec_info *current = (def_dec_info *)file_p->defs_decs;
 
-  if (!( current = file_p->defs_decs))
+  if (!current)
     return;                    /* no list to reverse */
 
   prev = current;
-  if (! (current = current->next_in_file))
+  if (! (current = (def_dec_info *)current->next_in_file))
     return;                    /* can't reverse a single list element */
 
-  ((NONCONST def_dec_info *) prev)->next_in_file = NULL;
+  prev->next_in_file = NULL;
 
   while (current)
     {
-      const def_dec_info *next = current->next_in_file;
+      def_dec_info *next = (def_dec_info *)current->next_in_file;
 
-      ((NONCONST def_dec_info *) current)->next_in_file = prev;
+      current->next_in_file = prev;
       prev = current;
       current = next;
     }
@@ -2575,7 +2596,7 @@ find_extern_def (head, user)
     if (dd_p->is_func_def && !dd_p->is_static)
       {
         if (!extern_def_p)     /* Previous definition? */
-          extern_def_p = dd_p; /* Remember the first definition found. */
+          extern_def_p = dd_p; /* Remember the first definition found.  */
         else
           {
             /* Ignore definition just found if it came from SYSCALLS.c.X.  */
@@ -2695,7 +2716,7 @@ find_extern_def (head, user)
 \f
 /* Find the (only?) static definition for a particular function name in a
    given file.  Here we get the function-name and the file info indirectly
-   from the def_dec_info record pointer which is passed in. */
+   from the def_dec_info record pointer which is passed in.  */
 
 static const def_dec_info *
 find_static_definition (user)
@@ -2950,7 +2971,7 @@ seek_to_line (n)
 }
 
 /* Given a pointer to a character in the cleaned text buffer, return a pointer
-   to the next non-whitepace character which follows it.  */
+   to the next non-whitespace character which follows it.  */
 
 static const char *
 forward_to_next_token_char (ptr)
@@ -3009,7 +3030,7 @@ output_string (str)
    buffer (which may include original comments and preprocessing directives)
    will be copied into the  output buffer.
 
-   Note that the request implide when this routine is called includes the
+   Note that the request implied when this routine is called includes the
    byte pointed to by the argument pointer `p'.  */
 
 static void
@@ -3391,11 +3412,11 @@ edit_formals_lists (end_formals, f_list_count, def_dec_p)
   return 0;
 }
 
-/* Given a pointer to a byte in the clean text buffer which points to the
-   beginning of a line that contains a "follower" token for a function
-   definition header, do whatever is necessary to find the right closing
-   paren for the rightmost formals list of the function definition header.
-*/
+/* Given a pointer to a byte in the clean text buffer which points to
+   the beginning of a line that contains a "follower" token for a
+   function definition header, do whatever is necessary to find the
+   right closing paren for the rightmost formals list of the function
+   definition header.  */
 
 static const char *
 find_rightmost_formals_list (clean_text_p)
@@ -3663,7 +3684,7 @@ add_global_decls (file_p, clean_text_p)
 
   /* Now scan forward for the first non-whitespace character.  In theory,
      this should be the first character of the following function definition
-     header.  We will put in the added declarations just prior to that. */
+     header.  We will put in the added declarations just prior to that.  */
 
   scan_p++;
   while (isspace (*scan_p))
@@ -3806,7 +3827,7 @@ edit_fn_definition (def_dec_p, clean_text_p)
       output_string ("\n");
   }
 #else /* !defined (UNPROTOIZE) */
-  /* If we are protoizing, there may be some flotsum & jetsum (like comments
+  /* If we are protoizing, there may be some flotsam & jetsam (like comments
      and preprocessing directives) after the old formals list but before
      the following { and we would like to preserve that stuff while effectively
      deleting the existing K&R formal parameter declarations.  We do so here
@@ -3819,7 +3840,7 @@ edit_fn_definition (def_dec_p, clean_text_p)
     const char *start_body_orig;
     const char *scan;
     const char *scan_orig;
-    int have_flotsum = 0;
+    int have_flotsam = 0;
     int have_newlines = 0;
 
     for (start_body = end_formals + 1; *start_body != '{';)
@@ -3839,9 +3860,9 @@ edit_fn_definition (def_dec_p, clean_text_p)
               *((NONCONST char *)scan_orig) = ' '; /* identical - so whiteout */
           }
         else
-          have_flotsum = 1;
+          have_flotsam = 1;
       }
-    if (have_flotsum)
+    if (have_flotsam)
       output_bytes (end_formals_orig + 1,
                    (size_t) (start_body_orig - end_formals_orig) - 1);
     else
@@ -3855,7 +3876,7 @@ edit_fn_definition (def_dec_p, clean_text_p)
 }
 
 /* Clean up the clean text buffer.  Do this by converting comments and
-   preprocessor directives into spaces.   Also convert line continuations
+   preprocessing directives into spaces.   Also convert line continuations
    into whitespace.  Also, whiteout string and character literals.  */
 
 static void
@@ -3927,7 +3948,9 @@ do_cleaning (new_clean_text_base, new_clean_text_limit)
                 if (++scan_p >= new_clean_text_limit)
                   abort ();
               }
-            *scan_p++ = ' ';
+           if (!isspace (*scan_p))
+             *scan_p = ' ';
+           scan_p++;
             break;
 
           case '\\':                   /* Handle line continuations.  */
@@ -4105,14 +4128,14 @@ scan_for_missed_items (file_p)
 /* Do all editing operations for a single source file (either a "base" file
    or an "include" file).  To do this we read the file into memory, keep a
    virgin copy there, make another cleaned in-core copy of the original file
-   (i.e. one in which all of the comments and preprocessor directives have
+   (i.e. one in which all of the comments and preprocessing directives have
    been replaced with whitespace), then use these two in-core copies of the
    file to make a new edited in-core copy of the file.  Finally, rename the
    original file (as a way of saving it), and then write the edited version
    of the file from core to a disk file of the same name as the original.
 
    Note that the trick of making a copy of the original sans comments &
-   preprocessor directives make the editing a whole lot easier.  */
+   preprocessing directives make the editing a whole lot easier.  */
    
 static void
 edit_file (hp)
@@ -4172,7 +4195,7 @@ edit_file (hp)
   if (my_stat ((char *)convert_filename, &stat_buf) == -1)
     {
       fprintf (stderr, "%s: can't get status for file `%s': %s\n",
-              pname, shortpath (NULL, convert_filename), sys_errlist[errno]);
+              pname, shortpath (NULL, convert_filename), my_strerror(errno));
       return;
     }
   orig_size = stat_buf.st_size;
@@ -4207,7 +4230,7 @@ edit_file (hp)
       {
         fprintf (stderr, "%s: can't open file `%s' for reading: %s\n",
                 pname, shortpath (NULL, convert_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         return;
       }
 
@@ -4220,7 +4243,7 @@ edit_file (hp)
         close (input_file);
         fprintf (stderr, "\n%s: error reading input file `%s': %s\n",
                 pname, shortpath (NULL, convert_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         return;
       }
 
@@ -4253,7 +4276,7 @@ edit_file (hp)
       {
         fprintf (stderr, "%s: can't create/open clean file `%s': %s\n",
                 pname, shortpath (NULL, clean_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         return;
       }
   
@@ -4341,8 +4364,8 @@ edit_file (hp)
 
   if (!nosave_flag)
     {
-      char *new_filename =
-          (char *) xmalloc (strlen (convert_filename) + strlen (save_suffix) + 2);
+      char *new_filename
+       = (char *) xmalloc (strlen (convert_filename) + strlen (save_suffix) + 2);
   
       strcpy (new_filename, convert_filename);
       strcat (new_filename, save_suffix);
@@ -4362,7 +4385,7 @@ edit_file (hp)
                       pname,
                       shortpath (NULL, convert_filename),
                       shortpath (NULL, new_filename),
-                      sys_errlist[errno]);
+                      my_strerror(errno));
               return;
             }
         }
@@ -4371,7 +4394,7 @@ edit_file (hp)
   if (my_unlink (convert_filename) == -1)
     {
       fprintf (stderr, "%s: can't delete file `%s': %s\n",
-              pname, shortpath (NULL, convert_filename), sys_errlist[errno]);
+              pname, shortpath (NULL, convert_filename), my_strerror(errno));
       return;
     }
 
@@ -4384,7 +4407,7 @@ edit_file (hp)
       {
         fprintf (stderr, "%s: can't create/open output file `%s': %s\n",
                 pname, shortpath (NULL, convert_filename),
-                sys_errlist[errno]);
+                my_strerror(errno));
         return;
       }
   
@@ -4410,7 +4433,7 @@ edit_file (hp)
   /* The cast avoids an erroneous warning on AIX.  */
   if (my_chmod ((char *)convert_filename, stat_buf.st_mode) == -1)
     fprintf (stderr, "%s: can't change mode of file `%s': %s\n",
-            pname, shortpath (NULL, convert_filename), sys_errlist[errno]);
+            pname, shortpath (NULL, convert_filename), my_strerror(errno));
 
   /* Note:  We would try to change the owner and group of the output file
      to match those of the input file here, except that may not be a good
@@ -4553,8 +4576,8 @@ main (argc, argv)
   if (!cwd_buffer)
     {
       fprintf (stderr, "%s: cannot get working directory: %s\n",
-              pname, sys_errlist[errno]);
-      exit (1);
+              pname, my_strerror(errno));
+      exit (FATAL_EXIT_CODE);
     }
 
   /* By default, convert the files in the current directory.  */
@@ -4568,7 +4591,7 @@ main (argc, argv)
 #endif
                           longopts, &longind)) != EOF)
     {
-      if (c == 0)              /* Long option. */
+      if (c == 0)              /* Long option.  */
        c = longopts[longind].val;
       switch (c)
        {
@@ -4638,8 +4661,8 @@ main (argc, argv)
 
   /* Now actually make a list of the base source filenames.  */
 
-  base_source_filenames =
-    (const char **) xmalloc ((n_base_source_files + 1) * sizeof (char *));
+  base_source_filenames
+    (const char **) xmalloc ((n_base_source_files + 1) * sizeof (char *));
   n_base_source_files = 0;
   for (; optind < argc; optind++)
     {
@@ -4679,9 +4702,8 @@ main (argc, argv)
         fprintf (stderr, "%s: %s\n", pname, version_string);
       do_processing ();
     }
-  if (errors)
-    exit (1);
-  else
-    exit (0);
+
+  exit (errors ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
+
   return 1;
 }