Makefile.in: Correct dependencies of fixincl and fixincl.o.
authorZack Weinberg <zack@wolery.cumb.org>
Wed, 19 Jan 2000 21:41:04 +0000 (21:41 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Wed, 19 Jan 2000 21:41:04 +0000 (21:41 +0000)
* fixinc/Makefile.in: Correct dependencies of fixincl and fixincl.o.
* fixinc/fixfixes.c (IO_use, CTRL_use, IO_defn, CTRL_defn): New fixes.
(fix_char_macro_defines, fix_char_macro_uses): New functions.

* fixinc/fixlib.c (is_cxx_header): Do the text scan with a regexp.
Recognize Emacs mode markers also.
* fixinc/fixtests.c (else_endif_label): Fix bug in recognition of
C++ comments in C++ headers.  Call is_cxx_header only if
necessary.

* fixinc/inclhack.def (avoid_bool): Add select for the problem and
bypass for ncurses.
(bsd43_io_macros, io_def_quotes, ioctl_fix_ctrl): Replace with...
(io_def_quotes, io_use_quotes, ctrl_def_quotes, ctrl_use_quotes):
... these, which use the new C fixes.
(math_exception): Escape literal '+' in bypass expression.

* fixinc/fixincl.x, fixinc/fixincl.sh, fixinc/inclhack.sh:
Regenerate.

From-SVN: r31512

gcc/ChangeLog
gcc/fixinc/Makefile.in
gcc/fixinc/fixfixes.c
gcc/fixinc/fixincl.sh
gcc/fixinc/fixincl.x
gcc/fixinc/fixlib.c
gcc/fixinc/fixtests.c
gcc/fixinc/inclhack.def
gcc/fixinc/inclhack.sh

index 389ce07df6800a6afee9c624e6646d7c1871a66b..e5f81774a3af291dcd94db59eff60d0b1958b4fe 100644 (file)
@@ -1,3 +1,25 @@
+2000-01-19  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * fixinc/Makefile.in: Correct dependencies of fixincl and fixincl.o.
+       * fixinc/fixfixes.c (IO_use, CTRL_use, IO_defn, CTRL_defn): New fixes.
+       (fix_char_macro_defines, fix_char_macro_uses): New functions.
+
+       * fixinc/fixlib.c (is_cxx_header): Do the text scan with a regexp.
+       Recognize Emacs mode markers also.
+       * fixinc/fixtests.c (else_endif_label): Fix bug in recognition of
+       C++ comments in C++ headers.  Call is_cxx_header only if
+       necessary.
+
+       * fixinc/inclhack.def (avoid_bool): Add select for the problem and
+       bypass for ncurses.
+       (bsd43_io_macros, io_def_quotes, ioctl_fix_ctrl): Replace with...
+       (io_def_quotes, io_use_quotes, ctrl_def_quotes, ctrl_use_quotes):
+       ... these, which use the new C fixes.
+       (math_exception): Escape literal '+' in bypass expression.
+
+       * fixinc/fixincl.x, fixinc/fixincl.sh, fixinc/inclhack.sh:
+       Regenerate.
+
 2000-01-19  Geoff Keating  <geoffk@cygnus.com>
 
        * rtlanal.c (reg_referenced_p): A CLOBBER of a MEM uses any REGs
index 8c3f5dcfa479f81a35bb8b965e06e718e28aa2ed..a2448c13a951782cb0041892e525efae8e538549 100644 (file)
@@ -76,7 +76,7 @@ gen : $(SH_TARGET) fixincl.x
 
 $(FIOBJ): $(HDR)
 
-fixincl: $(FIOBJ) fixfixes fixtests
+fixincl: $(FIOBJ)
        @echo $(CC) -o $@ $(FIOBJ) $(LIBERTY) $(LIB) ; \
        if $(CC) -o $@ $(FIOBJ) $(LIBERTY) $(LIB) ; then : ; else \
        rm -f $@ ; (echo "#! /bin/sh" ; echo exit 1 ) > $@ ; \
@@ -94,7 +94,7 @@ gnu-regex.o: gnu-regex.c
        -$(CC) $(CFLAGS) $(FIXINC_DEFS) $(INCLUDES) -DREGEX_MALLOC \
                -c $(srcdir)/gnu-regex.c
 
-fixincl.o : fixincl.x fixincl.c
+fixincl.o : fixincl.x fixincl.c fixfixes.c fixtests.c
 server.o : server.c server.h
 procopen.o : procopen.c server.h
 
index b701c05ccc213187d4a85c133ace309a0a717ba8..33f5f193dbe50aafef0bfb5d727e4a3ba64614ed 100644 (file)
@@ -73,7 +73,11 @@ typedef struct {
 
 #define FIXUP_TABLE \
   _FT_( "no_double_slash",  double_slash_fix ) \
-  _FT_( "else_endif_label", else_endif_label_fix )
+  _FT_( "else_endif_label", else_endif_label_fix ) \
+  _FT_( "IO_use",          IO_use_fix ) \
+  _FT_( "CTRL_use",        CTRL_use_fix) \
+  _FT_( "IO_defn",         IO_defn_fix ) \
+  _FT_( "CTRL_defn",       CTRL_defn_fix )
 
 
 #define FIX_PROC_HEAD( fix ) \
@@ -354,6 +358,196 @@ FIX_PROC_HEAD( else_endif_label_fix )
   return;
 }
 
+/* Scan the input file for all occurrences of text like this:
+
+   #define TIOCCONS _IO(T, 12)
+
+   and change them to read like this:
+
+   #define TIOCCONS _IO('T', 12)
+
+   which is the required syntax per the C standard.  (The definition of
+   _IO also has to be tweaked - see below.)  'IO' is actually whatever you
+   provide in the STR argument.  */
+void
+fix_char_macro_uses (text, str)
+     const char *text;
+     const char *str;
+{
+  /* This regexp looks for a traditional-syntax #define (# in column 1)
+     of an object-like macro.  */
+  static const char pat[] =
+    "^#[ \t]*define[ \t]+[A-Za-z][A-Za-z0-9]*[ \t]+";
+  static regex_t re;
+
+  regmatch_t rm[1];
+  const char *p, *limit;
+  size_t len = strlen (str);
+
+  compile_re (pat, &re, 1, "macro pattern", "fix_char_macro_uses");
+
+  for (p = text;
+       regexec (&re, p, 1, rm, 0) == 0;
+       p = limit + 1)
+    {
+      /* p + rm[0].rm_eo is the first character of the macro replacement.
+        Find the end of the macro replacement, and the STR we were
+        sent to look for within the replacement.  */
+      p += rm[0].rm_eo;
+      limit = p - 1;
+      do
+       {
+         limit = strchr (limit + 1, '\n');
+         if (!limit)
+           goto done;
+       }
+      while (limit[-1] == '\\');
+
+      do
+       {
+         if (*p == str[0] && !strncmp (p+1, str+1, len-1))
+           goto found;
+       }
+      while (++p < limit - len);
+      /* Hit end of line.  */
+      continue;
+
+    found:
+      /* Found STR on this line.  If the macro needs fixing,
+        the next few chars will be whitespace or uppercase,
+        then an open paren, then a single letter.  */
+      while ((isspace (*p) || isupper (*p)) && p < limit) p++;
+      if (*p++ != '(')
+       continue;
+      if (!isalpha (*p))
+       continue;
+      if (isalnum (p[1]) || p[1] == '_')
+       continue;
+
+      /* Splat all preceding text into the output buffer,
+        quote the character at p, then proceed.  */
+      fwrite (text, 1, p - text, stdout);
+      putchar ('\'');
+      putchar (*p);
+      putchar ('\'');
+      text = p + 1;
+    }
+ done:
+  fputs (text, stdout);
+}
+
+/* Scan the input file for all occurrences of text like this:
+
+   #define _IO(x, y) ('x'<<16+y)
+
+   and change them to read like this:
+
+   #define _IO(x, y) (x<<16+y)
+
+   which is the required syntax per the C standard.  (The uses of _IO
+   also have to be tweaked - see above.)  'IO' is actually whatever
+   you provide in the STR argument.  */
+void
+fix_char_macro_defines (text, str)
+     const char *text;
+     const char *str;
+{
+  /* This regexp looks for any traditional-syntax #define (# in column 1).  */
+  static const char pat[] =
+    "^#[ \t]*define[ \t]+";
+  static regex_t re;
+
+  regmatch_t rm[1];
+  const char *p, *limit;
+  size_t len = strlen (str);
+  char arg;
+
+  compile_re (pat, &re, 1, "macro pattern", "fix_char_macro_defines");
+
+  for (p = text;
+       regexec (&re, p, 1, rm, 0) == 0;
+       p = limit + 1)
+    {
+      /* p + rm[0].rm_eo is the first character of the macro name.
+        Find the end of the macro replacement, and the STR we were
+        sent to look for within the name.  */
+      p += rm[0].rm_eo;
+      limit = p - 1;
+      do
+       {
+         limit = strchr (limit + 1, '\n');
+         if (!limit)
+           goto done;
+       }
+      while (limit[-1] == '\\');
+
+      do
+       {
+         if (*p == str[0] && !strncmp (p+1, str+1, len-1))
+           goto found;
+       }
+      while (isalpha (*p) || isalnum (*p) || *p == '_');
+      /* Hit end of macro name without finding the string.  */
+      continue;
+
+    found:
+      /* Found STR in this macro name.  If the macro needs fixing,
+        there may be a few uppercase letters, then there will be an
+        open paren with _no_ intervening whitespace, and then a
+        single letter.  */
+      while (isupper (*p) && p < limit) p++;
+      if (*p++ != '(')
+       continue;
+      if (!isalpha (*p))
+       continue;
+      if (isalnum (p[1]) || p[1] == '_')
+       continue;
+
+      /* The character at P is the one to look for in the following
+        text.  */
+      arg = *p;
+      p += 2;
+
+      while (p < limit)
+       {
+         if (p[-1] == '\'' && p[0] == arg && p[1] == '\'')
+           {
+             /* Remove the quotes from this use of ARG.  */
+             p--;
+             fwrite (text, 1, p - text, stdout);
+             putchar (arg);
+             p += 3;
+             text = p;
+           }
+         else
+           p++;
+       }
+    }
+ done:
+  fputs (text, stdout);
+}
+
+/* The various prefixes on these macros are handled automatically
+   because the fixers don't care where they start matching.  */
+FIX_PROC_HEAD( IO_use_fix )
+{
+  fix_char_macro_uses (text, "IO");
+}
+FIX_PROC_HEAD( CTRL_use_fix )
+{
+  fix_char_macro_uses (text, "CTRL");
+}
+
+FIX_PROC_HEAD( IO_defn_fix )
+{
+  fix_char_macro_defines (text, "IO");
+}
+FIX_PROC_HEAD( CTRL_defn_fix )
+{
+  fix_char_macro_defines (text, "CTRL");
+}
+
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
 
      test for fix selector
index 809c807b8b759285ad13ae9ac2bca4e474536526..9a9bf9fa10e65434e2f081bfff697a6e00260bf4 100755 (executable)
@@ -6,7 +6,7 @@
 # files which are fixed to work correctly with ANSI C and placed in a
 # directory that GNU C will search.
 #
-# This script contains 112 fixup scripts.
+# This script contains 113 fixup scripts.
 #
 # See README-fixinc for more information.
 #
index c3bdc589363a9de417159d0b0cb1a586c76b68db..64d73679d6375622dafbf8aa97410d5998e92fef 100644 (file)
@@ -5,7 +5,7 @@
  * files which are fixed to work correctly with ANSI C and placed in a
  * directory that GNU C will search.
  *
- * This file contains 112 fixup descriptions.
+ * This file contains 113 fixup descriptions.
  *
  * See README-fixinc for more information.
  *
@@ -1006,8 +1006,23 @@ tSCC zAvoid_BoolList[] =
  *  Machine/OS name selection pattern
  */
 #define apzAvoid_BoolMachs (const char**)NULL
-#define AVOID_BOOL_TEST_CT  0
-#define aAvoid_BoolTests   (tTestDesc*)NULL
+
+/*
+ *  content selection pattern - do fix if pattern found
+ */
+tSCC zAvoid_BoolSelect0[] =
+       "char[ \t]+bool|bool[ \t]+char";
+
+/*
+ *  content bypass pattern - skip fix if pattern found
+ */
+tSCC zAvoid_BoolBypass0[] =
+       "we must use the C\\+\\+ compiler's type";
+
+#define    AVOID_BOOL_TEST_CT  2
+tTestDesc aAvoid_BoolTests[] = {
+  { TT_NEGREP,   zAvoid_BoolBypass0, (regex_t*)NULL },
+  { TT_EGREP,    zAvoid_BoolSelect0, (regex_t*)NULL }, };
 
 /*
  *  Fix Command Arguments for Avoid_Bool
@@ -1215,45 +1230,11 @@ const char* apzBroken_Assert_StdlibPatch[] = { "sed",
 #endif\n",
     (char*)NULL };
 
-/* * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- *  Description of Bsd43_Io_Macros fix
- */
-#define BSD43_IO_MACROS_FIXIDX           27
-tSCC zBsd43_Io_MacrosName[] =
-     "Bsd43_Io_Macros";
-/*
- *  File name selection pattern
- */
-#define zBsd43_Io_MacrosList (char*)NULL
-/*
- *  Machine/OS name selection pattern
- */
-#define apzBsd43_Io_MacrosMachs (const char**)NULL
-
-/*
- *  content selection pattern - do fix if pattern found
- */
-tSCC zBsd43_Io_MacrosSelect0[] =
-       "BSD43__IO";
-
-#define    BSD43_IO_MACROS_TEST_CT  1
-tTestDesc aBsd43_Io_MacrosTests[] = {
-  { TT_EGREP,    zBsd43_Io_MacrosSelect0, (regex_t*)NULL }, };
-
-/*
- *  Fix Command Arguments for Bsd43_Io_Macros
- */
-const char* apzBsd43_Io_MacrosPatch[] = { "sed",
-    "-e", "/[ \t]BSD43__IO[A-Z]*[ \t]*(/s/(\\(.\\),/('\\1',/",
-    "-e", "/#[ \t]*define[ \t]*[ \t]BSD43__IO/s/'\\([cgx]\\)'/\\1/g",
-    (char*)NULL };
-
 /* * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  *  Description of Dec_Intern_Asm fix
  */
-#define DEC_INTERN_ASM_FIXIDX            28
+#define DEC_INTERN_ASM_FIXIDX            27
 tSCC zDec_Intern_AsmName[] =
      "Dec_Intern_Asm";
 /*
@@ -1282,7 +1263,7 @@ const char* apzDec_Intern_AsmPatch[] = { "sed",
  *
  *  Description of No_Double_Slash fix
  */
-#define NO_DOUBLE_SLASH_FIXIDX           29
+#define NO_DOUBLE_SLASH_FIXIDX           28
 tSCC zNo_Double_SlashName[] =
      "No_Double_Slash";
 /*
@@ -1313,7 +1294,7 @@ const char* apzNo_Double_SlashPatch[] = {"no_double_slash",
  *
  *  Description of Ecd_Cursor fix
  */
-#define ECD_CURSOR_FIXIDX                30
+#define ECD_CURSOR_FIXIDX                29
 tSCC zEcd_CursorName[] =
      "Ecd_Cursor";
 /*
@@ -1339,7 +1320,7 @@ const char* apzEcd_CursorPatch[] = { "sed",
  *
  *  Description of Sco5_Stat_Wrappers fix
  */
-#define SCO5_STAT_WRAPPERS_FIXIDX        31
+#define SCO5_STAT_WRAPPERS_FIXIDX        30
 tSCC zSco5_Stat_WrappersName[] =
      "Sco5_Stat_Wrappers";
 /*
@@ -1375,7 +1356,7 @@ extern \"C\"\\\n\
  *
  *  Description of End_Else_Label fix
  */
-#define END_ELSE_LABEL_FIXIDX            32
+#define END_ELSE_LABEL_FIXIDX            31
 tSCC zEnd_Else_LabelName[] =
      "End_Else_Label";
 /*
@@ -1406,7 +1387,7 @@ const char* apzEnd_Else_LabelPatch[] = {"else_endif_label",
  *
  *  Description of Hp_Inline fix
  */
-#define HP_INLINE_FIXIDX                 33
+#define HP_INLINE_FIXIDX                 32
 tSCC zHp_InlineName[] =
      "Hp_Inline";
 /*
@@ -1441,7 +1422,7 @@ const char* apzHp_InlinePatch[] = { "sed",
  *
  *  Description of Hp_Sysfile fix
  */
-#define HP_SYSFILE_FIXIDX                34
+#define HP_SYSFILE_FIXIDX                33
 tSCC zHp_SysfileName[] =
      "Hp_Sysfile";
 /*
@@ -1475,7 +1456,7 @@ const char* apzHp_SysfilePatch[] = { "sed",
  *
  *  Description of Cxx_Unready fix
  */
-#define CXX_UNREADY_FIXIDX               35
+#define CXX_UNREADY_FIXIDX               34
 tSCC zCxx_UnreadyName[] =
      "Cxx_Unready";
 /*
@@ -1517,7 +1498,7 @@ extern \"C\" {\\\n\
  *
  *  Description of Hpux_Maxint fix
  */
-#define HPUX_MAXINT_FIXIDX               36
+#define HPUX_MAXINT_FIXIDX               35
 tSCC zHpux_MaxintName[] =
      "Hpux_Maxint";
 /*
@@ -1546,7 +1527,7 @@ const char* apzHpux_MaxintPatch[] = { "sed",
  *
  *  Description of Hpux_Systime fix
  */
-#define HPUX_SYSTIME_FIXIDX              37
+#define HPUX_SYSTIME_FIXIDX              36
 tSCC zHpux_SystimeName[] =
      "Hpux_Systime";
 /*
@@ -1580,7 +1561,7 @@ const char* apzHpux_SystimePatch[] = { "sed",
  *
  *  Description of Hpux8_Bogus_Inlines fix
  */
-#define HPUX8_BOGUS_INLINES_FIXIDX       38
+#define HPUX8_BOGUS_INLINES_FIXIDX       37
 tSCC zHpux8_Bogus_InlinesName[] =
      "Hpux8_Bogus_Inlines";
 /*
@@ -1617,7 +1598,7 @@ const char* apzHpux8_Bogus_InlinesPatch[] = { "sed",
  *
  *  Description of Hpux11_Uint32_C fix
  */
-#define HPUX11_UINT32_C_FIXIDX           39
+#define HPUX11_UINT32_C_FIXIDX           38
 tSCC zHpux11_Uint32_CName[] =
      "Hpux11_Uint32_C";
 /*
@@ -1651,7 +1632,7 @@ const char* apzHpux11_Uint32_CPatch[] = { "sed",
  *
  *  Description of Isc_Omits_With_Stdc fix
  */
-#define ISC_OMITS_WITH_STDC_FIXIDX       40
+#define ISC_OMITS_WITH_STDC_FIXIDX       39
 tSCC zIsc_Omits_With_StdcName[] =
      "Isc_Omits_With_Stdc";
 /*
@@ -1681,6 +1662,38 @@ const char* apzIsc_Omits_With_StdcPatch[] = { "sed",
     "-e", "s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/!defined(_POSIX_SOURCE)/",
     (char*)NULL };
 
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ *  Description of Io_Use_Quotes fix
+ */
+#define IO_USE_QUOTES_FIXIDX             40
+tSCC zIo_Use_QuotesName[] =
+     "Io_Use_Quotes";
+/*
+ *  File name selection pattern
+ */
+#define zIo_Use_QuotesList (char*)NULL
+/*
+ *  Machine/OS name selection pattern
+ */
+#define apzIo_Use_QuotesMachs (const char**)NULL
+
+/*
+ *  content selection pattern - do fix if pattern found
+ */
+tSCC zIo_Use_QuotesSelect0[] =
+       "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+IO[A-Z]*[ \t]*\\( *[^,']";
+
+#define    IO_USE_QUOTES_TEST_CT  1
+tTestDesc aIo_Use_QuotesTests[] = {
+  { TT_EGREP,    zIo_Use_QuotesSelect0, (regex_t*)NULL }, };
+
+/*
+ *  Fix Command Arguments for Io_Use_Quotes
+ */
+const char* apzIo_Use_QuotesPatch[] = {"IO_use",
+    (char*)NULL };
+
 /* * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  *  Description of Io_Def_Quotes fix
@@ -1701,7 +1714,7 @@ tSCC zIo_Def_QuotesName[] =
  *  content selection pattern - do fix if pattern found
  */
 tSCC zIo_Def_QuotesSelect0[] =
-       "[ \t]*[ \t](_|DES)IO[A-Z]*[ \t]*\\( *[^,']";
+       "define[ \t]+[A-Z0-9_]+IO[A-Z]*\\(([a-zA-Z]).*'\\1'";
 
 #define    IO_DEF_QUOTES_TEST_CT  1
 tTestDesc aIo_Def_QuotesTests[] = {
@@ -1710,56 +1723,78 @@ tTestDesc aIo_Def_QuotesTests[] = {
 /*
  *  Fix Command Arguments for Io_Def_Quotes
  */
-const char* apzIo_Def_QuotesPatch[] = { "sed",
-    "-e", "s/\\([ \t]*[ \t]_IO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/",
-    "-e", "s/\\([ \t]*[ \t]DESIO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/",
-    "-e", "/#[ \t]*define[ \t]*[ \t]_IO/s/'\\([cgxtf]\\)'/\\1/g",
-    "-e", "/#[ \t]*define[ \t]*[ \t]DESIOC/s/'\\([cdgx]\\)'/\\1/g",
+const char* apzIo_Def_QuotesPatch[] = {"IO_defn",
+    (char*)NULL };
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * *
+ *
+ *  Description of Ctrl_Use_Quotes fix
+ */
+#define CTRL_USE_QUOTES_FIXIDX           42
+tSCC zCtrl_Use_QuotesName[] =
+     "Ctrl_Use_Quotes";
+/*
+ *  File name selection pattern
+ */
+#define zCtrl_Use_QuotesList (char*)NULL
+/*
+ *  Machine/OS name selection pattern
+ */
+#define apzCtrl_Use_QuotesMachs (const char**)NULL
+
+/*
+ *  content selection pattern - do fix if pattern found
+ */
+tSCC zCtrl_Use_QuotesSelect0[] =
+       "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+CTRL[ \t]*\\( *[^,']";
+
+#define    CTRL_USE_QUOTES_TEST_CT  1
+tTestDesc aCtrl_Use_QuotesTests[] = {
+  { TT_EGREP,    zCtrl_Use_QuotesSelect0, (regex_t*)NULL }, };
+
+/*
+ *  Fix Command Arguments for Ctrl_Use_Quotes
+ */
+const char* apzCtrl_Use_QuotesPatch[] = {"CTRL_use",
     (char*)NULL };
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * *
  *
- *  Description of Ioctl_Fix_Ctrl fix
+ *  Description of Ctrl_Def_Quotes fix
  */
-#define IOCTL_FIX_CTRL_FIXIDX            42
-tSCC zIoctl_Fix_CtrlName[] =
-     "Ioctl_Fix_Ctrl";
+#define CTRL_DEF_QUOTES_FIXIDX           43
+tSCC zCtrl_Def_QuotesName[] =
+     "Ctrl_Def_Quotes";
 /*
  *  File name selection pattern
  */
-#define zIoctl_Fix_CtrlList (char*)NULL
+#define zCtrl_Def_QuotesList (char*)NULL
 /*
  *  Machine/OS name selection pattern
  */
-#define apzIoctl_Fix_CtrlMachs (const char**)NULL
+#define apzCtrl_Def_QuotesMachs (const char**)NULL
 
 /*
  *  content selection pattern - do fix if pattern found
  */
-tSCC zIoctl_Fix_CtrlSelect0[] =
-       "CTRL[ \t]*\\(";
+tSCC zCtrl_Def_QuotesSelect0[] =
+       "define[ \t]+[A-Z0-9_]+CTRL\\(([a-zA-Z]).*'\\1'";
 
-#define    IOCTL_FIX_CTRL_TEST_CT  1
-tTestDesc aIoctl_Fix_CtrlTests[] = {
-  { TT_EGREP,    zIoctl_Fix_CtrlSelect0, (regex_t*)NULL }, };
+#define    CTRL_DEF_QUOTES_TEST_CT  1
+tTestDesc aCtrl_Def_QuotesTests[] = {
+  { TT_EGREP,    zCtrl_Def_QuotesSelect0, (regex_t*)NULL }, };
 
 /*
- *  Fix Command Arguments for Ioctl_Fix_Ctrl
+ *  Fix Command Arguments for Ctrl_Def_Quotes
  */
-const char* apzIoctl_Fix_CtrlPatch[] = { "sed",
-    "-e", "/[^A-Z0-9_]CTRL[ \t]*(/s/\\([^']\\))/'\\1')/",
-    "-e", "/[^A-Z0-9]_CTRL[ \t]*(/s/\\([^']\\))/'\\1')/",
-    "-e", "/#[ \t]*define[ \t]*[ \t]CTRL/s/'\\([cgx]\\)'/\\1/g",
-    "-e", "/#[ \t]*define[ \t]*[ \t]_CTRL/s/'\\([cgx]\\)'/\\1/g",
-    "-e", "/#[ \t]*define[ \t]*[ \t]BSD43_CTRL/s/'\\([cgx]\\)'/\\1/g",
-    "-e", "/#[ \t]*define[ \t]*[ \t][_]*ISCTRL/s/'\\([cgx]\\)'/\\1/g",
+const char* apzCtrl_Def_QuotesPatch[] = {"CTRL_defn",
     (char*)NULL };
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * *
  *
  *  Description of Ip_Missing_Semi fix
  */
-#define IP_MISSING_SEMI_FIXIDX           43
+#define IP_MISSING_SEMI_FIXIDX           44
 tSCC zIp_Missing_SemiName[] =
      "Ip_Missing_Semi";
 /*
@@ -1793,7 +1828,7 @@ const char* apzIp_Missing_SemiPatch[] = { "sed",
  *
  *  Description of Irix_Multiline_Cmnt fix
  */
-#define IRIX_MULTILINE_CMNT_FIXIDX       44
+#define IRIX_MULTILINE_CMNT_FIXIDX       45
 tSCC zIrix_Multiline_CmntName[] =
      "Irix_Multiline_Cmnt";
 /*
@@ -1820,7 +1855,7 @@ const char* apzIrix_Multiline_CmntPatch[] = { "sed",
  *
  *  Description of Irix_Sockaddr fix
  */
-#define IRIX_SOCKADDR_FIXIDX             45
+#define IRIX_SOCKADDR_FIXIDX             46
 tSCC zIrix_SockaddrName[] =
      "Irix_Sockaddr";
 /*
@@ -1855,7 +1890,7 @@ struct sockaddr;\n",
  *
  *  Description of Irix_Struct__File fix
  */
-#define IRIX_STRUCT__FILE_FIXIDX         46
+#define IRIX_STRUCT__FILE_FIXIDX         47
 tSCC zIrix_Struct__FileName[] =
      "Irix_Struct__File";
 /*
@@ -1882,7 +1917,7 @@ struct __file_s;\n",
  *
  *  Description of Irix_Asm_Apostrophe fix
  */
-#define IRIX_ASM_APOSTROPHE_FIXIDX       47
+#define IRIX_ASM_APOSTROPHE_FIXIDX       48
 tSCC zIrix_Asm_ApostropheName[] =
      "Irix_Asm_Apostrophe";
 /*
@@ -1916,7 +1951,7 @@ const char* apzIrix_Asm_ApostrophePatch[] = { "sed",
  *
  *  Description of Isc_Fmod fix
  */
-#define ISC_FMOD_FIXIDX                  48
+#define ISC_FMOD_FIXIDX                  49
 tSCC zIsc_FmodName[] =
      "Isc_Fmod";
 /*
@@ -1950,7 +1985,7 @@ const char* apzIsc_FmodPatch[] = { "sed",
  *
  *  Description of Motorola_Nested fix
  */
-#define MOTOROLA_NESTED_FIXIDX           49
+#define MOTOROLA_NESTED_FIXIDX           50
 tSCC zMotorola_NestedName[] =
      "Motorola_Nested";
 /*
@@ -1979,7 +2014,7 @@ const char* apzMotorola_NestedPatch[] = { "sed",
  *
  *  Description of Isc_Sys_Limits fix
  */
-#define ISC_SYS_LIMITS_FIXIDX            50
+#define ISC_SYS_LIMITS_FIXIDX            51
 tSCC zIsc_Sys_LimitsName[] =
      "Isc_Sys_Limits";
 /*
@@ -2014,7 +2049,7 @@ const char* apzIsc_Sys_LimitsPatch[] = { "sed",
  *
  *  Description of Kandr_Concat fix
  */
-#define KANDR_CONCAT_FIXIDX              51
+#define KANDR_CONCAT_FIXIDX              52
 tSCC zKandr_ConcatName[] =
      "Kandr_Concat";
 /*
@@ -2048,7 +2083,7 @@ const char* apzKandr_ConcatPatch[] = { "sed",
  *
  *  Description of Limits_Ifndefs fix
  */
-#define LIMITS_IFNDEFS_FIXIDX            52
+#define LIMITS_IFNDEFS_FIXIDX            53
 tSCC zLimits_IfndefsName[] =
      "Limits_Ifndefs";
 /*
@@ -2106,7 +2141,7 @@ const char* apzLimits_IfndefsPatch[] = { "sed",
  *
  *  Description of Lynx_Void_Int fix
  */
-#define LYNX_VOID_INT_FIXIDX             53
+#define LYNX_VOID_INT_FIXIDX             54
 tSCC zLynx_Void_IntName[] =
      "Lynx_Void_Int";
 /*
@@ -2140,7 +2175,7 @@ const char* apzLynx_Void_IntPatch[] = { "sed",
  *
  *  Description of Lynxos_Fcntl_Proto fix
  */
-#define LYNXOS_FCNTL_PROTO_FIXIDX        54
+#define LYNXOS_FCNTL_PROTO_FIXIDX        55
 tSCC zLynxos_Fcntl_ProtoName[] =
      "Lynxos_Fcntl_Proto";
 /*
@@ -2174,7 +2209,7 @@ const char* apzLynxos_Fcntl_ProtoPatch[] = { "sed",
  *
  *  Description of M88k_Bad_Hypot_Opt fix
  */
-#define M88K_BAD_HYPOT_OPT_FIXIDX        55
+#define M88K_BAD_HYPOT_OPT_FIXIDX        56
 tSCC zM88k_Bad_Hypot_OptName[] =
      "M88k_Bad_Hypot_Opt";
 /*
@@ -2215,7 +2250,7 @@ static __inline__ double fake_hypot (x, y)\\\n\
  *
  *  Description of M88k_Bad_S_If fix
  */
-#define M88K_BAD_S_IF_FIXIDX             56
+#define M88K_BAD_S_IF_FIXIDX             57
 tSCC zM88k_Bad_S_IfName[] =
      "M88k_Bad_S_If";
 /*
@@ -2252,7 +2287,7 @@ const char* apzM88k_Bad_S_IfPatch[] = { "sed",
  *
  *  Description of M88k_Multi_Incl fix
  */
-#define M88K_MULTI_INCL_FIXIDX           57
+#define M88K_MULTI_INCL_FIXIDX           58
 tSCC zM88k_Multi_InclName[] =
      "M88k_Multi_Incl";
 /*
@@ -2293,7 +2328,7 @@ const char* apzM88k_Multi_InclPatch[] = { "sh", "-c",
  *
  *  Description of Machine_Name fix
  */
-#define MACHINE_NAME_FIXIDX              58
+#define MACHINE_NAME_FIXIDX              59
 tSCC zMachine_NameName[] =
      "Machine_Name";
 /*
@@ -2362,7 +2397,7 @@ s/\\\\+++fixinc_eol+++/\\\\/g\n\
  *
  *  Description of Math_Exception fix
  */
-#define MATH_EXCEPTION_FIXIDX            59
+#define MATH_EXCEPTION_FIXIDX            60
 tSCC zMath_ExceptionName[] =
      "Math_Exception";
 /*
@@ -2385,7 +2420,7 @@ tSCC zMath_ExceptionSelect0[] =
  *  content bypass pattern - skip fix if pattern found
  */
 tSCC zMath_ExceptionBypass0[] =
-       "We have a problem when using C++";
+       "We have a problem when using C\\+\\+";
 
 #define    MATH_EXCEPTION_TEST_CT  2
 tTestDesc aMath_ExceptionTests[] = {
@@ -2410,7 +2445,7 @@ const char* apzMath_ExceptionPatch[] = { "sed",
  *
  *  Description of Math_Huge_Val_From_Dbl_Max fix
  */
-#define MATH_HUGE_VAL_FROM_DBL_MAX_FIXIDX 60
+#define MATH_HUGE_VAL_FROM_DBL_MAX_FIXIDX 61
 tSCC zMath_Huge_Val_From_Dbl_MaxName[] =
      "Math_Huge_Val_From_Dbl_Max";
 /*
@@ -2456,7 +2491,7 @@ const char* apzMath_Huge_Val_From_Dbl_MaxPatch[] = { "sh", "-c",
  *
  *  Description of Math_Huge_Val_Ifndef fix
  */
-#define MATH_HUGE_VAL_IFNDEF_FIXIDX      61
+#define MATH_HUGE_VAL_IFNDEF_FIXIDX      62
 tSCC zMath_Huge_Val_IfndefName[] =
      "Math_Huge_Val_Ifndef";
 /*
@@ -2493,7 +2528,7 @@ const char* apzMath_Huge_Val_IfndefPatch[] = { "sed",
  *
  *  Description of Nested_Comment fix
  */
-#define NESTED_COMMENT_FIXIDX            62
+#define NESTED_COMMENT_FIXIDX            63
 tSCC zNested_CommentName[] =
      "Nested_Comment";
 /*
@@ -2519,7 +2554,7 @@ const char* apzNested_CommentPatch[] = { "sed",
  *
  *  Description of News_Os_Recursion fix
  */
-#define NEWS_OS_RECURSION_FIXIDX         63
+#define NEWS_OS_RECURSION_FIXIDX         64
 tSCC zNews_Os_RecursionName[] =
      "News_Os_Recursion";
 /*
@@ -2556,7 +2591,7 @@ const char* apzNews_Os_RecursionPatch[] = { "sed",
  *
  *  Description of Next_Math_Prefix fix
  */
-#define NEXT_MATH_PREFIX_FIXIDX          64
+#define NEXT_MATH_PREFIX_FIXIDX          65
 tSCC zNext_Math_PrefixName[] =
      "Next_Math_Prefix";
 /*
@@ -2594,7 +2629,7 @@ const char* apzNext_Math_PrefixPatch[] = { "sed",
  *
  *  Description of Next_Template fix
  */
-#define NEXT_TEMPLATE_FIXIDX             65
+#define NEXT_TEMPLATE_FIXIDX             66
 tSCC zNext_TemplateName[] =
      "Next_Template";
 /*
@@ -2629,7 +2664,7 @@ const char* apzNext_TemplatePatch[] = { "sed",
  *
  *  Description of Next_Volitile fix
  */
-#define NEXT_VOLITILE_FIXIDX             66
+#define NEXT_VOLITILE_FIXIDX             67
 tSCC zNext_VolitileName[] =
      "Next_Volitile";
 /*
@@ -2664,7 +2699,7 @@ const char* apzNext_VolitilePatch[] = { "sed",
  *
  *  Description of Next_Wait_Union fix
  */
-#define NEXT_WAIT_UNION_FIXIDX           67
+#define NEXT_WAIT_UNION_FIXIDX           68
 tSCC zNext_Wait_UnionName[] =
      "Next_Wait_Union";
 /*
@@ -2698,7 +2733,7 @@ const char* apzNext_Wait_UnionPatch[] = { "sed",
  *
  *  Description of Nodeent_Syntax fix
  */
-#define NODEENT_SYNTAX_FIXIDX            68
+#define NODEENT_SYNTAX_FIXIDX            69
 tSCC zNodeent_SyntaxName[] =
      "Nodeent_Syntax";
 /*
@@ -2724,7 +2759,7 @@ const char* apzNodeent_SyntaxPatch[] = { "sed",
  *
  *  Description of Osf_Namespace_A fix
  */
-#define OSF_NAMESPACE_A_FIXIDX           69
+#define OSF_NAMESPACE_A_FIXIDX           70
 tSCC zOsf_Namespace_AName[] =
      "Osf_Namespace_A";
 /*
@@ -2769,7 +2804,7 @@ const char* apzOsf_Namespace_APatch[] = { "sed",
  *
  *  Description of Osf_Namespace_B fix
  */
-#define OSF_NAMESPACE_B_FIXIDX           70
+#define OSF_NAMESPACE_B_FIXIDX           71
 tSCC zOsf_Namespace_BName[] =
      "Osf_Namespace_B";
 /*
@@ -2815,7 +2850,7 @@ typedef __regmatch_t\tregmatch_t;\n",
  *
  *  Description of Pthread_Page_Size fix
  */
-#define PTHREAD_PAGE_SIZE_FIXIDX         71
+#define PTHREAD_PAGE_SIZE_FIXIDX         72
 tSCC zPthread_Page_SizeName[] =
      "Pthread_Page_Size";
 /*
@@ -2849,7 +2884,7 @@ const char* apzPthread_Page_SizePatch[] = { "sed",
  *
  *  Description of Read_Ret_Type fix
  */
-#define READ_RET_TYPE_FIXIDX             72
+#define READ_RET_TYPE_FIXIDX             73
 tSCC zRead_Ret_TypeName[] =
      "Read_Ret_Type";
 /*
@@ -2884,7 +2919,7 @@ const char* apzRead_Ret_TypePatch[] = { "sed",
  *
  *  Description of Rs6000_Double fix
  */
-#define RS6000_DOUBLE_FIXIDX             73
+#define RS6000_DOUBLE_FIXIDX             74
 tSCC zRs6000_DoubleName[] =
      "Rs6000_Double";
 /*
@@ -2921,7 +2956,7 @@ const char* apzRs6000_DoublePatch[] = { "sed",
  *
  *  Description of Rs6000_Fchmod fix
  */
-#define RS6000_FCHMOD_FIXIDX             74
+#define RS6000_FCHMOD_FIXIDX             75
 tSCC zRs6000_FchmodName[] =
      "Rs6000_Fchmod";
 /*
@@ -2955,7 +2990,7 @@ const char* apzRs6000_FchmodPatch[] = { "sed",
  *
  *  Description of Rs6000_Param fix
  */
-#define RS6000_PARAM_FIXIDX              75
+#define RS6000_PARAM_FIXIDX              76
 tSCC zRs6000_ParamName[] =
      "Rs6000_Param";
 /*
@@ -2989,7 +3024,7 @@ const char* apzRs6000_ParamPatch[] = { "sed",
  *
  *  Description of Sony_Include fix
  */
-#define SONY_INCLUDE_FIXIDX              76
+#define SONY_INCLUDE_FIXIDX              77
 tSCC zSony_IncludeName[] =
      "Sony_Include";
 /*
@@ -3023,7 +3058,7 @@ const char* apzSony_IncludePatch[] = { "sed",
  *
  *  Description of Statsswtch fix
  */
-#define STATSSWTCH_FIXIDX                77
+#define STATSSWTCH_FIXIDX                78
 tSCC zStatsswtchName[] =
      "Statsswtch";
 /*
@@ -3057,7 +3092,7 @@ const char* apzStatsswtchPatch[] = { "sed",
  *
  *  Description of Stdio_Va_List fix
  */
-#define STDIO_VA_LIST_FIXIDX             78
+#define STDIO_VA_LIST_FIXIDX             79
 tSCC zStdio_Va_ListName[] =
      "Stdio_Va_List";
 /*
@@ -3108,7 +3143,7 @@ const char* apzStdio_Va_ListPatch[] = { "sh", "-c",
  *
  *  Description of Sun_Bogus_Ifdef fix
  */
-#define SUN_BOGUS_IFDEF_FIXIDX           79
+#define SUN_BOGUS_IFDEF_FIXIDX           80
 tSCC zSun_Bogus_IfdefName[] =
      "Sun_Bogus_Ifdef";
 /*
@@ -3142,7 +3177,7 @@ const char* apzSun_Bogus_IfdefPatch[] = { "sed",
  *
  *  Description of Sun_Bogus_Ifdef_Sun4c fix
  */
-#define SUN_BOGUS_IFDEF_SUN4C_FIXIDX     80
+#define SUN_BOGUS_IFDEF_SUN4C_FIXIDX     81
 tSCC zSun_Bogus_Ifdef_Sun4cName[] =
      "Sun_Bogus_Ifdef_Sun4c";
 /*
@@ -3176,7 +3211,7 @@ const char* apzSun_Bogus_Ifdef_Sun4cPatch[] = { "sed",
  *
  *  Description of Sun_Catmacro fix
  */
-#define SUN_CATMACRO_FIXIDX              81
+#define SUN_CATMACRO_FIXIDX              82
 tSCC zSun_CatmacroName[] =
      "Sun_Catmacro";
 /*
@@ -3215,7 +3250,7 @@ const char* apzSun_CatmacroPatch[] = { "sed",
  *
  *  Description of Sun_Malloc fix
  */
-#define SUN_MALLOC_FIXIDX                82
+#define SUN_MALLOC_FIXIDX                83
 tSCC zSun_MallocName[] =
      "Sun_Malloc";
 /*
@@ -3244,7 +3279,7 @@ const char* apzSun_MallocPatch[] = { "sed",
  *
  *  Description of Sun_Rusers_Semi fix
  */
-#define SUN_RUSERS_SEMI_FIXIDX           83
+#define SUN_RUSERS_SEMI_FIXIDX           84
 tSCC zSun_Rusers_SemiName[] =
      "Sun_Rusers_Semi";
 /*
@@ -3278,7 +3313,7 @@ const char* apzSun_Rusers_SemiPatch[] = { "sed",
  *
  *  Description of Sun_Signal fix
  */
-#define SUN_SIGNAL_FIXIDX                84
+#define SUN_SIGNAL_FIXIDX                85
 tSCC zSun_SignalName[] =
      "Sun_Signal";
 /*
@@ -3317,7 +3352,7 @@ void\t(*signal(...))(...);\\\n\
  *
  *  Description of Sun_Auth_Proto fix
  */
-#define SUN_AUTH_PROTO_FIXIDX            85
+#define SUN_AUTH_PROTO_FIXIDX            86
 tSCC zSun_Auth_ProtoName[] =
      "Sun_Auth_Proto";
 /*
@@ -3356,7 +3391,7 @@ const char* apzSun_Auth_ProtoPatch[] = { "sed",
  *
  *  Description of Sunos_Matherr_Decl fix
  */
-#define SUNOS_MATHERR_DECL_FIXIDX        86
+#define SUNOS_MATHERR_DECL_FIXIDX        87
 tSCC zSunos_Matherr_DeclName[] =
      "Sunos_Matherr_Decl";
 /*
@@ -3392,7 +3427,7 @@ struct exception;\n",
  *
  *  Description of Sunos_Strlen fix
  */
-#define SUNOS_STRLEN_FIXIDX              87
+#define SUNOS_STRLEN_FIXIDX              88
 tSCC zSunos_StrlenName[] =
      "Sunos_Strlen";
 /*
@@ -3426,7 +3461,7 @@ const char* apzSunos_StrlenPatch[] = { "sed",
  *
  *  Description of Systypes fix
  */
-#define SYSTYPES_FIXIDX                  88
+#define SYSTYPES_FIXIDX                  89
 tSCC zSystypesName[] =
      "Systypes";
 /*
@@ -3484,7 +3519,7 @@ typedef __SIZE_TYPE__ size_t;\\\n\
  *
  *  Description of Systypes_For_Aix fix
  */
-#define SYSTYPES_FOR_AIX_FIXIDX          89
+#define SYSTYPES_FOR_AIX_FIXIDX          90
 tSCC zSystypes_For_AixName[] =
      "Systypes_For_Aix";
 /*
@@ -3529,7 +3564,7 @@ const char* apzSystypes_For_AixPatch[] = { "sed",
  *
  *  Description of Sysv68_String fix
  */
-#define SYSV68_STRING_FIXIDX             90
+#define SYSV68_STRING_FIXIDX             91
 tSCC zSysv68_StringName[] =
      "Sysv68_String";
 /*
@@ -3565,7 +3600,7 @@ extern unsigned int\\\n\
  *
  *  Description of Sysz_Stdlib_For_Sun fix
  */
-#define SYSZ_STDLIB_FOR_SUN_FIXIDX       91
+#define SYSZ_STDLIB_FOR_SUN_FIXIDX       92
 tSCC zSysz_Stdlib_For_SunName[] =
      "Sysz_Stdlib_For_Sun";
 /*
@@ -3602,7 +3637,7 @@ const char* apzSysz_Stdlib_For_SunPatch[] = { "sed",
  *
  *  Description of Sysz_Stdtypes_For_Sun fix
  */
-#define SYSZ_STDTYPES_FOR_SUN_FIXIDX     92
+#define SYSZ_STDTYPES_FOR_SUN_FIXIDX     93
 tSCC zSysz_Stdtypes_For_SunName[] =
      "Sysz_Stdtypes_For_Sun";
 /*
@@ -3642,7 +3677,7 @@ const char* apzSysz_Stdtypes_For_SunPatch[] = { "sed",
  *
  *  Description of Tinfo_Cplusplus fix
  */
-#define TINFO_CPLUSPLUS_FIXIDX           93
+#define TINFO_CPLUSPLUS_FIXIDX           94
 tSCC zTinfo_CplusplusName[] =
      "Tinfo_Cplusplus";
 /*
@@ -3676,7 +3711,7 @@ const char* apzTinfo_CplusplusPatch[] = { "sed",
  *
  *  Description of Ultrix_Fix_Fixproto fix
  */
-#define ULTRIX_FIX_FIXPROTO_FIXIDX       94
+#define ULTRIX_FIX_FIXPROTO_FIXIDX       95
 tSCC zUltrix_Fix_FixprotoName[] =
      "Ultrix_Fix_Fixproto";
 /*
@@ -3711,7 +3746,7 @@ struct utsname;\n",
  *
  *  Description of Ultrix_Atof_Param fix
  */
-#define ULTRIX_ATOF_PARAM_FIXIDX         95
+#define ULTRIX_ATOF_PARAM_FIXIDX         96
 tSCC zUltrix_Atof_ParamName[] =
      "Ultrix_Atof_Param";
 /*
@@ -3745,7 +3780,7 @@ const char* apzUltrix_Atof_ParamPatch[] = { "sed",
  *
  *  Description of Ultrix_Const fix
  */
-#define ULTRIX_CONST_FIXIDX              96
+#define ULTRIX_CONST_FIXIDX              97
 tSCC zUltrix_ConstName[] =
      "Ultrix_Const";
 /*
@@ -3779,7 +3814,7 @@ const char* apzUltrix_ConstPatch[] = { "sed",
  *
  *  Description of Ultrix_Ifdef fix
  */
-#define ULTRIX_IFDEF_FIXIDX              97
+#define ULTRIX_IFDEF_FIXIDX              98
 tSCC zUltrix_IfdefName[] =
      "Ultrix_Ifdef";
 /*
@@ -3813,7 +3848,7 @@ const char* apzUltrix_IfdefPatch[] = { "sed",
  *
  *  Description of Ultrix_Nested_Cmnt fix
  */
-#define ULTRIX_NESTED_CMNT_FIXIDX        98
+#define ULTRIX_NESTED_CMNT_FIXIDX        99
 tSCC zUltrix_Nested_CmntName[] =
      "Ultrix_Nested_Cmnt";
 /*
@@ -3839,7 +3874,7 @@ const char* apzUltrix_Nested_CmntPatch[] = { "sed",
  *
  *  Description of Ultrix_Static fix
  */
-#define ULTRIX_STATIC_FIXIDX             99
+#define ULTRIX_STATIC_FIXIDX             100
 tSCC zUltrix_StaticName[] =
      "Ultrix_Static";
 /*
@@ -3875,7 +3910,7 @@ const char* apzUltrix_StaticPatch[] = { "sed",
  *
  *  Description of Undefine_Null fix
  */
-#define UNDEFINE_NULL_FIXIDX             100
+#define UNDEFINE_NULL_FIXIDX             101
 tSCC zUndefine_NullName[] =
      "Undefine_Null";
 /*
@@ -3916,7 +3951,7 @@ const char* apzUndefine_NullPatch[] = { "sed",
  *
  *  Description of Unixware7_Byteorder_Fix fix
  */
-#define UNIXWARE7_BYTEORDER_FIX_FIXIDX   101
+#define UNIXWARE7_BYTEORDER_FIX_FIXIDX   102
 tSCC zUnixware7_Byteorder_FixName[] =
      "Unixware7_Byteorder_Fix";
 /*
@@ -3958,7 +3993,7 @@ const char* apzUnixware7_Byteorder_FixPatch[] = { "sed",
  *
  *  Description of Va_I960_Macro fix
  */
-#define VA_I960_MACRO_FIXIDX             102
+#define VA_I960_MACRO_FIXIDX             103
 tSCC zVa_I960_MacroName[] =
      "Va_I960_Macro";
 /*
@@ -3995,7 +4030,7 @@ const char* apzVa_I960_MacroPatch[] = { "sed",
  *
  *  Description of Void_Null fix
  */
-#define VOID_NULL_FIXIDX                 103
+#define VOID_NULL_FIXIDX                 104
 tSCC zVoid_NullName[] =
      "Void_Null";
 /*
@@ -4029,7 +4064,7 @@ const char* apzVoid_NullPatch[] = { "sed",
  *
  *  Description of Vxworks_Gcc_Problem fix
  */
-#define VXWORKS_GCC_PROBLEM_FIXIDX       104
+#define VXWORKS_GCC_PROBLEM_FIXIDX       105
 tSCC zVxworks_Gcc_ProblemName[] =
      "Vxworks_Gcc_Problem";
 /*
@@ -4078,7 +4113,7 @@ const char* apzVxworks_Gcc_ProblemPatch[] = { "sed",
  *
  *  Description of Vxworks_Needs_Vxtypes fix
  */
-#define VXWORKS_NEEDS_VXTYPES_FIXIDX     105
+#define VXWORKS_NEEDS_VXTYPES_FIXIDX     106
 tSCC zVxworks_Needs_VxtypesName[] =
      "Vxworks_Needs_Vxtypes";
 /*
@@ -4112,7 +4147,7 @@ const char* apzVxworks_Needs_VxtypesPatch[] = { "sed",
  *
  *  Description of Vxworks_Needs_Vxworks fix
  */
-#define VXWORKS_NEEDS_VXWORKS_FIXIDX     106
+#define VXWORKS_NEEDS_VXWORKS_FIXIDX     107
 tSCC zVxworks_Needs_VxworksName[] =
      "Vxworks_Needs_Vxworks";
 /*
@@ -4160,7 +4195,7 @@ const char* apzVxworks_Needs_VxworksPatch[] = { "sed",
  *
  *  Description of Vxworks_Time fix
  */
-#define VXWORKS_TIME_FIXIDX              107
+#define VXWORKS_TIME_FIXIDX              108
 tSCC zVxworks_TimeName[] =
      "Vxworks_Time";
 /*
@@ -4210,7 +4245,7 @@ typedef void (*__gcc_VOIDFUNCPTR) ();\\\n\
  *
  *  Description of X11_Class fix
  */
-#define X11_CLASS_FIXIDX                 108
+#define X11_CLASS_FIXIDX                 109
 tSCC zX11_ClassName[] =
      "X11_Class";
 /*
@@ -4249,7 +4284,7 @@ const char* apzX11_ClassPatch[] = { "sed",
  *
  *  Description of X11_Class_Usage fix
  */
-#define X11_CLASS_USAGE_FIXIDX           109
+#define X11_CLASS_USAGE_FIXIDX           110
 tSCC zX11_Class_UsageName[] =
      "X11_Class_Usage";
 /*
@@ -4283,7 +4318,7 @@ const char* apzX11_Class_UsagePatch[] = { "sed",
  *
  *  Description of X11_New fix
  */
-#define X11_NEW_FIXIDX                   110
+#define X11_NEW_FIXIDX                   111
 tSCC zX11_NewName[] =
      "X11_New";
 /*
@@ -4323,7 +4358,7 @@ const char* apzX11_NewPatch[] = { "sed",
  *
  *  Description of X11_Sprintf fix
  */
-#define X11_SPRINTF_FIXIDX               111
+#define X11_SPRINTF_FIXIDX               112
 tSCC zX11_SprintfName[] =
      "X11_Sprintf";
 /*
@@ -4359,9 +4394,9 @@ extern char *\tsprintf();\\\n\
  *
  *  List of all fixes
  */
-#define REGEX_COUNT          105
+#define REGEX_COUNT          108
 #define MACH_LIST_SIZE_LIMIT 279
-#define FIX_COUNT            112
+#define FIX_COUNT            113
 
 tFixDesc fixDescList[ FIX_COUNT ] = {
   {  zAaa_Ki_IfaceName,    zAaa_Ki_IfaceList,
@@ -4499,11 +4534,6 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
      BROKEN_ASSERT_STDLIB_TEST_CT, FD_MACH_ONLY,
      aBroken_Assert_StdlibTests,   apzBroken_Assert_StdlibPatch },
 
-  {  zBsd43_Io_MacrosName,    zBsd43_Io_MacrosList,
-     apzBsd43_Io_MacrosMachs, (regex_t*)NULL,
-     BSD43_IO_MACROS_TEST_CT, FD_MACH_ONLY,
-     aBsd43_Io_MacrosTests,   apzBsd43_Io_MacrosPatch },
-
   {  zDec_Intern_AsmName,    zDec_Intern_AsmList,
      apzDec_Intern_AsmMachs, (regex_t*)NULL,
      DEC_INTERN_ASM_TEST_CT, FD_MACH_ONLY,
@@ -4569,15 +4599,25 @@ tFixDesc fixDescList[ FIX_COUNT ] = {
      ISC_OMITS_WITH_STDC_TEST_CT, FD_MACH_ONLY,
      aIsc_Omits_With_StdcTests,   apzIsc_Omits_With_StdcPatch },
 
+  {  zIo_Use_QuotesName,    zIo_Use_QuotesList,
+     apzIo_Use_QuotesMachs, (regex_t*)NULL,
+     IO_USE_QUOTES_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+     aIo_Use_QuotesTests,   apzIo_Use_QuotesPatch },
+
   {  zIo_Def_QuotesName,    zIo_Def_QuotesList,
      apzIo_Def_QuotesMachs, (regex_t*)NULL,
-     IO_DEF_QUOTES_TEST_CT, FD_MACH_ONLY,
+     IO_DEF_QUOTES_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
      aIo_Def_QuotesTests,   apzIo_Def_QuotesPatch },
 
-  {  zIoctl_Fix_CtrlName,    zIoctl_Fix_CtrlList,
-     apzIoctl_Fix_CtrlMachs, (regex_t*)NULL,
-     IOCTL_FIX_CTRL_TEST_CT, FD_MACH_ONLY,
-     aIoctl_Fix_CtrlTests,   apzIoctl_Fix_CtrlPatch },
+  {  zCtrl_Use_QuotesName,    zCtrl_Use_QuotesList,
+     apzCtrl_Use_QuotesMachs, (regex_t*)NULL,
+     CTRL_USE_QUOTES_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+     aCtrl_Use_QuotesTests,   apzCtrl_Use_QuotesPatch },
+
+  {  zCtrl_Def_QuotesName,    zCtrl_Def_QuotesList,
+     apzCtrl_Def_QuotesMachs, (regex_t*)NULL,
+     CTRL_DEF_QUOTES_TEST_CT, FD_MACH_ONLY | FD_SUBROUTINE,
+     aCtrl_Def_QuotesTests,   apzCtrl_Def_QuotesPatch },
 
   {  zIp_Missing_SemiName,    zIp_Missing_SemiList,
      apzIp_Missing_SemiMachs, (regex_t*)NULL,
index 190f49db03f92ff341ab8cd069c1aa711a842b40..40d2bbb84c317f51a51e56a7e33190d56fbee75b 100644 (file)
@@ -112,43 +112,27 @@ is_cxx_header (fname, text)
         }
     } not_cxx_name:;
 
-  /* Or it might contain the phrase 'extern "C++"' */
-  for (;;)
+  /* Or it might contain one of several phrases which indicate C++ code.
+     Currently recognized are:
+     extern "C++"
+     -*- (Mode: )? C++ -*-   (emacs mode marker)
+     template <
+   */
     {
-      tSCC zExtern[]   = "extern";
-      tSCC zExtCxx[]   = "\"C++\"";
-      tSCC zTemplate[] = "template";
-
-      switch (*(text++))
-        {
-        case 'e':
-          /*  Check for "extern \"C++\"" */
-          if (strncmp (text, zExtern+1, sizeof( zExtern )-2) != 0)
-            break;
-          text += sizeof( zExtern )-2;
-          if (! isspace( *(text++)) )
-            break;
-          while (isspace( *text ))  text++;
-          if (strncmp (text, zExtCxx, sizeof (zExtCxx) -1) == 0)
-            return BOOL_TRUE;
-          break;
-
-        case 't':
-          /*  Check for "template<" */
-          if (strncmp (text, zTemplate+1, sizeof( zTemplate )-2) != 0)
-            break;
-          text += sizeof( zTemplate )-2;
-          while (isspace( *text ))  text++;
-          if (*text == '<')
-            return BOOL_TRUE;
-          break;
-
-        case NUL:
-          goto text_done;
-          break;
-        }
-    } text_done:;
-
+      tSCC cxxpat[] = "\
+extern[ \t]*\"C\\+\\+\"|\
+-\\*-[ \t]*([mM]ode:[ \t]*)?[cC]\\+\\+[; \t]*-\\*-|\
+template[ \t]*<";
+      static regex_t cxxre;
+      static int compiled;
+
+      if (!compiled)
+       compile_re (cxxpat, &cxxre, 0, "contents check", "is_cxx_header");
+
+      if (regexec (&cxxre, text, 0, 0, 0) == 0)
+       return BOOL_TRUE;
+    }
+                  
   return BOOL_FALSE;
 }
 
index 941b1ee18155579a261ca9d24d8e24244ac4bf47..22fea350fd268febd087614366779272d37f30d4 100644 (file)
@@ -153,9 +153,9 @@ TEST_FOR_FIX_PROC_HEAD( else_endif_label_test )
   static regex_t label_re;
 
   char ch;
-  tCC* pz_next = (char*)NULL;
+  tCC* pz_next;
+  tCC* all_text = text;
   regmatch_t match[2];
-  t_bool file_is_cxx = is_cxx_header( fname, text );
 
   /*
      This routine may be run many times within a single execution.
@@ -170,20 +170,14 @@ TEST_FOR_FIX_PROC_HEAD( else_endif_label_test )
 
   for (;;) /* entire file */
     {
-      /*
-        See if we need to advance to the next candidate directive
-        If the scanning pointer passes over the end of the directive,
-        then the directive is inside a comment */
-      if (pz_next < text)
-        {
-          if (regexec (&label_re, text, 2, match, 0) != 0)
-            break;
-          pz_next = text + match[0].rm_eo;
-        }
-
-      /*
-        IF the scan pointer has not reached the directive end, ... */
-      if (pz_next > text)
+      /* Find the next else or endif in the file.  */
+      if (regexec (&label_re, text, 2, match, 0) != 0)
+       break;
+      pz_next = text + match[0].rm_eo;
+
+      /* Scan from where we are up to that position, to make sure
+        we didn't find something in a string or comment.  */
+      while (pz_next > text)
         {
           /*
             Advance the scanning pointer.  If we are at the start
@@ -209,34 +203,23 @@ TEST_FOR_FIX_PROC_HEAD( else_endif_label_test )
             case '\'':
               text = skip_quote( ch, text );
               break;
-            } /* switch (ch) */
-          continue;
-        } /* if (still shy of directive end) */
+            }
+        }
+      if (pz_next < text)
+       continue;
 
-      /*
-         The scanning pointer (text) has reached the end of the current
-         directive under test, then check for bogons here */
-      for (;;) /* bogon check */
+      /* We're at the end of a real directive.  Check for bogons here.  */
+      for (;;)
         {
           char ch = *(pz_next++);
-          if (isspace (ch))
-            {
-              if (ch == '\n')
-                {
-                  /*
-                    It is clean.  No bogons on this directive */
-                  text = pz_next;
-                  pz_next = (char*)NULL; /* force a new regex search */
-                  break;
-                }
-              continue;
-            }
+         switch (ch)
+           {
+           case '\n':
+             /* It is clean.  No bogons on this directive.  */
+             goto next_directive;
 
-          switch (ch)
-            {
             case '\\':
-              /*
-                Skip escaped newlines.  Otherwise, we have a bogon */
+              /* Skip escaped newlines.  Otherwise, we have a bogon.  */
               if (*pz_next != '\n')
                 return APPLY_FIX;
 
@@ -244,47 +227,48 @@ TEST_FOR_FIX_PROC_HEAD( else_endif_label_test )
               break;
 
             case '/':
-              /*
-                Skip comments.  Otherwise, we have a bogon */
-              switch (*pz_next)
-                {
-                case '/':
-                  /* IF we found a "//" in a C header, THEN fix it. */
-                  if (! file_is_cxx)
+              /* Skip comments.  Otherwise, we have a bogon */
+             switch (*pz_next)
+               {
+               case '/':
+                 /* // in a C header is a bogon.  */
+                  if (! is_cxx_header( fname, all_text ))
                     return APPLY_FIX;
 
-                  /* C++ header.  Skip to newline and continue. */
+                  /* C++ comment is allowed in a C++ header.
+                    Skip to newline and continue. */
                   pz_next = strchr( pz_next+1, '\n' );
                   if (pz_next == (char*)NULL)
                     return SKIP_FIX;
                   pz_next++;
-                  break;
+                  goto next_directive;
 
-                case '*':
+               case '*':
                   /* A comment for either C++ or C.  Skip over it. */
                   pz_next = strstr( pz_next+1, "*/" );
                   if (pz_next == (char*)NULL)
                     return SKIP_FIX;
                   pz_next += 2;
-                  break;
+                 break;
 
-                default:
-                  /* a '/' followed by other junk. */
-                  return APPLY_FIX;
-                }
-              break; /* a C or C++ comment */
+               default:
+                 return APPLY_FIX;
+               }
+             break;
 
             default:
-              /*
-                GOTTA BE A BOGON */
-              return APPLY_FIX;
+             if (!isspace (ch))
+               return APPLY_FIX;
             } /* switch (ch) */
         } /* for (bogon check loop) */
+    next_directive:;
+      text = pz_next;
     } /* for (entire file) loop */
 
   return SKIP_FIX;
 }
 
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
 
      test for fix selector
index d26c7d718d4d711290bd3c6df6805d3d5c00a940..5f804b20cef2f5d210699b88ccad435d2e07ccb3 100644 (file)
@@ -631,6 +631,9 @@ fix = {
     files    = term.h;
     files    = tinfo.h;
 
+    select   = "char[ \t]+bool|bool[ \t]+char";
+    bypass   = "we must use the C\\+\\+ compiler's type";
+
     sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/i\\\n"
                 "#ifndef __cplusplus\n";
 
@@ -748,21 +751,6 @@ fix = {
 };
 
 
-/*
- *  Note that BSD43_* are used on recent MIPS systems.
- */
-fix = {
-    hackname = bsd43_io_macros;
-    select   = "BSD43__IO";
-    /*
-     *  Put single quotes aroung the character that appears after '('
-     *  and before ',', UNLESS it is a 'c' or 'g' or 'x'.
-     */
-    sed = "/[ \t]BSD43__IO[A-Z]*[ \t]*(/"       's/(\(.\),/(\'\1\',/';
-    sed = "/#[ \t]*define[ \t]*[ \t]BSD43__IO/" 's/\'\([cgx]\)\'/\1/g';
-};
-
-
 /*
  *  Fix <c_asm.h> on Digital UNIX V4.0:
  *  It contains a prototype for a DEC C internal asm() function,
@@ -970,52 +958,45 @@ fix = {
 };
 
 /*
- *  Fix various _IO* defines, but do *not* quote the characters cgxtf.
+ *  Fix various macros used to define ioctl numbers.  The traditional
+ *  syntax was
+ *  #define _IO(n, x) (('n'<<8)+x)
+ *  #define TIOCFOO _IO(T, 1)
+ *  but this does not work with the C standard, which disallows macro
+ *  expansion inside strings.  We have to rewrite it thus:
+ *  #define _IO(n, x) ((n<<8)+x)
+ *  #define TIOCFOO  _IO('T', 1)
+ *  The select expressions match too much, but the c_fix code is cautious.
+ *
+ *  _IO might be: _IO DESIO BSD43__IO with W, R, WR, C, ... suffixes.
  */
 fix = {
-    hackname = io_def_quotes;
-    select = "[ \t]*[ \t](_|DES)IO[A-Z]*[ \t]*\\( *[^,']";
-    sed = "s/\\([ \t]*[ \t]_IO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/";
-    sed = "s/\\([ \t]*[ \t]DESIO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/";
-    sed = "/#[ \t]*define[ \t]*[ \t]_IO/"       "s/'\\([cgxtf]\\)'/\\1/g";
-    sed = "/#[ \t]*define[ \t]*[ \t]DESIOC/"    's/\'\([cdgx]\)\'/\1/g';
+    hackname = io_use_quotes;
+    select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+IO[A-Z]*[ \t]*\\( *[^,']";
+    c_fix = IO_use;
 };
 
-
+fix = {
+    hackname = io_def_quotes;
+    select = "define[ \t]+[A-Z0-9_]+IO[A-Z]*\\(([a-zA-Z]).*'\\1'";
+    c_fix = IO_defn;
+};
 /*
- *  Fix CTRL macros
- *
- * Basically, what is supposed to be happening is that every
- * _invocation_ of the "_CTRL()" or "CTRL()" macros is supposed to have
- * its argument inserted into single quotes.  We _must_ do this because
- * ANSI macro substitution rules prohibit looking inside quoted strings
- * for the substitution names.  A side effect is that the quotes are
- * inserted in the definitions of those macros as well.  So, the last
- * several sed expressions are supposed to clean up the definitions, as
- * long as those definitions are using "c", "g" or "x" as the macro
- * argument :).  Yuck.
+ *  Same deal for CTRL() macros.
+ *  CTRL might be: CTRL _CTRL ISCTRL BSD43_CTRL ...
  */
 fix = {
-    hackname = ioctl_fix_ctrl;
-    select = "CTRL[ \t]*\\(";
-
-    sed = "/[^A-Z0-9_]CTRL[ \t]*(/"
-              "s/\\([^']\\))/'\\1')/";
-
-    sed = "/[^A-Z0-9]_CTRL[ \t]*(/"
-              "s/\\([^']\\))/'\\1')/";
-
-    sed = "/#[ \t]*define[ \t]*[ \t]CTRL/"
-              "s/'\\([cgx]\\)'/\\1/g";
-
-    sed = "/#[ \t]*define[ \t]*[ \t]_CTRL/"
-              "s/'\\([cgx]\\)'/\\1/g";
-
-    sed = "/#[ \t]*define[ \t]*[ \t]BSD43_CTRL/"
-              "s/'\\([cgx]\\)'/\\1/g";
-
-    sed = "/#[ \t]*define[ \t]*[ \t][_]*ISCTRL/"
-              "s/'\\([cgx]\\)'/\\1/g";
+    hackname = ctrl_use_quotes;
+    select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+CTRL[ \t]*\\( *[^,']";
+    c_fix = CTRL_use;
+};
+fix = {
+    hackname = ctrl_def_quotes;
+    select = "define[ \t]+[A-Z0-9_]+CTRL\\(([a-zA-Z]).*'\\1'";
+    c_fix = CTRL_defn;
 };
 
 
@@ -1372,7 +1353,7 @@ fix = {
     hackname = math_exception;
     files    = math.h;
     select   = "struct exception";
-    bypass   = "We have a problem when using C++";
+    bypass   = "We have a problem when using C\\+\\+";
     sed      = "/struct exception/i\\\n"
                "#ifdef __cplusplus\\\n"
                "#define exception __math_exception\\\n"
index b3a3386716c97944483cc0067bacc1c9b11ee2ea..c68f2d711158656544189969ec9b2974626761fd 100755 (executable)
@@ -6,7 +6,7 @@
 # files which are fixed to work correctly with ANSI C and placed in a
 # directory that GNU C will search.
 #
-# This script contains 112 fixup scripts.
+# This script contains 113 fixup scripts.
 #
 # See README-fixinc for more information.
 #
@@ -1056,6 +1056,10 @@ struct rusage;
        ./curses_colr/curses.h | \
        ./term.h | \
        ./tinfo.h )
+    if ( test -n "`egrep 'char[        ]+bool|bool[    ]+char' ${file}`"
+       ) > /dev/null 2>&1 ; then
+    if ( test -z "`egrep 'we must use the C\\+\\+ compiler'\\''s type' ${file}`"
+       ) > /dev/null 2>&1 ; then
     fixlist="${fixlist}
       avoid_bool"
     if [ ! -r ${DESTFILE} ]
@@ -1095,6 +1099,8 @@ struct rusage;
           < $infile > ${DESTDIR}/fixinc.tmp
     rm -f ${DESTFILE}
     mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
+    fi # end of bypass 'if'
+    fi # end of select 'if'
     ;; # case end for file name test
     esac
 
@@ -1226,25 +1232,6 @@ struct rusage;
     esac
 
 
-    #
-    # Fix Bsd43_Io_Macros
-    #
-    if ( test -n "`egrep 'BSD43__IO' ${file}`"
-       ) > /dev/null 2>&1 ; then
-    fixlist="${fixlist}
-      bsd43_io_macros"
-    if [ ! -r ${DESTFILE} ]
-    then infile=${file}
-    else infile=${DESTFILE} ; fi 
-
-    sed -e '/[         ]BSD43__IO[A-Z]*[       ]*(/s/(\(.\),/('\''\1'\'',/' \
-        -e '/#[        ]*define[       ]*[     ]BSD43__IO/s/'\''\([cgx]\)'\''/\1/g' \
-          < $infile > ${DESTDIR}/fixinc.tmp
-    rm -f ${DESTFILE}
-    mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
-    fi # end of select 'if'
-
-
     #
     # Fix Dec_Intern_Asm
     #
@@ -1540,45 +1527,65 @@ extern "C" {\
     esac
 
 
+    #
+    # Fix Io_Use_Quotes
+    #
+    if ( test -n "`egrep 'define[      ]+[A-Z0-9_]+[   ]+[A-Z0-9_]+IO[A-Z]*[   ]*\\( *[^,'\\'']' ${file}`"
+       ) > /dev/null 2>&1 ; then
+    fixlist="${fixlist}
+      io_use_quotes"
+    if [ ! -r ${DESTFILE} ]
+    then infile=${file}
+    else infile=${DESTFILE} ; fi 
+    ${FIXFIXES} ${file} IO_use < $infile > ${DESTDIR}/fixinc.tmp
+    rm -f ${DESTFILE}
+    mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
+    fi # end of select 'if'
+
+
     #
     # Fix Io_Def_Quotes
     #
-    if ( test -n "`egrep '[    ]*[     ](_|DES)IO[A-Z]*[       ]*\\( *[^,'\\'']' ${file}`"
+    if ( test -n "`egrep 'define[      ]+[A-Z0-9_]+IO[A-Z]*\\(([a-zA-Z]).*'\\''\\1'\\''' ${file}`"
        ) > /dev/null 2>&1 ; then
     fixlist="${fixlist}
       io_def_quotes"
     if [ ! -r ${DESTFILE} ]
     then infile=${file}
     else infile=${DESTFILE} ; fi 
-
-    sed -e 's/\([      ]*[     ]_IO[A-Z]*[     ]*(\)\([^,'\'']\),/\1'\''\2'\'',/' \
-        -e 's/\([      ]*[     ]DESIO[A-Z]*[   ]*(\)\([^,'\'']\),/\1'\''\2'\'',/' \
-        -e '/#[        ]*define[       ]*[     ]_IO/s/'\''\([cgxtf]\)'\''/\1/g' \
-        -e '/#[        ]*define[       ]*[     ]DESIOC/s/'\''\([cdgx]\)'\''/\1/g' \
-          < $infile > ${DESTDIR}/fixinc.tmp
+    ${FIXFIXES} ${file} IO_defn < $infile > ${DESTDIR}/fixinc.tmp
     rm -f ${DESTFILE}
     mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
     fi # end of select 'if'
 
 
     #
-    # Fix Ioctl_Fix_Ctrl
+    # Fix Ctrl_Use_Quotes
     #
-    if ( test -n "`egrep 'CTRL[        ]*\\(' ${file}`"
+    if ( test -n "`egrep 'define[      ]+[A-Z0-9_]+[   ]+[A-Z0-9_]+CTRL[       ]*\\( *[^,'\\'']' ${file}`"
        ) > /dev/null 2>&1 ; then
     fixlist="${fixlist}
-      ioctl_fix_ctrl"
+      ctrl_use_quotes"
     if [ ! -r ${DESTFILE} ]
     then infile=${file}
     else infile=${DESTFILE} ; fi 
+    ${FIXFIXES} ${file} CTRL_use < $infile > ${DESTDIR}/fixinc.tmp
+    rm -f ${DESTFILE}
+    mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
+    fi # end of select 'if'
 
-    sed -e '/[^A-Z0-9_]CTRL[   ]*(/s/\([^'\'']\))/'\''\1'\'')/' \
-        -e '/[^A-Z0-9]_CTRL[   ]*(/s/\([^'\'']\))/'\''\1'\'')/' \
-        -e '/#[        ]*define[       ]*[     ]CTRL/s/'\''\([cgx]\)'\''/\1/g' \
-        -e '/#[        ]*define[       ]*[     ]_CTRL/s/'\''\([cgx]\)'\''/\1/g' \
-        -e '/#[        ]*define[       ]*[     ]BSD43_CTRL/s/'\''\([cgx]\)'\''/\1/g' \
-        -e '/#[        ]*define[       ]*[     ][_]*ISCTRL/s/'\''\([cgx]\)'\''/\1/g' \
-          < $infile > ${DESTDIR}/fixinc.tmp
+
+    #
+    # Fix Ctrl_Def_Quotes
+    #
+    if ( test -n "`egrep 'define[      ]+[A-Z0-9_]+CTRL\\(([a-zA-Z]).*'\\''\\1'\\''' ${file}`"
+       ) > /dev/null 2>&1 ; then
+    fixlist="${fixlist}
+      ctrl_def_quotes"
+    if [ ! -r ${DESTFILE} ]
+    then infile=${file}
+    else infile=${DESTFILE} ; fi 
+    ${FIXFIXES} ${file} CTRL_defn < $infile > ${DESTDIR}/fixinc.tmp
     rm -f ${DESTFILE}
     mv -f ${DESTDIR}/fixinc.tmp ${DESTFILE}
     fi # end of select 'if'
@@ -2043,7 +2050,7 @@ s/\\+++fixinc_eol+++/\\/g
     case "${file}" in ./math.h )
     if ( test -n "`egrep 'struct exception' ${file}`"
        ) > /dev/null 2>&1 ; then
-    if ( test -z "`egrep 'We have a problem when using C++' ${file}`"
+    if ( test -z "`egrep 'We have a problem when using C\\+\\+' ${file}`"
        ) > /dev/null 2>&1 ; then
     fixlist="${fixlist}
       math_exception"