OSDN Git Service

incorporate patches from 3.0 branch
[pf3gnuchains/gcc-fork.git] / gcc / fixinc / inclhack.def
index 5688c6e..aedf097 100644 (file)
@@ -6,6 +6,15 @@ autogen definitions fixincl;
 /* Define all the fixes we know about for repairing damaged headers.
    Please see the README before adding or changing entries in this file.
 
+   This is the sort command:
+
+   blocksort output=XXX \
+          pattern='^/\*$' \
+          start='DO +NOT +DO +BROKEN +FIXES' \
+          trailer='^/\*EOF\*[/]' \
+          input=inclhack.def \
+          key='hackname[       ]*=[    ]*(.*);'
+
    Set up a debug test so we can make the templates emit special
    code while debugging these fixes:  */
 
@@ -16,12 +25,15 @@ FIXINC_DEBUG = yes;
 /* DO NOT DO BROKEN FIXES (empty replacement fixes) */
 
 /*
- *  Purge some HP-UX 11 files that are only broken after they are "fixed".
+ *  This file on SunOS 4 has a very large macro.  When the sed loop
+ *  tries pull it in, it overflows the pattern space size of the SunOS
+ *  sed (GNU sed does not have this problem).  Since the file does not
+ *  require fixing, we remove it from the fixed directory.
  */
 fix = {
-    hackname = AAA_ki_iface;
-    files    = sys/ki_iface.h;
-    select   = 'These definitions are for HP Internal developers';
+    hackname = AAA_bad_fixes;
+    files    = sundev/ipi_error.h;
+    /* shouldn't there be a select expression here??? */
     replace; /* empty replacement -> no fixing the file */
 };
 
