OSDN Git Service

fixincludes/
[pf3gnuchains/gcc-fork.git] / fixincludes / inclhack.def
1 /* -*- Mode: C -*-  */
2
3 autogen definitions fixincl;
4
5 /* Define all the fixes we know about for repairing damaged headers.
6    Please see the README before adding or changing entries in this file.
7
8    This is the sort command:
9
10    blocksort output=inclhack.sorted \
11           pattern='^/\*$' \
12           trailer='^/\*EOF\*[/]' \
13           input=inclhack.def \
14           key='hackname[        ]*=[    ]*(.*);'
15
16    Set up a debug test so we can make the templates emit special
17    code while debugging these fixes:  */
18
19 #ifdef DEBUG
20 FIXINC_DEBUG = yes;
21 #endif
22
23 /* On AIX when _LARGE_FILES is defined stdio.h defines fopen to
24  * fopen64 etc. and this causes problems when building with g++
25  * because cstdio udefs everything from stdio.h, leaving us with
26  * ::fopen has not been declared errors. This fixes stdio.h to
27  * undef those defines and use __asm__ to alias the symbols if
28  * building with g++ and -D_LARGE_FILES
29  */
30 fix = {
31         hackname  = AAB_aix_stdio;
32         files     = stdio.h;
33         select    = "define fopen fopen64";
34         mach      = "*-*-aix*";
35
36         c_fix     = wrap;
37
38         c_fix_arg = "";
39
40         c_fix_arg = "\n" 
41         "#if defined __GNUG__ && defined _LARGE_FILES && defined __cplusplus\n"
42         "#define __need__aix_stdio_h_fix\n"
43         "#ifdef __need__aix_stdio_h_fix\n"
44         "#undef fseeko\n"
45         "#undef ftello\n"
46         "#undef fgetpos\n"
47         "#undef fsetpos\n"
48         "#undef fopen\n"
49         "#undef freopen\n"
50         "/* Alias the symbols using asm */\n"
51         "extern \"C\" {\n"
52         "extern int fgetpos(FILE *, fpos64_t *) __asm__(\"fgetpos64\");\n"
53         "extern FILE *fopen(const char *, const char *) __asm__(\"fopen64\");\n"
54         "extern FILE *freopen(const char *, const char *, FILE *) __asm__(\"freopen64\");\n"
55         "extern int fseeko(FILE *, off64_t, int) __asm__(\"fseeko64\");\n"
56         "extern int fsetpos(FILE *, const fpos64_t *) __asm__(\"fsetpos64\");\n"
57         "extern off64_t ftello(FILE *) __asm__(\"ftello64\");\n"
58         "}\n"
59         "#endif\n"
60         "#endif\n";
61         test_text = "";
62 };
63
64
65 /*
66  *  On Mac OS 10.3.9, the 'long double' functions are available in
67  *  libSystem, but are not prototyped in math.h.
68  */
69 fix = {
70   hackname  = AAB_darwin7_9_long_double_funcs;
71   mach      = "*-*-darwin7.9*";
72   files     = architecture/ppc/math.h;
73   bypass    = "powl";
74   replace = <<- _EndOfHeader_
75 /* This file prototypes the long double functions available on Mac OS
76    10.3.9.  */
77 #ifndef __MATH__
78 # undef __APPLE_CC__
79 # define __APPLE_CC__  1345
80 # include_next <architecture/ppc/math.h>
81 # undef __APPLE_CC__
82 # define __APPLE_CC__ 1
83 # ifndef __LIBMLDBL_COMPAT
84 #  ifdef __LONG_DOUBLE_128__
85 #   define __LIBMLDBL_COMPAT(sym) __asm("_" #sym "$LDBL128")
86 #  else
87 #   define __LIBMLDBL_COMPAT(sym)
88 #  endif /* __LONG_DOUBLE_128__ */
89 # endif /* __LIBMLDBL_COMPAT */
90 # ifdef __cplusplus
91    extern "C" {
92 # endif
93   extern long double acosl( long double ) __LIBMLDBL_COMPAT(acosl);
94   extern long double asinl( long double ) __LIBMLDBL_COMPAT(asinl);
95   extern long double atanl( long double ) __LIBMLDBL_COMPAT(atanl);
96   extern long double atan2l( long double, long double ) __LIBMLDBL_COMPAT(atan2l);
97   extern long double cosl( long double ) __LIBMLDBL_COMPAT(cosl);
98   extern long double sinl( long double ) __LIBMLDBL_COMPAT(sinl);
99   extern long double tanl( long double ) __LIBMLDBL_COMPAT(tanl);
100   extern long double acoshl( long double ) __LIBMLDBL_COMPAT(acoshl);
101   extern long double asinhl( long double ) __LIBMLDBL_COMPAT(asinhl);
102   extern long double atanhl( long double ) __LIBMLDBL_COMPAT(atanhl);
103   extern long double coshl( long double ) __LIBMLDBL_COMPAT(coshl);
104   extern long double sinhl( long double ) __LIBMLDBL_COMPAT(sinhl);
105   extern long double tanhl( long double ) __LIBMLDBL_COMPAT(tanhl);
106   extern long double expl( long double ) __LIBMLDBL_COMPAT(expl);
107   extern long double exp2l( long double ) __LIBMLDBL_COMPAT(exp2l);
108   extern long double expm1l( long double ) __LIBMLDBL_COMPAT(expm1l);
109   extern long double logl( long double ) __LIBMLDBL_COMPAT(logl);
110   extern long double log10l( long double ) __LIBMLDBL_COMPAT(log10l);
111   extern long double log2l( long double ) __LIBMLDBL_COMPAT(log2l);
112   extern long double log1pl( long double ) __LIBMLDBL_COMPAT(log1pl);
113   extern long double logbl( long double ) __LIBMLDBL_COMPAT(logbl);
114   extern long double modfl( long double, long double * ) __LIBMLDBL_COMPAT(modfl);
115   extern long double ldexpl( long double, int ) __LIBMLDBL_COMPAT(ldexpl);
116   extern long double frexpl( long double, int * ) __LIBMLDBL_COMPAT(frexpl);
117   extern int ilogbl( long double ) __LIBMLDBL_COMPAT(ilogbl);
118   extern long double scalbnl( long double, int ) __LIBMLDBL_COMPAT(scalbnl);
119   extern long double scalblnl( long double, long int ) __LIBMLDBL_COMPAT(scalblnl);
120   extern long double fabsl( long double ) __LIBMLDBL_COMPAT(fabsl);
121   extern long double cbrtl( long double ) __LIBMLDBL_COMPAT(cbrtl);
122   extern long double hypotl( long double, long double ) __LIBMLDBL_COMPAT(hypotl);
123   extern long double powl( long double, long double ) __LIBMLDBL_COMPAT(powl);
124   extern long double sqrtl( long double ) __LIBMLDBL_COMPAT(sqrtl);
125   extern long double erfl( long double ) __LIBMLDBL_COMPAT(erfl);
126   extern long double erfcl( long double ) __LIBMLDBL_COMPAT(erfcl);
127   extern long double lgammal( long double ) __LIBMLDBL_COMPAT(lgammal);
128   extern long double tgammal( long double ) __LIBMLDBL_COMPAT(tgammal);
129   extern long double ceill( long double ) __LIBMLDBL_COMPAT(ceill);
130   extern long double floorl( long double ) __LIBMLDBL_COMPAT(floorl);
131   extern long double nearbyintl( long double ) __LIBMLDBL_COMPAT(nearbyintl);
132   extern long double rintl( long double ) __LIBMLDBL_COMPAT(rintl);
133   extern long int lrintl( long double ) __LIBMLDBL_COMPAT(lrintl);
134   extern long long int llrintl( long double ) __LIBMLDBL_COMPAT(llrintl);
135   extern long double roundl( long double ) __LIBMLDBL_COMPAT(roundl);
136   extern long int lroundl( long double ) __LIBMLDBL_COMPAT(lroundl);
137   extern long long int llroundl( long double ) __LIBMLDBL_COMPAT(llroundl);
138   extern long double truncl( long double ) __LIBMLDBL_COMPAT(truncl);
139   extern long double fmodl( long double, long double) __LIBMLDBL_COMPAT(fmodl);
140   extern long double remainderl( long double, long double ) __LIBMLDBL_COMPAT(remainderl);
141   extern long double remquol( long double, long double, int * ) __LIBMLDBL_COMPAT(remquol);
142   extern long double copysignl( long double, long double ) __LIBMLDBL_COMPAT(copysignl);
143   extern long double nanl( const char * ) __LIBMLDBL_COMPAT(nanl);
144   extern long double nextafterl( long double, long double ) __LIBMLDBL_COMPAT(nextafterl);
145   extern long double nexttowardl( long double, long double ) __LIBMLDBL_COMPAT(nexttowardl);
146   extern long double fdiml( long double, long double ) __LIBMLDBL_COMPAT(fdiml);
147   extern long double fmaxl( long double, long double ) __LIBMLDBL_COMPAT(fmaxl);
148   extern long double fminl( long double, long double ) __LIBMLDBL_COMPAT(fminl);
149   extern long double fmal( long double, long double, long double ) __LIBMLDBL_COMPAT(fmal);
150 # ifdef __cplusplus
151    }
152 # endif
153 #endif /* __MATH__ */
154 _EndOfHeader_;
155 };
156
157
158 /*
159  *  ... and for the previous fix to be useful, you have to not use ""
160  *  includes.
161  */
162 fix = {
163   hackname  = AAB_darwin7_9_long_double_funcs_2;
164   mach      = "*-*-darwin7.9*";
165   files     = math.h;
166   select    = '#include[ \t]+\"';
167   c_fix     = format;
168   c_fix_arg = "%1<%2.h>";
169   
170   c_fix_arg = '([ \t]*#[ \t]*include[ \t]+)"([a-z0-9/]+)\.h"';
171   
172   test_text = '#include "architecture/ppc/math.h"';
173 };
174
175
176 /*
177  *  This fixes __FD_ZERO bug for linux 2.x.y (x <= 2 && y <= some n)
178  */
179 fix = {
180     hackname = AAB_fd_zero_asm_posix_types_h;
181     files    = asm/posix_types.h;
182     mach     = 'i[34567]86-*-linux*';
183     bypass   = '} while';
184     bypass   = 'x86_64';
185
186     /*
187      * Define _POSIX_TYPES_H_WRAPPER at the end of the wrapper, not
188      * the start, so that if #include_next gets another instance of
189      * the wrapper, this will follow the #include_next chain until
190      * we arrive at the real <asm/posix_types.h>.
191      */
192     replace  = <<-  _EndOfHeader_
193         /* This file fixes a bug in the __FD_ZERO macro
194            for older versions of the Linux kernel. */
195         #ifndef _POSIX_TYPES_H_WRAPPER
196         #include <features.h>
197          #include_next <asm/posix_types.h>
198         
199         #if defined(__FD_ZERO) && !defined(__GLIBC__)
200         #undef __FD_ZERO
201         #define __FD_ZERO(fdsetp) \
202           do { \
203             int __d0, __d1; \
204                         __asm__ __volatile__("cld ; rep ; stosl" \
205                                 : "=&c" (__d0), "=&D" (__d1) \
206                                 : "a" (0), "0" (__FDSET_LONGS), \
207                                   "1" ((__kernel_fd_set *) (fdsetp)) :"memory"); \
208           } while (0)
209         #endif
210         
211         #define _POSIX_TYPES_H_WRAPPER
212         #endif /* _POSIX_TYPES_H_WRAPPER */
213         _EndOfHeader_;
214 };
215
216
217 /*
218  *  This fixes __FD_ZERO bug for glibc-1.x
219  */
220 fix = {
221     hackname = AAB_fd_zero_gnu_types_h;
222     files    = gnu/types.h;
223     mach     = 'i[34567]86-*-linux*';
224
225     /*
226      * Define _TYPES_H_WRAPPER at the end of the wrapper, not
227      * the start, so that if #include_next gets another instance of
228      * the wrapper, this will follow the #include_next chain until
229      * we arrive at the real <gnu/types.h>.
230      */
231     replace  = <<-  _EndOfHeader_
232         /* This file fixes a bug in the __FD_ZERO macro present in glibc 1.x. */
233         #ifndef _TYPES_H_WRAPPER
234         #include <features.h>
235         #include_next <gnu/types.h>
236
237         #if defined(__FD_ZERO) && !defined(__GLIBC__)
238         #undef __FD_ZERO
239         # define __FD_ZERO(fdsetp) \
240           do { \
241             int __d0, __d1; \
242                 __asm__ __volatile__("cld ; rep ; stosl" \
243                 : "=&c" (__d0), "=&D" (__d1) \
244                 : "a" (0), "0" (__FDSET_LONGS), \
245                   "1" ((__fd_set *) (fdsetp)) :"memory"); \
246           } while (0)
247         #endif
248
249         #define _TYPES_H_WRAPPER
250         #endif /* _TYPES_H_WRAPPER */
251         _EndOfHeader_;
252 };
253
254
255 /*
256  *  This fixes __FD_ZERO bug for glibc-2.0.x
257  */
258 fix = {
259     hackname = AAB_fd_zero_selectbits_h;
260     files    = selectbits.h;
261     mach     = 'i[34567]86-*-linux*';
262
263     /*
264      * Define _SELECTBITS_H_WRAPPER at the end of the wrapper, not
265      * the start, so that if #include_next gets another instance of
266      * the wrapper, this will follow the #include_next chain until
267      * we arrive at the real <selectbits.h>.
268      */
269     replace  = <<-  _EndOfHeader_
270         /* This file fixes a bug in the __FD_ZERO macro present in glibc 2.0.x. */
271         #ifndef _SELECTBITS_H_WRAPPER
272           #include <features.h>
273           #include_next <selectbits.h>
274
275           #if defined(__FD_ZERO) && defined(__GLIBC__) \\
276           && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 \\
277           && __GLIBC_MINOR__ == 0
278              #undef __FD_ZERO
279              #define __FD_ZERO(fdsetp) \\
280              do { \\
281                 int __d0, __d1; \\
282               __asm__ __volatile__ ("cld; rep; stosl" \\
283                         : "=&c" (__d0), "=&D" (__d1) \\
284                         : "a" (0), "0" (sizeof (__fd_set) \\
285                                         / sizeof (__fd_mask)), \\
286                           "1" ((__fd_mask *) (fdsetp)) \\
287                         : "memory"); \\
288               } while (0)
289           #endif
290
291           #define _SELECTBITS_H_WRAPPER
292         #endif /* _SELECTBITS_H_WRAPPER */
293         _EndOfHeader_;
294 };
295
296
297 /*
298  * Solaris <sys/varargs.h> is a DDK (aka kernel-land) header providing
299  * the same interface as <stdarg.h>.  No idea why they couldn't have just
300  * used the standard header.
301  */
302 fix = {
303     hackname = AAB_solaris_sys_varargs_h;
304     files    = "sys/varargs.h";
305     mach     = '*-*-solaris*';
306     replace  = <<-  _EndOfHeader_
307         #ifdef __STDC__
308           #include <stdarg.h>
309         #else
310           #include <varargs.h>
311         #endif
312         _EndOfHeader_;
313 };
314
315
316 /*
317  *  Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
318  *  declaration on Sun OS 4.x.  We must only fix this on Sun OS 4.x, because
319  *  many other systems have similar text but correct versions of the file.
320  *  To ensure only Sun's is fixed, we grep for a likely unique string.
321  *  Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t )
322  */
323 fix = {
324     hackname = AAB_sun_memcpy;
325     files    = memory.h;
326     select   = "/\\*\t@\\(#\\)"
327              "(head/memory.h\t50.1\t "
328              "|memory\\.h 1\\.[2-4] 8./../.. SMI; from S5R2 1\\.2\t)\\*/";
329
330     replace = <<-  _EndOfHeader_
331         /* This file was generated by fixincludes */
332         #ifndef __memory_h__
333           #define __memory_h__
334
335           #ifdef __STDC__
336             extern void *memccpy();
337             extern void *memchr();
338             extern void *memcpy();
339             extern void *memset();
340           #else
341             extern char *memccpy();
342             extern char *memchr();
343             extern char *memcpy();
344             extern char *memset();
345           #endif /* __STDC__ */
346
347           extern int memcmp();
348
349         #endif /* __memory_h__ */
350         _EndOfHeader;
351 };
352
353
354 /*
355  *  Completely replace <sys/varargs.h> with a file that includes gcc's
356  *  stdarg.h or varargs.h files as appropriate.
357  */
358 #ifdef SVR4
359 fix = {
360     hackname = AAB_svr4_no_varargs;
361     files    = sys/varargs.h;
362     replace  = "/* This file was generated by fixincludes.  */\n"
363                "#ifndef _SYS_VARARGS_H\n"
364                "#define _SYS_VARARGS_H\n\n"
365
366                "#ifdef __STDC__\n"
367                "#include <stdarg.h>\n"
368                "#else\n"
369                "#include <varargs.h>\n"
370                "#endif\n\n"
371
372                "#endif  /* _SYS_VARARGS_H */\n";
373 };
374 #endif
375
376
377 /*
378  *  Completely replace <sys/byteorder.h> with a file that implements gcc's
379  *  optimized byteswapping.  (The original probably implemented some
380  *  incompatible optimized byteswapping.)
381  */
382 fix = {
383     hackname = AAB_svr4_replace_byteorder;
384     mach     = "*-*-sysv4*";
385     mach     = "i[34567]86-*-sysv5*";
386     mach     = "i[34567]86-*-sco3.2v5*";
387     mach     = "i[34567]86-*-udk*";
388     mach     = "i[34567]86-*-solaris2.[0-4]";
389     mach     = "powerpcle-*-solaris2.[0-4]";
390     mach     = "sparc-*-solaris2.[0-4]";
391     mach     = "i[34567]86-sequent-ptx*";
392     files    = sys/byteorder.h;
393     replace  = <<-  _EndOfHeader_
394         #ifndef _SYS_BYTEORDER_H
395         #define _SYS_BYTEORDER_H
396
397         /* Functions to convert `short' and `long' quantities from host byte order
398            to (internet) network byte order (i.e. big-endian).
399
400            Written by Ron Guilmette (rfg@ncd.com).
401
402            This isn't actually used by GCC.  It is installed by fixinc.svr4.
403
404            For big-endian machines these functions are essentially no-ops.
405
406            For little-endian machines, we define the functions using specialized
407            asm sequences in cases where doing so yields better code (e.g. i386).  */
408
409         #if !defined (__GNUC__) && !defined (__GNUG__)
410           #error You lose!  This file is only useful with GNU compilers.
411         #endif
412
413         #ifndef __BYTE_ORDER__
414           /* Byte order defines.  These are as defined on UnixWare 1.1, but with
415              double underscores added at the front and back.  */
416           #define __LITTLE_ENDIAN__   1234
417           #define __BIG_ENDIAN__      4321
418           #define __PDP_ENDIAN__      3412
419         #endif
420
421         #ifdef __STDC__
422           static __inline__ unsigned long htonl (unsigned long);
423           static __inline__ unsigned short htons (unsigned int);
424           static __inline__ unsigned long ntohl (unsigned long);
425           static __inline__ unsigned short ntohs (unsigned int);
426         #endif /* defined (__STDC__) */
427
428         #if defined (__i386__)
429
430           #ifndef __BYTE_ORDER__
431             #define __BYTE_ORDER__ __LITTLE_ENDIAN__
432           #endif
433
434           /* Convert a host long to a network long.  */
435
436           /* We must use a new-style function definition, so that this will also
437              be valid for C++.  */
438           static __inline__ unsigned long
439           htonl (unsigned long __arg)
440           {
441             register unsigned long __result;
442
443             __asm__ ("xchg%B0 %b0,%h0
444                   ror%L0 $16,%0
445                   xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
446             return __result;
447           }
448
449           /* Convert a host short to a network short.  */
450
451           static __inline__ unsigned short
452           htons (unsigned int __arg)
453           {
454             register unsigned short __result;
455
456             __asm__ ("xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
457             return __result;
458           }
459
460         #elif (defined (__ns32k__) || defined (__vax__) || defined (__arm__))
461
462           #ifndef __BYTE_ORDER__
463             #define __BYTE_ORDER__ __LITTLE_ENDIAN__
464           #endif
465
466           /* For other little-endian machines, using C code is just as efficient as
467              using assembly code.  */
468
469           /* Convert a host long to a network long.  */
470
471           static __inline__ unsigned long
472           htonl (unsigned long __arg)
473           {
474             register unsigned long __result;
475
476             __result = (__arg >> 24) & 0x000000ff;
477             __result |= (__arg >> 8) & 0x0000ff00;
478             __result |= (__arg << 8) & 0x00ff0000;
479             __result |= (__arg << 24) & 0xff000000;
480             return __result;
481           }
482
483           /* Convert a host short to a network short.  */
484
485           static __inline__ unsigned short
486           htons (unsigned int __arg)
487           {
488             register unsigned short __result;
489
490             __result = (__arg << 8) & 0xff00;
491             __result |= (__arg >> 8) & 0x00ff;
492             return __result;
493           }
494
495         #else /* must be a big-endian machine */
496
497           #ifndef __BYTE_ORDER__
498             #define __BYTE_ORDER__ __BIG_ENDIAN__
499           #endif
500
501           /* Convert a host long to a network long.  */
502
503           static __inline__ unsigned long
504           htonl (unsigned long __arg)
505           {
506             return __arg;
507           }
508
509           /* Convert a host short to a network short.  */
510
511           static __inline__ unsigned short
512           htons (unsigned int __arg)
513           {
514             return __arg;
515           }
516
517         #endif /* big-endian */
518
519         /* Convert a network long to a host long.  */
520
521         static __inline__ unsigned long
522         ntohl (unsigned long __arg)
523         {
524           return htonl (__arg);
525         }
526
527         /* Convert a network short to a host short.  */
528
529         static __inline__ unsigned short
530         ntohs (unsigned int __arg)
531         {
532           return htons (__arg);
533         }
534         #endif
535         _EndOfHeader_;
536 };
537
538
539 /*
540  *  Cancel out ansi_compat.h on Ultrix.  Replace it with an empty file.
541  */
542 fix = {
543     hackname = AAB_ultrix_ansi_compat;
544     files    = ansi_compat.h;
545     select   = ULTRIX;
546     replace  = "/* This file intentionally left blank.  */\n";
547 };
548
549
550 /*
551  *  The Ultrix 4.3 file limits.h is a symbolic link to sys/limits.h.
552  *  Replace limits.h with a file that includes sys/limits.h.
553  */
554 fix = {
555     hackname = AAB_ultrix_limits;
556     files    = limits.h;
557     mach     = "*-*-ultrix4.3";
558     replace  = <<-  _EndOfHeader_
559         #ifndef _LIMITS_INCLUDED
560           #define _LIMITS_INCLUDED
561           #include <sys/limits.h>
562         #endif /* _LIMITS_INCLUDED */
563         _EndOfHeader_;
564 };
565
566
567 /*
568  *  The ULTRIX 4.3 version of memory.h duplicates definitions
569  *  present in strings.h.  Replace memory.h with a file that includes
570  *  strings.h to prevent problems from multiple inclusion.
571  */
572 fix = {
573     hackname = AAB_ultrix_memory;
574     files    = memory.h;
575     mach     = "*-*-ultrix4.3";
576     replace  = <<-  _EndOfHeader_
577         #ifndef _MEMORY_INCLUDED
578           #define _MEMORY_INCLUDED
579           #include <strings.h>
580         #endif /* _MEMORY_INCLUDED */
581         _EndOfHeader_;
582 };
583
584
585 /*
586  *  The Ultrix 4.3 file string.h is a symbolic link to strings.h.
587  *  Replace string.h link with a file that includes strings.h to prevent
588  *  problems from multiple inclusion.
589  */
590 fix = {
591     hackname = AAB_ultrix_string;
592     files    = string.h;
593     mach     = "*-*-ultrix4.3";
594     replace  = <<-  _EndOfHeader_
595         #ifndef _STRING_INCLUDED
596           #define _STRING_INCLUDED
597           #include <strings.h>
598         #endif /* _STRING_INCLUDED */
599         _EndOfHeader_;
600 };
601
602
603 /*
604  *  pthread.h on AIX 4.3.3 tries to define a macro without whitspace
605  *  which violates a requirement of ISO C.
606  */
607 fix = {
608     hackname  = aix_pthread;
609     files     = "pthread.h";
610     select    = "(#define [A-Za-z_0-9]+)(\\\\\n[^A-Za-z_0-9 \t\n(])";
611     c_fix     = format;
612     c_fix_arg = "%1 %2";
613     test_text = "#define PTHREAD_MUTEX_INITIALIZER\\\\\n"
614                 "{...init stuff...}";
615 };
616
617
618 /*
619  *  sys/machine.h on AIX 4.3.3 puts whitespace between a \ and a newline
620  *  in an otherwise harmless (and #ifed out) macro definition
621  */
622 fix = {
623     hackname  = aix_sysmachine;
624     files     = sys/machine.h;
625     select    = "\\\\ +\n";
626     c_fix     = format;
627     c_fix_arg = "\\\n";
628     test_text = "#define FOO \\\n"
629     " bar \\ \n baz \\ \n bat";
630 };
631
632
633 /*
634  *  sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the
635  *  definition of struct rusage, so the prototype added by fixproto fails.
636  */
637 fix = {
638     hackname  = aix_syswait;
639     files     = sys/wait.h;
640     select    = "^extern pid_t wait3\\(\\);\n";
641     select    = "bos325,";
642     c_fix     = format;
643     c_fix_arg = "struct rusage;\n%0";
644     test_text = "/* bos325, */\n"
645     "extern pid_t wait3();\n"
646     "\t/* pid_t wait3(int *, int, struct rusage *); */";
647 };
648
649
650 /*
651  *  sys/wait.h on AIX 5.2 defines macros that have both signed and
652  *  unsigned types in conditional expressions.
653  */
654 fix = {
655     hackname  = aix_syswait_2;
656     files     = sys/wait.h;
657     select    = '\? (\(\(\(\(unsigned[^)]*\)[^)]*\) >> [^)]*\) \& 0xff\) : -1)';
658     c_fix     = format;
659     c_fix_arg = "? (int)%1";
660     test_text = "#define WSTOPSIG(__x)    (int)(WIFSTOPPED(__x) ? ((((unsigned int)__x) >> 8) & 0xff) : -1)";
661 };
662
663
664 /*
665  *  sys/signal.h on some versions of AIX uses volatile in the typedef of
666  *  sig_atomic_t, which causes gcc to generate a warning about duplicate
667  *  volatile when a sig_atomic_t variable is declared volatile, as
668  *  required by ANSI C.
669  */
670 fix = {
671     hackname  = aix_volatile;
672     files     = sys/signal.h;
673     select    = "typedef volatile int sig_atomic_t";
674     c_fix     = format;
675     c_fix_arg = "typedef int sig_atomic_t";
676     test_text = "typedef volatile int sig_atomic_t;";
677 };
678
679
680 /*
681  *  Fix __assert declaration in assert.h on Alpha OSF/1.
682  */
683 fix = {
684     hackname  = alpha___assert;
685     files     = "assert.h";
686     select    = '__assert\(char \*, char \*, int\)';
687     c_fix     = format;
688     c_fix_arg = "__assert(const char *, const char *, int)";
689     test_text = 'extern void __assert(char *, char *, int);';
690 };
691
692
693 /*
694  *  Obey __PRAGMA_EXTERN_PREFIX for Tru64 UNIX V4/5 headers.
695  */
696 fix = {
697     hackname  = alpha___extern_prefix;
698     select    = "(.*)(defined\\(__DECC\\)|def[ \t]*__DECC)[ \t]*\n"
699                 "(#[ \t]*pragma[ \t]*extern_prefix.*)";
700
701     mach      = "alpha*-dec-osf*";
702     c_fix     = format;
703     c_fix_arg = "%1 (defined(__DECC) || defined(__PRAGMA_EXTERN_PREFIX))\n%3";
704
705     test_text = "#ifdef  __DECC\n"
706                 "#pragma extern_prefix \"_P\"\n"
707                 "#   if defined(__DECC)\n"
708                 "#     pragma extern_prefix \"_E\"\n"
709                 "# if !defined(_LIBC_POLLUTION_H_) && defined(__DECC)\n"
710                 "#  pragma extern_prefix \"\"";
711 };
712
713
714 /*
715  *  Obey __PRAGMA_EXTERN_PREFIX for Tru64 UNIX V4/5 <standards.h>.
716  */
717 fix = {
718     hackname  = alpha___extern_prefix_standards;
719     files     = standards.h;
720     select    = ".*!defined\\(_LIBC_POLLUTION_H_\\) && !defined\\(__DECC\\)";
721
722     mach      = "alpha*-dec-osf*";
723     c_fix     = format;
724     c_fix_arg = "%0 && !defined(__PRAGMA_EXTERN_PREFIX)";
725
726     test_text = "#if (_ISO_C_SOURCE>=19990L) "
727                 "&& !defined(_LIBC_POLLUTION_H_) && !defined(__DECC)";
728 };
729
730
731 /*
732  *  Obey __PRAGMA_EXTERN_PREFIX for Tru64 UNIX V5 <sys/mount.h> and
733  *  <sys/stat.h>.  The tests for __DECC are special in various ways, so
734  *  alpha__extern_prefix cannot be used.
735  */
736 fix = {
737     hackname  = alpha___extern_prefix_sys_stat;
738     files     = sys/stat.h;
739     files     = sys/mount.h;
740     select    = "#[ \t]*if[ \t]*defined\\(__DECC\\)";
741
742     mach      = "alpha*-dec-osf5*";
743     c_fix     = format;
744     c_fix_arg = "%0 || defined(__PRAGMA_EXTERN_PREFIX)";
745
746     test_text = "#   if defined(__DECC)";
747 };
748
749
750 /*
751  *  Fix assert macro in assert.h on Alpha OSF/1.
752  *  The superfluous int cast breaks C++.
753  */
754 fix = {
755     hackname  = alpha_assert;
756     files     = "assert.h";
757     select    = '(#define assert\(EX\).*)\(\(int\) \(EX\)\)';
758     c_fix     = format;
759     c_fix_arg = "%1(EX)";
760     test_text = '#define assert(EX) (((int) (EX)) ? (void)0 '
761                 ': __assert(#EX, __FILE__, __LINE__))';
762 };
763
764
765 /*
766  *  Fix #defines under Alpha OSF/1:
767  *  The following files contain '#pragma extern_prefix "_FOO"' followed by
768  *  a '#define something(x,y,z) _FOOsomething(x,y,z)'.  The intent of these
769  *  statements is to reduce namespace pollution.  While these macros work
770  *  properly in most cases, they don't allow you to take a pointer to the
771  *  "something" being modified.  To get around this limitation, change these
772  *  statements to be of the form '#define something _FOOsomething'.
773  *
774  *  sed ain't egrep, lesson 2463:  sed can use self-referential
775  *  regular expressions.  In the substitute expression below,
776  *  "\\1" and "\\2" refer to subexpressions found earlier in the
777  *  same match.  So, we continue to use sed.  "extern_prefix" will
778  *  be a rare match anyway...
779  */
780 fix = {
781     hackname = alpha_bad_lval;
782
783     select   = "^[ \t]*#[ \t]*pragma[ \t]+extern_prefix";
784     mach      = "alpha*-dec-osf*";
785
786     sed      =
787         "s/^[ \t]*#[ \t]*define[ \t][ \t]*\\([^(]*\\)\\(([^)]*)\\)[ \t]*"
788                "\\(_.*\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/";
789
790     test_text = '#pragma extern_prefix "_FOO"'"\n"
791                 "#define something(x,y,z) _FOOsomething(x,y,z)\n"
792                 "#define mumble _FOOmumble";
793 };
794
795
796 /*
797  *  Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX.
798  */
799 fix = {
800     hackname  = alpha_getopt;
801     files     = "stdio.h";
802     files     = "stdlib.h";
803     select    = 'getopt\(int, char \*\[\], *char \*\)';
804     c_fix     = format;
805     c_fix_arg = "getopt(int, char *const[], const char *)";
806     test_text = 'extern int getopt(int, char *[], char *);';
807 };
808
809
810 /*
811  * Remove erroneous parentheses in sym.h on Alpha OSF/1.
812  */
813 fix = {
814     hackname  = alpha_parens;
815     files     = sym.h;
816     select    = '#ifndef\(__mips64\)';
817     c_fix     = format;
818     c_fix_arg = "#ifndef __mips64";
819     test_text = "#ifndef(__mips64) /* bogus */\nextern int foo;\n#endif";
820 };
821
822
823 /*
824  *  Obey __PRAGMA_EXTERN_PREFIX for Tru64 UNIX <pthread.h>.
825  */
826 fix = {
827     hackname  = alpha_pthread;
828     files     = pthread.h;
829     select    = "((#[ \t]*if)([ \t]*defined[ \t]*\\(_PTHREAD_ENV_DECC\\)"
830                 "|def _PTHREAD_ENV_DECC)(.*))\n"
831                 "(#[ \t]*define _PTHREAD_USE_PTDNAM_)";
832
833     mach      = "alpha*-dec-osf*";
834     c_fix     = format;
835     c_fix_arg = "%2 defined (_PTHREAD_ENV_DECC)%4 "
836                 "|| defined (__PRAGMA_EXTERN_PREFIX)\n%5";
837
838     test_text = "#  if defined (_PTHREAD_ENV_DECC) "
839                       "|| defined (_PTHREAD_ENV_EPCC)\n"
840                 "#   define _PTHREAD_USE_PTDNAM_\n"
841                 "#  endif\n"
842                 "#  ifdef _PTHREAD_ENV_DECC\n"
843                 "#   define _PTHREAD_USE_PTDNAM_\n"
844                 "#  endif";
845 };
846
847
848 /*
849  *  Recognize GCC in Tru64 UNIX V5.1B <pthread.h>.
850  */
851 fix = {
852     hackname  = alpha_pthread_gcc;
853     files     = pthread.h;
854     select    = "#else\n# error <pthread.h>: unrecognized compiler.";
855
856     mach      = "alpha*-dec-osf*";
857     c_fix     = format;
858     c_fix_arg = "#elif defined (__GNUC__)\n"
859                 "# define _PTHREAD_ENV_GCC\n"
860                 "%0";
861
862     test_text = "# define _PTHREAD_ENV_INTELC\n"
863                 "#else\n"
864                 "# error <pthread.h>: unrecognized compiler.\n"
865                 "#endif";
866 };
867
868 /*
869  * Compaq Tru64 v5.1 defines all of its PTHREAD_*_INITIALIZER macros
870  * incorrectly, specifying less fields in the initializers than are
871  * defined in the corresponding structure types.  Use of these macros
872  * in user code results in spurious warnings.
873  */
874 fix = {
875     hackname  = alpha_pthread_init;
876     files     = pthread.h;
877     select    = ' \* @\(#\).RCSfile: pthread\.h,v \$'
878                 ' .Revision: 1\.1\.33\.21 \$ \(DEC\)'
879                 ' .Date: 2000/08/15 15:30:13 \$';
880     mach      = "alpha*-dec-osf*";
881     sed       = "s@MVALID\\(.*\\)A}@MVALID\\1A, 0, 0, 0, 0, 0, 0 }@\n"
882                 "s@MVALID\\(.*\\)_}@MVALID\\1_, 0, 0, 0, 0 }@\n"
883                 "s@CVALID\\(.*\\)A}@CVALID\\1A, 0, 0, 0, 0 }@\n"
884                 "s@CVALID\\(.*\\)_}@CVALID\\1_, 0, 0 }@\n"
885                 "s@WVALID\\(.*\\)A}@WVALID\\1A, 0, 0, 0, 0, 0, 0, 0, 0, 0 }@\n"
886                 "s@WVALID\\(.*\\)_}@WVALID\\1_, 0, 0, 0, 0, 0, 0, 0 }@\n";
887     test_text = "/*\n"
888                 " * @(#)_RCSfile: pthread.h,v \\$ "
889                 "_Revision: 1.1.33.21 \\$ (DEC) "
890                 "_Date: 2000/08/15 15:30:13 \\$\n"
891                 " */\n"
892 "#ifndef _PTHREAD_NOMETER_STATIC\n"
893 "# define PTHREAD_MUTEX_INITIALIZER \\\n"
894 "    {_PTHREAD_MSTATE_CONFIG, _PTHREAD_MVALID | _PTHREAD_MVF_STA}\n"
895 "# define PTHREAD_COND_INITIALIZER \\\n"
896 "    {_PTHREAD_CSTATE_SLOW, _PTHREAD_CVALID | _PTHREAD_CVF_STA}\n"
897 "# define PTHREAD_MUTEX_INITWITHNAME_NP(_n_,_a_) \\\n"
898 "    {_PTHREAD_MSTATE_CONFIG, _PTHREAD_MVALID | _PTHREAD_MVF_STA, _n_, _a_}\n"
899 "# define PTHREAD_COND_INITWITHNAME_NP(_n_,_a_) \\\n"
900 "    {_PTHREAD_CSTATE_SLOW, _PTHREAD_CVALID | _PTHREAD_CVF_STA, _n_, _a_}\n"
901 "#else\n"
902 "# define PTHREAD_MUTEX_INITIALIZER {0, _PTHREAD_MVALID | _PTHREAD_MVF_STA}\n"
903 "# define PTHREAD_MUTEX_INITWITHNAME_NP(_n_,_a_) \\\n"
904 "    {0, _PTHREAD_MVALID | _PTHREAD_MVF_STA, _n_, _a_}\n"
905 "# define PTHREAD_COND_INITWITHNAME_NP(_n_,_a_) \\\n"
906 "    {0, _PTHREAD_CVALID | _PTHREAD_CVF_STA, _n_, _a_}\n"
907 "#endif\n\n"
908 "#define PTHREAD_RWLOCK_INITIALIZER {_PTHREAD_RWVALID | _PTHREAD_RWVF_STA}\n"
909 "#define PTHREAD_RWLOCK_INITWITHNAME_NP(_n_,_a_) \\\n"
910 "        {_PTHREAD_RWVALID | _PTHREAD_RWVF_STA, _n_, _a_}\n";
911 };
912
913 /*
914  *  Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0
915  *  And OpenBSD.
916  */
917 fix = {
918     hackname = alpha_sbrk;
919     files    = unistd.h;
920     select   = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\(";
921     c_fix     = format;
922     c_fix_arg = "void *sbrk(";
923     test_text = "extern char* sbrk(ptrdiff_t increment);";
924 };
925
926
927 /*
928  *  Change external names of wcstok/wcsftime via asm instead of macros on
929  *  Tru64 UNIX V4.0.
930  */
931 fix = {
932     hackname = alpha_wchar;
933     files    = wchar.h;
934
935     mach     = "alpha*-dec-osf4*";
936     select   = "#define wcstok wcstok_r";
937     sed      = "s@#define wcstok wcstok_r@"
938                 "extern wchar_t *wcstok __((wchar_t *, const wchar_t *, "
939                           "wchar_t **)) __asm__(\"wcstok_r\");@";
940     sed      = "s@#define wcsftime __wcsftime_isoc@"
941                 "extern size_t   wcsftime __((wchar_t *, size_t, const wchar_t *"
942                           ", const struct tm *)) __asm__(\"__wcsftime_isoc\");@";
943     test_text = "#define wcstok wcstok_r\n"
944                 "#define wcsftime __wcsftime_isoc";
945 };
946
947
948 /*
949  *  For C++, avoid any typedef or macro definition of bool,
950  *  and use the built in type instead.
951  *  HP/UX 10.20 also has it in curses_colr/curses.h.
952  */
953 fix = {
954     hackname  = avoid_bool_define;
955     files     = curses.h;
956     files     = curses_colr/curses.h;
957     files     = term.h;
958     files     = tinfo.h;
959
960     select    = "#[ \t]*define[ \t]+bool[ \t]";
961     bypass    = "__cplusplus";
962
963     c_fix     = format;
964     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
965     c_fix_arg = "^[ \t]*#[ \t]*define[ \t]+bool[ \t].*";
966
967     test_text = "# define bool\t char \n";
968 };
969
970
971 fix = {
972     hackname = avoid_bool_type;
973     files    = curses.h;
974     files    = curses_colr/curses.h;
975     files    = term.h;
976     files    = tinfo.h;
977
978     select    = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;";
979     bypass    = "__cplusplus";
980
981     c_fix     = format;
982     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
983
984     test_text = "typedef unsigned int\tbool \t; /* bool\n type */";
985 };
986
987
988 /*
989  *  For C++, avoid any typedef definition of wchar_t,
990  *  and use the built in type instead.
991  *  Don't do this for headers that are smart enough to do the right
992  *  thing (recent [n]curses.h and Xlib.h).
993  *  Don't do it for <linux/nls.h> which is never used from C++ anyway,
994  *  and will be broken by the edit.
995  */
996
997 fix = {
998     hackname = avoid_wchar_t_type;
999
1000     select    = "^[ \t]*typedef[ \t].*[ \t]wchar_t[ \t]*;";
1001     bypass    = "__cplusplus";
1002     bypass    = "_LINUX_NLS_H";
1003     bypass    = "XFree86: xc/lib/X11/Xlib\\.h";
1004
1005     c_fix     = format;
1006     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
1007
1008     test_text = "typedef unsigned short\twchar_t \t; /* wchar_t\n type */";
1009 };
1010
1011
1012 /*
1013  *  Fix `typedef struct term;' on hppa1.1-hp-hpux9.
1014  */
1015 fix = {
1016     hackname  = bad_struct_term;
1017     files     = curses.h;
1018     select    = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;";
1019     c_fix     = format;
1020     c_fix_arg = "struct term;";
1021
1022     test_text = 'typedef struct term;';
1023 };
1024
1025
1026 /*
1027  *  Fix one other error in this file:
1028  *  a mismatched quote not inside a C comment.
1029  */
1030 fix = {
1031     hackname  = badquote;
1032     files     = sundev/vuid_event.h;
1033     select    = "doesn't";
1034     c_fix     = format;
1035     c_fix_arg = "does not";
1036
1037     test_text = "/* doesn't have matched single quotes */";
1038 };
1039
1040
1041 /*
1042  *  check for broken assert.h that needs stdio.h
1043  */
1044 fix = {
1045     hackname  = broken_assert_stdio;
1046     files     = assert.h;
1047     select    = stderr;
1048     bypass    = "include.*stdio\\.h";
1049     c_fix     = wrap;
1050     c_fix_arg = "#include <stdio.h>\n";
1051     test_text = "extern FILE* stderr;";
1052 };
1053
1054
1055 /*
1056  *  check for broken assert.h that needs stdlib.h
1057  */
1058 fix = {
1059     hackname  = broken_assert_stdlib;
1060     files     = assert.h;
1061     select    = 'exit *\(|abort *\(';
1062     bypass    = "include.*stdlib\\.h";
1063     c_fix     = wrap;
1064     c_fix_arg = "#ifdef __cplusplus\n"
1065                 "#include <stdlib.h>\n"
1066                 "#endif\n";
1067     test_text = "extern void exit ( int );";
1068 };
1069
1070
1071 /*
1072  *  Remove `extern double cabs' declarations from math.h.
1073  *  This conflicts with C99.  Discovered on AIX.
1074  *  IRIX 5 and IRIX 6 before 6.5.18 (where C99 support was introduced)
1075  *  declares cabs() to take a struct __cabs_s argument.
1076  *  SunOS4 has its cabs() declaration followed by a comment which
1077  *  terminates on the following line.
1078  *  Darwin hides its broken cabs in architecture-specific subdirs.
1079  */
1080 fix = {
1081     hackname = broken_cabs;
1082     files    = math.h, "architecture/*/math.h";
1083     select   = "^extern[ \t]+double[ \t]+cabs";
1084
1085     sed       = "s/^extern[ \t]*double[ \t]*cabs[ \t]*\([^\\\)]*\);//";
1086     sed       = "s/^extern[ \t]*long[ \t]*double[ \t]*cabsl[ \t]*\([^\\\)]*\);//";
1087
1088     test_text = "#ifdef __STDC__\n"
1089                 "extern     double   cabs(struct dbl_hypot);\n"
1090                 "#else\n"
1091                 "extern     double   cabs();\n"
1092                 "#endif\n"
1093                 "extern double cabs ( _Complex z );\n"
1094                 "extern double cabs(); /* This is a comment\n"
1095                 "                         and it ends here. */\n"
1096                 "extern double  cabs(struct __cabs_s);\n"
1097                 "extern long double cabsl( struct __cabsl_s );";
1098 };
1099
1100 /*
1101  * Fixup Darwin's broken check for __builtin_nanf.
1102  */ 
1103     
1104 fix = {
1105     hackname  = broken_nan;
1106     /*
1107      *  It is tempting to omit the first "files" entry.  Do not.
1108      *  The testing machinery will take the first "files" entry as the name
1109      *  of a test file to play with.  It would be a nuisance to have a directory
1110      *  with the name "*".
1111      */
1112     files     = "architecture/ppc/math.h";
1113     files     = "architecture/*/math.h";
1114     select    = "#if defined(__APPLE_CC__) && (__APPLE_CC__ >= 1345)";
1115     bypass    = "powl";
1116     c_fix     = format; 
1117     c_fix_arg = "#if 1";
1118     test_text = "#if defined(__APPLE_CC__) && (__APPLE_CC__ >= 1345)";
1119 }; 
1120
1121
1122 /*
1123  *  Various systems derived from BSD4.4 contain a macro definition
1124  *  for vfscanf that interacts badly with requirements of builtin-attrs.def.
1125  *  Known to be fixed in FreeBSD 5 system headers.
1126  */
1127 fix = {
1128     hackname  = bsd_stdio_attrs_conflict;
1129     mach      = "*-*-*bsd*";
1130     mach      = "*-*-*darwin*";
1131     files     = stdio.h;
1132     select    = "^#define[ \t]*vfscanf[ \t]*__svfscanf[ \t]*$";
1133     c_fix     = format;
1134     c_fix_arg = '#define _BSD_STRING(_BSD_X) _BSD_STRINGX(_BSD_X)' "\n"
1135                 '#define _BSD_STRINGX(_BSD_X) #_BSD_X' "\n"
1136                 'int vfscanf(FILE *, const char *, __builtin_va_list) '
1137                 '__asm__ (_BSD_STRING(__USER_LABEL_PREFIX__) "__svfscanf");';
1138     test_text = '#define  vfscanf       __svfscanf';
1139 };
1140
1141
1142 /*
1143  *  Fix various macros used to define ioctl numbers.
1144  *  The traditional syntax was:
1145  *
1146  *    #define _CTRL(n, x) (('n'<<8)+x)
1147  *    #define TCTRLCFOO _CTRL(T, 1)
1148  *
1149  *  but this does not work with the C standard, which disallows macro
1150  *  expansion inside strings.  We have to rewrite it thus:
1151  *
1152  *    #define _CTRL(n, x) ((n<<8)+x)
1153  *    #define TCTRLCFOO  _CTRL('T', 1)
1154  *
1155  *  The select expressions match too much, but the c_fix code is cautious.
1156  *
1157  *  CTRL might be: CTRL _CTRL ISCTRL BSD43_CTRL ...
1158  */
1159 fix = {
1160     hackname  = ctrl_quotes_def;
1161     select    = "define[ \t]+[A-Z0-9_]+CTRL\\([a-zA-Z][,)]";
1162     c_fix     = char_macro_def;
1163     c_fix_arg = "CTRL";
1164
1165     /*
1166      *  This is two tests in order to ensure that the "CTRL(c)" can
1167      *  be selected in isolation from the multi-arg format
1168      */
1169     test_text = "#define BSD43_CTRL(n, x) (('n'<<8)+x)\n";
1170     test_text = "#define _CTRL(c) ('c'&037)";
1171 };
1172
1173 fix = {
1174     hackname  = ctrl_quotes_use;
1175     select    = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+CTRL[ \t]*\\( *[^,']";
1176     c_fix     = char_macro_use;
1177     c_fix_arg = "CTRL";
1178     test_text = "#define TCTRLFOO BSD43_CTRL(T, 1)";
1179 };
1180
1181
1182 /*
1183  *  sys/mman.h on HP/UX is not C++ ready,
1184  *  even though NO_IMPLICIT_EXTERN_C is defined on HP/UX.
1185  *
1186  *  rpc/types.h on OSF1/2.0 is not C++ ready,
1187  *  even though NO_IMPLICIT_EXTERN_C is defined for the alpha.
1188  *
1189  *  The problem is the declaration of malloc.
1190  */
1191 fix = {
1192     hackname = cxx_unready;
1193     files    = sys/mman.h;
1194     files    = rpc/types.h;
1195     select   = '[^#]+malloc.*;';  /* Catch any form of declaration
1196                                      not within a macro.  */
1197     bypass   = '"C"|__BEGIN_DECLS';
1198
1199     c_fix     = wrap;
1200     c_fix_arg = "#ifdef __cplusplus\n"
1201                 "extern \"C\" {\n"
1202                 "#endif\n";
1203     c_fix_arg = "#ifdef __cplusplus\n"
1204                 "}\n"
1205                 "#endif\n";
1206     test_text = "extern void* malloc( size_t );";
1207 };
1208
1209
1210 /*
1211  *  On darwin8 and earlier, mach-o/swap.h isn't properly guarded
1212  *  by 'extern "C"'.  On darwin7 some mach/ headers aren't properly guarded.
1213  */
1214 fix = {
1215   hackname  = darwin_externc;
1216   mach      = "*-*-darwin*";
1217   files     = mach-o/swap.h;
1218   files     = mach/mach_time.h;
1219   files     = mach/mach_traps.h;
1220   files     = mach/message.h;
1221   files     = mach/mig.h;
1222   files     = mach/semaphore.h;
1223   bypass    = "extern \"C\"";
1224   bypass    = "__BEGIN_DECLS";
1225   c_fix     = wrap;
1226   c_fix_arg = "#ifdef __cplusplus\n"
1227               "extern \"C\" {\n"
1228               "#endif\n";
1229   c_fix_arg = "#ifdef __cplusplus\n"
1230               "}\n"
1231               "#endif\n";
1232   test_text = "extern void swap_fat_header();\n";
1233 };
1234
1235
1236 /*
1237  * AvailabilityMacros.h on Darwin breaks with GCC 4.0, because of
1238  * bad __GNUC__ tests.
1239  */
1240
1241 fix = {
1242   hackname  = darwin_gcc4_breakage;
1243   mach      = "*-*-darwin*";
1244   files     = AvailabilityMacros.h;
1245   select    = "\\(__GNUC__ >= 3\\) && \\(__GNUC_MINOR__ >= 1\\)";
1246   c_fix     = format;
1247   c_fix_arg = "((__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))";
1248   test_text = "#if defined(__GNUC__) && (__GNUC__ >= 3) && "
1249               "(__GNUC_MINOR__ >= 1)\n";
1250 };
1251
1252
1253 /*
1254  *  __private_extern__ doesn't exist in FSF GCC.  Even if it did,
1255  *  why would you ever put it in a system header file?
1256  */
1257 fix = {
1258   hackname  = darwin_private_extern;
1259   mach      = "*-*-darwin*";
1260   files     = mach-o/dyld.h;
1261   select    = "__private_extern__ [a-z_]+ _dyld_";
1262   c_fix     = format;
1263   c_fix_arg = "extern";
1264   c_fix_arg = "__private_extern__";
1265   test_text = "__private_extern__ int _dyld_func_lookup(\n"
1266               "const char *dyld_func_name,\n"
1267               "unsigned long *address);\n";
1268 };
1269
1270
1271 /*
1272  *  Fix <c_asm.h> on Digital UNIX V4.0:
1273  *  It contains a prototype for a DEC C internal asm() function,
1274  *  clashing with gcc's asm keyword.  So protect this with __DECC.
1275  */
1276 fix = {
1277     hackname = dec_intern_asm;
1278     files    = c_asm.h;
1279     sed = "/^[ \t]*float[ \t]*fasm/i\\\n#ifdef __DECC\n";
1280     sed = "/^[ \t]*#[ \t]*pragma[ \t]*intrinsic([ \t]*dasm/a\\\n"
1281           "#endif\n";
1282     test_text =
1283     "float fasm {\n"
1284     "    ... asm stuff ...\n"
1285     "};\n#pragma intrinsic( dasm )\n/* END ASM TEST*/";
1286 };
1287
1288
1289 /*
1290  * Fix typo in <wchar.h> on DJGPP 2.03.
1291  */
1292 fix = {
1293     hackname  = djgpp_wchar_h;
1294     file      = wchar.h;
1295     select    = "__DJ_wint_t";
1296     bypass    = "sys/djtypes.h";
1297     c_fix     = format;
1298     c_fix_arg = "%0\n#include <sys/djtypes.h>";
1299     c_fix_arg = "#include <stddef.h>";
1300     test_text = "#include <stddef.h>\n"
1301                 "extern __DJ_wint_t x;\n";
1302 };
1303
1304
1305 /*
1306  * Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
1307  */
1308 fix = {
1309     hackname  = ecd_cursor;
1310     files     = "sunwindow/win_lock.h";
1311     files     = "sunwindow/win_cursor.h";
1312     select    = 'ecd\.cursor';
1313     c_fix     = format;
1314     c_fix_arg = 'ecd_cursor';
1315
1316     test_text = "#ifdef ecd.cursor\n#error bogus\n#endif /* ecd+cursor */";
1317 };
1318
1319
1320 /*
1321  *  math.h on SunOS 4 puts the declaration of matherr before the definition
1322  *  of struct exception, so the prototype (added by fixproto) causes havoc.
1323  *  This must appear before the math_exception fix.
1324  */
1325 fix = {
1326     hackname  = exception_structure;
1327     files     = math.h;
1328
1329     /*  If matherr has a prototype already, the header needs no fix.  */
1330     bypass    = 'matherr.*(struct exception|__MATH_EXCEPTION|[ \t]*__FP_EXCEPTION[ \t]*\*[ \t]*)';
1331     select    = matherr;
1332
1333     c_fix     = wrap;
1334     c_fix_arg = "struct exception;\n";
1335
1336     test_text = "extern int matherr();";
1337 };
1338
1339
1340 /*
1341  *  Between 8/24/1998 and 2/17/2001, FreeBSD system headers presume
1342  *  neither the existence of GCC 3 nor its exact feature set yet break
1343  *  (by design?) when __GNUC__ is set beyond 2.
1344  */
1345 fix = {
1346     hackname  = freebsd_gcc3_breakage;
1347     mach      = "*-*-freebsd*";
1348     files     = sys/cdefs.h;
1349     select    = '^#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7$';
1350     bypass    = '__GNUC__[ \t]*([>=]=[ \t]*[3-9]|>[ \t]*2)';
1351     c_fix     = format;
1352     c_fix_arg = '%0 || __GNUC__ >= 3';
1353     test_text = '#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7';
1354 };
1355
1356
1357 /*
1358  *  Some releases of FreeBSD 4 and FreeBSD 5.0 and 5.1 system headers presume
1359  *  neither the existence of GCC 4 nor its exact feature set yet break
1360  *  (by design?) when __GNUC__ is set beyond 3.
1361  */
1362 fix = {
1363     hackname  = freebsd_gcc4_breakage;
1364     mach      = "*-*-freebsd*"; 
1365     files     = sys/cdefs.h;
1366     select    = '^#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 \|\| __GNUC__ == 3$';
1367     c_fix     = format;
1368     c_fix_arg = '#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3';
1369     test_text = '#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ == 3';
1370 };
1371
1372
1373 /*
1374  *  Some versions of glibc don't expect the C99 inline semantics.
1375  */
1376 fix = {
1377     hackname  = glibc_c99_inline_1;
1378     files     = features.h, '*/features.h';
1379     select    = "^ *&& !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__$";
1380     c_fix     = format;
1381     c_fix_arg = "%0 && (defined __extern_inline || defined __GNUC_GNU_INLINE__)";
1382     test_text = <<-EOT
1383 #if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \
1384     && !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__
1385 # define __USE_EXTERN_INLINES   1
1386 #endif
1387 EOT;
1388 };
1389
1390
1391 /*
1392  *  Similar, but a version that didn't have __NO_INLINE__
1393  */
1394 fix = {
1395     hackname  = glibc_c99_inline_1a;
1396     files     = features.h, '*/features.h';
1397     select    = "(\\) && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__)\n"
1398                 "(#[ \t]*define[ \t]*__USE_EXTERN_INLINES[ \t]*1)";
1399     c_fix     = format;
1400     c_fix_arg = "%1 && (defined __extern_inline || defined __GNUC_GNU_INLINE__)\n%2";
1401     test_text = <<-EOT
1402 #if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__
1403 # define __USE_EXTERN_INLINES   1
1404 #endif
1405 EOT;
1406 };
1407
1408
1409 /*
1410  * The glibc_c99_inline_1 fix should have fixed everything.  Unfortunately
1411  * there are many glibc headers which do not respect __USE_EXTERN_INLINES.
1412  * The remaining glibc_c99_inline_* fixes deal with some of those headers.
1413  */
1414 fix = {
1415     hackname  = glibc_c99_inline_2;
1416     files     = sys/stat.h, '*/sys/stat.h';
1417     select    = "extern __inline__ int";
1418     sed     = "s/extern int \\(stat\\|lstat\\|fstat\\|mknod\\)/"
1419               "#ifdef __GNUC_GNU_INLINE__\\\nextern\\\n#endif\\\n"
1420               "__inline__ int \\1/";
1421     sed     = "s/extern int __REDIRECT\\(_NTH\\|\\) (\\(stat\\|lstat\\|fstat\\)/"
1422               "#ifdef __GNUC_GNU_INLINE__\\\nextern\\\n#endif\\\n"
1423               "__inline__ int __REDIRECT\\1 (\\2/";
1424     sed     = "s/^extern __inline__ int/"
1425               "#ifdef __GNUC_GNU_INLINE__\\\nextern\\\n#endif\\\n"
1426               "__inline__ int/";
1427     test_text = <<-EOT
1428         extern int fstat64 (int __fd, struct stat64 *__buf) __THROW __nonnull ((2));
1429         extern __inline__ int
1430         __NTH (fstat64 (int __fd, struct stat64 *__statbuf))
1431         {}
1432         EOT;
1433 };
1434
1435
1436 fix = {
1437     hackname  = glibc_c99_inline_3;
1438     files     = bits/string2.h, '*/bits/string2.h';
1439     select    = "extern __inline";
1440     bypass    = "__extern_inline|__GNU_STDC_INLINE__";
1441     c_fix     = format;
1442     c_fix_arg = "# if defined(__cplusplus) || defined(__GNUC_STDC_INLINE__)";
1443     c_fix_arg = "^# ifdef __cplusplus$";
1444     test_text = <<-EOT
1445         # ifdef __cplusplus
1446         #  define __STRING_INLINE inline
1447         # else
1448         #  define __STRING_INLINE extern __inline
1449         # endif
1450         EOT;
1451 };
1452
1453
1454 fix = {
1455     hackname  = glibc_c99_inline_4;
1456     files     = sys/sysmacros.h, '*/sys/sysmacros.h', wchar.h, '*/wchar.h';
1457     bypass    = "__extern_inline|__gnu_inline__";
1458     select    = "(^| )extern __inline";
1459     c_fix     = format;
1460     c_fix_arg = "%0 __attribute__ ((__gnu_inline__))";
1461     test_text = <<-EOT
1462         __extension__ extern __inline unsigned int
1463         extern __inline unsigned int
1464         EOT;
1465 };
1466
1467
1468 /*  glibc-2.3.5 defines pthread mutex initializers incorrectly,
1469  *  so we replace them with versions that correspond to the
1470  *  definition.
1471  */
1472 fix = {
1473     hackname = glibc_mutex_init;
1474     files    = pthread.h;
1475     select   = '\{ *\{ *0, *\} *\}';
1476     sed      = "/define[ \t]\\+PTHREAD_MUTEX_INITIALIZER[ \t]*\\\\/,+1"
1477                "s/{ { 0, } }/{ { 0, 0, 0, 0, 0, 0 } }/";
1478     sed      = "s/{ \\(0, 0, 0, 0, PTHREAD_MUTEX_\\(RECURSIVE\\|ERRORCHECK\\|ADAPTIVE\\)_NP\\) }/{ \\1, 0 }/";
1479     sed      = "s/{ \\(0, 0, 0, PTHREAD_MUTEX_\\(RECURSIVE\\|ERRORCHECK\\|ADAPTIVE\\)_NP\\) }/{ \\1, 0, 0 }/";
1480     sed      = "/define[ \t]\\+PTHREAD_RWLOCK_INITIALIZER[ \t]*\\\\/"
1481                "N;s/^[ \t]*#[ \t]*"
1482                "\\(define[ \t]\\+PTHREAD_RWLOCK_INITIALIZER[ \t]*\\\\\\)\\n"
1483                "[ \t]*{ { 0, } }/# if __WORDSIZE == 64\\n"
1484                "#  \\1\\n"
1485                "  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }\\n"
1486                "# else\\n"
1487                "#  \\1\\n"
1488                "  { { 0, 0, 0, 0, 0, 0, 0, 0 } }\\n"
1489                "# endif/";
1490     sed      = "s/{ \\(0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP\\) }/{ \\1, 0 }/";
1491     sed      = "/define[ \t]\\+PTHREAD_COND_INITIALIZER/"
1492                "s/{ { 0, } }/{ { 0, 0, 0, 0, 0, (void *) 0, 0, 0 } }/";
1493
1494     test_text = <<- _EOText_
1495 #define PTHREAD_MUTEX_INITIALIZER \\
1496   { { 0, } }
1497 #ifdef __USE_GNU
1498 # if __WORDSIZE == 64
1499 #  define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \\
1500   { { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP } }
1501 #  define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \\
1502   { { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP } }
1503 #  define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \\
1504   { { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP } }
1505 # else
1506 #  define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \\
1507   { { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP } }
1508 #  define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \\
1509   { { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP } }
1510 #  define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \\
1511   { { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP } }
1512 # endif
1513 #endif
1514 # define PTHREAD_RWLOCK_INITIALIZER \\
1515   { { 0, } }
1516 # ifdef __USE_GNU
1517 #  if __WORDSIZE == 64
1518 #   define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \\
1519   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                           \\
1520       PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
1521 #  else
1522 #   define PTHREAD_RWLOCK_WRITER_NONRECURSIVE_INITIALIZER_NP \\
1523   { { 0, 0, 0, 0, 0, 0, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP } }
1524 #  endif
1525 # endif
1526 #define PTHREAD_COND_INITIALIZER { { 0, } }
1527 _EOText_;
1528 };
1529
1530
1531 /*
1532  * Fix these files to use the types we think they should for
1533  * ptrdiff_t, size_t, and wchar_t.
1534  *
1535  * This defines the types in terms of macros predefined by our 'cpp'.
1536  * This is supposedly necessary for glibc's handling of these types.
1537  * It's probably not necessary for anyone else, but it doesn't hurt.
1538  */
1539 fix = {
1540     hackname  = gnu_types;
1541     files  = "sys/types.h";
1542     files  = "stdlib.h";
1543     files  = "sys/stdtypes.h";
1544     files  = "stddef.h";
1545     files  = "memory.h";
1546     files  = "unistd.h";
1547     bypass    = '_GCC_(PTRDIFF|SIZE|WCHAR)_T';
1548     select    = "^[ \t]*typedef[ \t]+.*[ \t](ptrdiff|size|wchar)_t;";
1549     c_fix     = gnu_type;
1550     /* The Solaris 10 headers already define these types correctly.  */
1551     mach   = '*-*-solaris2.1[0-9]*';
1552     not_machine = true;
1553
1554     test_text = "typedef long int ptrdiff_t; /* long int */\n"
1555                 "typedef uint_t size_t; /* uint_t */\n"
1556                 "typedef ushort_t wchar_t; /* ushort_t */";
1557 };
1558
1559
1560 /*
1561  *  Fix HP & Sony's use of "../machine/xxx.h"
1562  *  to refer to:  <machine/xxx.h>
1563  */
1564 fix = {
1565     hackname  = hp_inline;
1566     files     = sys/spinlock.h;
1567     files     = machine/machparam.h;
1568     select    = "[ \t]*#[ \t]*include[ \t]+"  '"\.\./machine/';
1569
1570     c_fix     = format;
1571     c_fix_arg = "%1<machine/%2.h>";
1572
1573     c_fix_arg = "([ \t]*#[ \t]*include[ \t]+)"  '"\.\./machine/'
1574                 '([a-z]+)\.h"';
1575
1576     test_text = ' # include "../machine/mumble.h"';
1577 };
1578
1579
1580 /*
1581  *  Check for (...) in C++ code in HP/UX sys/file.h.
1582  */
1583 fix = {
1584     hackname  = hp_sysfile;
1585     files     = sys/file.h;
1586     select    = "HPUX_SOURCE";
1587
1588     c_fix     = format;
1589     c_fix_arg = "(struct file *, ...)";
1590     c_fix_arg = '\(\.\.\.\)';
1591
1592     test_text = "extern void foo(...); /* HPUX_SOURCE - bad varargs */";
1593 };
1594
1595
1596 /*
1597  * Delete C++ double pow (double, int) inline function from HP-UX 10 & 11
1598  * math.h to prevent clash with define in c_std/bits/std_cmath.h.
1599  */
1600 fix = {
1601     hackname  = hpux10_cpp_pow_inline;
1602     files     = fixinc-test-limits.h, math.h;
1603     select    = <<-     END_POW_INLINE
1604         ^# +ifdef +__cplusplus
1605          +\}
1606          +inline +double +pow\(double +__d,int +__expon\) +\{
1607         [       ]+return +pow\(__d,\(double\)__expon\);
1608          +\}
1609          +extern +"C" +\{
1610         #else
1611         # +endif
1612         END_POW_INLINE;
1613  
1614     c_fix     = format;
1615     c_fix_arg = "";
1616
1617     test_text =
1618         "#    ifdef __cplusplus\n"
1619         "     }\n"
1620         "     inline double pow(double __d,int __expon) {\n"
1621         "\t return pow(__d,(double)__expon);\n"
1622         "     }\n"
1623         '     extern "C"' " {\n"
1624         "#else\n"
1625         "#    endif";
1626 };
1627
1628 fix = {
1629      hackname  = hpux11_cpp_pow_inline;
1630      files     = math.h;
1631      select    = " +inline double pow\\(double d,int expon\\) \\{\n"
1632                  " +return pow\\(d, \\(double\\)expon\\);\n"
1633                  " +\\}\n";
1634      c_fix     = format;
1635      c_fix_arg = "";
1636
1637      test_text =
1638             "   inline double pow(double d,int expon) {\n"
1639             "     return pow(d, (double)expon);\n"
1640             "   }\n";
1641 };
1642
1643
1644 fix = {
1645      hackname  = hppa_hpux_fp_macros;
1646      mach      = "hppa*-hp-hpux11*";
1647      files     = math.h;
1648      select    = "#[ \t]*define[ \t]*FP_NORMAL.*\n"
1649                  "#[ \t]*define[ \t]*FP_ZERO.*\n"
1650                  "#[ \t]*define[ \t]*FP_INFINITE.*\n"
1651                  "#[ \t]*define[ \t]*FP_SUBNORMAL.*\n"
1652                  "#[ \t]*define[ \t]*FP_NAN.*\n";
1653      c_fix     = format;
1654      c_fix_arg = "#endif /* _INCLUDE_HPUX_SOURCE */\n\n#if defined(_INCLUDE_HPUX_SOURCE) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))\n%0#endif\n\n#ifdef _INCLUDE_HPUX_SOURCE\n";
1655
1656      test_text =
1657             "#  define FP_NORMAL     0\n"
1658             "#  define FP_ZERO       1\n"
1659             "#  define FP_INFINITE   2\n"
1660             "#  define FP_SUBNORMAL  3\n"
1661             "#  define FP_NAN        4\n";
1662 };
1663
1664
1665 /*
1666  *  Fix hpux 10.X missing ctype declarations 1
1667  */
1668 fix = {
1669     hackname = hpux10_ctype_declarations1;
1670     files    = ctype.h;
1671     select   = "^#[ \t]*define _toupper\\(__c\\)[ \t]*__toupper\\(__c\\)";
1672     bypass   = "^[ \t]*extern[ \t]*int[ \t]*__tolower[ \t]*\\(";
1673     c_fix     = format;
1674     c_fix_arg = "#ifdef _PROTOTYPES\n"
1675                 "extern int __tolower(int);\n"
1676                 "extern int __toupper(int);\n"
1677                 "#else /* NOT _PROTOTYPES */\n"
1678                 "extern int __tolower();\n"
1679                 "extern int __toupper();\n"
1680                 "#endif /* _PROTOTYPES */\n\n"
1681                 "%0\n";
1682
1683     test_text = "#  define _toupper(__c)         __toupper(__c)\n";
1684 };
1685
1686
1687 /*
1688  *  Fix hpux 10.X missing ctype declarations 2
1689  */
1690 fix = {
1691     hackname = hpux10_ctype_declarations2;
1692     files    = ctype.h;
1693     select   = "^#  if defined\\(_SB_CTYPE_MACROS\\) && \\!defined\\(__lint\\)";
1694     bypass   = "^[ \t]*extern[ \t]*int[ \t]*_isalnum[ \t]*\\(";
1695     c_fix     = format;
1696     c_fix_arg = "%0\n\n"
1697                 "#ifdef _PROTOTYPES\n"
1698                 "     extern int _isalnum(int);\n"
1699                 "     extern int _isalpha(int);\n"
1700                 "     extern int _iscntrl(int);\n"
1701                 "     extern int _isdigit(int);\n"
1702                 "     extern int _isgraph(int);\n"
1703                 "     extern int _islower(int);\n"
1704                 "     extern int _isprint(int);\n"
1705                 "     extern int _ispunct(int);\n"
1706                 "     extern int _isspace(int);\n"
1707                 "     extern int _isupper(int);\n"
1708                 "     extern int _isxdigit(int);\n"
1709                 "#  else /* not _PROTOTYPES */\n"
1710                 "     extern int _isalnum();\n"
1711                 "     extern int _isalpha();\n"
1712                 "     extern int _iscntrl();\n"
1713                 "     extern int _isdigit();\n"
1714                 "     extern int _isgraph();\n"
1715                 "     extern int _islower();\n"
1716                 "     extern int _isprint();\n"
1717                 "     extern int _ispunct();\n"
1718                 "     extern int _isspace();\n"
1719                 "     extern int _isupper();\n"
1720                 "     extern int _isxdigit();\n"
1721                 "#endif /* _PROTOTYPES */\n";
1722
1723     test_text = "#  if defined(_SB_CTYPE_MACROS) && !defined(__lint)\n"
1724                 "     extern unsigned int *__SB_masks;\n";
1725 };
1726
1727
1728 /*
1729  *  Fix hpux 10.X missing stdio declarations
1730  */
1731 fix = {
1732     hackname = hpux10_stdio_declarations;
1733     files    = stdio.h;
1734     select   = "^#[ \t]*define _iob[ \t]*__iob";
1735     bypass   = "^[ \t]*extern[ \t]*int[ \t]*vsnprintf[ \t]*\\(";
1736     c_fix     = format;
1737     c_fix_arg = "%0\n\n"
1738         "#  if defined(__STDC__) || defined(__cplusplus)\n"
1739         "     extern int snprintf(char *, size_t, const char *, ...);\n"
1740         "     extern int vsnprintf(char *, size_t, const char *, __va_list);\n"
1741         "#  else /* not __STDC__) || __cplusplus */\n"
1742         "     extern int snprintf();\n"
1743         "     extern int vsnprintf();\n"
1744         "#  endif /* __STDC__) || __cplusplus */\n";
1745
1746     test_text = "#  define _iob __iob\n";
1747 };
1748
1749
1750 /*
1751  *  Make sure hpux defines abs in header.
1752  */
1753 fix = {
1754     hackname  = hpux11_abs;
1755     mach      = "ia64-hp-hpux11*";
1756     files     = stdlib.h;
1757     select    = "ifndef _MATH_INCLUDED";
1758     c_fix     = format;
1759     c_fix_arg = "if !defined(_MATH_INCLUDED) || defined(__GNUG__)";
1760 //  sed       = "s/ifndef _MATH_INCLUDED/if !defined(_MATH_INCLUDED) || defined(__GNUG__)/";
1761     test_text = "#ifndef _MATH_INCLUDED";
1762 };
1763
1764
1765 /*
1766  *  Keep HP-UX 11 from stomping on C++ math namespace
1767  *  with defines for fabsf.
1768  */
1769 fix = {
1770     hackname  = hpux11_fabsf;
1771     files     = math.h;
1772     select    = "^[ \t]*#[ \t]*define[ \t]+fabsf\\(.*";
1773     bypass    = "__cplusplus";
1774
1775     c_fix     = format;
1776     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
1777
1778     test_text =
1779     "#ifdef _PA_RISC\n"
1780     "#  define fabsf(x) ((float)fabs((double)(float)(x)))\n"
1781     "#endif";
1782 };
1783
1784
1785 /*
1786  * Prevent HP-UX 11 from defining __size_t and preventing size_t from
1787  * being defined by having it define _hpux_size_t instead.
1788  */
1789 fix = {
1790     hackname  = hpux11_size_t;
1791     mach      = "*-hp-hpux11*";
1792     select    = "__size_t";
1793
1794     c_fix     = format;
1795     c_fix_arg = "_hpux_size_t";
1796
1797     test_text =
1798     "#define __size_t size_t\n"
1799     "       extern int getpwuid_r( char *, __size_t, struct passwd **);\n";
1800 };
1801
1802
1803 /*
1804  *  Fix hpux 11.00 broken snprintf declaration
1805  *  (third argument is char *, needs to be const char * to prevent
1806  *  spurious warnings with -Wwrite-strings or in C++).
1807  */
1808 fix = {
1809     hackname = hpux11_snprintf;
1810     files    = stdio.h;
1811     select   = '(extern int snprintf *\(char *\*, *(|__|_hpux_)size_t,)'
1812                                     ' *(char *\*, *\.\.\.\);)';
1813     c_fix     = format;
1814     c_fix_arg = '%1 const %3';
1815
1816     test_text = "extern int snprintf(char *, size_t, char *, ...);\n"
1817                 "extern int snprintf(char *, __size_t, char *, ...);\n"
1818                 "extern int snprintf(char *, _hpux_size_t, char *, ...);";
1819 };
1820
1821
1822 /*
1823  * In inttypes.h on HPUX 11, the use of __CONCAT__ in the definition
1824  * of UINT32_C has undefined behavior according to ISO/ANSI:
1825  * the arguments to __CONCAT__ are not macro expanded before the
1826  * concatination happens so the trailing ')' in the first argument
1827  * is concatinated with the 'l' in the second argument creating an
1828  * invalid pp token.  The behavior of invalid pp tokens is undefined.
1829  * GCC does not handle these invalid tokens the way the HP compiler does.
1830  * This problem will potentially occur anytime macros are used in the
1831  * arguments to __CONCAT__.  A general solution to this problem would be to
1832  * insert another layer of macro between __CONCAT__ and its use
1833  * in UINT32_C.  An example of this solution can be found in the C standard.
1834  * A more specific solution, the one used here, is to change the UINT32_C
1835  * macro to not used macros in the arguments to __CONCAT__.
1836  */
1837 fix = {
1838     hackname = hpux11_uint32_c;
1839     files    = inttypes.h;
1840     select   = "^#define UINT32_C\\(__c\\)[ \t]*"
1841                          "__CONCAT__\\(__CONCAT_U__\\(__c\\),l\\)";
1842     c_fix    = format;
1843     c_fix_arg = '#define UINT32_C(__c) __CONCAT__(__c,ul)';
1844     test_text =
1845     "#define CONCAT_U__(__c)\t__CONCAT__(__c,u)\n"
1846     "#define UINT32_C(__c)\t__CONCAT__(__CONCAT_U__(__c),l)";
1847 };
1848
1849
1850 /*
1851  *  Fix hpux 11.00 broken vsnprintf declaration
1852  */
1853 fix = {
1854     hackname = hpux11_vsnprintf;
1855     files    = stdio.h;
1856     select   = '(extern int vsnprintf\(char \*, _[hpux]*_size_t, '
1857                                      'const char \*,) __va__list\);';
1858     c_fix     = format;
1859     c_fix_arg = "%1 __va_list);";
1860
1861     test_text = 'extern int vsnprintf(char *, _hpux_size_t, const char *,'
1862                                      ' __va__list);';
1863 };
1864
1865
1866 /*
1867  *  get rid of bogus inline definitions in HP-UX 8.0
1868  */
1869 fix = {
1870     hackname = hpux8_bogus_inlines;
1871     files    = math.h;
1872     select   = inline;
1873     bypass   = "__GNUG__";
1874     sed = "s@inline int abs(int [a-z][a-z]*) {.*}"
1875            "@extern \"C\" int abs(int);@";
1876     sed = "s@inline double abs(double [a-z][a-z]*) {.*}@@";
1877     sed = "s@inline int sqr(int [a-z][a-z]*) {.*}@@";
1878     sed = "s@inline double sqr(double [a-z][a-z]*) {.*}@@";
1879     test_text = "inline int abs(int v) { return (v>=0)?v:-v; }\n"
1880                 "inline double sqr(double v) { return v**0.5; }";
1881 };
1882
1883
1884 /*
1885  *  Fix hpux broken ctype macros
1886  */
1887 fix = {
1888     hackname = hpux_ctype_macros;
1889     files    = ctype.h;
1890     select   = '((: |\()__SB_masks \? )'
1891                '(__SB_masks\[__(alnum|c)\] & _IS)';
1892     c_fix     = format;
1893     c_fix_arg = "%1(int)%3";
1894
1895     test_text = ": __SB_masks ? __SB_masks[__alnum] & _ISCNTRL\n"
1896                 "# define isalpha(__c) (__SB_masks ? __SB_masks[__c] & _IS\n";
1897 };
1898
1899
1900 /*
1901  *  Fix hpux broken #ifndef _XOPEN_SOURCE_EXTENDED conditional on htonl etc.
1902  */
1903 fix = {
1904     hackname = hpux_htonl;
1905     files    = netinet/in.h;
1906     select   = "#ifndef _XOPEN_SOURCE_EXTENDED\n"
1907                "(/\\*\n"
1908                " \\* Macros for number representation conversion\\.\n"
1909                " \\*/\n"
1910                "#ifndef ntohl)";
1911     c_fix     = format;
1912     c_fix_arg = "#if 1\n%1";
1913
1914     test_text = "#ifndef _XOPEN_SOURCE_EXTENDED\n"
1915                 "/*\n"
1916                 " * Macros for number representation conversion.\n"
1917                 " */\n"
1918                 "#ifndef ntohl\n"
1919                 "#define ntohl(x)        (x)\n"
1920                 "#define ntohs(x)        (x)\n"
1921                 "#define htonl(x)        (x)\n"
1922                 "#define htons(x)        (x)\n"
1923                 "#endif\n"
1924                 "#endif  /* ! _XOPEN_SOURCE_EXTENDED */";
1925 };
1926
1927
1928 /*
1929  * HP-UX long_double
1930  */
1931 fix = {
1932     hackname  = hpux_long_double;
1933     files     = stdlib.h;
1934     select    = "extern[ \t]long_double[ \t]strtold";
1935     bypass    = "long_double_t";
1936     sed       = "/^#[ \t]*ifndef _LONG_DOUBLE/,/\\/\\* _LONG_DOUBLE \\*\\//D";
1937     sed       = "s/long_double/long double/g";
1938
1939     test_text = "#  ifndef _LONG_DOUBLE\n"
1940                 "#    define _LONG_DOUBLE\n"
1941                 "     typedef struct {\n"
1942                 "       unsigned int word1, word2, word3, word4;\n"
1943                 "     } long_double;\n"
1944                 "#  endif /* _LONG_DOUBLE */\n"
1945                 "extern long_double strtold(const char *, char **);\n";
1946 };
1947
1948
1949 /*
1950  *  Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
1951  */
1952 fix = {
1953     hackname = hpux_systime;
1954     files    = sys/time.h;
1955     select   = "^extern struct sigevent;";
1956
1957     c_fix     = format;
1958     c_fix_arg = "struct sigevent;";
1959
1960     test_text = 'extern struct sigevent;';
1961 };
1962
1963
1964 /*
1965  *  Wrap spu_info in ifdef _KERNEL.  GCC cannot handle an array of unknown
1966  *  type and mpinfou is only defined when _KERNEL is set.
1967  */
1968 fix = {
1969     hackname = hpux_spu_info;
1970     mach     = "*-hp-hpux*";
1971     files    = ia64/sys/getppdp.h;
1972     select   = "^.*extern.*spu_info.*";
1973
1974     c_fix     = format;
1975     c_fix_arg = "#ifdef _KERNEL\n%0\n#endif";
1976
1977     test_text = "extern union mpinfou spu_info[];";
1978 };
1979
1980 fix = {
1981     hackname  = hpux11_extern_sendfile;
1982     mach      = "*-hp-hpux11.[12]*";
1983     files     = sys/socket.h;
1984     select    = "^[ \t]*extern sbsize_t sendfile.*\n.*, int\\)\\);\n";
1985     c_fix     = format;
1986     c_fix_arg = "#ifndef _APP32_64BIT_OFF_T\n%0#endif\n";
1987     test_text = "   extern sbsize_t sendfile __((int, int, off_t, bsize_t,\n                               const struct iovec *, int));\n";
1988 };
1989
1990 fix = {
1991     hackname  = hpux11_extern_sendpath;
1992     mach      = "*-hp-hpux11.[12]*";
1993     files     = sys/socket.h;
1994     select    = "^[ \t]*extern sbsize_t sendpath.*\n.*, int\\)\\);\n";
1995     c_fix     = format;
1996     c_fix_arg = "#ifndef _APP32_64BIT_OFF_T\n%0#endif\n";
1997     test_text = "   extern sbsize_t sendpath __((int, int, off_t, bsize_t,\n                               const struct iovec *, int));\n";
1998 };
1999
2000 fix = {
2001     hackname  = hpux_extern_errno;
2002     mach      = "*-hp-hpux10.*";
2003     mach      = "*-hp-hpux11.[0-2]*";
2004     files     = errno.h;
2005     select    = "^[ \t]*extern int errno;$";
2006     c_fix     = format;
2007     c_fix_arg = "#ifdef __cplusplus\nextern \"C\" {\n#endif\n%0\n#ifdef __cplusplus\n}\n#endif";
2008     test_text = "   extern int errno;\n";
2009 };
2010
2011 /*
2012  *  Fix C99 constant in __POINTER_SET define.
2013  */
2014 fix = {
2015     hackname  = hpux11_pthread_const;
2016     mach      = "*-hp-hpux11.[0-3]*";
2017     files     = sys/pthread.h;
2018     select    = "^#define[ \t]*__POINTER_SET[ \t]*\\(\\(void \\*\\) 1LL\\)";
2019
2020     c_fix     = format;
2021     c_fix_arg = "#define __POINTER_SET\t\t((void *) 1L)";
2022     test_text = "#define __POINTER_SET\t\t((void *) 1LL)";
2023 };
2024
2025 /*
2026  *  Add missing braces to pthread initializer defines.
2027  */
2028 fix = {
2029     hackname  = hpux_pthread_initializers;
2030     mach      = "*-hp-hpux11.[0-3]*";
2031     files     = sys/pthread.h;
2032     sed       = "s@^[ \t]*1, 1, 1, 1,[ \t]*\\\\"
2033                  "@\t{ 1, 1, 1, 1 },\t\t\t\t\t\t\t\\\\@";
2034     sed       = "s@^[ \t]*1,[ \t]*\\\\"
2035                  "@\t{ 1, 0 }@";
2036     sed       = "/^[ \t]*0$/d";
2037     sed       = "s@__PTHREAD_MUTEX_VALID, 0"
2038                  "@{ __PTHREAD_MUTEX_VALID, 0 }@";
2039     sed       = "s@^[ \t]*0, 0, -1, 0,[ \t]*\\\\"
2040                  "@\t{ 0, 0, -1, 0 },\t\t\t\t\t\t\\\\@";
2041     sed       = "s@0, __LWP_MTX_VALID, 0, 1, 1, 1, 1,[ \t]*\\\\"
2042                  "@{ 0, __LWP_MTX_VALID }, { 0, 1, 1, 1, 1 },\t\t\t\\\\@";
2043     sed       = "s@^[ \t]*__LWP_MTX_VALID, 0, 1, 1, 1, 1,[ \t]*\\\\"
2044                  "@\t{ 0, __LWP_MTX_VALID }, { 0, 1, 1, 1, 1 },\t\t\t\\\\@";
2045     sed       = "s@^[ \t]*0, 0[ \t]*\\\\"
2046                  "@\t{ 0, 0 }\t\t\t\t\t\t\t\\\\@";
2047     sed       = "s@__PTHREAD_COND_VALID, 0"
2048                  "@{ __PTHREAD_COND_VALID, 0 }@";
2049     sed       = "s@__LWP_COND_VALID, 0,[ \t]*\\\\"
2050                  "@{ __LWP_COND_VALID, 0 },\t\t\t\t\t\\\\@";
2051     sed       = "s@__PTHREAD_RWLOCK_VALID, 0"
2052                  "@{ __PTHREAD_RWLOCK_VALID, 0 }@";
2053     sed       = "s@__LWP_RWLOCK_VALID, 0,[ \t]*\\\\"
2054                  "@{ __LWP_RWLOCK_VALID, 0 },\t\t\t\t\t\\\\@";
2055     sed       = "s@^[ \t]*0, 0, 0, 0, 0, 0, 0[ \t]*\\\\"
2056                  "@\t{ 0, 0, 0, 0, 0 }, { 0, 0}\t\t\t\t\t\\\\@";
2057     test_text = "#define PTHREAD_MUTEX_INITIALIZER  {\t\t\t\t\t\\\\\n"
2058                 "\t__PTHREAD_MUTEX_VALID, 0,\t\t\t\t\t\\\\\n"
2059                 "\t(PTHREAD_MUTEX_DEFAULT | PTHREAD_PROCESS_PRIVATE),\t\t\\\\\n"
2060                 "\t__SPNLCK_INITIALIZER,\t\t\t\t\t\t\\\\\n"
2061                 "\t0, 0, -1, 0,\t\t\t\t\t\t\t\\\\\n"
2062                 "\t0, __LWP_MTX_VALID, 0, 1, 1, 1, 1,\t\t\t\t\\\\\n"
2063                 "\t0, 0\t\t\t\t\t\t\t\t\\\\\n"
2064                 "}\n";
2065 };
2066
2067 /*
2068  *  Fix glibc definition of HUGE_VAL in terms of hex floating point constant
2069  */
2070 fix = {
2071     hackname  = huge_val_hex;
2072     files     = bits/huge_val.h;
2073     select    = "^#[ \t]*define[ \t]*HUGE_VAL[ \t].*0x1\\.0p.*";
2074     bypass    = "__builtin_huge_val";
2075
2076     c_fix     = format;
2077     c_fix_arg = "#define HUGE_VAL (__builtin_huge_val())\n";
2078
2079     test_text = "# define HUGE_VAL\t(__extension__ 0x1.0p2047)";
2080 };
2081
2082
2083 /*
2084  *  Fix glibc definition of HUGE_VALF in terms of hex floating point constant
2085  */
2086 fix = {
2087     hackname  = huge_valf_hex;
2088     files     = bits/huge_val.h;
2089     select    = "^#[ \t]*define[ \t]*HUGE_VALF[ \t].*0x1\\.0p.*";
2090     bypass    = "__builtin_huge_valf";
2091
2092     c_fix     = format;
2093     c_fix_arg = "#define HUGE_VALF (__builtin_huge_valf())\n";
2094
2095     test_text = "#  define HUGE_VALF (__extension__ 0x1.0p255f)";
2096 };
2097
2098
2099 /*
2100  *  Fix glibc definition of HUGE_VALL in terms of hex floating point constant
2101  */
2102 fix = {
2103     hackname  = huge_vall_hex;
2104     files     = bits/huge_val.h;
2105     select    = "^#[ \t]*define[ \t]*HUGE_VALL[ \t].*0x1\\.0p.*";
2106     bypass    = "__builtin_huge_vall";
2107
2108     c_fix     = format;
2109     c_fix_arg = "#define HUGE_VALL (__builtin_huge_vall())\n";
2110
2111     test_text = "#  define HUGE_VALL (__extension__ 0x1.0p32767L)";
2112 };
2113
2114
2115 /*
2116  *  Fix return type of abort and free
2117  */
2118 fix = {
2119     hackname  = int_abort_free_and_exit;
2120     files     = stdlib.h;
2121     select    = "int[ \t]+(abort|free|exit)[ \t]*\\(";
2122     bypass    = "_CLASSIC_ANSI_TYPES";
2123
2124     c_fix     = format;
2125     c_fix_arg = "void\t%1(";
2126
2127     test_text = "extern int abort(int);\n"
2128                 "extern int free(void*);\n"
2129                 "extern int exit(void*);";
2130 };
2131
2132
2133 /*
2134  *  Fix various macros used to define ioctl numbers.
2135  *  The traditional syntax was:
2136  *
2137  *    #define _IO(n, x) (('n'<<8)+x)
2138  *    #define TIOCFOO _IO(T, 1)
2139  *
2140  *  but this does not work with the C standard, which disallows macro
2141  *  expansion inside strings.  We have to rewrite it thus:
2142  *
2143  *    #define _IO(n, x) ((n<<8)+x)
2144  *    #define TIOCFOO  _IO('T', 1)
2145  *
2146  *  The select expressions match too much, but the c_fix code is cautious.
2147  *
2148  *  _IO might be: _IO DESIO BSD43__IO with W, R, WR, C, ... suffixes.
2149  */
2150 fix = {
2151     hackname  = io_quotes_def;
2152     select    = "define[ \t]+[A-Z0-9_]+IO[A-Z]*\\([a-zA-Z][,)]";
2153     c_fix     = char_macro_def;
2154     c_fix_arg = "IO";
2155     test_text =
2156     "#define BSD43__IOWR(n, x) (('n'<<8)+x)\n"
2157     "#define _IOWN(x,y,t)  (_IOC_IN|(((t)&_IOCPARM_MASK)<<16)|('x'<<8)|y)\n"
2158     "#define _IO(x,y)      ('x'<<8|y)";
2159     test_text =
2160     "#define XX_IO(x)        ('x'<<8|256)";
2161 };
2162
2163 fix = {
2164     hackname  = io_quotes_use;
2165     select    = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+IO[A-Z]*[ \t]*"
2166                 "\\( *[^,']";
2167     c_fix     = char_macro_use;
2168     c_fix_arg = "IO";
2169     test_text = "#define TIOCFOO BSD43__IOWR(T, 1)\n"
2170                 "#define TIOCFOO \\\\\n"
2171                 "BSD43__IOWR(T, 1) /* Some are multi-line */";
2172 };
2173
2174
2175 /*
2176  *  Check for missing ';' in struct
2177  */
2178 fix = {
2179     hackname = ip_missing_semi;
2180     files    = netinet/ip.h;
2181     select   = "}$";
2182     sed      = "/^struct/,/^};/s/}$/};/";
2183     test_text=
2184     "struct mumble {\n"
2185     "  union {\n"
2186     "    int x;\n"
2187     "  }\n"
2188     "}; /* mumbled struct */\n";
2189 };
2190
2191
2192 /*
2193  *  IRIX 6.5.1[89] <internal/sgimacros.h> unconditionally defines
2194  *  __restrict as restrict iff __c99.  This is wrong for C++, which
2195  *  needs many C99 features, but only supports __restrict.
2196  */
2197 fix = {
2198     hackname  = irix___restrict;
2199     files     = internal/sgimacros.h;
2200     select    = "(#ifdef __c99\n)(#[ \t]*define __restrict restrict)";
2201
2202     mach      = "mips-sgi-irix6.5";
2203     c_fix     = format;
2204     c_fix_arg = "%1"
2205                 "#  ifndef __cplusplus\n%2\n#  endif";
2206
2207     test_text = "#ifdef __c99\n#  define __restrict restrict";
2208 };
2209
2210 /*
2211  * IRIX 6.5.22 <internal/math_core.h> uses the SGI c99 __generic() intrinsic
2212  * to define the fpclasify, isfinite, isinf, isnan, isnormal and signbit 
2213  * functions.
2214  *
2215  * This was probably introduced around IRIX 6.5.18
2216  */
2217 fix = {
2218     hackname  = irix___generic1;
2219     files     = internal/math_core.h;
2220     mach      = "mips-sgi-irix6.5";
2221     select    = "#define ([a-z]+)\\(x\\) *__generic.*";
2222
2223     c_fix     = format;
2224     c_fix_arg = "extern int %1(double);\n"
2225                 "extern int %1f(float);\n"
2226                 "extern int %1l(long double);\n"
2227                 "#define %1(x) (sizeof(x) == sizeof(double) ? _%1(x) \\\n"
2228                 "               : sizeof(x) == sizeof(float) ? _%1f(x) \\\n"
2229                 "               : _%1l(x))\n";
2230
2231     test_text = 
2232       "#define isnan(x) __generic(x,,, _isnan, _isnanf, _isnanl,,,)(x)\n";
2233 };
2234
2235
2236 /* Likewise <internal/math_core.h> on IRIX 6.5.19 and later uses the SGI
2237    compiler's __generic intrinsic to define isgreater, isgreaterequal,
2238    isless, islessequal, islessgreater and isunordered functions.  */
2239 fix = {
2240     hackname  = irix___generic2;
2241     files     = internal/math_core.h;
2242     mach      = "mips-sgi-irix6.5";
2243     select    = "#define ([a-z]+)\\(x,y\\) *__generic.*";
2244
2245     c_fix     = format;
2246     c_fix_arg = "#define %1(x,y) \\\n"
2247                 "  ((sizeof(x)<=4 && sizeof(y)<=4) ? _%1f(x,y) \\\n"
2248                 "   : (sizeof(x)<=8 && sizeof(y)<=8) ? _%1(x,y) \\\n"
2249                 "   : _%1l(x,y))\n";
2250
2251     test_text = 
2252       "#define isless(x,y)         __generic(x,y,, _isless, _islessf, _islessl,,,)(x,y)";
2253 };
2254
2255
2256 /*
2257  *  IRIX 5.2's <sys/asm.h> contains an asm comment with a contraction
2258  *  that causes the assembly preprocessor to complain about an
2259  *  unterminated character constant.
2260  */
2261 fix = {
2262     hackname  = irix_asm_apostrophe;
2263     files     = sys/asm.h;
2264
2265     select    = "^[ \t]*#.*[Ww]e're";
2266     c_fix     = format;
2267     c_fix_arg = "%1 are";
2268     c_fix_arg = "^([ \t]*#.*[Ww]e)'re";
2269     test_text = "\t# and we're on vacation";
2270 };
2271
2272
2273 /*
2274  *  Non-traditional "const" declaration in Irix's limits.h.
2275  */
2276 fix = {
2277     hackname    = irix_limits_const;
2278     files       = fixinc-test-limits.h, limits.h;
2279     select      = "^extern const ";
2280     c_fix       = format;
2281     c_fix_arg   = "extern __const ";
2282     test_text   = "extern const char limit; /* test limits */";
2283 };
2284
2285
2286 /*
2287  *  IRIX 6.5.1[78] <sys/socket.h> has a broken definition of socklen_t.
2288  *  Various socket function prototypes use different types instead,
2289  *  depending on the API in use (BSD, XPG4/5), but the socklen_t
2290  *  definition doesn't reflect this (SGI Bug Id 864477, fixed in
2291  *  IRIX 6.5.19).
2292  */
2293 fix = {
2294     hackname  = irix_socklen_t;
2295     files     = sys/socket.h;
2296     select    = "(#define _SOCKLEN_T\n)(typedef u_int32_t socklen_t;)";
2297
2298     mach      = "mips-sgi-irix6.5";
2299     c_fix     = format;
2300     c_fix_arg = "%1"
2301                 "#if _NO_XOPEN4 && _NO_XOPEN5\n"
2302                 "typedef int socklen_t;\n"
2303                 "#else\n"
2304                 "%2\n"
2305                 "#endif /* _NO_XOPEN4 && _NO_XOPEN5 */";
2306
2307     test_text = "#define _SOCKLEN_T\ntypedef u_int32_t socklen_t;";
2308 };
2309
2310 /*
2311  *  IRIX 6.5 <stdint.h> only works with ISO C99 and errors out
2312  *  otherwise.
2313  */
2314 fix = {
2315     hackname  = irix_stdint_c99;
2316     files     = stdint.h;
2317     select = "(#ifndef __c99\n)(#error This header file is to be used only for c99 mode compilations)";
2318
2319     mach      = "mips-sgi-irix6.5";
2320     c_fix  = format;
2321     c_fix_arg = "#if 0\n"
2322                 "%2";
2323     test_text =
2324     "#ifndef __c99\n#error This header file is to be used only for c99 mode compilations\n#else";
2325 };
2326
2327
2328 /*
2329  *  IRIX 5.x's stdio.h and IRIX 6.5's internal/stdio_core.h declare
2330  *  some functions that take a va_list as
2331  *  taking char *.  However, GCC uses void * for va_list, so
2332  *  calling vfprintf with a va_list fails in C++.  */
2333 fix = {
2334     hackname  = irix_stdio_va_list;
2335     files     = stdio.h;
2336     files     = internal/stdio_core.h;
2337
2338     select = '/\* va_list \*/ char \*';
2339     c_fix  = format;
2340     c_fix_arg = "__gnuc_va_list";
2341     test_text =
2342     "extern int printf( const char *, /* va_list */ char * );";
2343 };
2344
2345
2346 /*
2347  *  IRIX 6.5.19 <internal/wchar_core.h> provides the XPG4 variant of
2348  *  wcsftime by default.  ISO C99 requires the XPG5 variant instead.
2349  */
2350 fix = {
2351     hackname  = irix_wcsftime;
2352     files     = internal/wchar_core.h;
2353     select    = "#if _NO_XOPEN5\n(extern size_t[ \t]+wcsftime.*const char \*.*)";
2354
2355     mach      = "mips-sgi-irix6.5";
2356     c_fix     = format;
2357     c_fix_arg = "#if _NO_XOPEN5 && !defined(__c99)\n%1";
2358
2359     test_text = "#if _NO_XOPEN5\n"
2360                 "extern size_t          wcsftime(wchar_t *, __SGI_LIBC_NAMESPACE_QUALIFIER size_t, const char *, const struct tm *);";
2361 };
2362
2363 /*
2364  * Fixing ISC fmod declaration
2365  */
2366 fix = {
2367     hackname  = isc_fmod;
2368     files     = math.h;
2369     select    = 'fmod\(double\)';
2370     c_fix     = format;
2371     c_fix_arg = "fmod(double, double)";
2372     test_text = "extern double  fmod(double);";
2373 };
2374
2375
2376 /*
2377  *  On Interactive Unix 2.2, certain traditional Unix definitions
2378  *  (notably getc and putc in stdio.h) are omitted if __STDC__ is
2379  *  defined, not just if _POSIX_SOURCE is defined.  This makes it
2380  *  impossible to compile any nontrivial program except with -posix.
2381  */
2382 fix = {
2383     hackname = isc_omits_with_stdc;
2384
2385     files     = "stdio.h";
2386     files     = "math.h";
2387     files     = "ctype.h";
2388     files     = "sys/limits.h";
2389     files     = "sys/fcntl.h";
2390     files     = "sys/dirent.h";
2391
2392     select    = '!defined\(__STDC__\) && !defined\(_POSIX_SOURCE\)';
2393     c_fix     = format;
2394     c_fix_arg = '!defined(_POSIX_SOURCE)';
2395     test_text = "#if !defined(__STDC__) && !defined(_POSIX_SOURCE) /* ? ! */"
2396                 "\nint foo;\n#endif";
2397 };
2398
2399
2400 /*
2401  * These files in Sun OS 4.x and ARM/RISCiX and BSD4.3
2402  * use / * * / to concatenate tokens.
2403  */
2404 fix = {
2405     hackname = kandr_concat;
2406     files  = "sparc/asm_linkage.h";
2407     files  = "sun*/asm_linkage.h";
2408     files  = "arm/as_support.h";
2409     files  = "arm/mc_type.h";
2410     files  = "arm/xcb.h";
2411     files  = "dev/chardefmac.h";
2412     files  = "dev/ps_irq.h";
2413     files  = "dev/screen.h";
2414     files  = "dev/scsi.h";
2415     files  = "sys/tty.h";
2416     files  = "Xm.acorn/XmP.h";
2417     files  = bsd43/bsd43_.h;
2418     select = '/\*\*/';
2419     c_fix     = format;
2420     c_fix_arg = '##';
2421     test_text = "#define __CONCAT__(a,b) a/**/b";
2422 };
2423
2424
2425 /*
2426  *  Fix libc1 _G_va_list definition, used in declarations of several
2427  *  more-or-less standard functions, for example vasprintf.
2428  */
2429 fix = {
2430     hackname = libc1_G_va_list;
2431     files    = _G_config.h;
2432     mach     = '*-*-linux*libc1';
2433     select   = 'typedef void \* _G_va_list;';
2434     c_fix     = format;
2435     c_fix_arg = "typedef __builtin_va_list _G_va_list;";
2436     test_text = 'typedef void * _G_va_list;';
2437 };
2438
2439
2440 /*
2441  *  GNU libc1 string.h does not prototype memcpy and memcmp for gcc
2442  *  versions > 1.  This fix will open up the declaration for all
2443  *  versions of GCC and for g++.
2444  */
2445 fix = {
2446     hackname  = libc1_ifdefd_memx;
2447
2448     /* The string.h result is overwritten by AAB_ultrix_string when doing
2449        "make check" and will fail.  Therefore, we add the following kludgery
2450        to insert the test_text into the special testing header.  :-}  */
2451     files     = testing.h;
2452     files     = string.h;
2453
2454     c_fix     = format;
2455     select    = "' is a built-in function for gcc 2\\.x\\. \\*/";
2456     bypass    = __cplusplus;
2457     c_fix_arg = "%1";
2458     c_fix_arg =
2459        '/\* `mem...\' is a built-in function for gcc 2\.x\. \*/' "\n"
2460        '#if defined\(__STDC__\) && __GNUC__ < 2'                 "\n"
2461        "(/\\* .* \\*/\n"
2462        "extern [a-z_]+ mem.*(\n[^#].*)*;)\n"
2463        "#endif";
2464
2465     test_text =
2466     "/* \\`memcpy' is a built-in function for gcc 2.x. */\n"
2467     "#if defined(__STDC__) && __GNUC__ < 2\n"
2468     "/* Copy N bytes of SRC to DEST.  */\n"
2469     "extern __ptr_t memcpy __P ((__ptr_t __dest, __const __ptr_t __src,\n"
2470     "                         size_t __n));\n"
2471     "#endif";
2472 };
2473
2474
2475 /* The /usr/include/sys/ucontext.h on ia64-*linux-gnu systems defines
2476  * an _SC_GR0_OFFSET macro using an idiom that isn't a compile time
2477  * constant on recent versions of g++.
2478  */
2479 fix = {
2480     hackname = linux_ia64_ucontext;
2481     files = "sys/ucontext.h";
2482     mach = "ia64-*-linux*";
2483     select = '\(\(\(char \*\) &\(\(struct sigcontext \*\) 0\)'
2484              '->sc_gr\[0\]\) - \(char \*\) 0\)';
2485     c_fix = format;
2486     c_fix_arg = "__builtin_offsetof \(struct sigcontext, sc_gr[0]\)";
2487     test_text = "# define _SC_GR0_OFFSET\t\\\\\n"
2488         "\t(((char *) &((struct sigcontext *) 0)->sc_gr[0]) - (char *) 0)\n";
2489 };
2490
2491
2492 /*
2493  * Apparently some SVR4 systems typedef longlong_t to long ?
2494  */
2495 #ifdef SVR4
2496 fix = {
2497     hackname  = longlong_t;
2498     select    = "typedef[ \t]+(unsigned[ \t]+)?long[ \t]+(u_)?longlong_t";
2499     c_fix     = format;
2500     c_fix_arg = "typedef %1long long %2longlong_t";
2501     test_text = "typedef long longlong_t\n"
2502                 "typedef unsigned long u_longlong_t";
2503 };
2504 #endif
2505
2506 /* 
2507  *  Remove header file warning from sys/time.h.  Autoconf's
2508  *  AC_HEADER_TIME recommends to include both sys/time.h and time.h
2509  *  which causes warning on LynxOS.  Remove the warning.
2510  */
2511 fix = {
2512     hackname  = lynxos_no_warning_in_sys_time_h;
2513     files     = sys/time.h;
2514     select    = "#warning[ \t]+Using <time.h> instead of <sys/time.h>";
2515     c_fix     = format;
2516     c_fix_arg = "";
2517     test_text = "#warning Using <time.h> instead of <sys/time.h>";
2518 };
2519
2520
2521 /* 
2522  *  Add missing declaration for putenv.
2523  */
2524 fix = {
2525     hackname  = lynxos_missing_putenv;
2526     mach      = '*-*-lynxos*';
2527     files     = stdlib.h;
2528     bypass    = 'putenv[ \t]*\\(';
2529     select    = "extern char \\*getenv[ \t]*_AP\\(\\(const char \\*\\)\\);";
2530     c_fix     = format;
2531     c_fix_arg = "%0\n"
2532         "extern int putenv                              _AP((char *));";
2533     c_fix_arg = "extern char \\*getenv[ \t]*_AP\\(\\(const char \\*\\)\\);";
2534     test_text = "extern char *getenv    _AP((const char *));";
2535 };
2536
2537
2538 /*
2539  * Fix BSD machine/ansi.h to use __builtin_va_list to define _BSD_VA_LIST_.
2540  *
2541  * On NetBSD, machine is a symbolic link to an architecture specific
2542  * directory name, so we can't match a specific file name here.
2543  */
2544 fix = {
2545     hackname = machine_ansi_h_va_list;
2546     select   = "define[ \t]+_BSD_VA_LIST_[ \t]";
2547     bypass   = '__builtin_va_list';
2548
2549     c_fix     = format;
2550     c_fix_arg = "%1__builtin_va_list";
2551     c_fix_arg = "(define[ \t]+_BSD_VA_LIST_[ \t]+).*";
2552
2553     test_text = " # define _BSD_VA_LIST_\tchar**";
2554 };
2555
2556
2557 /*
2558  *  Fix non-ansi machine name defines
2559  */
2560 fix = {
2561     hackname  = machine_name;
2562     c_test    = machine_name;
2563     c_fix     = machine_name;
2564
2565     test_text = "/* MACH_DIFF: */\n"
2566     "#if defined( i386 ) || defined( sparc ) || defined( vax )"
2567     "\n/* no uniform test, so be careful  :-) */";
2568 };
2569
2570
2571 /*
2572  *  Some math.h files define struct exception (it's in the System V
2573  *  Interface Definition), which conflicts with the class exception defined
2574  *  in the C++ file std/stdexcept.h.  We redefine it to __math_exception.
2575  *  This is not a great fix, but I haven't been able to think of anything
2576  *  better.  Note that we have to put the #ifdef/#endif blocks at beginning
2577  *  and end of file, because fixproto runs after us and may insert
2578  *  additional references to struct exception.
2579  */
2580 fix = {
2581     hackname  = math_exception;
2582     files     = math.h;
2583     select    = "struct exception";
2584     /*
2585      * This should be bypassed on __cplusplus, but some supposedly C++ C++
2586      * aware headers, such as Solaris 8 and 9, don't wrap their struct
2587      * exception either.  So currently we bypass only for glibc, based on a
2588      * comment in the fixed glibc header.  Ick.
2589      */
2590     bypass    = 'We have a problem when using C\+\+|for C\+\+, _[a-z0-9A-Z_]+_exception; for C, exception';
2591     c_fix     = wrap;
2592
2593     c_fix_arg = "#ifdef __cplusplus\n"
2594                 "#define exception __math_exception\n"
2595                 "#endif\n";
2596
2597     c_fix_arg = "#ifdef __cplusplus\n"
2598                 "#undef exception\n"
2599                 "#endif\n";
2600
2601     test_text = "typedef struct exception t_math_exception;";
2602 };
2603
2604
2605 /*
2606  *  This looks pretty broken to me.  ``dbl_max_def'' will contain
2607  *  "define DBL_MAX " at the start, when what we really want is just
2608  *  the value portion.  Can't figure out how to write a test case
2609  *  for this either  :-(
2610  */
2611 fix = {
2612     hackname = math_huge_val_from_dbl_max;
2613     files    = math.h;
2614
2615     /*
2616      * IF HUGE_VAL is defined to be DBL_MAX *and* DBL_MAX is _not_ defined
2617      * in math.h, this fix applies.
2618      */
2619     select   = "define[ \t]+HUGE_VAL[ \t]+DBL_MAX";
2620     bypass   = "define[ \t]+DBL_MAX";
2621
2622     shell    =
2623     /*
2624      *  See if we have a definition for DBL_MAX in float.h.
2625      *  If we do, we will replace the one in math.h with that one.
2626      */
2627
2628     "\tdbl_max_def=`egrep 'define[ \t]+DBL_MAX[ \t]+.*' float.h "
2629                    "| sed 's/.*DBL_MAX[ \t]*//' 2>/dev/null`\n\n"
2630
2631     "\tif ( test -n \"${dbl_max_def}\" ) > /dev/null 2>&1\n"
2632     "\tthen sed -e '/define[ \t]*HUGE_VAL[ \t]*DBL_MAX/"
2633                         "s@DBL_MAX@'\"$dbl_max_def@\"\n"
2634     "\telse cat\n"
2635     "\tfi";
2636
2637     test_text =
2638     "`echo '#define DBL_MAX\t3.1415e+9 /* really big */' >> float.h`\n"
2639     "#define HUGE_VAL DBL_MAX";
2640 };
2641
2642
2643 /*
2644  *  nested comment
2645  */
2646 fix = {
2647     hackname  = nested_auth_des;
2648     files     = rpc/rpc.h;
2649     select    = '(/\*.*rpc/auth_des\.h>.*)/\*';
2650     c_fix     = format;
2651     c_fix_arg = "%1*/ /*";
2652     test_text = "/*#include <rpc/auth_des.h> /* skip this */";
2653 };
2654
2655
2656 /*
2657  * Fix nested comments in Motorola's <limits.h> and <sys/limits.h>
2658  */
2659 fix = {
2660     hackname = nested_motorola;
2661     mach     = "m68k-motorola-sysv*";
2662     files    = sys/limits.h;
2663     files    = limits.h;
2664     select   = "max # bytes atomic in write|error value returned by Math lib";
2665
2666     sed = "s@^\\(#undef[ \t][ \t]*PIPE_BUF[ \t]*"
2667                    "/\\* max # bytes atomic in write to a\\)$@\\1 */@";
2668     sed = "s@\\(/\\*#define\tHUGE_VAL\t3.[0-9e+]* \\)"
2669           "\\(/\\*error value returned by Math lib\\*/\\)$@\\1*/ \\2@";
2670
2671     test_text =
2672     "#undef PIPE_BUF /* max # bytes atomic in write to a\n"
2673     "\t\t/* PIPE */\n"
2674     "/*#define\tHUGE_VAL\t3.9e+9 /*error value returned by Math lib*/";
2675 };
2676
2677
2678 /*
2679  * Fixing nested comments in ISC <sys/limits.h>
2680  */
2681 fix = {
2682     hackname = nested_sys_limits;
2683     files  = sys/limits.h;
2684     select = CHILD_MAX;
2685     sed    = "/CHILD_MAX/s,/\\* Max, Max,";
2686     sed    = "/OPEN_MAX/s,/\\* Max, Max,";
2687     test_text = "/*\n#define CHILD_MAX 20 /* Max, Max, ... */ /*\n"
2688                 "#define OPEN_MAX  20 /* Max, Max, ... */\n";
2689 };
2690
2691
2692 /*
2693  *  Some versions of NetBSD don't expect the C99 inline semantics.
2694  */
2695 fix = {
2696     hackname  = netbsd_c99_inline_1;
2697     mach      = "*-*-netbsd*";
2698     files     = signal.h;
2699     select    = "extern __inline int";
2700
2701     c_fix     = format;
2702     c_fix_arg = "extern\n#ifdef __GNUC_STDC_INLINE__\n__attribute__((__gnu_inline__))\n#endif\n__inline int";
2703
2704     test_text = "extern __inline int\nsigaddset(sigset_t *set, int signo)\n{}";
2705 };
2706
2707
2708 fix = {
2709     hackname  = netbsd_c99_inline_2;
2710     mach      = "*-*-netbsd*";
2711     files     = signal.h;
2712     select    = "#define _SIGINLINE extern __inline";
2713
2714     c_fix     = format;
2715     c_fix_arg = <<- _EOArg_
2716         #ifdef __GNUC_STDC_INLINE__
2717         #define _SIGINLINE extern __attribute__((__gnu_inline__)) __inline
2718         #else
2719         %0
2720         #endif
2721         _EOArg_;
2722
2723     test_text = "#define _SIGINLINE extern __inline";
2724 };
2725
2726
2727 /*
2728  * NetBSD has a semicolon after the ending '}' for some extern "C".
2729  */
2730 fix = {
2731     hackname  = netbsd_extra_semicolon;
2732     mach      = "*-*-netbsd*";
2733     files     = sys/cdefs.h;
2734     select    = "#define[ \t]*__END_DECLS[ \t]*};";
2735
2736     c_fix     = format;
2737     c_fix_arg = "#define __END_DECLS }";
2738
2739     test_text = "#define __END_DECLS };";
2740 };
2741
2742
2743 /*
2744  *  NeXT 3.2 adds const prefix to some math functions.
2745  *  These conflict with the built-in functions.
2746  */
2747 fix = {
2748     hackname  = next_math_prefix;
2749     files     = ansi/math.h;
2750     select    = "^extern[ \t]+double[ \t]+__const__[ \t]";
2751
2752     c_fix     = format;
2753     c_fix_arg = "extern double %1(";
2754     c_fix_arg = "^extern[ \t]+double[ \t]+__const__[ \t]+([a-z]+)\\(";
2755
2756     test_text = "extern\tdouble\t__const__\tmumble();";
2757 };
2758
2759
2760 /*
2761  *  NeXT 3.2 uses the word "template" as a parameter for some
2762  *  functions. GCC reports an invalid use of a reserved key word
2763  *  with the built-in functions.
2764  */
2765 fix = {
2766     hackname = next_template;
2767     files    = bsd/libc.h;
2768     select   = "[ \t]template\\)";
2769
2770     c_fix     = format;
2771     c_fix_arg = "(%1)";
2772     c_fix_arg = "\\(([^)]*)[ \t]template\\)";
2773     test_text = "extern mumble( char * template); /* fix */";
2774 };
2775
2776
2777 /*
2778  *  NeXT 3.2 includes the keyword volatile in the abort() and  exit()
2779  *  function prototypes. That conflicts with the  built-in functions.
2780  */
2781 fix = {
2782     hackname = next_volitile;
2783     files    = ansi/stdlib.h;
2784     select   = "^extern[ \t]+volatile[ \t]+void[ \t]";
2785
2786     c_fix     = format;
2787     c_fix_arg = "extern void %1(";
2788     c_fix_arg = "^extern[ \t]+volatile[ \t]+void[ \t]+(exit|abort)\\(";
2789
2790     test_text = "extern\tvolatile\tvoid\tabort();";
2791 };
2792
2793
2794 /*
2795  *  NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1.
2796  *  Note that version 3 of the NeXT system has wait.h in a different directory,
2797  *  so that this code won't do anything.  But wait.h in version 3 has a
2798  *  conditional, so it doesn't need this fix.  So everything is okay.
2799  */
2800 fix = {
2801     hackname  = next_wait_union;
2802     files     = sys/wait.h;
2803
2804     select    = 'wait\(union wait';
2805     c_fix     = format;
2806     c_fix_arg = "wait(void";
2807     test_text = "extern pid_d wait(union wait*);";
2808 };
2809
2810
2811 /*
2812  *  a missing semi-colon at the end of the nodeent structure definition.
2813  */
2814 fix = {
2815     hackname  = nodeent_syntax;
2816     files     = netdnet/dnetdb.h;
2817     select    = "char[ \t]*\\*na_addr[ \t]*$";
2818     c_fix     = format;
2819     c_fix_arg = "%0;";
2820     test_text = "char *na_addr\t";
2821 };
2822
2823
2824 /*
2825  *  obstack.h used casts as lvalues.
2826  *
2827  *  We need to change postincrements of casted pointers (which are
2828  *  then dereferenced and assigned into) of the form
2829  *
2830  *    *((TYPE*)PTRVAR)++ = (VALUE)
2831  *
2832  *  into expressions like
2833  *
2834  *    ((*((TYPE*)PTRVAR) = (VALUE)), (PTRVAR += sizeof (TYPE)))
2835  *
2836  *  which is correct for the cases used in obstack.h since PTRVAR is
2837  *  of type char * and the value of the expression is not used.
2838  */
2839 fix = {
2840     hackname  = obstack_lvalue_cast;
2841     files     = obstack.h;
2842     select    = '\*\(\(([^()]*)\*\)(.*)\)\+\+ = \(([^()]*)\)';
2843     c_fix     = format;
2844     c_fix_arg = "((*((%1*)%2) = (%3)), (%2 += sizeof (%1)))";
2845     test_text = "*((void **) (h)->next_free)++ = (aptr)";
2846 };
2847
2848
2849 /*
2850  *  sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by
2851  *  defining regex.h related types.  This causes libg++ build and usage
2852  *  failures.  Fixing this correctly requires checking and modifying 3 files.
2853  */
2854 fix = {
2855     hackname = osf_namespace_a;
2856     files    = reg_types.h;
2857     files    = sys/lc_core.h;
2858     test     = " -r reg_types.h";
2859     test     = " -r sys/lc_core.h";
2860     test     = " -n \"`grep '} regex_t;' reg_types.h`\"";
2861     test     = " -z \"`grep __regex_t regex.h`\"";
2862
2863     c_fix     = format;
2864     c_fix_arg = "__%0";
2865     c_fix_arg = "reg(ex|off|match)_t";
2866
2867     test_text = "`touch sys/lc_core.h`"
2868     "typedef struct {\n  int stuff, mo_suff;\n} regex_t;\n"
2869     "extern regex_t    re;\n"
2870     "extern regoff_t   ro;\n"
2871     "extern regmatch_t rm;\n";
2872 };
2873
2874 fix = {
2875     hackname = osf_namespace_c;
2876     files    = regex.h;
2877     test     = " -r reg_types.h";
2878     test     = " -r sys/lc_core.h";
2879     test     = " -n \"`grep '} regex_t;' reg_types.h`\"";
2880     test     = " -z \"`grep __regex_t regex.h`\"";
2881
2882     select    = "#include <reg_types\.h>.*";
2883     c_fix     = format;
2884     c_fix_arg = "%0\n"
2885                 "typedef __regex_t\tregex_t;\n"
2886                 "typedef __regoff_t\tregoff_t;\n"
2887                 "typedef __regmatch_t\tregmatch_t;";
2888
2889     test_text = "#include <reg_types.h>";
2890 };
2891
2892
2893 /*
2894  *  Fix __page_size* declarations in pthread.h AIX 4.1.[34].
2895  *  The original ones fail if uninitialized externs are not common.
2896  *  This is the default for all ANSI standard C++ compilers.
2897  */
2898 fix = {
2899     hackname  = pthread_page_size;
2900     files     = pthread.h;
2901     select    = "^int __page_size";
2902     c_fix     = format;
2903     c_fix_arg = "extern %0";
2904     test_text = "int __page_size;";
2905 };
2906
2907 /*
2908  * On broken glibc-2.3.3 systems an array of incomplete structures is
2909  * passed to __sigsetjmp.  Fix that to take a pointer instead.
2910  */
2911 fix = {
2912     hackname  = pthread_incomplete_struct_argument;
2913     files     = pthread.h;
2914     select    = "struct __jmp_buf_tag";
2915     c_fix     = format;
2916     c_fix_arg = "%1 *%2%3";
2917     c_fix_arg = "^(extern int __sigsetjmp \\(struct __jmp_buf_tag) (__env)\\[1\\](.*)$";
2918     test_text = "extern int __sigsetjmp (struct __jmp_buf_tag __env[1], int __savemask);";
2919 };
2920
2921 /*
2922  * On DYNIX/ptx, sys/mc_param.h has an embedded asm for the cpuid instruction
2923  * on the P5. This is not used by anything else so we ifdef it out.
2924  * Current GCC doesn't seem to complain about the asm, though.
2925  */
2926 #ifdef PTX
2927 fix = {
2928     hackname  = ptx_sys_mc_param_h;
2929     files     = sys/mc_param.h;
2930     sed       = "/__asm/,/}/{"
2931                   "/__asm/i\\\n"
2932                   "#if !defined (__GNUC__) && !defined (__GNUG__)\n"
2933                   "/}/a\\\n"
2934                   "#endif\n"
2935                 "}";
2936     test_text = "__asm\n"
2937                 "int _CPUID()\n"
2938                 "{\n"
2939                 "   non-GNU assembly here\n"
2940                 "}";
2941 };
2942 #endif
2943
2944
2945 /*
2946  *  Fix return type of fread and fwrite on sysV68
2947  */
2948 fix = {
2949     hackname = read_ret_type;
2950     files    = stdio.h;
2951     select   = "extern int\t.*, fread\\(\\), fwrite\\(\\)";
2952     c_fix     = format;
2953     c_fix_arg = "extern unsigned int fread(), fwrite();\n%1%2";
2954     c_fix_arg = "(extern int\t.*), fread\\(\\), fwrite\\(\\)(.*)";
2955
2956     test_text = "extern int\tfclose(), fflush(), fread(), fwrite(), foo();";
2957 };
2958
2959
2960 /*
2961  *  Fix casts as lvalues in glibc's <rpc/xdr.h>.
2962  */
2963 fix = {
2964     hackname  = rpc_xdr_lvalue_cast_a;
2965     files     = rpc/xdr.h;
2966     select    = "#define[ \t]*IXDR_GET_LONG.*\\\\\n.*__extension__.*";
2967     c_fix     = format;
2968     c_fix_arg = "#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf))";
2969     test_text = "#define IXDR_GET_LONG(buf) \\\\\n"
2970                 "\t((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++))";
2971 };
2972
2973
2974 fix = {
2975     hackname  = rpc_xdr_lvalue_cast_b;
2976     files     = rpc/xdr.h;
2977     select    = "#define[ \t]*IXDR_PUT_LONG.*\\\\\n.*__extension__.*";
2978     c_fix     = format;
2979     c_fix_arg = "#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v)))";
2980     test_text = "#define IXDR_PUT_LONG(buf, v) \\\\\n"
2981                 "\t(*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v)))";
2982 };
2983
2984
2985 /*
2986  *  function class(double x) conflicts with C++ keyword on rs/6000
2987  */
2988 fix = {
2989     hackname  = rs6000_double;
2990     files     = math.h;
2991     select    = '[^a-zA-Z_]class\(';
2992
2993     c_fix     = format;
2994     c_fix_arg = "#ifndef __cplusplus\n%0\n#endif";
2995     c_fix_arg = '^.*[^a-zA-Z_]class\(.*';
2996
2997     test_text = "extern int class();";
2998 };
2999
3000
3001 /*
3002  *  Wrong fchmod prototype on RS/6000.
3003  */
3004 fix = {
3005     hackname  = rs6000_fchmod;
3006     files     = sys/stat.h;
3007     select    = 'fchmod\(char \*';
3008     c_fix     = format;
3009     c_fix_arg = "fchmod(int";
3010     test_text = "extern int fchmod(char *, mode_t);";
3011 };
3012
3013
3014 /*
3015  *  parameters conflict with C++ new on rs/6000
3016  */
3017 fix = {
3018     hackname  = rs6000_param;
3019     files     = "stdio.h";
3020     files     = "unistd.h";
3021
3022     select    = 'rename\(const char \*old, const char \*new\)';
3023     c_fix     = format;
3024     c_fix_arg = 'rename(const char *_old, const char *_new)';
3025
3026     test_text = 'extern int rename(const char *old, const char *new);';
3027 };
3028
3029
3030 /*
3031  *  On OpenServer and on UnixWare 7, <math.h> uses the native compiler
3032  *  __builtin_generic. We fix that usage to use the GCC equivalent.
3033  * It also has a plethora of inline functions that conflict with libstdc++.
3034  */
3035 fix = {
3036     hackname = sco_math;
3037     files    = math.h, '*/math.h';
3038     select   = "inline double abs";
3039     bypass   = "__GNUG__";
3040     sed      = "/#define.*__fp_class(a) \\\\/i\\\n"
3041                "#ifndef __GNUC__\n";
3042     sed      =
3043 "/.*__builtin_generic/a\\\n"
3044 "#else\\\n"
3045 "#define __fp_class(a) \\\\\\\n"
3046 "  __builtin_choose_expr(__builtin_types_compatible_p(typeof(a),long double),\\\\\\\n"
3047 "   __fpclassifyl(a), \\\\\\\n"
3048 "    __builtin_choose_expr(__builtin_types_compatible_p(typeof(a), float), \\\\\\\n"
3049 "      __fpclassifyf(a),__fpclassify(a)))\\\n"
3050 "#endif";
3051
3052     sed      = "/extern \"C\\+\\+\"/N;"
3053                "/inline double abs/i\\\n"
3054                "#ifndef __GNUC__\n";
3055     sed      = "/inline long double trunc/N;"
3056                "/inline long double trunc.*}.*extern \"C\\+\\+\"/a\\\n"
3057                "#endif /* ! __GNUC__ */";
3058
3059     test_text =
3060     "#define __fp_class(a) \\\\\n"
3061     " __builtin_generic(a,\"ld:__fplcassifyl;f:__fpclassifyf;:__fpclassify\")\n";
3062
3063 };
3064
3065
3066 /*
3067  *  On SCO OpenServer prior to 5.0.7UP1, <sys/regset.h> and <ieeefp.h>
3068  *  have a clash on struct _fpstate and struct fpstate.
3069  */
3070 fix = {
3071     hackname = sco_regset;
3072     files    = sys/regset.h;
3073     mach     = "*-*-sco3.2v5*";
3074     select   = "(struct[ \t]+.*)fpstate";
3075     c_fix     = format;
3076     c_fix_arg = "%1rsfpstate";
3077
3078     test_text =
3079     "union u_fps {\n"
3080     "    struct\tfpstate\n"
3081     "    {\n"
3082     "       int whatever;\n"
3083     "    }\n"
3084     "};\n"
3085     "union _u_fps {\n"
3086     "    struct _fpstate\n"
3087     "    {\n"
3088     "       int whatever;\n"
3089     "    }\n"
3090     "};\n";
3091 };
3092
3093
3094 /*
3095  *  The static functions lstat() and fchmod() in <sys/stat.h>
3096  *  cause G++ grief since they're not wrapped in "if __cplusplus".
3097  *
3098  *  On SCO OpenServer 5.0.0 through (at least) 5.0.5 <sys/stat.h> contains
3099  *  tiny static wrappers that aren't C++ safe.
3100  */
3101 fix = {
3102     hackname = sco_static_func;
3103     files    = sys/stat.h;
3104     mach     = "i?86-*-sco3.2*";
3105     select   = "^static int";
3106
3107     sed      = "/^static int/i\\\n"
3108                "#if __cplusplus\\\n"
3109                "extern \"C\" {\\\n"
3110                "#endif /* __cplusplus */";
3111
3112     sed      = "/^}$/a\\\n"
3113                "#if __cplusplus\\\n"
3114                " }\\\n"
3115                "#endif /* __cplusplus */";
3116
3117     test_text =
3118     "#ifdef __STDC__\n"
3119     "static int\tstat(const char *__f, struct stat *__p) {\n"
3120     "\treturn __stat32(__f, __p);\n"
3121     "}\n\n#  else /* !__STDC__ THIS FAILS ON BSD SYSTEMS */\n"
3122
3123     "static int\tstat(__f, __p)\n"
3124     "\tchar *__f;\n"
3125     "\tstruct stat *__p;\n"
3126     "{\n"
3127     "\treturn __stat32(__f, __p);\n"
3128     "}\n"
3129     "#endif";
3130 };
3131
3132
3133 /*
3134  *  Fix prototype declaration of utime in sys/times.h.
3135  *  In 3.2v4.0 the const is missing.
3136  */
3137 fix = {
3138     hackname  = sco_utime;
3139     files     = sys/times.h;
3140     mach      = "i?86-*-sco3.2v4*";
3141
3142     select    = '\(const char \*, struct utimbuf \*\);';
3143     c_fix     = format;
3144     c_fix_arg = '(const char *, const struct utimbuf *);';
3145
3146     test_text = "extern int utime(const char *, struct utimbuf *);";
3147 };
3148
3149 /*
3150  * Sun Solaris 10 defines several C99 math macros in terms of
3151  * builtins specific to the Studio compiler, in particular not
3152  * compatible with the GNU compiler.
3153  */
3154 fix = {
3155     hackname = solaris_math_1;
3156     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3157     bypass = "__GNUC__";
3158     files = iso/math_c99.h;
3159     c_fix = format;
3160     c_fix_arg = "#define\tHUGE_VA%1\t(__builtin_huge_va%2())";
3161     c_fix_arg = "^#define[ \t]+HUGE_VA([LF]+)[ \t]+__builtin_huge_va([lf]+)";
3162     test_text =
3163     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3164     "#undef     HUGE_VAL\n"
3165     "#define    HUGE_VAL        __builtin_huge_val\n"
3166     "#undef     HUGE_VALF\n"
3167     "#define    HUGE_VALF       __builtin_huge_valf\n"
3168     "#undef     HUGE_VALL\n"
3169     "#define    HUGE_VALL       __builtin_huge_vall";
3170 };
3171
3172 fix = {
3173     hackname = solaris_math_2;
3174     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3175     bypass = "__GNUC__";
3176     files = iso/math_c99.h;
3177     c_fix = format;
3178     c_fix_arg = "#define\tINFINITY\t(__builtin_inff())";
3179     c_fix_arg = "^#define[ \t]+INFINITY[ \t]+__builtin_infinity";
3180     test_text =
3181     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3182     "#undef     INFINITY\n"
3183     "#define    INFINITY        __builtin_infinity";
3184 };
3185
3186 fix = {
3187     hackname = solaris_math_3;
3188     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3189     bypass = "__GNUC__";
3190     files = iso/math_c99.h;
3191     c_fix = format;
3192     c_fix_arg = "#define\tNAN\t\t(__builtin_nanf(\"\"))";
3193     c_fix_arg = "^#define[ \t]+NAN[ \t]+__builtin_nan";
3194     test_text =
3195     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3196     "#undef     NAN\n"
3197     "#define    NAN     __builtin_nan";
3198 };
3199
3200 fix = {
3201     hackname = solaris_math_4;
3202     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3203     bypass = "__GNUC__";
3204     files = iso/math_c99.h;
3205     c_fix = format;
3206     c_fix_arg = "#define\tfpclassify(x) \\\n"
3207                 "  __extension__ ({ const __typeof(x) __x_fp = (x); \\\n"
3208                 "\t\t   isnan(__x_fp) \\\n"
3209                 "\t\t     ? FP_NAN \\\n"
3210                 "\t\t     : isinf(__x_fp) \\\n"
3211                 "\t\t       ? FP_INFINITE \\\n"
3212                 "\t\t       : isnormal(__x_fp) \\\n"
3213                 "\t\t\t ? FP_NORMAL \\\n"
3214                 "\t\t\t : __x_fp == 0.0 \\\n"
3215                 "\t\t\t   ? FP_ZERO \\\n"
3216                 "\t\t\t   : FP_SUBNORMAL; })";
3217     c_fix_arg = "^#define[ \t]+fpclassify\\(x\\)[ \t]+__builtin_fpclassify\\(x\\)";
3218     test_text =
3219     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3220     "#undef     fpclassify\n"
3221     "#define    fpclassify(x)   __builtin_fpclassify(x)";
3222 };
3223
3224 fix = {
3225     hackname = solaris_math_8;
3226     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3227     bypass = "__GNUC__";
3228     files = iso/math_c99.h;
3229     c_fix = format;
3230     c_fix_arg = "#define\tsignbit(x)\t(sizeof(x) == sizeof(float) \\\n"
3231                 "\t\t\t   ? __builtin_signbitf(x) \\\n"
3232                 "\t\t\t   : sizeof(x) == sizeof(long double) \\\n"
3233                 "\t\t\t     ? __builtin_signbitl(x) \\\n"
3234                 "\t\t\t     : __builtin_signbit(x))";
3235     c_fix_arg = "^#define[ \t]+signbit\\(x\\)[ \t]+__builtin_signbit\\(x\\)";
3236     test_text =
3237     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3238     "#undef     signbit\n"
3239     "#define    signbit(x)      __builtin_signbit(x)";
3240 };
3241
3242 fix = {
3243     hackname = solaris_math_9;
3244     select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3245     bypass = "__GNUC__";
3246     files = iso/math_c99.h;
3247     c_fix = format;
3248     c_fix_arg = "#define\t%1(x, y)%2__builtin_%1(x, y)";
3249     c_fix_arg = "^#define[ \t]+([a-z]+)\\(x, y\\)([ \t]+)\\(\\(x\\) __builtin_[a-z]+\\(y\\)\\)";
3250     test_text =
3251     '#ident     "@(#)math_c99.h 1.9     04/11/01 SMI"'"\n"
3252     "#undef     isgreater\n"
3253     "#define    isgreater(x, y)         ((x) __builtin_isgreater(y))\n"
3254     "#undef     isgreaterequal\n"
3255     "#define    isgreaterequal(x, y)    ((x) __builtin_isgreaterequal(y))\n"
3256     "#undef     isless\n"
3257     "#define    isless(x, y)            ((x) __builtin_isless(y))\n"
3258     "#undef     islessequal\n"
3259     "#define    islessequal(x, y)       ((x) __builtin_islessequal(y))\n"
3260     "#undef     islessgreater\n"
3261     "#define    islessgreater(x, y)     ((x) __builtin_islessgreater(y))\n"
3262     "#undef     isunordered\n"
3263     "#define    isunordered(x, y)       ((x) __builtin_isunordered(y))";
3264 };
3265
3266 /*
3267  * On Solaris 11, if you do isinf(NaN) you'll get a floating point
3268  * exception.  Provide an alternative using GCC's builtin.
3269  */
3270
3271 fix = {
3272     hackname  = solaris_math_10;
3273     select    = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3274     files     = iso/math_c99.h;
3275     c_fix     = format;
3276     c_fix_arg = "#define\tisinf(x) __builtin_isinf(x)";
3277     c_fix_arg = "^#define[ \t]+isinf\\(x\\)[ \t]+__extension__\\([ \t]*\\\\\n"
3278                 "[ \t]*\\{[ \t]*__typeof\\(x\\)[ \t]*__x_i[ \t]*=[ \t]*\\(x\\);[ \t]*\\\\\n"
3279                 "[ \t]*__x_i[ \t]*==[ \t]*\\(__typeof\\(__x_i\\)\\)[ \t]*INFINITY[ \t]*\\|\\|[ \t]*\\\\\n"
3280                 "[ \t]*__x_i[ \t]*==[ \t]*\\(__typeof\\(__x_i\\)\\)[ \t]*\\(-INFINITY\\);[ \t]*\\}\\)";
3281     test_text =
3282     '#pragma ident      "@(#)math_c99.h 1.12    07/01/21 SMI"'"\n"
3283     "#undef     isinf\n"
3284     "#define    isinf(x)        __extension__( \\\\\n"
3285     "                   { __typeof(x) __x_i = (x); \\\\\n"
3286     "                   __x_i == (__typeof(__x_i)) INFINITY || \\\\\n"
3287     "                   __x_i == (__typeof(__x_i)) (-INFINITY); })";
3288 };
3289
3290 /*
3291  *  Sun Solaris 2.5.1, 2.6 defines PTHREAD_{MUTEX|COND}_INITIALIZER
3292  *  incorrectly, so we replace them with versions that correspond to
3293  *  the definition.  We also explicitly name this fix "1" and the next
3294  *  fix "2" because this one does not deal with the last field.  This
3295  *  fix needs to run before the next.
3296  */
3297 fix = {
3298     hackname = solaris_mutex_init_1;
3299     select = '@\(#\)pthread.h' "[ \t]+1.1[0-9][ \t]+9[567]/[0-9/]+ SMI";
3300     files = pthread.h;
3301     sed   = "/define[ \t]*PTHREAD_MUTEX_INI/s/{0, 0,/{{{0}, 0}, {{{0}}},/\n"
3302             "/define[ \t]*PTHREAD_COND_INI/s/{0,/{{{0},0},/";
3303     test_text =
3304     '#ident "@(#)pthread.h  1.16    97/05/05 SMI"'"\n"
3305     "#define PTHREAD_MUTEX_INITIALIZER\t{0, 0, 0}\n"
3306     "#define PTHREAD_COND_INITIALIZER\t{0, 0} /* */\n";
3307 };
3308
3309
3310 /*
3311  * Sun Solaris defines PTHREAD_MUTEX_INITIALIZER with a trailing
3312  * "0" for the last field of the pthread_mutex_t structure, which is
3313  * of type upad64_t, which itself is typedef'd to int64_t, but with
3314  * __STDC__ defined (e.g. by -ansi) it is a union. So change the
3315  * initializer to "{0}" instead
3316  */
3317 fix = {
3318     hackname = solaris_mutex_init_2;
3319     select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3320     files = pthread.h;
3321     /*
3322      * On Solaris 10, this fix is unnecessary because upad64_t is
3323      * always defined correctly regardless of the definition of the
3324      * __STDC__ macro.  The first "mach" pattern matches up to
3325      * solaris9.  The second "mach" pattern will not match any two (or
3326      * more) digit solaris version, but it will match e.g. 2.5.1.
3327      */
3328     mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*';
3329     c_fix = format;
3330     c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
3331                 "%0\n"
3332                 "#else\n"
3333                 "%1, {0}}%4\n"
3334                 "#endif";
3335     c_fix_arg = "(^#define[ \t]+PTHREAD_(MUTEX|COND)_INITIALIZER[ \t]+"
3336                 "(|/\*.*\*/[ \t]*\\\\\n[ \t]*)\\{.*)"
3337                 ",[ \t]*0\\}" "(|[ \t].*)$";
3338     test_text =
3339     '#ident "@(#)pthread.h  1.26  98/04/12 SMI"'"\n"
3340     "#define PTHREAD_MUTEX_INITIALIZER\t{{{0},0}, {{{0}}}, 0}\n"
3341     "#define PTHREAD_COND_INITIALIZER\t{{{0}, 0}, 0}\t/* DEFAULTCV */\n"
3342     "#define    PTHREAD_MUTEX_INITIALIZER               /* = DEFAULTMUTEX */    \\\\\n"
3343     "   {{0, 0, 0, DEFAULT_TYPE, _MUTEX_MAGIC}, {{{0}}}, 0}\n"
3344     "#define    PTHREAD_COND_INITIALIZER                /* = DEFAULTCV */       \\\\\n"
3345     "   {{{0, 0, 0, 0}, DEFAULT_TYPE, _COND_MAGIC}, 0}";
3346 };
3347
3348
3349 /*
3350  * Sun Solaris defines PTHREAD_RWLOCK_INITIALIZER with a "0" for some
3351  *  fields of the pthread_rwlock_t structure, which are of type
3352  *  upad64_t, which itself is typedef'd to int64_t, but with __STDC__
3353  *  defined (e.g. by -ansi) it is a union. So change the initializer
3354  *  to "{0}" instead.
3355  */
3356 fix = {
3357     hackname = solaris_rwlock_init_1;
3358     select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3359     files = pthread.h;
3360     mach = '*-*-solaris*';
3361     c_fix = format;
3362     c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
3363                 "%0\n"
3364                 "#else\n"
3365                 "%1{0, 0, 0, {{0}, {0}, {0}}, {{0}, {0}}, {{0}, {0}}}\n"
3366                 "#endif";
3367     c_fix_arg = "(^#define[ \t]+PTHREAD_RWLOCK_INITIALIZER[ \t]+)"
3368                 "\\{0, 0, 0, \\{0, 0, 0\\}, \\{0, 0\\}, \\{0, 0\\}\\}[ \t]*$";
3369
3370     test_text =
3371     '#ident "@(#)pthread.h  1.26  98/04/12 SMI"'"\n"
3372     "#define PTHREAD_RWLOCK_INITIALIZER\t{0, 0, 0, {0, 0, 0}, {0, 0}, {0, 0}}";
3373 };
3374
3375
3376 /*
3377  * Sun Solaris defines PTHREAD_ONCE_INIT as an array containing a
3378  * structure.  As such, it need two levels of brackets, but only
3379  * contains one.  Wrap the macro definition in an extra layer.
3380  */
3381 fix = {
3382     hackname = solaris_once_init_1;
3383     select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3384     files = pthread.h;
3385     mach = '*-*-solaris*';
3386     c_fix = format;
3387     c_fix_arg = "%1{%2}%3";
3388     c_fix_arg = "(^#define[ \t]+PTHREAD_ONCE_INIT[ \t]+\\{)([^}]+)(\\})[ \t]*$";
3389     test_text =
3390     '#pragma ident      "@(#)pthread.h  1.37    04/09/28 SMI"'"\n"
3391     "#define PTHREAD_ONCE_INIT\t{0, 0, 0, PTHREAD_ONCE_NOTDONE}";
3392 };
3393
3394
3395 /*
3396  * Sun Solaris defines PTHREAD_ONCE_INIT with a "0" for some
3397  *  fields of the pthread_once_t structure, which are of type
3398  *  upad64_t, which itself is typedef'd to int64_t, but with __STDC__
3399  *  defined (e.g. by -ansi) it is a union. So change the initializer
3400  *  to "{0}" instead.  This test relies on solaris_once_init_1.
3401  */
3402 fix = {
3403     hackname = solaris_once_init_2;
3404     select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI";
3405     files = pthread.h;
3406     /*
3407      * On Solaris 10, this fix is unnecessary because upad64_t is
3408      * always defined correctly regardless of the definition of the
3409      * __STDC__ macro.  The first "mach" pattern matches up to
3410      * solaris9.  The second "mach" pattern will not match any two (or
3411      * more) digit solaris version, but it will match e.g. 2.5.1.
3412      */
3413     mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*';
3414     c_fix = format;
3415     c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n"
3416                 "%0\n"
3417                 "#else\n"
3418                 "%1{0}, {0}, {0}, {%3}%4\n"
3419                 "#endif";
3420     c_fix_arg = "(^#define[ \t]+PTHREAD_ONCE_INIT[ \t]+\\{\\{)"
3421                 "(0, 0, 0, )(PTHREAD_[A-Z_]+)(\\}\\})[ \t]*$";
3422     test_text =
3423     '#ident "@(#)pthread.h  1.26  98/04/12 SMI"'"\n"
3424     "#define PTHREAD_ONCE_INIT\t{{0, 0, 0, PTHREAD_ONCE_NOTDONE}}\n";
3425 };
3426
3427
3428 /*
3429  * Solaris 2.5.1 and 2.6 use an outdated prototype for send & recv
3430  * in sys/socket.h.  This is corrected in Solaris 7 and up.
3431  */
3432 fix = {
3433     hackname = solaris_socket;
3434     files = sys/socket.h;
3435     select = '@\(#\)socket.h' "[ \t]+1.[123][0-9][ \t]+9[567]/[0-9/]+ SMI";
3436     c_fix = format;
3437     c_fix_arg = "extern int %1(int, %2void *, int, int);";
3438     c_fix_arg = '^extern int (recv|send)\(int,'
3439                 ' (const )*char '
3440                 '\*, int, int\);';
3441
3442     test_text = '#ident   "@(#)socket.h   1.30    97/01/20 SMI"'"\n"
3443                 "extern int recv(int, char *, int, int);\n"
3444                 "extern int send(int, const char *, int, int);";
3445 };
3446
3447
3448 /*
3449  * Solaris 2.8 has what appears to be some gross workaround for 
3450  * some old version of their c++ compiler.  G++ doesn't want it
3451  * either, but doesn't want to be tied to SunPRO version numbers.
3452  */
3453 fix = {
3454     hackname = solaris_stdio_tag;
3455     files    = stdio_tag.h;
3456
3457     select   = '__cplusplus < 54321L';
3458     /* In Solaris 10, the code in stdio_tag.h is conditionalized on 
3459        "!defined(__GNUC__)" so we no longer need to fix it.  */
3460     bypass   = '__GNUC__';
3461     sed      = 's/defined(__cplusplus) && (__cplusplus < 54321L)/0/';
3462
3463     test_text = "#if\tdefined(__cplusplus) && (__cplusplus < 54321L)";
3464 };
3465
3466
3467 /*
3468  * Sun Solaris 2.5.1 doesn't define 'getpagesize' in <unistd.h>, as is done
3469  * on Solaris 2.6 and up.
3470  */
3471 fix = {
3472     hackname  = solaris_unistd;
3473     files = unistd.h;
3474     select = '@\(#\)unistd.h' "[ \t]+1.3[0-9][ \t]+9[567]/[0-9/]+ SMI";
3475     bypass = "getpagesize";
3476     c_fix = format;
3477     c_fix_arg = "extern int getpagesize();\n%0";
3478     c_fix_arg = '^extern (pid_t|int) getpgid\(.*\);';
3479     test_text = '#ident "@(#)unistd.h   1.33    95/08/28 SMI"'"\n"
3480                 "extern pid_t getpgid(pid_t);\n"
3481                 "extern int getpgid();";
3482 };
3483
3484
3485 /*
3486  * <widec.h> until Solaris 2.5.1 defines macros for a couple of <wchar.h>
3487  * functions, breaking their prototypes if that file is included afterwards.
3488  * Include <wchar.h> early to avoid this issue, as is done on Solaris 2.6
3489  * and up.
3490  */
3491 fix = {
3492     hackname  = solaris_widec;
3493     files     = widec.h;
3494     mach      = '*-*-solaris2.[0-5]';
3495     mach      = '*-*-solaris2.[0-5].*';
3496     bypass    = "include.*wchar\\.h";
3497     select    = "#include <euc.h>";
3498     c_fix     = format;
3499     c_fix_arg = "%0\n#include <wchar.h>";
3500     test_text = "#include <euc.h>";
3501 };
3502
3503
3504 /*
3505  *  a missing semi-colon at the end of the statsswtch structure definition.
3506  */
3507 fix = {
3508     hackname  = statsswtch;
3509     files     = rpcsvc/rstat.h;
3510     select    = "boottime$";
3511     c_fix     = format;
3512     c_fix_arg = "boottime;";
3513     test_text = "struct statswtch {\n  int boottime\n};";
3514 };
3515
3516
3517 /*
3518  *  Arrange for stdio.h to use stdarg.h to define __gnuc_va_list.
3519  *  On 4BSD-derived systems, stdio.h defers to machine/ansi.h; that's
3520  *  OK too.
3521  */
3522 fix = {
3523     hackname = stdio_stdarg_h;
3524     files    = stdio.h;
3525     bypass   = "include.*(stdarg\.h|machine/ansi\.h)";
3526     /*
3527      * On Solaris 10, this fix is unncessary; <stdio.h> includes
3528      * <iso/stdio_iso.h>, which includes <sys/va_list.h>.
3529       */
3530     mach     = '*-*-solaris2.1[0-9]*';
3531     not_machine = true;
3532
3533     c_fix     = wrap;
3534
3535     c_fix_arg = "#define __need___va_list\n#include <stdarg.h>\n";
3536
3537     test_text = "";
3538 };
3539
3540
3541 /*
3542  *  Don't use or define the name va_list in stdio.h.  This is for
3543  *  ANSI.  Note _BSD_VA_LIST_ is dealt with elsewhere.  The presence
3544  *  of __gnuc_va_list, __DJ_va_list, or _G_va_list is taken to
3545  *  indicate that the header knows what it's doing -- under SUSv2,
3546  *  stdio.h is required to define va_list, and we shouldn't break
3547  *  that.  On IRIX 6.5, internal/wchar_core.h used to get its
3548  *  definition of va_list from stdio.h.  Since this doesn't happen any
3549  *  longer, use __gnuc_va_list there, too.
3550  */
3551 fix = {
3552     hackname = stdio_va_list;
3553     files    = stdio.h;
3554     files    = internal/stdio_core.h;
3555     files    = internal/wchar_core.h;
3556     bypass   = '__gnuc_va_list|_BSD_VA_LIST_|__DJ_va_list|_G_va_list';
3557     /* 
3558      * On Solaris 10, the definition in 
3559      * <stdio.h> is guarded appropriately by the _XPG4 feature macro; 
3560      * there is therefore no need for this fix there.
3561      */
3562     mach = '*-*-solaris2.1[0-9]*';
3563     not_machine = true;
3564
3565     /*
3566      * Use __gnuc_va_list in arg types in place of va_list.
3567      * On 386BSD use __gnuc_va_list instead of _VA_LIST_.  On Tru64 UNIX V5.1A
3568      * use __gnuc_va_list instead of __VA_LIST__.  We're hoping the
3569      * trailing parentheses and semicolon save all other systems from this.
3570      * Define __not_va_list__ (something harmless and unused)
3571      * instead of va_list.
3572      * Don't claim to have defined va_list.
3573      */
3574     sed = "s@[ \t]va_list\\([ \t)]\\)@ __gnuc_va_list\\1@\n"
3575           "s@(va_list)&@(__gnuc_va_list)\\&@\n"
3576           "s@ _VA_LIST_));@ __gnuc_va_list));@\n"
3577           "s@ __VA_LIST__));@ __gnuc_va_list));@\n"
3578           "s@ va_list@ __not_va_list__@\n"
3579           "s@\\*va_list@*__not_va_list__@\n"
3580           "s@ __va_list)@ __gnuc_va_list)@\n"
3581           "s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;"
3582            "@typedef \\1 __not_va_list__;@\n"
3583           "s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n"
3584           "s@GNUC_VA_LIST@GNUC_Va_LIST@\n"
3585           "s@_VA_LIST_DEFINED@_Va_LIST_DEFINED@\n"
3586           "s@_NEED___VA_LIST@_NEED___Va_LIST@\n"
3587           "s@VA_LIST@DUMMY_VA_LIST@\n"
3588           "s@_Va_LIST@_VA_LIST@";
3589     test_text = "extern void mumble( va_list);";
3590 };
3591
3592
3593 /*
3594  *  Fix headers that use va_list from stdio.h to use the updated
3595  *  va_list from the stdio_va_list change.  Note _BSD_VA_LIST_ is
3596  *  dealt with elsewhere.  The presence of __gnuc_va_list,
3597  *  __DJ_va_list, or _G_va_list is taken to indicate that the header
3598  *  knows what it's doing.
3599  */
3600 fix = {
3601     hackname = stdio_va_list_clients;
3602     files    = com_err.h;
3603     files    = cps.h;
3604     files    = curses.h;
3605     files    = krb5.h;
3606     files    = lc_core.h;
3607     files    = pfmt.h;
3608     files    = wchar.h;
3609     files    = curses_colr/curses.h;
3610     bypass   = '__gnuc_va_list|_BSD_VA_LIST_|__DJ_va_list|_G_va_list';
3611     /* Don't fix, if we use va_list from stdarg.h, or if the use is
3612        otherwise protected.  */
3613     bypass   = 'include <stdarg\.h>|#ifdef va_start';
3614
3615     /*
3616      * Use __gnuc_va_list in arg types in place of va_list.
3617      * On 386BSD use __gnuc_va_list instead of _VA_LIST_.  On Tru64 UNIX V5.1A
3618      * use __gnuc_va_list instead of __VA_LIST__.  We're hoping the
3619      * trailing parentheses and semicolon save all other systems from this.
3620      * Define __not_va_list__ (something harmless and unused)
3621      * instead of va_list.
3622      * Don't claim to have defined va_list.
3623      */
3624     sed = "s@[ \t]va_list\\([ \t)]\\)@ __gnuc_va_list\\1@\n"
3625           "s@(va_list)&@(__gnuc_va_list)\\&@\n"
3626           "s@ _VA_LIST_));@ __gnuc_va_list));@\n"
3627           "s@ __VA_LIST__));@ __gnuc_va_list));@\n"
3628           "s@ va_list@ __not_va_list__@\n"
3629           "s@\\*va_list@*__not_va_list__@\n"
3630           "s@ __va_list)@ __gnuc_va_list)@\n"
3631           "s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;"
3632            "@typedef \\1 __not_va_list__;@\n"
3633           "s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n"
3634           "s@GNUC_VA_LIST@GNUC_Va_LIST@\n"
3635           "s@_VA_LIST_DEFINED@_Va_LIST_DEFINED@\n"
3636           "s@_NEED___VA_LIST@_NEED___Va_LIST@\n"
3637           "s@VA_LIST@DUMMY_VA_LIST@\n"
3638           "s@_Va_LIST@_VA_LIST@";
3639     test_text = "extern void mumble( va_list);";
3640 };
3641
3642
3643 /*
3644  *  "!__STDC__" or "__STDC__==0" or "__STDC__!=1" or "__STDC__-0==0"
3645  *  is "!defined( __STRICT_ANSI__ )"
3646  */
3647 fix = {
3648     hackname = strict_ansi_not;
3649     select   = "^([ \t]*#[ \t]*if.*)"
3650                "(!__STDC__"
3651                "|__STDC__[ \t]*==[ \t]*0"
3652                "|__STDC__[ \t]*!=[ \t]*1"
3653                "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*0)";
3654     /* Tru64 UNIX V4.0F/V5.1 <standards.h> supports GCC usage of __STDC__. */
3655     bypass = 'GNU and MIPS C compilers define __STDC__ differently';
3656     /* GNU gmp.h uses "__STDC__ != 1" only if __SCO_VERSION__, which
3657        is not defined by GCC, so it is safe.  */
3658     bypass = '__SCO_VERSION__.*__STDC__ != 1';
3659     c_test   = stdc_0_in_system_headers;
3660
3661     c_fix     = format;
3662     c_fix_arg = "%1 !defined(__STRICT_ANSI__)";
3663
3664     test_text = "#if !__STDC__ \n"
3665                 "#if __STDC__ == 0\n"
3666                 "#if __STDC__ != 1\n"
3667                 "#if __STDC__ - 0 == 0"
3668                "/* not std C */\nint foo;\n"
3669                "\n#end-end-end-end-if :-)";
3670 };
3671
3672 /*
3673  *  "__STDC__-0==0"
3674  *  is "!defined( __STRICT_ANSI__ )" on continued #if-s
3675  */
3676 fix = {
3677     hackname = strict_ansi_not_ctd;
3678     files    = math.h, limits.h, stdio.h, signal.h,
3679                stdlib.h, sys/signal.h, time.h;
3680     /*
3681      * Starting at the beginning of a line, skip white space and
3682      * a leading "(" or "&&" or "||".  One of those must be found.
3683      * Then, zero, one or more copies of a "defined(_FOO_BAR_) &&"
3684      * expression.  If these are nested, then they must accumulate
3685      * because we won't match any closing parentheses.  Finally,
3686      * after skipping over all that, we must then match our suspect
3687      * phrase:  "__STDC__-0==0" with or without white space.
3688      */
3689     select   = "^([ \t]*" '(\(|&&|\|\|)'
3690                "([ \t(]*!*[ \t]*defined\\([a-zA-Z_0-9]+\\)[ \t]*[|&][|&])*"
3691                "[ \t(]*)"
3692                "(__STDC__[ \t]*(|-[ \t]*0[ \t]*)==[ \t]*0)";
3693     c_test   = stdc_0_in_system_headers;
3694
3695     c_fix     = format;
3696     c_fix_arg = "%1 !defined(__STRICT_ANSI__)";
3697
3698     test_text = "#if 1 && \\\\\n"
3699                "&& defined(mumbling) |& (__STDC__ - 0 == 0) \\\\\n"
3700                "( __STDC__ == 0 && !defined(_XOPEN_SOURCE) \\\\\n"
3701                "|| __STDC__ - 0 == 0 ) /* not std C */\n"
3702                "int foo;\n#endif";
3703 };
3704
3705
3706 /*
3707  *  "__STDC__!=0" or "__STDC__==1" or "__STDC__-0==1"
3708  *  is "defined( __STRICT_ANSI__ )"
3709  */
3710 fix = {
3711     hackname = strict_ansi_only;
3712     select   = "^([ \t]*#[ \t]*if.*)"
3713                "(__STDC__[ \t]*!=[ \t]*0"
3714                "|__STDC__[ \t]*==[ \t]*1"
3715                "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*1"
3716                "|__STDC__[ \t]*-[ \t]*0[ \t]*!=[ \t]*0)";
3717     c_test   = stdc_0_in_system_headers;
3718
3719     c_fix     = format;
3720     c_fix_arg = "%1 defined(__STRICT_ANSI__)";
3721
3722     test_text = "#if __STDC__ == 1 /* is std C\n */\nint foo;\n#endif";
3723 };
3724
3725
3726 /*
3727  *  IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s
3728  *  in prototype without previous definition.
3729  */
3730 fix = {
3731     hackname  = struct_file;
3732     files     = rpc/xdr.h;
3733     select    = '^.*xdrstdio_create.*struct __file_s';
3734     c_fix     = format;
3735     c_fix_arg = "struct __file_s;\n%0";
3736     test_text = "extern void xdrstdio_create( struct __file_s* );";
3737 };
3738
3739
3740 /*
3741  *  IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr
3742  *  in prototype without previous definition.
3743  *
3744  *  Don't fix OpenBSD, which uses struct sockaddr_in prototyping the same
3745  *  function, and does define it.
3746  */
3747 fix = {
3748     hackname  = struct_sockaddr;
3749     files     = rpc/auth.h;
3750     select    = "^.*authdes_create.*struct sockaddr[^_]";
3751     bypass    = "<sys/socket\.h>";
3752     bypass    = "struct sockaddr;\n";
3753     c_fix     = format;
3754     c_fix_arg = "struct sockaddr;\n%0";
3755     test_text = "extern AUTH* authdes_create( struct sockaddr* );";
3756 };
3757
3758
3759 /*
3760  *  Apply fix this to all OSs since this problem seems to effect
3761  *  more than just SunOS.
3762  */
3763 fix = {
3764     hackname = sun_auth_proto;
3765     files    = rpc/auth.h;
3766     files    = rpc/clnt.h;
3767     files    = rpc/svc.h;
3768     files    = rpc/xdr.h;
3769     bypass   = "__cplusplus";
3770     /*
3771      *  Select those files containing '(*name)()'.
3772      */
3773     select    = '\(\*[a-z][a-z_]*\)\(\)';
3774
3775     c_fix     = format;
3776     c_fix_arg = "#ifdef __cplusplus\n%1(...);%2\n"
3777                 "#else\n%1();%2\n#endif";
3778     c_fix_arg = '(.*\(\*[a-z][a-z_]*\))\(\);(.*)';
3779
3780     test_text =
3781     "struct auth_t {\n"
3782     "    int (*name)(); /* C++ bad */\n"
3783     "};";
3784 };
3785
3786
3787 /*
3788  *  Fix bogus #ifdef on SunOS 4.1.
3789  */
3790 fix = {
3791     hackname  = sun_bogus_ifdef;
3792     files     = "hsfs/hsfs_spec.h";
3793     files     = "hsfs/iso_spec.h";
3794     select    = '#ifdef(.*\|\|.*)';
3795     c_fix     = format;
3796     c_fix_arg = "#if%1";
3797
3798     test_text = "#ifdef  __i386__ || __vax__ || __sun4c__";
3799 };
3800
3801
3802 /*
3803  *  Fix the CAT macro in SunOS memvar.h.
3804  */
3805 fix = {
3806     hackname  = sun_catmacro;
3807     files     = pixrect/memvar.h;
3808     select    = "^#define[ \t]+CAT\\(a,b\\).*";
3809     c_fix     = format;
3810
3811     c_fix_arg =
3812     "#ifdef __STDC__\n"
3813     "#  define CAT(a,b) a##b\n"
3814     "#else\n%0\n#endif";
3815
3816     test_text =
3817     "#define CAT(a,b)\ta/**/b";
3818 };
3819
3820
3821 /*
3822  *  Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1.
3823  *  Also fix return type of {m,re}alloc in <malloc.h> on sysV68
3824  */
3825 fix = {
3826     hackname = sun_malloc;
3827     files    = malloc.h;
3828     bypass   = "_CLASSIC_ANSI_TYPES";
3829
3830     sed   = "s/typedef[ \t]char \\*\tmalloc_t/typedef void \\*\tmalloc_t/g";
3831     sed   = "s/int[ \t][ \t]*free/void\tfree/g";
3832     sed   = "s/char\\([ \t]*\\*[ \t]*malloc\\)/void\\1/g";
3833     sed   = "s/char\\([ \t]*\\*[ \t]*realloc\\)/void\\1/g";
3834     sed   = "s/char\\([ \t]*\\*[ \t]*calloc\\)/void\\1/g";
3835
3836     test_text =
3837     "typedef char *\tmalloc_t;\n"
3838     "int \tfree();\n"
3839     "char*\tmalloc();\n"
3840     "char*\tcalloc();\n"
3841     "char*\trealloc();";
3842 };
3843
3844
3845 /*
3846  *  Check for yet more missing ';' in struct (in SunOS 4.0.x)
3847  */
3848 fix = {
3849     hackname = sun_rusers_semi;
3850     files    = rpcsvc/rusers.h;
3851     select   = "_cnt$";
3852     sed      = "/^struct/,/^};/s/_cnt$/_cnt;/";
3853     test_text = "struct mumble\n  int _cnt\n};";
3854 };
3855
3856
3857 /*
3858  *  signal.h on SunOS defines signal using (),
3859  *  which causes trouble when compiling with g++ -pedantic.
3860  */
3861 fix = {
3862     hackname = sun_signal;
3863     files    = sys/signal.h;
3864     files    = signal.h;
3865     select   = "^void\t" '\(\*signal\(\)\)\(\);.*';
3866
3867     c_fix     = format;
3868     c_fix_arg =
3869           "#ifdef __cplusplus\n"
3870           "void\t(*signal(...))(...);\n"
3871           "#else\n%0\n#endif";
3872
3873     test_text = "void\t(*signal())();";
3874 };
3875
3876
3877 /*
3878  *  Correct the return type for strlen in strings.h in SunOS 4.
3879  */
3880 fix = {
3881     hackname = sunos_strlen;
3882     files    = strings.h;
3883     select   = "int[ \t]*strlen\\(\\);(.*)";
3884     c_fix     = format;
3885     c_fix_arg = "__SIZE_TYPE__ strlen();%1";
3886     test_text = " int\tstrlen(); /* string length */";
3887 };
3888
3889
3890 /*
3891  *  Disable apparent native compiler optimization cruft in SVR4.2 <string.h>
3892  *  that is visible to any ANSI compiler using this include.  Simply
3893  *  delete the lines that #define some string functions to internal forms.
3894  */
3895 fix = {
3896     hackname = svr4_disable_opt;
3897     files    = string.h;
3898     select   = '#define.*__std_hdr_';
3899     sed      = '/#define.*__std_hdr_/d';
3900     test_text = "#define strlen __std_hdr_strlen\n";
3901 };
3902
3903
3904 /*
3905  *  Conditionalize some of <sys/endian.h> on __GNUC__ and __GNUG__.
3906  *  On some systems (UnixWare 2, UnixWare 7), the file is byteorder.h
3907  *  but we still "hijack" it and redirect it to the GNU byteorder.h..
3908  */
3909 #ifdef SVR5
3910 fix = {
3911     hackname = svr4_endian;
3912     files    = sys/endian.h;
3913 #ifdef LATER
3914     /*
3915      * since we emit our own sys/byteorder.h,
3916      * this fix can never be applied to that file.
3917      */
3918     files    = sys/byteorder.h;
3919 #endif
3920     bypass   = '__GNUC__';
3921
3922     sed      = "/#\tifdef\t__STDC__/i\\\n"
3923                "#   if !defined (__GNUC__) && !defined (__GNUG__)\n";
3924
3925     sed      = "/#\t\tinclude\t<sys\\/byteorder.h>/s/\t\t/   /";
3926
3927     sed      = "/#   include\t<sys\\/byteorder.h>/i\\\n"
3928                "#   endif /* !defined (__GNUC__) && !defined (__GNUG__) */\n";
3929 };
3930 #endif /* SVR5 */
3931
3932
3933 /*
3934  *  Remove useless extern keyword from struct forward declarations
3935  *  in <sys/stream.h> and <sys/strsubr.h>
3936  */
3937 #ifdef SVR4
3938 fix = {
3939     hackname = svr4_extern_struct;
3940     files    = sys/stream.h;
3941     files    = sys/strsubr.h;
3942     select   = 'extern struct [a-z_]*;';
3943     sed      = 's/extern struct \([a-z][a-z_]*\)/struct \1/';
3944 };
3945 #endif
3946
3947 /*
3948  *  Fix declarations of `ftw' and `nftw' in <ftw.h>.  On some/most SVR4
3949  *  systems the file <ftw.h> contains extern declarations of these
3950  *  functions followed by explicitly `static' definitions of these
3951  *  functions... and that's not allowed according to ANSI C.  (Note
3952  *  however that on Solaris, this header file glitch has been pre-fixed by
3953  *  Sun.  In the Solaris version of <ftw.h> there are no static
3954  *  definitions of any function so we don't need to do any of this stuff
3955  *  when on Solaris.
3956  */
3957 #ifdef SVR4
3958 #ifndef SOLARIS
3959 fix = {
3960     hackname = svr4_ftw;
3961     files    = ftw.h;
3962     select   = '^extern int ftw\(const';
3963
3964     sed = '/^extern int ftw(const/i' "\\\n"
3965             "#if !defined(_STYPES)\\\n"
3966             "static\\\n"
3967             "#else\\\n"
3968             "extern\\\n"
3969             "#endif";
3970     sed = 's/extern \(int ftw(const.*\)$/\1/';
3971     sed = "/^extern int nftw/i\\\n"
3972             "#if defined(_STYPES)\\\n"
3973             "static\\\n"
3974             "#else\\\n"
3975             "extern\\\n"
3976             "#endif";
3977     sed = 's/extern \(int nftw.*\)$/\1/';
3978     sed = "/^extern int ftw(),/c\\\n"
3979             "#if !defined(_STYPES)\\\n"
3980             "static\\\n"
3981             "#else\\\n"
3982             "extern\\\n"
3983             "#endif\\\n"
3984             "  int ftw();\\\n"
3985             "#if defined(_STYPES)\\\n"
3986             "static\\\n"
3987             "#else\\\n"
3988             "extern\\\n"
3989             "#endif\\\n"
3990             "  int nftw();";
3991 };
3992 #endif
3993 #endif
3994
3995
3996 /*
3997  *   Fix broken decl of getcwd present on some svr4 systems.
3998  */
3999 fix = {
4000     hackname = svr4_getcwd;
4001     files    = stdlib.h;
4002     files    = unistd.h;
4003     files    = prototypes.h;
4004     select   = 'getcwd\(char \*, int\)';
4005
4006     c_fix     = format;
4007     c_fix_arg = "getcwd(char *, size_t)";
4008
4009     test_text = "extern char* getcwd(char *, int);";
4010 };
4011
4012
4013 /*
4014  *  Wrap some files on System V r4 and DYNIX/ptx systems with
4015  *  #ifdef _KERNEL, presumably to prevent kernel headers from
4016