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