OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.2.2/] [fixincludes/] [inclhack.def] - Blame information for rev 297

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.