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