1/* -*- Mode: C -*- */ 2 3autogen 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 20FIXINC_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 */ 28fix = { 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 <architecture/ppc/math.h> 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 */ 121fix = { 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 */ 138fix = { 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 <asm/posix_types.h>. 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 <features.h> 155 #include_next <asm/posix_types.h> 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 */ 178fix = { 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 <gnu/types.h>. 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 <features.h> 193 #include_next <gnu/types.h> 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 */ 216fix = { 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 <selectbits.h>. 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 <features.h> 231 #include_next <selectbits.h> 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 <sys/varargs.h> is a DDK (aka kernel-land) header providing 257 * the same interface as <stdarg.h>. No idea why they couldn't have just 258 * used the standard header. 259 */ 260fix = { 261 hackname = AAB_solaris_sys_varargs_h; 262 files = "sys/varargs.h"; 263 mach = '*-*-solaris*'; 264 replace = <<- _EndOfHeader_ 265 #ifdef __STDC__ 266 #include <stdarg.h> 267 #else 268 #include <varargs.h> 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 */ 281fix = { 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 <sys/varargs.h> with a file that includes gcc's 314 * stdarg.h or varargs.h files as appropriate. 315 */ 316#ifdef SVR4 317fix = { 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 <stdarg.h>\n" 326 "#else\n" 327 "#include <varargs.h>\n" 328 "#endif\n\n" 329 330 "#endif /* _SYS_VARARGS_H */\n"; 331}; 332#endif 333 334 335/* 336 * Completely replace <sys/byteorder.h> with a file that implements gcc's 337 * optimized byteswapping. (The original probably implemented some 338 * incompatible optimized byteswapping.) 339 */ 340fix = { 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 */ 500fix = { 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 */ 512fix = { 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 <sys/limits.h> 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 */ 530fix = { 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 <strings.h> 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 */ 548fix = { 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 <strings.h> 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 */ 565fix = { 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 */ 580fix = { 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 */ 595fix = { 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 */ 612fix = { 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 */ 628fix = { 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 */ 641fix = { 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 */ 654fix = { 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 <standards.h>. 673 */ 674fix = { 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 <sys/mount.h> and 689 * <sys/stat.h>. The tests for __DECC are special in various ways, so 690 * alpha__extern_prefix cannot be used. 691 */ 692fix = { 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 */ 710fix = { 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 */ 735fix = { 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 */ 754fix = { 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 */ 768fix = { 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 <pthread.h>. 780 */ 781fix = { 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 <pthread.h>. 802 */ 803fix = { 804 hackname = alpha_pthread_gcc; 805 files = pthread.h; 806 select = "#else\n# error <pthread.h>: 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 <pthread.h>: 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 */ 826fix = { 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 */ 869fix = { 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 */ 883fix = { 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 */ 901fix = { 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 919fix = { 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 <linux/nls.h> which is never used from C++ anyway, 942 * and will be broken by the edit. 943 */ 944 945fix = { 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 */ 963fix = { 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 */ 978fix = { 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 */ 992fix = { 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 <stdio.h>\n"; 999 test_text = "extern FILE* stderr;"; 1000}; 1001 1002 1003/* 1004 * check for broken assert.h that needs stdlib.h 1005 */ 1006fix = { 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 <stdlib.h>\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 */ 1028fix = { 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 1054fix = { 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 */ 1071fix = { 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 */ 1103fix = { 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 1117fix = { 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 */ 1135fix = { 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 1159fix = { 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 */ 1175fix = { 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 <c_asm.h> 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 */ 1194fix = { 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 <wchar.h> on DJGPP 2.03. 1209 */ 1210fix = { 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 <sys/djtypes.h>"; 1217 c_fix_arg = "#include <stddef.h>"; 1218 test_text = "#include <stddef.h>\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 */ 1226fix = { 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 */ 1243fix = { 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 */ 1263fix = { 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 */ 1280fix = { 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 */ 1295fix = { 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 */ 1362fix = { 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: <machine/xxx.h> 1386 */ 1387fix = { 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<machine/%2.h>"; 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 */ 1406fix = { 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 */ 1423fix = { 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 1451fix = { 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 */ 1470fix = { 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 */ 1492fix = { 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 */ 1533fix = { 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 */ 1555fix = { 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 */ 1571fix = { 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 */ 1591fix = { 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 */ 1610fix = { 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 */ 1639fix = { 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 */ 1655fix = { 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 */ 1671fix = { 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 */ 1689fix = { 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 */ 1705fix = { 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 */ 1733fix = { 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 <sys/time.h> to avoid invalid forward decl 1753 */ 1754fix = { 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 */ 1770fix = { 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 1782fix = { 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 1792fix = { 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 1802fix = { 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 */ 1816fix = { 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 */ 1858fix = { 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 */ 1874fix = { 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 */ 1890fix = { 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 */ 1906fix = { 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 */ 1938fix = { 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 1951fix = { 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 */ 1966fix = { 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] <internal/sgimacros.h> unconditionally defines 1982 * __restrict as restrict iff __c99. This is wrong for C++, which 1983 * needs many C99 features, but only supports __restrict. 1984 */ 1985fix = { 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 <internal/math_core.h> 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 */ 2005fix = { 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 <internal/math_core.h> 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. */ 2027fix = { 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 <sys/asm.h> contains an asm comment with a contraction 2046 * that causes the assembly preprocessor to complain about an 2047 * unterminated character constant. 2048 */ 2049fix = { 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 */ 2064fix = { 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] <sys/socket.h> 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 */ 2081fix = { 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 <stdint.h> only works with ISO C99 and errors out 2100 * otherwise. 2101 */ 2102fix = { 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++. */ 2121fix = { 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 <internal/wchar_core.h> provides the XPG4 variant of 2136 * wcsftime by default. ISO C99 requires the XPG5 variant instead. 2137 */ 2138fix = { 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 */ 2154fix = { 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 */ 2170fix = { 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 */ 2192fix = { 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 */ 2223fix = { 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 */ 2239fix = { 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 */ 2273fix = { 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 2290fix = { 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 */ 2305fix = { 2306 hackname = lynxos_no_warning_in_sys_time_h; 2307 files = sys/time.h; 2308 select = "#warning[ \t]+Using <time.h> instead of <sys/time.h>"; 2309 c_fix = format; 2310 c_fix_arg = ""; 2311 test_text = "#warning Using <time.h> instead of <sys/time.h>"; 2312}; 2313 2314 2315/* 2316 * Add missing declaration for putenv. 2317 */ 2318fix = { 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 */ 2338fix = { 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 */ 2354fix = { 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 */ 2374fix = { 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 */ 2405fix = { 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 */ 2440fix = { 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 <rpc/auth_des.h> /* skip this */"; 2447}; 2448 2449 2450/* 2451 * Fix nested comments in Motorola's <limits.h> and <sys/limits.h> 2452 */ 2453fix = { 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 <sys/limits.h> 2474 */ 2475fix = { 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 */ 2489fix = { 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 */ 2506fix = { 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 */ 2524fix = { 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 */ 2540fix = { 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 */ 2559fix = { 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 */ 2573fix = { 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 */ 2598fix = { 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 */ 2613fix = { 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 2633fix = { 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 <reg_types\.h>.*"; 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 <reg_types.h>"; 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 */ 2657fix = { 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 */ 2670fix = { 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 2686fix = { 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 */ 2707fix = { 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 <rpc/xdr.h>. 2721 */ 2722fix = { 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 2733fix = { 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 */ 2747fix = { 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 */ 2763fix = { 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 */ 2776fix = { 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, <math.h> 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 */ 2794fix = { 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, <sys/regset.h> and <ieeefp.h> 2834 * have a clash on struct _fpstate and struct fpstate. 2835 */ 2836fix = { 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 <sys/stat.h> 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 <sys/stat.h> contains 2865 * tiny static wrappers that aren't C++ safe. 2866 */ 2867fix = { 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 */ 2903fix = { 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 */ 2920fix = { 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 2938fix = { 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 2952fix = { 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 2966fix = { 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__ ({ __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 2990fix = { 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__ ({ __typeof (x) __x_f = (x); \\\n" 2998 "\t\t __builtin_expect(!isnan(__x_f - __x_f), 1); })"; 2999 c_fix_arg = "^#define[ \t]+isfinite\\(x\\)[ \t]+__builtin_isfinite\\(x\\)"; 3000 test_text = 3001 '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" 3002 "#undef isfinite\n" 3003 "#define isfinite(x) __builtin_isfinite(x)"; 3004}; 3005 3006fix = { 3007 hackname = solaris_math_6; 3008 select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3009 bypass = "__GNUC__"; 3010 files = iso/math_c99.h; 3011 c_fix = format; 3012 c_fix_arg = "#define\tisinf(x) \\\n" 3013 " __extension__ ({ __typeof (x) __x_i = (x); \\\n" 3014 "\t\t __builtin_expect(!isnan(__x_i) && !isfinite(__x_i), 0); })"; 3015 c_fix_arg = "^#define[ \t]+isinf\\(x\\)[ \t]+__builtin_isinf\\(x\\)"; 3016 test_text = 3017 '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" 3018 "#undef isinf\n" 3019 "#define isinf(x) __builtin_isinf(x)"; 3020}; 3021 3022fix = { 3023 hackname = solaris_math_7; 3024 select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3025 bypass = "__GNUC__"; 3026 files = iso/math_c99.h; 3027 c_fix = format; 3028 c_fix_arg = "#define\tisnormal(x) \\\n" 3029 " __extension__ ({ __typeof(x) __x_n = (x); \\\n" 3030 "\t\t if (__x_n < 0.0) __x_n = -__x_n; \\\n" 3031 "\t\t __builtin_expect(isfinite(__x_n) \\\n" 3032 "\t\t\t\t && (sizeof(__x_n) == sizeof(float) \\\n" 3033 "\t\t\t\t\t ? __x_n >= __FLT_MIN__ \\\n" 3034 "\t\t\t\t\t : sizeof(__x_n) == sizeof(long double) \\\n" 3035 "\t\t\t\t\t ? __x_n >= __LDBL_MIN__ \\\n" 3036 "\t\t\t\t\t : __x_n >= __DBL_MIN__), 1); })"; 3037 c_fix_arg = "^#define[ \t]+isnormal\\(x\\)[ \t]+__builtin_isnormal\\(x\\)"; 3038 test_text = 3039 '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" 3040 "#undef isnormal\n" 3041 "#define isnormal(x) __builtin_isnormal(x)"; 3042}; 3043 3044fix = { 3045 hackname = solaris_math_8; 3046 select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3047 bypass = "__GNUC__"; 3048 files = iso/math_c99.h; 3049 c_fix = format; 3050 c_fix_arg = "#define\tsignbit(x)\t(sizeof(x) == sizeof(float) \\\n" 3051 "\t\t\t ? __builtin_signbitf(x) \\\n" 3052 "\t\t\t : sizeof(x) == sizeof(long double) \\\n" 3053 "\t\t\t ? __builtin_signbitl(x) \\\n" 3054 "\t\t\t : __builtin_signbit(x))"; 3055 c_fix_arg = "^#define[ \t]+signbit\\(x\\)[ \t]+__builtin_signbit\\(x\\)"; 3056 test_text = 3057 '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" 3058 "#undef signbit\n" 3059 "#define signbit(x) __builtin_signbit(x)"; 3060}; 3061 3062fix = { 3063 hackname = solaris_math_9; 3064 select = '@\(#\)math_c99.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3065 bypass = "__GNUC__"; 3066 files = iso/math_c99.h; 3067 c_fix = format; 3068 c_fix_arg = "#define\t%1(x, y)%2__builtin_%1(x, y)"; 3069 c_fix_arg = "^#define[ \t]+([a-z]+)\\(x, y\\)([ \t]+)\\(\\(x\\) __builtin_[a-z]+\\(y\\)\\)"; 3070 test_text = 3071 '#ident "@(#)math_c99.h 1.9 04/11/01 SMI"'"\n" 3072 "#undef isgreater\n" 3073 "#define isgreater(x, y) ((x) __builtin_isgreater(y))\n" 3074 "#undef isgreaterequal\n" 3075 "#define isgreaterequal(x, y) ((x) __builtin_isgreaterequal(y))\n" 3076 "#undef isless\n" 3077 "#define isless(x, y) ((x) __builtin_isless(y))\n" 3078 "#undef islessequal\n" 3079 "#define islessequal(x, y) ((x) __builtin_islessequal(y))\n" 3080 "#undef islessgreater\n" 3081 "#define islessgreater(x, y) ((x) __builtin_islessgreater(y))\n" 3082 "#undef isunordered\n" 3083 "#define isunordered(x, y) ((x) __builtin_isunordered(y))"; 3084}; 3085 3086/* 3087 * Sun Solaris 2.5.1, 2.6 defines PTHREAD_{MUTEX|COND}_INITIALIZER 3088 * incorrectly, so we replace them with versions that correspond to 3089 * the definition. We also explicitly name this fix "1" and the next 3090 * fix "2" because this one does not deal with the last field. This 3091 * fix needs to run before the next. 3092 */ 3093fix = { 3094 hackname = solaris_mutex_init_1; 3095 select = '@\(#\)pthread.h' "[ \t]+1.1[0-9][ \t]+9[567]/[0-9/]+ SMI"; 3096 files = pthread.h; 3097 sed = "/define[ \t]*PTHREAD_MUTEX_INI/s/{0, 0,/{{{0}, 0}, {{{0}}},/\n" 3098 "/define[ \t]*PTHREAD_COND_INI/s/{0,/{{{0},0},/"; 3099 test_text = 3100 '#ident "@(#)pthread.h 1.16 97/05/05 SMI"'"\n" 3101 "#define PTHREAD_MUTEX_INITIALIZER\t{0, 0, 0}\n" 3102 "#define PTHREAD_COND_INITIALIZER\t{0, 0} /* */\n"; 3103}; 3104 3105 3106/* 3107 * Sun Solaris defines PTHREAD_MUTEX_INITIALIZER with a trailing 3108 * "0" for the last field of the pthread_mutex_t structure, which is 3109 * of type upad64_t, which itself is typedef'd to int64_t, but with 3110 * __STDC__ defined (e.g. by -ansi) it is a union. So change the 3111 * initializer to "{0}" instead 3112 */ 3113fix = { 3114 hackname = solaris_mutex_init_2; 3115 select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3116 files = pthread.h; 3117 /* 3118 * On Solaris 10, this fix is unnecessary because upad64_t is 3119 * always defined correctly regardless of the definition of the 3120 * __STDC__ macro. The first "mach" pattern matches up to 3121 * solaris9. The second "mach" pattern will not match any two (or 3122 * more) digit solaris version, but it will match e.g. 2.5.1. 3123 */ 3124 mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*'; 3125 c_fix = format; 3126 c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n" 3127 "%0\n" 3128 "#else\n" 3129 "%1, {0}}%4\n" 3130 "#endif"; 3131 c_fix_arg = "(^#define[ \t]+PTHREAD_(MUTEX|COND)_INITIALIZER[ \t]+" 3132 "(|/\*.*\*/[ \t]*\\\\\n[ \t]*)\\{.*)" 3133 ",[ \t]*0\\}" "(|[ \t].*)$"; 3134 test_text = 3135 '#ident "@(#)pthread.h 1.26 98/04/12 SMI"'"\n" 3136 "#define PTHREAD_MUTEX_INITIALIZER\t{{{0},0}, {{{0}}}, 0}\n" 3137 "#define PTHREAD_COND_INITIALIZER\t{{{0}, 0}, 0}\t/* DEFAULTCV */\n" 3138 "#define PTHREAD_MUTEX_INITIALIZER /* = DEFAULTMUTEX */ \\\\\n" 3139 " {{0, 0, 0, DEFAULT_TYPE, _MUTEX_MAGIC}, {{{0}}}, 0}\n" 3140 "#define PTHREAD_COND_INITIALIZER /* = DEFAULTCV */ \\\\\n" 3141 " {{{0, 0, 0, 0}, DEFAULT_TYPE, _COND_MAGIC}, 0}"; 3142}; 3143 3144 3145/* 3146 * Sun Solaris defines PTHREAD_RWLOCK_INITIALIZER with a "0" for some 3147 * fields of the pthread_rwlock_t structure, which are of type 3148 * upad64_t, which itself is typedef'd to int64_t, but with __STDC__ 3149 * defined (e.g. by -ansi) it is a union. So change the initializer 3150 * to "{0}" instead. 3151 */ 3152fix = { 3153 hackname = solaris_rwlock_init_1; 3154 select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3155 files = pthread.h; 3156 mach = '*-*-solaris*'; 3157 c_fix = format; 3158 c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n" 3159 "%0\n" 3160 "#else\n" 3161 "%1{0, 0, 0, {{0}, {0}, {0}}, {{0}, {0}}, {{0}, {0}}}\n" 3162 "#endif"; 3163 c_fix_arg = "(^#define[ \t]+PTHREAD_RWLOCK_INITIALIZER[ \t]+)" 3164 "\\{0, 0, 0, \\{0, 0, 0\\}, \\{0, 0\\}, \\{0, 0\\}\\}[ \t]*$"; 3165 3166 test_text = 3167 '#ident "@(#)pthread.h 1.26 98/04/12 SMI"'"\n" 3168 "#define PTHREAD_RWLOCK_INITIALIZER\t{0, 0, 0, {0, 0, 0}, {0, 0}, {0, 0}}"; 3169}; 3170 3171 3172/* 3173 * Sun Solaris defines PTHREAD_ONCE_INIT as an array containing a 3174 * structure. As such, it need two levels of brackets, but only 3175 * contains one. Wrap the macro definition in an extra layer. 3176 */ 3177fix = { 3178 hackname = solaris_once_init_1; 3179 select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3180 files = pthread.h; 3181 mach = '*-*-solaris*'; 3182 c_fix = format; 3183 c_fix_arg = "%1{%2}%3"; 3184 c_fix_arg = "(^#define[ \t]+PTHREAD_ONCE_INIT[ \t]+\\{)([^}]+)(\\})[ \t]*$"; 3185 test_text = 3186 '#pragma ident "@(#)pthread.h 1.37 04/09/28 SMI"'"\n" 3187 "#define PTHREAD_ONCE_INIT\t{0, 0, 0, PTHREAD_ONCE_NOTDONE}"; 3188}; 3189 3190 3191/* 3192 * Sun Solaris defines PTHREAD_ONCE_INIT with a "0" for some 3193 * fields of the pthread_once_t structure, which are of type 3194 * upad64_t, which itself is typedef'd to int64_t, but with __STDC__ 3195 * defined (e.g. by -ansi) it is a union. So change the initializer 3196 * to "{0}" instead. This test relies on solaris_once_init_1. 3197 */ 3198fix = { 3199 hackname = solaris_once_init_2; 3200 select = '@\(#\)pthread.h' "[ \t]+1.[0-9]+[ \t]+[0-9/]+ SMI"; 3201 files = pthread.h; 3202 /* 3203 * On Solaris 10, this fix is unnecessary because upad64_t is 3204 * always defined correctly regardless of the definition of the 3205 * __STDC__ macro. The first "mach" pattern matches up to 3206 * solaris9. The second "mach" pattern will not match any two (or 3207 * more) digit solaris version, but it will match e.g. 2.5.1. 3208 */ 3209 mach = '*-*-solaris2.[0-9]', '*-*-solaris2.[0-9][!0-9]*'; 3210 c_fix = format; 3211 c_fix_arg = "#if __STDC__ - 0 == 0 && !defined(_NO_LONGLONG)\n" 3212 "%0\n" 3213 "#else\n" 3214 "%1{0}, {0}, {0}, {%3}%4\n" 3215 "#endif"; 3216 c_fix_arg = "(^#define[ \t]+PTHREAD_ONCE_INIT[ \t]+\\{\\{)" 3217 "(0, 0, 0, )(PTHREAD_[A-Z_]+)(\\}\\})[ \t]*$"; 3218 test_text = 3219 '#ident "@(#)pthread.h 1.26 98/04/12 SMI"'"\n" 3220 "#define PTHREAD_ONCE_INIT\t{{0, 0, 0, PTHREAD_ONCE_NOTDONE}}\n"; 3221}; 3222 3223 3224/* 3225 * Solaris 2.5.1 and 2.6 use an outdated prototype for send & recv 3226 * in sys/socket.h. This is corrected in Solaris 7 and up. 3227 */ 3228fix = { 3229 hackname = solaris_socket; 3230 files = sys/socket.h; 3231 select = '@\(#\)socket.h' "[ \t]+1.[123][0-9][ \t]+9[567]/[0-9/]+ SMI"; 3232 c_fix = format; 3233 c_fix_arg = "extern int %1(int, %2void *, int, int);"; 3234 c_fix_arg = '^extern int (recv|send)\(int,' 3235 ' (const )*char ' 3236 '\*, int, int\);'; 3237 3238 test_text = '#ident "@(#)socket.h 1.30 97/01/20 SMI"'"\n" 3239 "extern int recv(int, char *, int, int);\n" 3240 "extern int send(int, const char *, int, int);"; 3241}; 3242 3243 3244/* 3245 * Solaris 2.8 has what appears to be some gross workaround for 3246 * some old version of their c++ compiler. G++ doesn't want it 3247 * either, but doesn't want to be tied to SunPRO version numbers. 3248 */ 3249fix = { 3250 hackname = solaris_stdio_tag; 3251 files = stdio_tag.h; 3252 3253 select = '__cplusplus < 54321L'; 3254 /* In Solaris 10, the code in stdio_tag.h is conditionalized on 3255 "!defined(__GNUC__)" so we no longer need to fix it. */ 3256 bypass = '__GNUC__'; 3257 sed = 's/defined(__cplusplus) && (__cplusplus < 54321L)/0/'; 3258 3259 test_text = "#if\tdefined(__cplusplus) && (__cplusplus < 54321L)"; 3260}; 3261 3262 3263/* 3264 * Sun Solaris 2.5.1 doesn't define 'getpagesize' in <unistd.h>, as is done 3265 * on Solaris 2.6 and up. 3266 */ 3267fix = { 3268 hackname = solaris_unistd; 3269 files = unistd.h; 3270 select = '@\(#\)unistd.h' "[ \t]+1.3[0-9][ \t]+9[567]/[0-9/]+ SMI"; 3271 bypass = "getpagesize"; 3272 c_fix = format; 3273 c_fix_arg = "extern int getpagesize();\n%0"; 3274 c_fix_arg = '^extern (pid_t|int) getpgid\(.*\);'; 3275 test_text = '#ident "@(#)unistd.h 1.33 95/08/28 SMI"'"\n" 3276 "extern pid_t getpgid(pid_t);\n" 3277 "extern int getpgid();"; 3278}; 3279 3280 3281/* 3282 * <widec.h> until Solaris 2.5.1 defines macros for a couple of <wchar.h> 3283 * functions, breaking their prototypes if that file is included afterwards. 3284 * Include <wchar.h> early to avoid this issue, as is done on Solaris 2.6 3285 * and up. 3286 */ 3287fix = { 3288 hackname = solaris_widec; 3289 files = widec.h; 3290 mach = '*-*-solaris2.[0-5]'; 3291 mach = '*-*-solaris2.[0-5].*'; 3292 bypass = "include.*wchar\\.h"; 3293 select = "#include <euc.h>"; 3294 c_fix = format; 3295 c_fix_arg = "%0\n#include <wchar.h>"; 3296 test_text = "#include <euc.h>"; 3297}; 3298 3299 3300/* 3301 * a missing semi-colon at the end of the statsswtch structure definition. 3302 */ 3303fix = { 3304 hackname = statsswtch; 3305 files = rpcsvc/rstat.h; 3306 select = "boottime$"; 3307 c_fix = format; 3308 c_fix_arg = "boottime;"; 3309 test_text = "struct statswtch {\n int boottime\n};"; 3310}; 3311 3312 3313/* 3314 * Arrange for stdio.h to use stdarg.h to define __gnuc_va_list. 3315 * On 4BSD-derived systems, stdio.h defers to machine/ansi.h; that's 3316 * OK too. 3317 */ 3318fix = { 3319 hackname = stdio_stdarg_h; 3320 files = stdio.h; 3321 bypass = "include.*(stdarg\.h|machine/ansi\.h)"; 3322 /* 3323 * On Solaris 10, this fix is unncessary; <stdio.h> includes 3324 * <iso/stdio_iso.h>, which includes <sys/va_list.h>. 3325 */ 3326 mach = '*-*-solaris2.1[0-9]*'; 3327 not_machine = true; 3328 3329 c_fix = wrap; 3330 3331 c_fix_arg = "#define __need___va_list\n#include <stdarg.h>\n"; 3332 3333 test_text = ""; 3334}; 3335 3336 3337/* 3338 * Don't use or define the name va_list in stdio.h. This is for 3339 * ANSI. Note _BSD_VA_LIST_ is dealt with elsewhere. The presence 3340 * of __gnuc_va_list, __DJ_va_list, or _G_va_list is taken to 3341 * indicate that the header knows what it's doing -- under SUSv2, 3342 * stdio.h is required to define va_list, and we shouldn't break 3343 * that. On IRIX 6.5, internal/wchar_core.h used to get its 3344 * definition of va_list from stdio.h. Since this doesn't happen any 3345 * longer, use __gnuc_va_list there, too. 3346 */ 3347fix = { 3348 hackname = stdio_va_list; 3349 files = stdio.h; 3350 files = internal/stdio_core.h; 3351 files = internal/wchar_core.h; 3352 bypass = '__gnuc_va_list|_BSD_VA_LIST_|__DJ_va_list|_G_va_list'; 3353 /* 3354 * On Solaris 10, the definition in 3355 * <stdio.h> is guarded appropriately by the _XPG4 feature macro; 3356 * there is therefore no need for this fix there. 3357 */ 3358 mach = '*-*-solaris2.1[0-9]*'; 3359 not_machine = true; 3360 3361 /* 3362 * Use __gnuc_va_list in arg types in place of va_list. 3363 * On 386BSD use __gnuc_va_list instead of _VA_LIST_. On Tru64 UNIX V5.1A 3364 * use __gnuc_va_list instead of __VA_LIST__. We're hoping the 3365 * trailing parentheses and semicolon save all other systems from this. 3366 * Define __not_va_list__ (something harmless and unused) 3367 * instead of va_list. 3368 * Don't claim to have defined va_list. 3369 */ 3370 sed = "s@[ \t]va_list\\([ \t)]\\)@ __gnuc_va_list\\1@\n" 3371 "s@(va_list)&@(__gnuc_va_list)\\&@\n" 3372 "s@ _VA_LIST_));@ __gnuc_va_list));@\n" 3373 "s@ __VA_LIST__));@ __gnuc_va_list));@\n" 3374 "s@ va_list@ __not_va_list__@\n" 3375 "s@\\*va_list@*__not_va_list__@\n" 3376 "s@ __va_list)@ __gnuc_va_list)@\n" 3377 "s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;" 3378 "@typedef \\1 __not_va_list__;@\n" 3379 "s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n" 3380 "s@GNUC_VA_LIST@GNUC_Va_LIST@\n" 3381 "s@_VA_LIST_DEFINED@_Va_LIST_DEFINED@\n" 3382 "s@_NEED___VA_LIST@_NEED___Va_LIST@\n" 3383 "s@VA_LIST@DUMMY_VA_LIST@\n" 3384 "s@_Va_LIST@_VA_LIST@"; 3385 test_text = "extern void mumble( va_list);"; 3386}; 3387 3388 3389/* 3390 * Fix headers that use va_list from stdio.h to use the updated 3391 * va_list from the stdio_va_list change. Note _BSD_VA_LIST_ is 3392 * dealt with elsewhere. The presence of __gnuc_va_list, 3393 * __DJ_va_list, or _G_va_list is taken to indicate that the header 3394 * knows what it's doing. 3395 */ 3396fix = { 3397 hackname = stdio_va_list_clients; 3398 files = com_err.h; 3399 files = cps.h; 3400 files = curses.h; 3401 files = krb5.h; 3402 files = lc_core.h; 3403 files = pfmt.h; 3404 files = wchar.h; 3405 files = curses_colr/curses.h; 3406 bypass = '__gnuc_va_list|_BSD_VA_LIST_|__DJ_va_list|_G_va_list'; 3407 /* Don't fix, if we use va_list from stdarg.h, or if the use is 3408 otherwise protected. */ 3409 bypass = 'include <stdarg\.h>|#ifdef va_start'; 3410 3411 /* 3412 * Use __gnuc_va_list in arg types in place of va_list. 3413 * On 386BSD use __gnuc_va_list instead of _VA_LIST_. On Tru64 UNIX V5.1A 3414 * use __gnuc_va_list instead of __VA_LIST__. We're hoping the 3415 * trailing parentheses and semicolon save all other systems from this. 3416 * Define __not_va_list__ (something harmless and unused) 3417 * instead of va_list. 3418 * Don't claim to have defined va_list. 3419 */ 3420 sed = "s@[ \t]va_list\\([ \t)]\\)@ __gnuc_va_list\\1@\n" 3421 "s@(va_list)&@(__gnuc_va_list)\\&@\n" 3422 "s@ _VA_LIST_));@ __gnuc_va_list));@\n" 3423 "s@ __VA_LIST__));@ __gnuc_va_list));@\n" 3424 "s@ va_list@ __not_va_list__@\n" 3425 "s@\\*va_list@*__not_va_list__@\n" 3426 "s@ __va_list)@ __gnuc_va_list)@\n" 3427 "s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;" 3428 "@typedef \\1 __not_va_list__;@\n" 3429 "s@typedef[ \t]*__va_list__@typedef __gnuc_va_list@\n" 3430 "s@GNUC_VA_LIST@GNUC_Va_LIST@\n" 3431 "s@_VA_LIST_DEFINED@_Va_LIST_DEFINED@\n" 3432 "s@_NEED___VA_LIST@_NEED___Va_LIST@\n" 3433 "s@VA_LIST@DUMMY_VA_LIST@\n" 3434 "s@_Va_LIST@_VA_LIST@"; 3435 test_text = "extern void mumble( va_list);"; 3436}; 3437 3438 3439/* 3440 * "!__STDC__" or "__STDC__==0" or "__STDC__!=1" or "__STDC__-0==0" 3441 * is "!defined( __STRICT_ANSI__ )" 3442 */ 3443fix = { 3444 hackname = strict_ansi_not; 3445 select = "^([ \t]*#[ \t]*if.*)" 3446 "(!__STDC__" 3447 "|__STDC__[ \t]*==[ \t]*0" 3448 "|__STDC__[ \t]*!=[ \t]*1" 3449 "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*0)"; 3450 /* Tru64 UNIX V4.0F/V5.1 <standards.h> supports GCC usage of __STDC__. */ 3451 bypass = 'GNU and MIPS C compilers define __STDC__ differently'; 3452 /* GNU gmp.h uses "__STDC__ != 1" only if __SCO_VERSION__, which 3453 is not defined by GCC, so it is safe. */ 3454 bypass = '__SCO_VERSION__.*__STDC__ != 1'; 3455 c_test = stdc_0_in_system_headers; 3456 3457 c_fix = format; 3458 c_fix_arg = "%1 !defined(__STRICT_ANSI__)"; 3459 3460 test_text = "#if !__STDC__ \n" 3461 "#if __STDC__ == 0\n" 3462 "#if __STDC__ != 1\n" 3463 "#if __STDC__ - 0 == 0" 3464 "/* not std C */\nint foo;\n" 3465 "\n#end-end-end-end-if :-)"; 3466}; 3467 3468/* 3469 * "__STDC__-0==0" 3470 * is "!defined( __STRICT_ANSI__ )" on continued #if-s 3471 */ 3472fix = { 3473 hackname = strict_ansi_not_ctd; 3474 files = math.h, limits.h, stdio.h, signal.h, 3475 stdlib.h, sys/signal.h, time.h; 3476 /* 3477 * Starting at the beginning of a line, skip white space and 3478 * a leading "(" or "&&" or "||". One of those must be found. 3479 * Then, zero, one or more copies of a "defined(_FOO_BAR_) &&" 3480 * expression. If these are nested, then they must accumulate 3481 * because we won't match any closing parentheses. Finally, 3482 * after skipping over all that, we must then match our suspect 3483 * phrase: "__STDC__-0==0" with or without white space. 3484 */ 3485 select = "^([ \t]*" '(\(|&&|\|\|)' 3486 "([ \t(]*!*[ \t]*defined\\([a-zA-Z_0-9]+\\)[ \t]*[|&][|&])*" 3487 "[ \t(]*)" 3488 "(__STDC__[ \t]*(|-[ \t]*0[ \t]*)==[ \t]*0)"; 3489 c_test = stdc_0_in_system_headers; 3490 3491 c_fix = format; 3492 c_fix_arg = "%1 !defined(__STRICT_ANSI__)"; 3493 3494 test_text = "#if 1 && \\\\\n" 3495 "&& defined(mumbling) |& (__STDC__ - 0 == 0) \\\\\n" 3496 "( __STDC__ == 0 && !defined(_XOPEN_SOURCE) \\\\\n" 3497 "|| __STDC__ - 0 == 0 ) /* not std C */\n" 3498 "int foo;\n#endif"; 3499}; 3500 3501 3502/* 3503 * "__STDC__!=0" or "__STDC__==1" or "__STDC__-0==1" 3504 * is "defined( __STRICT_ANSI__ )" 3505 */ 3506fix = { 3507 hackname = strict_ansi_only; 3508 select = "^([ \t]*#[ \t]*if.*)" 3509 "(__STDC__[ \t]*!=[ \t]*0" 3510 "|__STDC__[ \t]*==[ \t]*1" 3511 "|__STDC__[ \t]*-[ \t]*0[ \t]*==[ \t]*1" 3512 "|__STDC__[ \t]*-[ \t]*0[ \t]*!=[ \t]*0)"; 3513 c_test = stdc_0_in_system_headers; 3514 3515 c_fix = format; 3516 c_fix_arg = "%1 defined(__STRICT_ANSI__)"; 3517 3518 test_text = "#if __STDC__ == 1 /* is std C\n */\nint foo;\n#endif"; 3519}; 3520 3521 3522/* 3523 * IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s 3524 * in prototype without previous definition. 3525 */ 3526fix = { 3527 hackname = struct_file; 3528 files = rpc/xdr.h; 3529 select = '^.*xdrstdio_create.*struct __file_s'; 3530 c_fix = format; 3531 c_fix_arg = "struct __file_s;\n%0"; 3532 test_text = "extern void xdrstdio_create( struct __file_s* );"; 3533}; 3534 3535 3536/* 3537 * IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr 3538 * in prototype without previous definition. 3539 * 3540 * Don't fix OpenBSD, which uses struct sockaddr_in prototyping the same 3541 * function, and does define it. 3542 */ 3543fix = { 3544 hackname = struct_sockaddr; 3545 files = rpc/auth.h; 3546 select = "^.*authdes_create.*struct sockaddr[^_]"; 3547 bypass = "<sys/socket\.h>"; 3548 bypass = "struct sockaddr;\n"; 3549 c_fix = format; 3550 c_fix_arg = "struct sockaddr;\n%0"; 3551 test_text = "extern AUTH* authdes_create( struct sockaddr* );"; 3552}; 3553 3554 3555/* 3556 * Apply fix this to all OSs since this problem seems to effect 3557 * more than just SunOS. 3558 */ 3559fix = { 3560 hackname = sun_auth_proto; 3561 files = rpc/auth.h; 3562 files = rpc/clnt.h; 3563 files = rpc/svc.h; 3564 files = rpc/xdr.h; 3565 bypass = "__cplusplus"; 3566 /* 3567 * Select those files containing '(*name)()'. 3568 */ 3569 select = '\(\*[a-z][a-z_]*\)\(\)'; 3570 3571 c_fix = format; 3572 c_fix_arg = "#ifdef __cplusplus\n%1(...);%2\n" 3573 "#else\n%1();%2\n#endif"; 3574 c_fix_arg = '(.*\(\*[a-z][a-z_]*\))\(\);(.*)'; 3575 3576 test_text = 3577 "struct auth_t {\n" 3578 " int (*name)(); /* C++ bad */\n" 3579 "};"; 3580}; 3581 3582 3583/* 3584 * Fix bogus #ifdef on SunOS 4.1. 3585 */ 3586fix = { 3587 hackname = sun_bogus_ifdef; 3588 files = "hsfs/hsfs_spec.h"; 3589 files = "hsfs/iso_spec.h"; 3590 select = '#ifdef(.*\|\|.*)'; 3591 c_fix = format; 3592 c_fix_arg = "#if%1"; 3593 3594 test_text = "#ifdef __i386__ || __vax__ || __sun4c__"; 3595}; 3596 3597 3598/* 3599 * Fix the CAT macro in SunOS memvar.h. 3600 */ 3601fix = { 3602 hackname = sun_catmacro; 3603 files = pixrect/memvar.h; 3604 select = "^#define[ \t]+CAT\\(a,b\\).*"; 3605 c_fix = format; 3606 3607 c_fix_arg = 3608 "#ifdef __STDC__\n" 3609 "# define CAT(a,b) a##b\n" 3610 "#else\n%0\n#endif"; 3611 3612 test_text = 3613 "#define CAT(a,b)\ta/**/b"; 3614}; 3615 3616 3617/* 3618 * Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1. 3619 * Also fix return type of {m,re}alloc in <malloc.h> on sysV68 3620 */ 3621fix = { 3622 hackname = sun_malloc; 3623 files = malloc.h; 3624 bypass = "_CLASSIC_ANSI_TYPES"; 3625 3626 sed = "s/typedef[ \t]char \\*\tmalloc_t/typedef void \\*\tmalloc_t/g"; 3627 sed = "s/int[ \t][ \t]*free/void\tfree/g"; 3628 sed = "s/char\\([ \t]*\\*[ \t]*malloc\\)/void\\1/g"; 3629 sed = "s/char\\([ \t]*\\*[ \t]*realloc\\)/void\\1/g"; 3630 sed = "s/char\\([ \t]*\\*[ \t]*calloc\\)/void\\1/g"; 3631 3632 test_text = 3633 "typedef char *\tmalloc_t;\n" 3634 "int \tfree();\n" 3635 "char*\tmalloc();\n" 3636 "char*\tcalloc();\n" 3637 "char*\trealloc();"; 3638}; 3639 3640 3641/* 3642 * Check for yet more missing ';' in struct (in SunOS 4.0.x) 3643 */ 3644fix = { 3645 hackname = sun_rusers_semi; 3646 files = rpcsvc/rusers.h; 3647 select = "_cnt$"; 3648 sed = "/^struct/,/^};/s/_cnt$/_cnt;/"; 3649 test_text = "struct mumble\n int _cnt\n};"; 3650}; 3651 3652 3653/* 3654 * signal.h on SunOS defines signal using (), 3655 * which causes trouble when compiling with g++ -pedantic. 3656 */ 3657fix = { 3658 hackname = sun_signal; 3659 files = sys/signal.h; 3660 files = signal.h; 3661 select = "^void\t" '\(\*signal\(\)\)\(\);.*'; 3662 3663 c_fix = format; 3664 c_fix_arg = 3665 "#ifdef __cplusplus\n" 3666 "void\t(*signal(...))(...);\n" 3667 "#else\n%0\n#endif"; 3668 3669 test_text = "void\t(*signal())();"; 3670}; 3671 3672 3673/* 3674 * Correct the return type for strlen in strings.h in SunOS 4. 3675 */ 3676fix = { 3677 hackname = sunos_strlen; 3678 files = strings.h; 3679 select = "int[ \t]*strlen\\(\\);(.*)"; 3680 c_fix = format; 3681 c_fix_arg = "__SIZE_TYPE__ strlen();%1"; 3682 test_text = " int\tstrlen(); /* string length */"; 3683}; 3684 3685 3686/* 3687 * Disable apparent native compiler optimization cruft in SVR4.2 <string.h> 3688 * that is visible to any ANSI compiler using this include. Simply 3689 * delete the lines that #define some string functions to internal forms. 3690 */ 3691fix = { 3692 hackname = svr4_disable_opt; 3693 files = string.h; 3694 select = '#define.*__std_hdr_'; 3695 sed = '/#define.*__std_hdr_/d'; 3696 test_text = "#define strlen __std_hdr_strlen\n"; 3697}; 3698 3699 3700/* 3701 * Conditionalize some of <sys/endian.h> on __GNUC__ and __GNUG__. 3702 * On some systems (UnixWare 2, UnixWare 7), the file is byteorder.h 3703 * but we still "hijack" it and redirect it to the GNU byteorder.h.. 3704 */ 3705#ifdef SVR5 3706fix = { 3707 hackname = svr4_endian; 3708 files = sys/endian.h; 3709#ifdef LATER 3710 /* 3711 * since we emit our own sys/byteorder.h, 3712 * this fix can never be applied to that file. 3713 */ 3714 files = sys/byteorder.h; 3715#endif 3716 bypass = '__GNUC__'; 3717 3718 sed = "/#\tifdef\t__STDC__/i\\\n" 3719 "# if !defined (__GNUC__) && !defined (__GNUG__)\n"; 3720 3721 sed = "/#\t\tinclude\t<sys\\/byteorder.h>/s/\t\t/ /"; 3722 3723 sed = "/# include\t<sys\\/byteorder.h>/i\\\n" 3724 "# endif /* !defined (__GNUC__) && !defined (__GNUG__) */\n"; 3725}; 3726#endif /* SVR5 */ 3727 3728 3729/* 3730 * Remove useless extern keyword from struct forward declarations 3731 * in <sys/stream.h> and <sys/strsubr.h> 3732 */ 3733#ifdef SVR4 3734fix = { 3735 hackname = svr4_extern_struct; 3736 files = sys/stream.h; 3737 files = sys/strsubr.h; 3738 select = 'extern struct [a-z_]*;'; 3739 sed = 's/extern struct \([a-z][a-z_]*\)/struct \1/'; 3740}; 3741#endif 3742 3743/* 3744 * Fix declarations of `ftw' and `nftw' in <ftw.h>. On some/most SVR4 3745 * systems the file <ftw.h> contains extern declarations of these 3746 * functions followed by explicitly `static' definitions of these 3747 * functions... and that's not allowed according to ANSI C. (Note 3748 * however that on Solaris, this header file glitch has been pre-fixed by 3749 * Sun. In the Solaris version of <ftw.h> there are no static 3750 * definitions of any function so we don't need to do any of this stuff 3751 * when on Solaris. 3752 */ 3753#ifdef SVR4 3754#ifndef SOLARIS 3755fix = { 3756 hackname = svr4_ftw; 3757 files = ftw.h; 3758 select = '^extern int ftw\(const'; 3759 3760 sed = '/^extern int ftw(const/i' "\\\n" 3761 "#if !defined(_STYPES)\\\n" 3762 "static\\\n" 3763 "#else\\\n" 3764 "extern\\\n" 3765 "#endif"; 3766 sed = 's/extern \(int ftw(const.*\)$/\1/'; 3767 sed = "/^extern int nftw/i\\\n" 3768 "#if defined(_STYPES)\\\n" 3769 "static\\\n" 3770 "#else\\\n" 3771 "extern\\\n" 3772 "#endif"; 3773 sed = 's/extern \(int nftw.*\)$/\1/'; 3774 sed = "/^extern int ftw(),/c\\\n" 3775 "#if !defined(_STYPES)\\\n" 3776 "static\\\n" 3777 "#else\\\n" 3778 "extern\\\n" 3779 "#endif\\\n" 3780 " int ftw();\\\n" 3781 "#if defined(_STYPES)\\\n" 3782 "static\\\n" 3783 "#else\\\n" 3784 "extern\\\n" 3785 "#endif\\\n" 3786 " int nftw();"; 3787}; 3788#endif 3789#endif 3790 3791 3792/* 3793 * Fix broken decl of getcwd present on some svr4 systems. 3794 */ 3795fix = { 3796 hackname = svr4_getcwd; 3797 files = stdlib.h; 3798 files = unistd.h; 3799 files = prototypes.h; 3800 select = 'getcwd\(char \*, int\)'; 3801 3802 c_fix = format; 3803 c_fix_arg = "getcwd(char *, size_t)"; 3804 3805 test_text = "extern char* getcwd(char *, int);"; 3806}; 3807 3808 3809/* 3810 * Wrap some files on System V r4 and DYNIX/ptx systems with 3811 * #ifdef _KERNEL, presumably to prevent kernel headers from 3812 * leaking into userspace. This may not be necessary at all, 3813 * but it was in the old scripts, so it seems safest to keep it for now. 3814 */ 3815fix = { 3816 /* Can't name this with _kernel, or the test case will hit the bypass! */ 3817 hackname = svr4_krnl; 3818 /* Since I'm rather unsure about the validity of this, limit it 3819 * to the specific systems it was operating on before. It should 3820 * also be bypassed for i?86-*-sysv4.3uw2, by that rule, but I didn't 3821 * see an easy way to do that. Hopefully it will be harmless 3822 * in any case. -- Nathanael */ 3823 mach = '*-*-sysv4*'; 3824 mach = 'i?86-sequent-ptx*'; 3825 files = fs/rfs/rf_cache.h; 3826 files = sys/erec.h; 3827 files = sys/err.h; 3828 files = sys/char.h; 3829 files = sys/getpages.h; 3830 files = sys/map.h; 3831 files = sys/cmn_err.h; 3832 files = sys/kdebugger.h; 3833 3834 /* This bypass will match _KERNEL, __KERNEL, __KERNEL__, etc. 3835 * It will also match SVR4_KERNEL_CHECK, which means that the 3836 * testsuite case will always be bypassed. Which is fine with me. */ 3837 bypass = '_KERNEL'; 3838 3839 c_fix = wrap; 3840 c_fix_arg = "#ifdef _KERNEL\n"; 3841 c_fix_arg = "#endif /* _KERNEL */\n"; 3842 3843 /* There's no reasonable test for this given that we don't know exactly 3844 * what problem inspired it in the first place. */ 3845 test_text = ""; 3846}; 3847 3848 3849/* 3850 * Delete any #defines of `__i386' which may be present in <ieeefp.h>. They 3851 * tend to conflict with the compiler's own definition of this symbol. (We 3852 * will use the compiler's definition.) 3853 * Likewise __sparc, for Solaris, and __i860, and a few others 3854 * (guessing it is necessary for all of them). 3855 */ 3856#ifdef SVR4 3857fix = { 3858 hackname = svr4_mach_defines; 3859 files = ieeefp.h; 3860 select = "#define[ \t]*__(i386|mips|sparc|m88k|m68k)[ \t]"; 3861 sed = "/#define[ \t]*__\\(i386|mips|sparc|m88k|m68k\\)[ \t]/d"; 3862}; 3863#endif 3864 3865 3866/* 3867 * Fix declarations of `makedev', `major', and `minor' in <sys/mkdev.h>. 3868 * They are declared as non-static then immediately redeclared as static. 3869 */ 3870#ifdef SVR5 3871fix = { 3872 hackname = svr4_mkdev; 3873 files = sys/mkdev.h; 3874 select = '^static'; 3875 3876 sed = "/^dev_t makedev(/s/^/static /"; 3877 sed = "/^major_t major(/s/^/static /"; 3878 sed = "/^minor_t minor(/s/^/static /"; 3879}; 3880#endif /* SVR5 */ 3881 3882 3883/* 3884 * Fix reference to NC_NPI_RAW in <sys/netcspace.h>. 3885 * Also fix types of array initializers. 3886 */ 3887#ifdef SVR4 3888fix = { 3889 hackname = svr4_netcspace; 3890 files = sys/netcspace.h; 3891 select = 'NC_NPI_RAW'; 3892 sed = 's/NC_NPI_RAW/NC_TPI_RAW/g'; 3893 sed = 's/NC_/(unsigned long) NC_/'; 3894}; 3895#endif 3896 3897/* 3898 * Fix reference to NMSZ in <sys/adv.h>. 3899 */ 3900#ifdef SVR4 3901fix = { 3902 hackname = svr4_nmsz; 3903 files = sys/adv.h; 3904 select = '\[NMSZ\]'; 3905 sed = 's/\[NMSZ\]/\[RFS_NMSZ\]/g'; 3906}; 3907#endif 3908 3909 3910/* 3911 * Some SVR4 systems supposedly use these non-ANSI preprocessor directives. 3912 */ 3913#ifdef SVR4 3914fix = { 3915 hackname = svr4_preproc_lint_on; 3916 select = '#lint\(on\)'; 3917 c_fix = format; 3918 c_fix_arg = 'defined(lint)'; 3919 test_text = "#if #lint(on)"; 3920}; 3921fix = { 3922 hackname = svr4_preproc_lint_off; 3923 select = '#lint\(off\)'; 3924 c_fix = format; 3925 c_fix_arg = '!defined(lint)'; 3926 test_text = "#if #lint(off)"; 3927}; 3928fix = { 3929 hackname = svr4_preproc_machine; 3930 select = '#(machine|system|cpu)\(([^)]*)\)'; 3931 c_fix = format; 3932 c_fix_arg = 'defined(__%1__)'; 3933 test_text = "#if #machine(i386) || #system(vax) || #cpu(sparc)"; 3934}; 3935#endif 3936 3937 3938/* 3939 * Fix broken decl of profil present on some svr4 systems. 3940 */ 3941fix = { 3942 hackname = svr4_profil; 3943 files = stdlib.h; 3944 files = unistd.h; 3945 3946 select = 3947 'profil\(unsigned short \*, unsigned int, unsigned int, unsigned int\)'; 3948 /* The fix is wrong on IRIX 5/6 and creates a conflict with another 3949 prototype in <sys/profil.h>. */ 3950 bypass = 'Silicon Graphics'; 3951 c_fix = format; 3952 c_fix_arg = 'profil(unsigned short *, size_t, int, unsigned int)'; 3953 3954 test_text = 3955 'profil(unsigned short *, unsigned int, unsigned int, unsigned int);'; 3956}; 3957 3958 3959/* 3960 * Convert functions to prototype form, and fix arg names in <sys/stat.h>. 3961 */ 3962#ifdef SVR4 3963fix = { 3964 hackname = svr4_proto_form; 3965 files = sys/stat.h; 3966 select = 'const extern'; 3967 3968 sed = "/^stat([ \t]*[^c]/ {\nN\nN\n" 3969 "s/(.*)\\n/( /\n" 3970 "s/;\\n/, /\n" 3971 "s/;$/)/\n" "}"; 3972 3973 sed = "/^lstat([ \t]*[^c]/ {\nN\nN\n" 3974 "s/(.*)\\n/( /\n" 3975 "s/;\\n/, /\n" 3976 "s/;$/)/\n" "}"; 3977 3978 sed = "/^fstat([ \t]*[^i]/ {\nN\nN\n" 3979 "s/(.*)\\n/( /\n" 3980 "s/;\\n/, /\n" 3981 "s/;$/)/\n" "}"; 3982 3983 sed = "/^mknod([ \t]*[^c]/{\nN\nN\nN\n" 3984 "s/(.*)\\n/( /\n" 3985 "s/;\\n/, /g\n" 3986 "s/;$/)/\n" "}"; 3987 3988 sed = "1,$s/\\([^A-Za-z]\\)path\\([^A-Za-z]\\)/\\1__path\\2/g"; 3989 sed = "1,$s/\\([^A-Za-z]\\)buf\\([^A-Za-z]\\)/\\1__buf\\2/g"; 3990 sed = "1,$s/\\([^A-Za-z]\\)fd\\([^A-Za-z]\\)/\\1__fd\\2/g"; 3991 sed = "1,$s/ret\\([^u]\\)/__ret\\1/g"; 3992 sed = "1,$s/\\([^_]\\)mode\\([^_]\\)/\\1__mode\\2/g"; 3993 sed = "1,$s/\\([^_r]\\)dev\\([^_]\\)/\\1__dev\\2/g"; 3994}; 3995#endif 3996 3997/* 3998 * Add a prototyped declaration of mmap to <sys/mman.h>. 3999 */ 4000#ifdef SVR4 4001fix = { 4002 hackname = svr4_proto_mmap; 4003 files = sys/mman.h; 4004 select = '^extern caddr_t mmap();$'; 4005 sed = '/^extern caddr_t mmap();$/c' "\\\n" 4006 "#ifdef __STDC__\\\n" 4007 "extern caddr_t mmap (caddr_t, size_t, int, int, int, off_t);\\\n" 4008 "#else /* !defined(__STDC__) */\\\n" 4009 "extern caddr_t mmap ();\\\n" 4010 "#endif /* !defined(__STDC__) */\\\n"; 4011}; 4012#endif 4013 4014/* 4015 * Add a #define of _SIGACTION_ into <sys/signal.h>. 4016 */ 4017#ifdef SVR4 4018fix = { 4019 hackname = svr4_sigaction; 4020 files = sys/signal.h; 4021 sed = "/^struct sigaction {/i\\\n" 4022 "#define _SIGACTION_"; 4023 sed = 's/(void *(\*)())/(void (*)(int))/'; 4024}; 4025#endif 4026 4027 4028/* 4029 * Correct types for signal handler constants like SIG_DFL; they might be 4030 * void (*) (), and should be void (*) (int). C++ doesn't like the 4031 * old style. 4032 */ 4033fix = { 4034 hackname = svr4_sighandler_type; 4035 files = sys/signal.h; 4036 select = 'void *\(\*\)\(\)'; 4037 c_fix = format; 4038 c_fix_arg = "void (*)(int)"; 4039 test_text = "#define SIG_DFL (void(*)())0\n" 4040 "#define SIG_IGN (void (*)())0\n"; 4041}; 4042 4043/* 4044 * Put storage class at start of decl, to avoid warning. 4045 */ 4046#ifdef SVR4 4047fix = { 4048 hackname = svr4_storage_class; 4049 files = rpc/types.h; 4050 select = 'const extern'; 4051 sed = 's/const extern/extern const/g'; 4052}; 4053#endif 4054 4055 4056/* 4057 * Some SysV r4 systems, including Sequent's DYNIX/ptx, use the local 4058 * function 'getrnge' in <regexp.h> before they declare it. For these 4059 * systems add a 'static int' declaration of 'getrnge' into <regexp.h> 4060 * early on. 4061 * 4062 * 'getrnge' traditionally manipulates a file-scope global called 'size', 4063 * so put the declaration right after the declaration of 'size'. 4064 * 4065 * Don't do this if there is already a `static void getrnge' declaration 4066 * present, since this would cause a redeclaration error. Solaris 2.x has 4067 * such a declaration. 4068 */ 4069fix = { 4070 hackname = svr4_undeclared_getrnge; 4071 files = regexp.h; 4072 select = "getrnge"; 4073 bypass = "static void getrnge"; 4074 c_fix = format; 4075 c_fix_arg = "%0\n" 4076 "static int getrnge ();"; 4077 c_fix_arg = "^static int[ \t]+size;"; 4078 test_text = "static int size;\n" 4079 "/* stuff which calls getrnge() */\n" 4080 "static getrnge()\n" 4081 "{}"; 4082}; 4083 4084 4085/* 4086 * Like svr4_mach_defines, but with newfangled syntax. 4087 * Source lines are of #define __i386 #machine(i386). Delete them. 4088 */ 4089#ifdef SVR5 4090fix = { 4091 hackname = svr5_mach_defines; 4092 files = ieeefp.h; 4093 select = "#define[ \t]*__i386.*\(i386\)"; 4094 sed = "/#define[ \t]*__i386.*/d"; 4095}; 4096#endif /* SVR5 */ 4097 4098 4099/* 4100 * Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn} 4101 * in string.h on sysV68 4102 * Correct the return type for strlen in string.h on Lynx. 4103 * Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0. 4104 * Add missing const for strdup on OSF/1 V3.0. 4105 * On sysV88 layout is slightly different. 4106 */ 4107fix = { 4108 hackname = sysv68_string; 4109 files = testing.h; 4110 files = string.h; 4111 bypass = "_CLASSIC_ANSI_TYPES"; 4112 4113 sed = "s/extern[ \t]*int[ \t]*strlen();/extern unsigned int strlen();/"; 4114 sed = "s/extern[ \t]*int[ \t]*ffs[ \t]*(long);/extern int ffs(int);/"; 4115 sed = "s/strdup(char \\*s1);/strdup(const char *s1);/"; 4116 4117 sed = "/^extern char$/N"; 4118 sed = "s/^extern char\\(\\n\t\\*memccpy(),\\)$/extern void\\1/"; 4119 4120 sed = "/^extern int$/N"; 4121 sed = "s/^extern int\\(\\n\tstrlen(),\\)/extern size_t\\1/"; 4122 4123 sed = "/^\tstrncmp(),$/N"; 4124 sed = 's/^\(' "\t" 'strncmp()\),\n\(' "\t" 'strlen(),\)$/' 4125 '\1;' "\\\nextern unsigned int\\\n\\2/"; 4126 4127 test_text = 4128 "extern int strlen();\n" 4129 4130 "extern int ffs(long);\n" 4131 4132 "extern char\n" 4133 "\t*memccpy(),\n" 4134 "\tmemcpy();\n" 4135 4136 "extern int\n" 4137 "\tstrcmp(),\n" 4138 "\tstrncmp(),\n" 4139 "\tstrlen(),\n" 4140 "\tstrspn();\n" 4141 4142 "extern int\n" 4143 "\tstrlen(), strspn();"; 4144}; 4145 4146 4147/* 4148 * Fix return type of calloc, malloc, realloc, bsearch and exit 4149 */ 4150fix = { 4151 hackname = sysz_stdlib_for_sun; 4152 files = stdlib.h; 4153 bypass = "_CLASSIC_ANSI_TYPES"; 4154 4155 select = "char[ \t]*\\*[ \t]*(calloc|malloc|realloc|bsearch)[ \t]*\\("; 4156 c_fix = format; 4157 c_fix_arg = "void *\t%1("; 4158 4159 test_text = 4160 "extern char*\tcalloc(size_t);\n" 4161 "extern char*\tmalloc(size_t);\n" 4162 "extern char*\trealloc(void*,size_t);\n" 4163 "extern char*\tbsearch(void*,size_t,size_t);\n"; 4164}; 4165 4166 4167/* 4168 * __thread is now a keyword. 4169 */ 4170fix = { 4171 hackname = thread_keyword; 4172 files = "pthread.h"; 4173 files = "bits/sigthread.h"; 4174 select = "([* ])__thread([,)])"; 4175 c_fix = format; 4176 c_fix_arg = "%1__thr%2"; 4177 4178 test_text = 4179 "extern int pthread_create (pthread_t *__restrict __thread,\n" 4180 "extern int pthread_kill (pthread_t __thread, int __signo);\n" 4181 "extern int pthread_cancel (pthread_t __thread);"; 4182}; 4183 4184/* 4185 * if the #if says _cplusplus, not the double underscore __cplusplus 4186 * that it should be 4187 */ 4188fix = { 4189 hackname = tinfo_cplusplus; 4190 files = tinfo.h; 4191 select = "[ \t]_cplusplus"; 4192 4193 c_fix = format; 4194 c_fix_arg = " __cplusplus"; 4195 test_text = "#ifdef _cplusplus\nint bogus;\n#endif"; 4196}; 4197 4198 4199/* 4200 * function parameter to atexit is missing "void" on VAX Ultrix 4.3. 4201 */ 4202fix = { 4203 hackname = ultrix_atexit_param; 4204 files = stdlib.h; 4205 select = 'atexit\(.*\(\)'; 4206 4207 c_fix = format; 4208 c_fix_arg = "atexit( void (*__func)( void )"; 4209 4210 test_text = "int atexit( void (*__func)() );\n"; 4211}; 4212 4213 4214/* 4215 * parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R. 4216 */ 4217fix = { 4218 hackname = ultrix_atof_param; 4219 files = math.h; 4220 select = "atof\\([ \t]*char"; 4221 4222 c_fix = format; 4223 c_fix_arg = "atof(const char"; 4224 4225 test_text = "extern double atof( char *__nptr);\n"; 4226}; 4227 4228 4229/* 4230 * parameters not const on DECstation Ultrix V4.0 and OSF/1. 4231 */ 4232fix = { 4233 hackname = ultrix_const; 4234 files = stdio.h; 4235 select = 'perror\( char \*'; 4236 4237 c_fix = format; 4238 c_fix_arg = "%1 const %3 *__"; 4239 c_fix_arg = "([ \t*](perror|fputs|fwrite|scanf|fscanf)\\(.*)" 4240 "[ \t]+(char|void) \\*__"; 4241 4242 test_text = 4243 "extern void perror( char *__s );\n" 4244 "extern int fputs( char *__s, FILE *);\n" 4245 "extern size_t fwrite( void *__ptr, size_t, size_t, FILE *);\n" 4246 "extern int fscanf( FILE *__stream, char *__format, ...);\n" 4247 "extern int scanf( char *__format, ...);\n"; 4248}; 4249 4250 4251/* 4252 * parameters not const on DECstation Ultrix V4.0 and OSF/1. 4253 */ 4254fix = { 4255 hackname = ultrix_const2; 4256 files = stdio.h; 4257 4258 select = '\*fopen\( char \*'; 4259 c_fix = format; 4260 c_fix_arg = "%1( const char *%3, const char *"; 4261 c_fix_arg = "([ \t*](fopen|sscanf|popen|tempnam))\\(" 4262 "[ \t]*char[ \t]*\\*([^,]*)," 4263 "[ \t]*char[ \t]*\\*[ \t]*"; 4264 4265 test_text = 4266 "extern FILE *fopen( char *__filename, char *__type );\n" 4267 "extern int sscanf( char *__s, char *__format, ...);\n" 4268 "extern FILE *popen(char *, char *);\n" 4269 "extern char *tempnam(char*,char*);\n"; 4270}; 4271 4272 4273/* 4274 * parameters not const on Ultrix V4.3. 4275 */ 4276fix = { 4277 hackname = ultrix_const3; 4278 files = stdio.h; 4279 select = 'fdopen\( .*, char \*'; 4280 4281 c_fix = format; 4282 c_fix_arg = "%1 const %3 *__"; 4283 c_fix_arg = "([ \t*](fdopen)\\(.*)" 4284 "[ \t]+(char|void) \\*__"; 4285 4286 test_text = 4287 "extern FILE * fdopen( int __filedes, char *__type );\n"; 4288}; 4289 4290 4291/* 4292 * Ultrix V4.[35] puts the declaration of uname before the definition 4293 * of struct utsname, so the prototype (added by fixproto) causes havoc. 4294 */ 4295fix = { 4296 hackname = ultrix_fix_fixproto; 4297 files = sys/utsname.h; 4298 select = ULTRIX; 4299 4300 c_fix = format; 4301 c_fix_arg = "struct utsname;\n%0"; 4302 c_fix_arg = "^[ \t]*extern[ \t]*int[ \t]*uname\\(\\);"; 4303 4304 test_text = 4305 "/* ULTRIX's uname */\nextern\tint\tuname();"; 4306}; 4307 4308 4309/* 4310 * Check for bad #ifdef line (in Ultrix 4.1) 4311 */ 4312fix = { 4313 hackname = ultrix_ifdef; 4314 select = "^#ifdef KERNEL[ \t]+&&"; 4315 files = sys/file.h; 4316 4317 c_fix = format; 4318 c_fix_arg = "#if defined(KERNEL) &&"; 4319 4320 test_text = 4321 "#ifdef KERNEL\t&& defined( mumbojumbo )\nint oops;\n#endif"; 4322}; 4323 4324 4325/* 4326 * Add once-only latch to Ultrix V4.3 locale.h. 4327 */ 4328fix = { 4329 hackname = ultrix_locale; 4330 files = locale.h; 4331 select = "@\\(#\\)locale\\.h.*6\\.1.*\\(ULTRIX\\)"; 4332 c_fix = wrap; 4333 test_text = 4334 "@(#)locale.h 6.1 (ULTRIX)\n"; 4335}; 4336 4337 4338/* 4339 * Strip "|| CC$gfloat" from Ultrix math headers. 4340 */ 4341fix = { 4342 hackname = ultrix_math_ifdef; 4343 files = sys/limits.h; 4344 files = float.h; 4345 files = math.h; 4346 select = "^(#if.*)\\|\\|[ \t]+CC\\$[a-z]+"; 4347 c_fix = format; 4348 c_fix_arg = "%1"; 4349 4350 test_text = '#if defined(__GFLOAT) || CC\$gfloat'; 4351}; 4352 4353 4354/* 4355 * Avoid nested comments on Ultrix 4.3. 4356 */ 4357fix = { 4358 hackname = ultrix_nested_ioctl; 4359 files = sys/ioctl.h; 4360 select = "^/\\* #define SIOCSCREEN"; 4361 sed = "/^\\/\\* #define SIOCSCREEN/s@/\\* screend@*//* screend@"; 4362 test_text = 4363 "/* #define SIOCSCREENON _IOWR('i', 49, int)" 4364 "/* screend, net/gw_screen.h */\n"; 4365}; 4366 4367 4368fix = { 4369 hackname = ultrix_nested_svc; 4370 files = rpc/svc.h; 4371 select = "^ \\*[ \t]*int protocol; */\\*"; 4372 sed = "s@^\\( \\*\tint protocol; \\)/\\*@\\1*/ /*@"; 4373 test_text = 4374 " *\tint protocol; /* like TCP or UDP\n"; 4375}; 4376 4377 4378/* 4379 * Add missing prototype for lstat and define for S_ISLNK 4380 * in Ultrix V4.3 sys/stat.h. 4381 */ 4382fix = { 4383 hackname = ultrix_stat; 4384 files = sys/stat.h; 4385 select = "@\\(#\\)stat\\.h.*6\\.1.*\\(ULTRIX\\)"; 4386 sed = "/^#define[ \t]S_IFPORT[ \t]*S_IFIFO$/a\\\n" 4387 "\\\n" 4388 "/* macro to test for symbolic link */\\\n" 4389 "#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)\\\n" 4390 "\n"; 4391 sed = "/^[ \t]*fstat(),$/a\\\n" 4392 "\tlstat(),\n"; 4393 test_text = 4394 "@(#)stat.h 6.1 (ULTRIX)\n" 4395 "#define S_IFPORT S_IFIFO\n" 4396 "\tfstat(),\n/* THE INSERTION LINE FAILS ON BSD SYSTEMS */"; 4397}; 4398 4399 4400/* 4401 * Check for superfluous `static' (in Ultrix 4.2) 4402 * On Ultrix 4.3, includes of other files (r3_cpu.h,r4_cpu.h) is broken. 4403 */ 4404fix = { 4405 hackname = ultrix_static; 4406 files = machine/cpu.h; 4407 select = '#include "r[34]_cpu'; 4408 sed = "s/^static struct tlb_pid_state/struct tlb_pid_state/"; 4409 sed = 's/^#include "r3_cpu\.h"$/#include <machine\/r3_cpu\.h>/'; 4410 sed = 's/^#include "r4_cpu\.h"$/#include <machine\/r4_cpu\.h>/'; 4411 test_text = 4412 "static struct tlb_pid_state {\n" 4413 "#include \"r3_cpu.h\"\n"; 4414}; 4415 4416 4417/* 4418 * Add missing declarations to Ultrix V4.3 stdlib.h. 4419 */ 4420fix = { 4421 hackname = ultrix_stdlib; 4422 files = stdlib.h; 4423 select = "@\\(#\\)stdlib\\.h.*6\\.1.*\\(ULTRIX\\)"; 4424 4425 sed = "/^char.*getenv( const char .* );.*$/a\\\n" 4426 "int\t\tsetenv( const char *__name, const char *__val, int __ovrwrt );\\\n" 4427 "void\t\tunsetenv( const char *__name );\\\n" 4428 "int\t\tputenv( char *__s );\n"; 4429 4430 sed = "/^char.*getenv();.*$/a\\\n" 4431 "int\tsetenv();\\\n" 4432 "void\tunsetenv();\\\n" 4433 "int\tputenv();\n"; 4434 4435 test_text = 4436 "@(#)stdlib.h 6.1 (ULTRIX)\n" 4437 "char * getenv( const char *__name );\n" 4438 "char *getenv();\n"; 4439}; 4440 4441 4442/* 4443 * Add once-only latch to Ultrix V4.3 strings.h. 4444 */ 4445fix = { 4446 hackname = ultrix_strings; 4447 files = strings.h; 4448 select = "@\\(#\\)strings\\.h.*6\\.1.*\\(ULTRIX\\)"; 4449 c_fix = wrap; 4450 test_text = 4451 "@(#)strings.h 6.1 (ULTRIX)\n"; 4452}; 4453 4454 4455/* 4456 * Add missing declarations to Ultrix V4.3 strings.h. 4457 */ 4458fix = { 4459 hackname = ultrix_strings2; 4460 files = strings.h; 4461 select = "@\\(#\\)strings\\.h.*6\\.1.*\\(ULTRIX\\)"; 4462 4463 sed = "/^.*strncmp( const .* );.*/a\\\n" 4464 "\\\n" 4465 "extern int\\\n" 4466 "\tstrcasecmp( const char *__s1, const char *__s2),\\\n" 4467 "\tstrncasecmp( const char *__s1, const char *__s2, size_t __n );\n"; 4468 4469 sed = "/^.*strncmp();.*/a\\\n" 4470 "extern int\\\n" 4471 "\tstrcasecmp(),\\\n" 4472 "\tstrncasecmp();\n"; 4473 4474 test_text = 4475 "@(#)strings.h 6.1 (ULTRIX)\n" 4476 "\tstrncmp( const char *__s1, const char *__s2, size_t __n );\n" 4477 "\tstrncmp();\n"; 4478}; 4479 4480 4481/* 4482 * Add missing declarations to Ultrix V4.3 sys/time.h. 4483 */ 4484fix = { 4485 hackname = ultrix_sys_time; 4486 files = sys/time.h; 4487 select = "@\\(#\\)time\\.h.*6\\.1.*\\(ULTRIX\\)"; 4488 4489 sed = "/^extern.*time_t.*time( time_t .* );.*$/a\\\n" 4490 "\\\n" 4491 "extern int adjtime(struct timeval *, struct timeval *);\\\n" 4492 "extern int getitimer(int, struct itimerval *);\\\n" 4493 "extern int setitimer(int, struct itimerval *, struct itimerval *);\\\n" 4494 "extern int gettimeofday(struct timeval *, struct timezone *);\\\n" 4495 "extern int settimeofday(struct timeval *, struct timezone *);\\\n" 4496 "extern void profil(const void *, size_t, size_t, unsigned int);\\\n" 4497 "extern int stime(const time_t *);\\\n" 4498 "extern int utimes(const char *, const struct timeval[2]);\\\n" 4499 "extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *);\n"; 4500 4501 sed = "/^extern.*double.*difftime();.*$/a\\\n" 4502 "extern\tint adjtime();\\\n" 4503 "extern\tint getitimer();\\\n" 4504 "extern\tint setitimer();\\\n" 4505 "extern\tint gettimeofday();\\\n" 4506 "extern\tint settimeofday();\\\n" 4507 "extern\tvoid profil();\\\n" 4508 "extern\tint stime();\\\n" 4509 "extern\tint utimes();\\\n" 4510 "extern\tint select();\n"; 4511 4512 test_text = 4513 "@(#)time.h 6.1 (ULTRIX)\n" 4514 "extern time_t time( time_t *__tloc );\n" 4515 "extern double difftime();\n"; 4516}; 4517 4518 4519/* 4520 * Add missing declarations to Ultrix V4.3 unistd.h. 4521 */ 4522fix = { 4523 hackname = ultrix_unistd; 4524 files = unistd.h; 4525 select = "@\\(#\\)unistd\\.h.*6\\.1.*\\(ULTRIX\\)"; 4526 4527 sed = "/^[ \t]*getgroups(),.*$/a\\\n" 4528 "\tgetpagesize(),\n"; 4529 4530 sed = "/^[ \t]*fork(),.*$/a\\\n" 4531 "\tvfork(),\n"; 4532 4533 test_text = 4534 "@(#)unistd.h 6.1 (ULTRIX)\n" 4535 "\tgetgroups(),\n" 4536 "\tfork(),\n"; 4537}; 4538 4539 4540/* 4541 * On Cray Unicos/Mk some standard headers use the C99 keyword "restrict" 4542 * which must be replaced by __restrict__ for GCC. 4543 */ 4544fix = { 4545 hackname = unicosmk_restrict; 4546 files = stdio.h; 4547 files = stdlib.h; 4548 files = wchar.h; 4549 mach = "*-*-unicosmk*"; 4550 select = "(\\*[ \t]*)restrict([ \t]+)"; 4551 4552 c_fix = format; 4553 c_fix_arg = "%1__restrict__%2"; 4554 4555 test_text = "void f (char * restrict x);"; 4556}; 4557 4558/* 4559 * If arpa/inet.h prototypes are incompatible with the ones we just 4560 * installed in <sys/byteorder.h>, just remove the protos. 4561 * Because of this close association, this patch must be applied only 4562 * on those systems where the replacement byteorder header is installed. 4563 */ 4564fix = { 4565 hackname = uw7_byteorder_fix; 4566 files = arpa/inet.h; 4567 select = "in_port_t"; 4568 test = "-f sys/byteorder.h"; 4569#ifndef SVR5 4570 mach = "*-*-sysv4*"; 4571 mach = "i?86-*-sysv5*"; 4572 mach = "i?86-*-udk*"; 4573 mach = "i?86-*-solaris2.[0-4]"; 4574 mach = "powerpcle-*-solaris2.[0-4]"; 4575 mach = "sparc-*-solaris2.[0-4]"; 4576#endif /* SVR5 */ 4577 4578 c_fix = format; 4579 c_fix_arg = ""; 4580 c_fix_arg = "^extern.*[ \t](htons|ntohs).*\\(in_port_t\\).*;"; 4581 4582 test_text = "extern in_port_t\thtons __P((in_port_t));\n" 4583 "extern in_port_t\tntohs __P((in_port_t));" 4584 "`[ ! -d $DESTDIR/sys ] && mkdir $DESTDIR/sys\n" 4585 "echo '/* DUMMY */' >> sys/byteorder.h`"; 4586}; 4587 4588 4589/* 4590 * Fix definitions of macros used by va-i960.h in VxWorks header file. 4591 */ 4592fix = { 4593 hackname = va_i960_macro; 4594 files = arch/i960/archI960.h; 4595 select = "__(vsiz|vali|vpad|alignof__)"; 4596 4597 c_fix = format; 4598 c_fix_arg = "__vx%1"; 4599 4600 test_text = 4601 "extern int __vsiz vsiz;\n" 4602 "extern int __vali vali;\n" 4603 "extern int __vpad vpad;\n" 4604 "#define __alignof__(x) ..."; 4605}; 4606 4607 4608/* 4609 * AIX and Interix headers define NULL to be cast to a void pointer, 4610 * which is illegal in ANSI C++. 4611 */ 4612fix = { 4613 hackname = void_null; 4614 files = curses.h; 4615 files = dbm.h; 4616 files = locale.h; 4617 files = stdio.h; 4618 files = stdlib.h; 4619 files = string.h; 4620 files = time.h; 4621 files = unistd.h; 4622 files = sys/dir.h; 4623 files = sys/param.h; 4624 files = sys/types.h; 4625 /* avoid changing C++ friendly NULL */ 4626 bypass = __cplusplus; 4627 select = "^#[ \t]*define[ \t]+NULL[ \t]+\\(\\(void[ \t]*\\*\\)0\\)"; 4628 c_fix = format; 4629 c_fix_arg = "#define NULL 0"; 4630 test_text = "# define\tNULL \t((void *)0) /* typed NULL */"; 4631}; 4632 4633 4634/* 4635 * Make VxWorks header which is almost gcc ready fully gcc ready. 4636 */ 4637fix = { 4638 hackname = vxworks_gcc_problem; 4639 files = types/vxTypesBase.h; 4640 select = "__GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__"; 4641 4642 sed = "s/#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__/" 4643 "#if 1/"; 4644 4645 sed = "/[ \t]size_t/i\\\n" 4646 "#ifndef _GCC_SIZE_T\\\n" 4647 "#define _GCC_SIZE_T\n"; 4648 4649 sed = "/[ \t]size_t/a\\\n" 4650 "#endif\n"; 4651 4652 sed = "/[ \t]ptrdiff_t/i\\\n" 4653 "#ifndef _GCC_PTRDIFF_T\\\n" 4654 "#define _GCC_PTRDIFF_T\n"; 4655 4656 sed = "/[ \t]ptrdiff_t/a\\\n" 4657 "#endif\n"; 4658 4659 sed = "/[ \t]wchar_t/i\\\n" 4660 "#ifndef _GCC_WCHAR_T\\\n" 4661 "#define _GCC_WCHAR_T\n"; 4662 4663 sed = "/[ \t]wchar_t/a\\\n" 4664 "#endif\n"; 4665 4666 test_text = 4667 "#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__\n" 4668 "typedef unsigned int size_t;\n" 4669 "typedef long ptrdiff_t;\n" 4670 "typedef unsigned short wchar_t;\n" 4671 "#endif /* __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__ */\n"; 4672}; 4673 4674 4675/* 4676 * Fix VxWorks <time.h> to not require including <vxTypes.h>. 4677 */ 4678fix = { 4679 hackname = vxworks_needs_vxtypes; 4680 files = time.h; 4681 select = "uint_t([ \t]+_clocks_per_sec)"; 4682 c_fix = format; 4683 c_fix_arg = "unsigned int%1"; 4684 test_text = "uint_t\t_clocks_per_sec;"; 4685}; 4686 4687 4688/* 4689 * Fix VxWorks <sys/stat.h> to not require including <vxWorks.h>. 4690 */ 4691fix = { 4692 hackname = vxworks_needs_vxworks; 4693 files = sys/stat.h; 4694 test = " -r types/vxTypesOld.h"; 4695 test = " -n \"`egrep '#include' $file`\""; 4696 test = " -n \"`egrep ULONG $file`\""; 4697 select = "#[ \t]define[ \t]+__INCstath"; 4698 4699 sed = "/#[ \t]define[ \t][ \t]*__INCstath/a\\\n" 4700 "#include <types/vxTypesOld.h>\n"; 4701 4702 test_text = "`touch types/vxTypesOld.h`" 4703 "#include </dev/null> /* ULONG */\n" 4704 "# define\t__INCstath <sys/stat.h>"; 4705}; 4706 4707 4708/* 4709 * Another bad dependency in VxWorks 5.2 <time.h>. 4710 */ 4711fix = { 4712 hackname = vxworks_time; 4713 files = time.h; 4714 test = " -r vxWorks.h"; 4715 4716 select = "#[ \t]*define[ \t]+VOIDFUNCPTR[ \t].*"; 4717 c_fix = format; 4718 4719 c_fix_arg = 4720 "#ifndef __gcc_VOIDFUNCPTR_defined\n" 4721 "#ifdef __cplusplus\n" 4722 "typedef void (*__gcc_VOIDFUNCPTR) (...);\n" 4723 "#else\n" 4724 "typedef void (*__gcc_VOIDFUNCPTR) ();\n" 4725 "#endif\n" 4726 "#define __gcc_VOIDFUNCPTR_defined\n" 4727 "#endif\n" 4728 "#define VOIDFUNCPTR __gcc_VOIDFUNCPTR"; 4729 4730 test_text = "`touch vxWorks.h`" 4731 "#define VOIDFUNCPTR (void(*)())"; 4732}; 4733 4734 4735/* 4736 * WindISS math.h headers include bogus extern declarations of 4737 * numerous math functions that conflict with libstdc++-v3. 4738 */ 4739fix = { 4740 hackname = windiss_math1; 4741 files = math.h; 4742 mach = "*-*-windiss"; 4743 sed = "s|inline long double cosl.*|#ifndef __GNUC__|"; 4744 4745 test_text = "inline long double cosl(long double);"; 4746}; 4747 4748fix = { 4749 hackname = windiss_math2; 4750 files = math.h; 4751 mach = "*-*-windiss"; 4752 sed = "s|/\\* long double declarations \\*/|" 4753 "#endif /* __GNUC__ */|"; 4754 4755 test_text = "/* long double declarations */"; 4756}; 4757 4758/* 4759 * WindISS headers include "diab/va_list.h" instead of "stdarg.h" 4760 */ 4761fix = { 4762 select = '(#include.*)diab/va_list.h'; 4763 hackname = windiss_valist; 4764 sed = "s|diab/va_list.h|stdarg.h|"; 4765 mach = "*-*-windiss"; 4766 4767 test_text = "#include <diab/va_list.h>"; 4768}; 4769 4770/* 4771 * There are several name conflicts with C++ reserved words in X11 header 4772 * files. These are fixed in some versions, so don't do the fixes if 4773 * we find __cplusplus in the file. These were found on the RS/6000. 4774 */ 4775fix = { 4776 hackname = x11_class; 4777 files = X11/ShellP.h; 4778 bypass = __cplusplus; 4779 select = "^([ \t]*char \\*)class;(.*)"; 4780 c_fix = format; 4781 c_fix_arg = "#ifdef __cplusplus\n%1c_class;%2\n" 4782 "#else\n%1class;%2\n#endif"; 4783 test_text = 4784 "struct {\n" 4785 " char *class;\n" 4786 "} mumble;\n"; 4787}; 4788 4789 4790/* 4791 * class in Xm/BaseClassI.h 4792 */ 4793fix = { 4794 hackname = x11_class_usage; 4795 files = Xm/BaseClassI.h; 4796 bypass = "__cplusplus"; 4797 4798 select = " class\\)"; 4799 c_fix = format; 4800 c_fix_arg = " c_class)"; 4801 4802 test_text = "extern mumble (int class);\n"; 4803}; 4804 4805 4806/* 4807 * new in Xm/Traversal.h 4808 */ 4809fix = { 4810 hackname = x11_new; 4811 files = Xm/Traversal.h; 4812 bypass = __cplusplus; 4813 4814 sed = "/Widget\told, new;/i\\\n" 4815 "#ifdef __cplusplus\\\n" 4816 "\tWidget\told, c_new;\\\n" 4817 "#else\n"; 4818 4819 sed = "/Widget\told, new;/a\\\n" 4820 "#endif\n"; 4821 4822 sed = "s/Widget new,/Widget c_new,/g"; 4823 test_text = 4824 "struct wedge {\n" 4825 " Widget\told, new; /* fixinc check FAILS ON BSD */\n" 4826 "};\nextern Wedged( Widget new, Widget old );"; 4827}; 4828 4829 4830/* 4831 * Incorrect sprintf declaration in X11/Xmu.h 4832 */ 4833fix = { 4834 hackname = x11_sprintf; 4835 files = X11/Xmu.h; 4836 files = X11/Xmu/Xmu.h; 4837 select = "^extern char \\*\tsprintf\\(\\);$"; 4838 4839 c_fix = format; 4840 c_fix_arg = "#ifndef __STDC__\n%0\n#endif /* !defined __STDC__ */"; 4841 4842 test_text = "extern char *\tsprintf();"; 4843}; 4844 4845/*EOF*/ 4846