@@ -60,15 +72,24 @@ fix = {
 
 
 /*
- *  This file on SunOS 4 has a very large macro.  When the sed loop
- *  tries pull it in, it overflows the pattern space size of the SunOS
- *  sed (GNU sed does not have this problem).  Since the file does not
- *  require fixing, we remove it from the fixed directory.
+ *  Purge some HP-UX 11 files that are only broken after they are "fixed".
  */
 fix = {
-    hackname = AAA_bad_fixes;
-    files    = sundev/ipi_error.h;
-    /* shouldn't there be a select expression here??? */
+    hackname = AAA_ki_iface;
+    files    = sys/ki_iface.h;
+    select   = 'These definitions are for HP Internal developers';
+    replace; /* empty replacement -> no fixing the file */
+};
+
+
+/*
+ * Tru64 UNIX V4.0F/V5.1 <standards.h> defines _NO_PROTO and _NONSTD_TYPES
+ * correctly for GCC, but strict_ansi_not breaks it.
+ */
+fix = {
+    hackname = AAA_standards;
+    files    = standards.h;
+    select   = 'GNU and MIPS C compilers define __STDC__ differently';
     replace; /* empty replacement -> no fixing the file */
 };
 
@@ -86,26 +107,27 @@ fix = {
 /* And now, the real fixes, replacement text fixes first: */
 
 /*
- *  Completely replace &lt;_int_varargs.h&gt; with a file that includes gcc's
+ *  Completely replace <_int_varargs.h> with a file that includes gcc's
  *  stdarg.h or varargs.h files as appropriate on DG/UX
  */
 fix = {
     hackname = AAB_dgux_int_varargs;
     files    = _int_varargs.h;
-    replace  = "#ifndef __INT_VARARGS_H
+    replace  =
+"#ifndef __INT_VARARGS_H
 \#define __INT_VARARGS_H
 
 /************************************************************************/
 /* _INT_VARARGS.H - Define the common stuff for varargs/stdarg/stdio.   */
 /************************************************************************/
 
-/*
+/*" "
 ** This file is a DG internal header.  Never include this
 ** file directly.
 */
 
 \#ifndef ___int_features_h
-\#include &lt;sys/_int_features.h&gt;
+\#include <sys/_int_features.h>
 \#endif
 
 \#if !(defined(_VA_LIST) || defined(_VA_LIST_))
@@ -320,6 +342,29 @@ extern int memcmp();
 
 
 /*
+ *  Completely replace <sys/varargs.h> with a file that includes gcc's
+ *  stdarg.h or varargs.h files as appropriate.
+ */
+#ifdef SVR4
+fix = {
+    hackname = AAB_svr4_no_varargs;
+    files    = sys/varargs.h;
+    replace  = "/* This file was generated by fixincludes.  */\n"
+               "#ifndef _SYS_VARARGS_H\n"
+               "#define _SYS_VARARGS_H\n\n"
+
+               "#ifdef __STDC__\n"
+               "#include <stdarg.h>\n"
+               "#else\n"
+               "#include <varargs.h>\n"
+               "#endif\n\n"
+
+               "#endif  /* _SYS_VARARGS_H */\n";
+};
+#endif
+
+
+/*
  *  Completely replace <sys/byteorder.h>; with a file that implements gcc's
  *  optimized byteswapping.  Restricted to "SVR4" machines until either
  *  it is shown to be safe to replace this file always, or we get bolder ;-)
@@ -483,29 +528,6 @@ ntohs (unsigned int __arg)
 
 
 /*
- *  Completely replace <sys/varargs.h> with a file that includes gcc's
- *  stdarg.h or varargs.h files as appropriate.
- */
-#ifdef SVR4
-fix = {
-    hackname = AAB_svr4_no_varargs;
-    files    = sys/varargs.h;
-    replace  = "/* This file was generated by fixincludes.  */\n"
-               "#ifndef _SYS_VARARGS_H\n"
-               "#define _SYS_VARARGS_H\n\n"
-
-               "#ifdef __STDC__\n"
-               "#include <stdarg.h>\n"
-               "#else\n"
-               "#include <varargs.h>\n"
-               "#endif\n\n"
-
-               "#endif  /* _SYS_VARARGS_H */\n";
-};
-#endif
-
-
-/*
  *  Cancel out ansi_compat.h on Ultrix.  Replace it with an empty file.
  */
 fix = {
@@ -525,9 +547,7 @@ fix = {
     files    = limits.h;
     mach     = "*-*-ultrix4.3";
     replace  =
-'/*    @(#)limits.h                            */
-/* This file was generated by fixincludes      */
-\#ifndef _LIMITS_INCLUDED
+'#ifndef _LIMITS_INCLUDED
 \#define _LIMITS_INCLUDED
 \#include <sys/limits.h>
 \#endif /* _LIMITS_INCLUDED */
@@ -545,9 +565,7 @@ fix = {
     files    = memory.h;
     mach     = "*-*-ultrix4.3";
     replace  =
-'/*    @(#)memory.h                            */
-/* This file was generated by fixincludes      */
-\#ifndef _MEMORY_INCLUDED
+'#ifndef _MEMORY_INCLUDED
 \#define _MEMORY_INCLUDED
 \#include <strings.h>
 \#endif /* _MEMORY_INCLUDED */
@@ -565,9 +583,7 @@ fix = {
     files    = string.h;
     mach     = "*-*-ultrix4.3";
     replace  =
-'/*    @(#)string.h                            */
-/* This file was generated by fixincludes      */
-\#ifndef _STRING_INCLUDED
+'#ifndef _STRING_INCLUDED
 \#define _STRING_INCLUDED
 \#include <strings.h>
 \#endif /* _STRING_INCLUDED */
@@ -639,6 +655,19 @@ fix = {
 
 
 /*
+ *  Fix __assert declaration in assert.h on Alpha OSF/1.
+ */
+fix = {
+    hackname  = alpha___assert;
+    files     = "assert.h";
+    select    = '__assert\(char \*, char \*, int\)';
+    c_fix     = format;
+    c_fix_arg = "__assert(const char *, const char *, int)";
+    test_text = 'extern void __assert(char *, char *, int);';
+};
+
+
+/*
  *  Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX.
  */
 fix = {
@@ -764,11 +793,25 @@ fix = {
 
     c_fix     = format;
     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
-    c_fix_arg = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;.*";
 
-    test_text = "typedef unsigned int\tbool \t; /* bool type */";
+    test_text = "typedef unsigned int\tbool \t; /* bool\n type */";
 };
 
+/*
+ *  For C++, avoid any typedef definition of wchar_t,
+ *  and use the built in type instead.
+ */
+
+fix = {
+    hackname = avoid_wchar_t_type;
+
+    select    = "^[ \t]*typedef[ \t].*[ \t]wchar_t[ \t]*;";
+
+    c_fix     = format;
+    c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
+
+    test_text = "typedef unsigned short\twchar_t \t; /* wchar_t\n type */";
+};
 
 /*
  *  Fix #defines under Alpha OSF/1:
@@ -986,6 +1029,21 @@ fix = {
 
 
 /*
+ * Fix typo in <wchar.h> on DJGPP 2.03.
+ */
+fix = {
+    hackname  = djgpp_wchar_h;
+    file      = wchar.h;
+    select    = "__DJ_wint_t";
+    bypass    = "sys/djtypes.h";
+    c_fix     = format;
+    c_fix_arg = "%0\n#include <sys/djtypes.h>";
+    c_fix_arg = "#include <stddef.h>";
+    test_text = "#include <stddef.h>\n"
+                "extern __DJ_wint_t x;\n";
+};
+
+/*
  * Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
  */
 fix = {
@@ -1017,6 +1075,44 @@ fix = {
 
 
 /*
+ *  Between 8/24/1998 and 2/17/2001, FreeBSD system headers presume
+ *  neither the existence of GCC 3 nor its exact feature set yet break
+ *  (by design?) when __GNUC__ is set beyond 2.
+ */
+fix = {
+    hackname  = freebsd_gcc3_breakage;
+    mach      = *-*-freebsd*;
+    files     = sys/cdefs.h;
+    select    = '^#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7$';
+    bypass    = '__GNUC__[ \t]*([>=]=[ \t]*[3-9]|>[ \t]*2)';
+    c_fix     = format;
+    c_fix_arg = '%0 || __GNUC__ >= 3';
+    test_text = '#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7';
+};
+
+
+/*
+ * Fix these files to use the same types that we think they should.
+ */
+fix = {
+    hackname  = gnu_types;
+    files  = "sys/types.h";
+    files  = "stdlib.h";
+    files  = "sys/stdtypes.h";
+    files  = "stddef.h";
+    files  = "memory.h";
+    files  = "unistd.h";
+    bypass    = '_GCC_(PTRDIFF|SIZE|WCHAR)_T';
+    select    = "^[ \t]*typedef[ \t]+.*[ \t](ptrdiff|size|wchar)_t;";
+    c_fix     = gnu_type;
+
+    test_text = "typedef long int ptrdiff_t; /* long int */\n"
+                "typedef uint_t size_t; /* uint_t */\n"
+                "typedef ushort_t wchar_t; /* ushort_t */";
+};
+
+
+/*
  *  Fix HP & Sony's use of "../machine/xxx.h"
  *  to refer to:  <machine/xxx.h>
  */
@@ -1053,6 +1149,53 @@ fix = {
 
 
 /*
+ * Delete C++ double pow (double, int) inline function from HP-UX 10 & 11
+ * math.h to prevent clash with define in c_std/bits/std_cmath.h.
+ */
+fix = {
+    hackname  = hpux10_cpp_pow_inline;
+    files     = fixinc-test-limits.h, math.h;
+    select    = <<-    END_POW_INLINE
+       ^# +ifdef +__cplusplus
+        +}
+        +inline +double +pow\(double +__d,int +__expon\) +{
+       [       ]+return +pow\(__d,\(double\)__expon\);
+        +}
+        +extern +"C" +{
+       #else
+       # +endif
+       END_POW_INLINE;
+    c_fix     = format;
+    c_fix_arg = "";
+
+    test_text =
+       "#    ifdef __cplusplus\n"
+       "     }\n"
+       "     inline double pow(double __d,int __expon) {\n"
+       "\t return pow(__d,(double)__expon);\n"
+       "     }\n"
+       '     extern "C"' " {\n"
+       "#else\n"
+       "#    endif";
+};
+
+fix = {
+     hackname  = hpux11_cpp_pow_inline;
+     files     = math.h;
+     select    = " +inline double pow\\(double d,int expon\\) {\n"
+                 " +return pow\\(d, \\(double\\)expon\\);\n"
+                 " +}\n";
+     c_fix     = format;
+     c_fix_arg = "";
+
+     test_text =
+            "   inline double pow(double d,int expon) {\n"
+            "     return pow(d, (double)expon);\n"
+            "   }\n";
+};
+
+/*
  *  Keep HP-UX 11 from stomping on C++ math namespace
  *  with defines for fabsf.
  */
@@ -1073,7 +1216,7 @@ fix = {
 
 
 /*
- * In inttypes.h on HPUX 11, the use of __CONCAT__ in the definition 
+ * In inttypes.h on HPUX 11, the use of __CONCAT__ in the definition
  * of UINT32_C has undefined behavior according to ISO/ANSI:
  * the arguments to __CONCAT__ are not macro expanded before the
  * concatination happens so the trailing ')' in the first argument
@@ -1081,7 +1224,7 @@ fix = {
  * invalid pp token.  The behavior of invalid pp tokens is undefined.
  * GCC does not handle these invalid tokens the way the HP compiler does.
  * This problem will potentially occur anytime macros are used in the
- * arguments to __CONCAT__.  A general solution to this problem would be to 
+ * arguments to __CONCAT__.  A general solution to this problem would be to
  * insert another layer of macro between __CONCAT__ and its use
  * in UINT32_C.  An example of this solution can be found in the C standard.
  * A more specific solution, the one used here, is to change the UINT32_C
@@ -1101,6 +1244,24 @@ fix = {
 
 
 /*
+ *  Fix hpux 11.00 broken vsnprintf declaration
+ */
+fix = {
+    hackname = hpux11_vsnprintf;
+    files    = stdio.h;
+    select   = 'extern int vsnprintf\(char \*, __size_t, const char \*,'
+                                     ' __va__list\);';
+
+    c_fix     = format;
+    c_fix_arg = "extern int vsnprintf(char *, __size_t, const char *,"
+                                     " __va_list);";
+
+    test_text = 'extern int vsnprintf(char *, __size_t, const char *,'
+                                     ' __va__list);';
+};
+
+
+/*
  *  get rid of bogus inline definitions in HP-UX 8.0
  */
 fix = {
@@ -1118,43 +1279,54 @@ fix = {
 
 
 /*
- *  Fix return type of abort and free
+ *  HPUX 10.x sys/param.h defines MAXINT which clashes with values.h
  */
 fix = {
-    hackname  = int_abort_free_and_exit;
-    files     = stdlib.h;
-    select    = "int[ \t]+(abort|free|exit)[ \t]*\\(";
+    hackname  = hpux_maxint;
+    files     = sys/param.h;
+    files     = values.h;
+    select    = "^#[ \t]*define[ \t]+MAXINT[ \t]";
+    bypass    = "^#[ \t]*ifndef[ \t]+MAXINT";
+    test =
+    "-n \"`egrep '#[ \t]*define[ \t]+MAXINT[ \t]' sys/param.h`\"";
 
     c_fix     = format;
-    c_fix_arg = "void\t%1(";
+    c_fix_arg = "#ifndef MAXINT\n%0\n#endif";
+    c_fix_arg = "^#[ \t]*define[ \t]+MAXINT[ \t].*";
 
-    test_text = "extern int abort(int);\n"
-                "extern int free(void*);\n"
-                "extern int exit(void*);";
+    test_text = '#define MAXINT 0x7FFFFFFF';
 };
 
 
 /*
- *  On Interactive Unix 2.2, certain traditional Unix definitions
- *  (notably getc and putc in stdio.h) are omitted if __STDC__ is
- *  defined, not just if _POSIX_SOURCE is defined.  This makes it
- *  impossible to compile any nontrivial program except with -posix.
+ *  Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
  */
 fix = {
-    hackname = isc_omits_with_stdc;
+    hackname = hpux_systime;
+    files    = sys/time.h;
+    select   = "^extern struct sigevent;";
 
-    files     = "stdio.h";
-    files     = "math.h";
-    files     = "ctype.h";
-    files     = "sys/limits.h";
-    files     = "sys/fcntl.h";
-    files     = "sys/dirent.h";
+    c_fix     = format;
+    c_fix_arg = "struct sigevent;";
+
+    test_text = 'extern struct sigevent;';
+};
+
+
+/*
+ *  Fix return type of abort and free
+ */
+fix = {
+    hackname  = int_abort_free_and_exit;
+    files     = stdlib.h;
+    select    = "int[ \t]+(abort|free|exit)[ \t]*\\(";
 
-    select    = '!defined\(__STDC__\) && !defined\(_POSIX_SOURCE\)';
     c_fix     = format;
-    c_fix_arg = '!defined(_POSIX_SOURCE)';
-    test_text = "#if !defined(__STDC__) && !defined(_POSIX_SOURCE) /* ? ! */"
-                "\nint foo;\n#endif";
+    c_fix_arg = "void\t%1(";
+
+    test_text = "extern int abort(int);\n"
+                "extern int free(void*);\n"
+                "extern int exit(void*);";
 };
 
 
@@ -1201,38 +1373,6 @@ fix = {
 
 
 /*
- *  HPUX 10.x sys/param.h defines MAXINT which clashes with values.h
- */
-fix = {
-    hackname  = hpux_maxint;
-    files     = sys/param.h;
-    files     = values.h;
-    select    = "^#[ \t]*define[ \t]*MAXINT[ \t]";
-
-    c_fix     = format;
-    c_fix_arg = "#ifndef MAXINT\n%0\n#endif";
-    c_fix_arg = "^#[ \t]*define[ \t]*MAXINT[ \t].*";
-
-    test_text = '#define MAXINT 0x7FFFFFFF';
-};
-
-
-/*
- *  Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
- */
-fix = {
-    hackname = hpux_systime;
-    files    = sys/time.h;
-    select   = "^extern struct sigevent;";
-
-    c_fix     = format;
-    c_fix_arg = "struct sigevent;";
-
-    test_text = 'extern struct sigevent;';
-};
-
-
-/*
  *  Check for missing ';' in struct
  */
 fix = {
@@ -1267,6 +1407,35 @@ fix = {
 
 
 /*
+ *  Non-traditional "const" declaration in Irix's limits.h.
+ */
+fix = {
+    hackname    = irix_limits_const;
+    files       = fixinc-test-limits.h, limits.h;
+    select      = "^extern const ";
+    c_fix       = format;
+    c_fix_arg   = "extern __const ";
+    test_text   = "extern const char limit; /* test limits */";
+};
+
+
+/*
+ *  IRIX 5.x's stdio.h declares some functions that take a va_list as
+ *  taking char *.  However, GCC uses void * for va_list, so
+ *  calling vfprintf with a va_list fails in C++.  */
+fix = {
+    hackname  = irix_stdio_va_list;
+    files     = stdio.h;
+
+    select = '(printf\(.*), /\* va_list \*/ char \*';
+    c_fix  = format;
+    c_fix_arg = "%1, __gnuc_va_list";
+    test_text =
+    "extern int printf( const char *, /* va_list */ char * );";
+};
+
+
+/*
  * Fixing ISC fmod declaration
  */
 fix = {
@@ -1280,6 +1449,30 @@ fix = {
 
 
 /*
+ *  On Interactive Unix 2.2, certain traditional Unix definitions
+ *  (notably getc and putc in stdio.h) are omitted if __STDC__ is
+ *  defined, not just if _POSIX_SOURCE is defined.  This makes it
+ *  impossible to compile any nontrivial program except with -posix.
+ */
+fix = {
+    hackname = isc_omits_with_stdc;
+
+    files     = "stdio.h";
+    files     = "math.h";
+    files     = "ctype.h";
+    files     = "sys/limits.h";
+    files     = "sys/fcntl.h";
+    files     = "sys/dirent.h";
+
+    select    = '!defined\(__STDC__\) && !defined\(_POSIX_SOURCE\)';
+    c_fix     = format;
+    c_fix_arg = '!defined(_POSIX_SOURCE)';
+    test_text = "#if !defined(__STDC__) && !defined(_POSIX_SOURCE) /* ? ! */"
+                "\nint foo;\n#endif";
+};
+
+
+/*
  * These files in Sun OS 4.x and ARM/RISCiX and BSD4.3
  * use / * * / to concatenate tokens.
  */
@@ -1458,10 +1651,12 @@ fix = {
 
 /*
  * Fix BSD machine/ansi.h to use __builtin_va_list to define _BSD_VA_LIST_.
+ *
+ * On NetBSD, machine is a symbolic link to an architecture specific
+ * directory name, so we can't match a specific file name here.
  */
 fix = {
     hackname = machine_ansi_h_va_list;
-    files    = machine/ansi.h;
     select   = "define[ \t]+_BSD_VA_LIST_[ \t]";
     bypass   = '__builtin_va_list';
 
@@ -1571,6 +1766,19 @@ fix = {
 
 
 /*
+ *  nested comment
+ */
+fix = {
+    hackname  = nested_auth_des;
+    files     = rpc/rpc.h;
+    select    = '(/\*.*rpc/auth_des\.h>.*)/\*';
+    c_fix     = format;
+    c_fix_arg = "%1*/ /*";
+    test_text = "/*#include <rpc/auth_des.h> /* skip this */";
+};
+
+
+/*
  * Fix nested comments in Motorola's <limits.h> and <sys/limits.h>
  */
 fix = {
@@ -1606,19 +1814,6 @@ fix = {
 };
 
 /*
- *  nested comment
- */
-fix = {
-    hackname  = nested_auth_des;
-    files     = rpc/rpc.h;
-    select    = '(/\*.*rpc/auth_des\.h>.*)/\*';
-    c_fix     = format;
-    c_fix_arg = "%1*/ /*";
-    test_text = "/*#include <rpc/auth_des.h> /* skip this */";
-};
-
-
-/*
  *  fix bogus recursive stdlib.h in NEWS-OS 4.0C
  */
 fix = {
@@ -1788,7 +1983,7 @@ fix = {
 
 
 /*
- *  function class(double x) conflicts with C++ keyword on rs/6000 
+ *  function class(double x) conflicts with C++ keyword on rs/6000
  */
 fix = {
     hackname  = rs6000_double;
@@ -1817,7 +2012,7 @@ fix = {
 
 
 /*
- *  parameters conflict with C++ new on rs/6000 
+ *  parameters conflict with C++ new on rs/6000
  */
 fix = {
     hackname  = rs6000_param;
@@ -1833,7 +2028,7 @@ fix = {
 
 
 /*
- *  The static functions lstat() and fchmod() in <sys/stat.h> 
+ *  The static functions lstat() and fchmod() in <sys/stat.h>
  *  cause G++ grief since they're not wrapped in "if __cplusplus".
  *
  *  On SCO OpenServer 5.0.0 through (at least) 5.0.5 <sys/stat.h> contains
@@ -1872,22 +2067,6 @@ fix = {
 
 
 /*
- *  "!__STDC__" is "!defined( __STRICT_ANSI__ )"
- */
-fix = {
-    hackname = sco_strict_ansi;
-    mach     = "i?86-*-sco3.2*";
-    select   = "^[ \t]*#[ \t]*if.*!__STDC__";
-
-    c_fix     = format;
-    c_fix_arg = "%1defined(__STRICT_ANSI__)%2";
-    c_fix_arg = "^([ \t]*#[ \t]*if[ \t].*!)__STDC__(.*)";
-
-    test_text = "#if !__STDC__ /* not standard C */\nint foo;\n#endif";
-};
-
-
-/*
  *  Fix prototype declaration of utime in sys/times.h.
  *  In 3.2v4.0 the const is missing.
  */
@@ -1905,6 +2084,34 @@ fix = {
 
 
 /*
+ * Sun Solaris defines PTHREAD_MUTEX_INITIALIZER with a trailing
+ * "0" for the last field of the pthread_mutex_t structure, which is
+ * of type upad64_t, which itself is typedef'd to int64_t, but with
+ * __STDC__ defined (e.g. by -ansi) it is a union. So change the
+ * initializer to "{0}" instead
+ */
+fix = {
+    hackname = solaris_mutex_init;
+    select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
+    files = pthread.h;
+    c_fix = format;
+    c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
+                "%0\n"
+                "#else\n"
+                "%1, {0}}%3\n"
+                "#endif";
+    c_fix_arg = "(^#define[ \t]+PTHREAD_(MUTEX|COND)_INITIALIZER[ \t]+{.*)"
+                ",[ \t]*0}" "(|[ \t].*)$";
+    test_text =
+    '#ident "@(#)pthread.h  1.26  98/04/12 SMI"'"\n"
+    "#define PTHREAD_MUTEX_INITIALIZER\t{{{0},0}, {{{0}}}, 0}\n"
+    "#define PTHREAD_COND_INITIALIZER\t{{{0}, 0}, 0}\t/* DEFAULTCV */\n"
+    "#define PTHREAD_RWLOCK_INITIALIZER\t"
+             "{0, 0, 0, {0, 0, 0}, {0, 0}, {0, 0}}";
+};
+
+
+/*
  *  Sony NEWSOS 5.0 does not support the complete ANSI C standard.
  */
 #ifdef SONY
@@ -1992,7 +2199,7 @@ fix = {
 fix = {
     hackname = stdio_va_list;
     files    = stdio.h;
-    bypass   = '__gnuc_va_list|_BSD_VA_LIST_';
+    bypass   = '__gnuc_va_list|_BSD_VA_LIST_|__DJ_va_list';
 
     /*
      * Use __gnuc_va_list in arg types in place of va_list.
@@ -2019,18 +2226,68 @@ fix = {
 
 
 /*
- *  Check for strict ansi compliance
+ *  "!__STDC__" or "__STDC__==0" or "__STDC__!=1" or "__STDC__-0==0"
+ *  is "!defined( __STRICT_ANSI__ )"
  */
-#ifdef STRICT_ANSI
 fix = {
-    hackname = strict_ansi;
-    select   = "__STDC__[ \t]*[=!]=[ \t]*[01]";
-    sed      = "s/__STDC__[ \t]*==[ \t]*0/!defined (__STRICT_ANSI__)/g";
-    sed      = "s/__STDC__[ \t]*!=[ \t]*0/defined (__STRICT_ANSI__)/g";
-    sed      = "s/__STDC__[ \t]*==[ \t]*1/defined (__STRICT_ANSI__)/g";
-    sed      = "s/__STDC__[ \t]*!=[ \t]*1/!defined (__STRICT_ANSI__)/g";
+    hackname = strict_ansi_not;
+    select   = "^([ \t]*#[ \t]*if.*)"
+               "(!__STDC__"
+               "|__STDC__[ \t]*==[ \t]*0"
+               "|__STDC__[ \t]*!=[ \t]*1"
+               "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*0"
+               ")(.*)";
+    c_test   = stdc_0_in_system_headers;
+
+    c_fix     = format;
+    c_fix_arg = "%1 !defined(__STRICT_ANSI__)%3";
+
+    test_text = "#if !__STDC__ \n"
+                "#if __STDC__ == 0\n"
+                "#if __STDC__ != 1\n"
+                "#if __STDC__ - 0 == 0"
+               "/* not std C */\nint foo;\n"
+               "\n#end-end-end-end-if :-)";
+};
+
+/*
+ *  "__STDC__-0==0"
+ *  is "!defined( __STRICT_ANSI__ )" on continued #if-s
+ */
+fix = {
+    hackname = strict_ansi_not_ctd;
+    files    = math.h, limits.h, stdio.h, signal.h, stdlib.h, time.h;
+    select   = "^([ \t]*[|&][|&][ \t(]*)"
+               "(__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*0"
+               ")(.*)";
+    c_test   = stdc_0_in_system_headers;
+
+    c_fix     = format;
+    c_fix_arg = "%1 !defined(__STRICT_ANSI__)%3";
+
+    test_text = "#if 1\\\n"
+               "|| __STDC__ - 0 == 0 /* not std C */\nint foo;\n#endif";
+};
+
+/*
+ *  "__STDC__!=0" or "__STDC__==1" or "__STDC__-0==1"
+ *  is "defined( __STRICT_ANSI__ )"
+ */
+fix = {
+    hackname = strict_ansi_only;
+    select   = "^([ \t]*#[ \t]*if.*)"
+               "(__STDC__[ \t]*!=[ \t]*0"
+               "|__STDC__[ \t]*==[ \t]*1"
+               "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*1"
+               "|__STDC__[ \t]*-[ \t]*0[ \t]*!=[ \t]*0"
+               ")(.*)";
+    c_test   = stdc_0_in_system_headers;
+
+    c_fix     = format;
+    c_fix_arg = "%1 defined(__STRICT_ANSI__)%3";
+
+    test_text = "#if __STDC__ == 1 /* is std C\n */\nint foo;\n#endif";
 };
-#endif
 
 
 /*
@@ -2187,7 +2444,7 @@ fix = {
     files     = math.h;
 
     /*  If matherr has a prototype already, the header needs no fix.  */
-    bypass    = 'matherr.*struct exception';
+    bypass    = 'matherr.*(struct exception|__MATH_EXCEPTION)';
     select    = matherr;
 
     c_fix     = wrap;
@@ -2534,7 +2791,7 @@ fix = {
 #endif
 
 
-/* 
+/*
  *  Like svr4_mach_defines, but with newfangled syntax.
  *  Source lines are of #define __i386 #machine(i386).   Delete them.
  */
@@ -2549,27 +2806,6 @@ fix = {
 
 
 /*
- * Fix these files to use the same types that we think they should.
- */
-fix = {
-    hackname  = gnu_types;
-    files  = "sys/types.h";
-    files  = "stdlib.h";
-    files  = "sys/stdtypes.h";
-    files  = "stddef.h";
-    files  = "memory.h";
-    files  = "unistd.h";
-    bypass    = '_GCC_(PTRDIFF|SIZE|WCHAR)_T';
-    select    = "^[ \t]*typedef[ \t]+.*[ \t](ptrdiff|size|wchar)_t;";
-    c_fix     = gnu_type;
-
-    test_text = "typedef long int ptrdiff_t; /* long int */\n"
-                "typedef uint_t size_t; /* uint_t */\n"
-                "typedef ushort_t wchar_t; /* ushort_t */";
-};
-
-
-/*
  *  Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn}
  *  in string.h on sysV68
  *  Correct the return type for strlen in string.h on Lynx.
@@ -2651,6 +2887,21 @@ fix = {
 
 
 /*
+ *  function parameter to atexit is missing "void" on VAX Ultrix 4.3.
+ */
+fix = {
+    hackname = ultrix_atexit_param;
+    files    = stdlib.h;
+    select   = 'atexit\(.*\(\)';
+
+    c_fix     = format;
+    c_fix_arg = "atexit( void (*__func)( void )";
+
+    test_text = "int atexit( void (*__func)() );\n";
+};
+
+
+/*
  *  parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R.
  */
 fix = {
@@ -2862,7 +3113,7 @@ fix = {
     hackname = uw7_byteorder_fix;
     files    = arpa/inet.h;
     select   = "in_port_t";
-    test     = "-f $DESTDIR/sys/byteorder.h";
+    test     = "-f sys/byteorder.h";
 #ifndef SVR5
        mach = "*-*-sysv4*";
        mach = "i?86-*-sysv5*";
@@ -2874,12 +3125,12 @@ fix = {
 
     c_fix     = format;
     c_fix_arg = "";
-    c_fix_arg = "^extern.*(htons|ntohs).*\\(in_port_t\\).*\n";
+    c_fix_arg = "^extern.*[ \t](htons|ntohs).*\\(in_port_t\\).*;";
 
-    test_text = "extern htons(in_port_t);"
+    test_text = "extern in_port_t\thtons __P((in_port_t));\n"
+                "extern in_port_t\tntohs __P((in_port_t));"
                 "`[ ! -d $DESTDIR/sys ] && mkdir $DESTDIR/sys\n"
-                "echo '/* DUMMY */' >> sys/byteorder.h\n"
-                "touch $DESTDIR/sys/byteorder.h`";
+                "echo '/* DUMMY */' >> sys/byteorder.h`";
 };