X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ffixinc%2Finclhack.def;h=f8d71910a1a63e73bf144c40f35095273a04a5ee;hp=91854a2a3e1fed1db8880ac316bf59a3cdbf859e;hb=038a3e7a475cf0af637cf0a65a554511dee4aaf8;hpb=2f0f06da738367e82500522ae955fab8dce4ab80 diff --git a/gcc/fixinc/inclhack.def b/gcc/fixinc/inclhack.def index 91854a2a3e1..f8d71910a1a 100644 --- a/gcc/fixinc/inclhack.def +++ b/gcc/fixinc/inclhack.def @@ -1,466 +1,846 @@ + /* -*- Mode: C -*- */ -autogen definitions inclhack; +autogen definitions fixincl; + +/* Define all the fixes we know about for repairing damaged headers. + Please see the README before adding or changing entries in this file. + + Set up a debug test so we can make the templates emit special + code while debugging these fixes: */ + +#ifdef DEBUG +FIXINC_DEBUG = yes; +#endif + +/* DO NOT DO BROKEN FIXES (empty replacement fixes) */ /* - * Define all the fixes we know about for repairing damaged headers + * Purge some HP-UX 11 files that are only broken after they are "fixed". */ +fix = { + hackname = AAA_ki_iface; + files = sys/ki_iface.h; + select = 'These definitions are for HP Internal developers'; + replace; /* empty replacement -> no fixing the file */ +}; + /* - * sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the definition - * of struct rusage, so the prototype (added by fixproto) causes havoc. + * Purge some HP-UX 11 files that are only broken after they are "fixed". */ fix = { - hackname = aix_syswait; - files = sys/wait.h; - select = "bos325,"; - sed = "/^extern pid_t wait3();$/i\\\n" - "struct rusage;\n"; + hackname = AAA_ki; + files = sys/ki.h; + select = '11.00 HP-UX LP64'; + replace; /* empty replacement -> no fixing the file */ }; /* - * sys/signal.h on some versions of AIX uses volatile in the typedef of - * sig_atomic_t, which causes gcc to generate a warning about duplicate - * volatile when a sig_atomic_t variable is declared volatile, as - * required by ANSI C. + * Purge some HP-UX 11 files that are only broken after they are "fixed". */ fix = { - hackname = aix_volatile; - files = sys/signal.h; - select = "typedef volatile int sig_atomic_t"; - sed = "s/typedef volatile int sig_atomic_t" - "/typedef int sig_atomic_t/"; + hackname = AAA_ki_calls; + files = sys/ki_calls.h; + select = 'kthread_create_caller_t'; + replace; /* empty replacement -> no fixing the file */ }; /* - * Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX. + * Purge some HP-UX 11 files that are only broken after they are "fixed". */ fix = { - hackname = alpha_getopt; - files = "stdio.h"; - files = "stdlib.h"; - select = 'getopt\(int, char \*\['; - sed = 's/getopt(int, char \*\[\],[ ]*char \*)/' - 'getopt(int, char *const[], const char *)/'; + hackname = AAA_ki_defs; + files = sys/ki_defs.h; + select = 'Kernel Instrumentation Definitions'; + replace; /* empty replacement -> no fixing the file */ }; -/* - * Remove erroneous parentheses in sym.h on Alpha OSF/1. +/* + * This file on SunOS 4 has a very large macro. When the sed loop + * tries pull it in, it overflows the pattern space size of the SunOS + * sed (GNU sed does not have this problem). Since the file does not + * require fixing, we remove it from the fixed directory. */ fix = { - hackname = alpha_parens; - files = sym.h; - select = '#ifndef\(__mips64\)'; - sed = "s/#ifndef(__mips64)/#ifndef __mips64/"; + hackname = AAA_bad_fixes; + files = sundev/ipi_error.h; + /* shouldn't there be a select expression here??? */ + replace; /* empty replacement -> no fixing the file */ }; /* - * Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0 + * Purge some HP-UX 11 files that are only broken after they are "fixed". */ fix = { - hackname = alpha_sbrk; - files = unistd.h; - select = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\("; - sed = "s/char\\([ \t]*\\*[\t ]*sbrk[ \t]*(\\)/void\\1/"; + hackname = AAA_time; + files = sys/time.h; + select = '11.0 and later representation of ki time'; + replace; /* empty replacement -> no fixing the file */ }; +/* And now, the real fixes, replacement text fixes first: */ /* - * Fix this ARM/RISCiX file where ___type is a Compiler - * hint that is specific to the Norcroft compiler. + * Completely replace <_int_varargs.h> with a file that includes gcc's + * stdarg.h or varargs.h files as appropriate on DG/UX */ fix = { - hackname = arm_norcroft_hint; - select = "___type p_type"; - files = "X11/Intrinsic.h"; - sed = "s/___type p_type/p_type/"; + hackname = AAB_dgux_int_varargs; + files = _int_varargs.h; + replace = "#ifndef __INT_VARARGS_H +\#define __INT_VARARGS_H + +/************************************************************************/ +/* _INT_VARARGS.H - Define the common stuff for varargs/stdarg/stdio. */ +/************************************************************************/ + +/* +** This file is a DG internal header. Never include this +** file directly. +*/ + +\#ifndef ___int_features_h +\#include <sys/_int_features.h> +\#endif + +\#if !(defined(_VA_LIST) || defined(_VA_LIST_)) +\#define _VA_LIST +\#define _VA_LIST_ + +\#ifdef __LINT__ + +\#ifdef __STDC__ +typedef void * va_list; +\#else +typedef char * va_list; +\#endif + +\#else +\#if _M88K_ANY + +\#if defined(__DCC__) + +typedef struct { + int next_arg; + int *mem_ptr; + int *reg_ptr; +} va_list; + +\#else /* ! defined(__DCC__) */ + +typedef struct { + int __va_arg; /* argument number */ + int *__va_stk; /* start of args passed on stack */ + int *__va_reg; /* start of args passed in regs */ +} va_list; + +\#endif /* ! defined(__DCC__) */ + +\#elif _IX86_ANY + +\#if defined(__GNUC__) || defined(__STDC__) +typedef void * va_list; +\#else +typedef char * va_list; +\#endif + +\#endif /* _IX86_ANY */ + +\#endif /* __LINT__ */ +\#endif /* !(defined(_VA_LIST) || defined(_VA_LIST_)) */ +\#endif /* #ifndef __INT_VARARGS_H */\n"; }; /* - * Fix this ARM/RISCiX file to avoid interfering - * with the use of __wchar_t in cc1plus. + * This fixes __FD_ZERO bug for linux 2.x.y (x <= 2 && y <= some n) */ fix = { - hackname = arm_wchar; - files = stdlib.h; - select = "#[ \t]*define[ \t]*__wchar_t"; - sed = "s/\\(#[ \t]*ifndef[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/"; - sed = "s/\\(#[ \t]*define[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/"; + hackname = AAB_fd_zero_asm_posix_types_h; + files = asm/posix_types.h; + mach = 'i[34567]86-*-linux-gnu*'; + bypass = '} while'; + + /* + * Define _POSIX_TYPES_H_WRAPPER at the end of the wrapper, not + * the start, so that if #include_next gets another instance of + * the wrapper, this will follow the #include_next chain until + * we arrive at the real . + */ + replace = + +'/* This file fixes a bug in the __FD_ZERO macro + for older versions of the Linux kernel. */ +\#ifndef _POSIX_TYPES_H_WRAPPER +\#include + \#include_next + +\#if defined(__FD_ZERO) && !defined(__GLIBC__) +\#undef __FD_ZERO +\#define __FD_ZERO(fdsetp) \\ + do { \\ + int __d0, __d1; \\ + __asm__ __volatile__("cld ; rep ; stosl" \\ + : "=&c" (__d0), "=&D" (__d1) \\ + : "a" (0), "0" (__FDSET_LONGS), \\ + "1" ((__kernel_fd_set *) (fdsetp)) :"memory"); \\ + } while (0) +\#endif + +\#define _POSIX_TYPES_H_WRAPPER +\#endif /* _POSIX_TYPES_H_WRAPPER */ +'; }; /* - * This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89; - * gcc doesn't understand it. + * This fixes __FD_ZERO bug for glibc-1.x */ fix = { - hackname = aux_asm; - files = sys/param.h; - select = "#ifndef NOINLINE"; - sed = "s|#ifndef NOINLINE" - "|#if !defined(NOINLINE) \\&\\& !defined(__GNUC__)|"; + hackname = AAB_fd_zero_gnu_types_h; + files = gnu/types.h; + mach = 'i[34567]86-*-linux-gnu*'; + + /* + * Define _TYPES_H_WRAPPER at the end of the wrapper, not + * the start, so that if #include_next gets another instance of + * the wrapper, this will follow the #include_next chain until + * we arrive at the real . + */ + replace = + +'/* This file fixes a bug in the __FD_ZERO macro present in glibc 1.x. */ +\#ifndef _TYPES_H_WRAPPER +\#include + \#include_next + +\#if defined(__FD_ZERO) && !defined(__GLIBC__) +\#undef __FD_ZERO +\# define __FD_ZERO(fdsetp) \\ + do { \\ + int __d0, __d1; \\ + __asm__ __volatile__("cld ; rep ; stosl" \\ + : "=&c" (__d0), "=&D" (__d1) \\ + : "a" (0), "0" (__FDSET_LONGS), \\ + "1" ((__fd_set *) (fdsetp)) :"memory"); \\ + } while (0) +\#endif + +\#define _TYPES_H_WRAPPER +\#endif /* _TYPES_H_WRAPPER */ +'; }; /* - * For C++, avoid any typedef or macro definition of bool, - * and use the built in type instead. - * HP/UX 10.20 also has it in curses_colr/curses.h. + * This fixes __FD_ZERO bug for glibc-2.0.x */ fix = { - hackname = avoid_bool; - files = curses.h; - files = curses_colr/curses.h; - files = term.h; - files = tinfo.h; + hackname = AAB_fd_zero_selectbits_h; + files = selectbits.h; + mach = 'i[34567]86-*-linux-gnu*'; - sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/i\\\n" - "#ifndef __cplusplus\n"; + /* + * Define _SELECTBITS_H_WRAPPER at the end of the wrapper, not + * the start, so that if #include_next gets another instance of + * the wrapper, this will follow the #include_next chain until + * we arrive at the real . + */ + replace = - sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/a\\\n" - "#endif\n"; +'/* This file fixes a bug in the __FD_ZERO macro present in glibc 2.0.x. */ +\#ifndef _SELECTBITS_H_WRAPPER +\#include + \#include_next - sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/i\\\n" - "#ifndef __cplusplus\n"; +\#if defined(__FD_ZERO) && defined(__GLIBC__) \\ + && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 \\ + && __GLIBC_MINOR__ == 0 +\#undef __FD_ZERO +\#define __FD_ZERO(fdsetp) \\ + do { \\ + int __d0, __d1; \\ + __asm__ __volatile__ ("cld; rep; stosl" \\ + : "=&c" (__d0), "=&D" (__d1) \\ + : "a" (0), "0" (sizeof (__fd_set) \\ + / sizeof (__fd_mask)), \\ + "1" ((__fd_mask *) (fdsetp)) \\ + : "memory"); \\ + } while (0) +\#endif - sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/a\\\n" - "#endif\n"; +\#define _SELECTBITS_H_WRAPPER +\#endif /* _SELECTBITS_H_WRAPPER */ +'; +}; - sed = "/^[ ]*typedef[ \t][ \t]*unsigned char[ \t][ \t]*bool[ \t]*;/i\\\n" - "#ifndef __cplusplus\n"; - sed = "/^[ ]*typedef[ \t][ \t]*unsigned char[ \t][ \t]*bool[ \t]*;/a\\\n" - "#endif\n"; +/* + * Fix non-ANSI memcpy declaration that conflicts with gcc's builtin + * declaration on Sun OS 4.x. We must only fix this on Sun OS 4.x, because + * many other systems have similar text but correct versions of the file. + * To ensure only Sun's is fixed, we grep for a likely unique string. + * Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t ) + */ +fix = { + hackname = AAB_sun_memcpy; + files = memory.h; + select = "/\\*\t@\\(#\\)" + "(head/memory.h\t50.1\t " + "|memory\\.h 1\\.[2-4] 8./../.. SMI; from S5R2 1\\.2\t)\\*/"; + + replace = +'/* This file was generated by fixincludes */ +\#ifndef __memory_h__ +\#define __memory_h__ + +\#ifdef __STDC__ +extern void *memccpy(); +extern void *memchr(); +extern void *memcpy(); +extern void *memset(); +\#else +extern char *memccpy(); +extern char *memchr(); +extern char *memcpy(); +extern char *memset(); +\#endif /* __STDC__ */ + +extern int memcmp(); + +\#endif /* __memory_h__ */ +'; + }; /* - * Fix `typedef struct term;' on hppa1.1-hp-hpux9. + * Completely replace ; with a file that implements gcc's + * optimized byteswapping. Restricted to "SVR4" machines until either + * it is shown to be safe to replace this file always, or we get bolder ;-) */ fix = { - hackname = bad_struct_term; - files = curses.h; - select = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;"; - sed = "s/^[ \t]*typedef[ \t][ \t]*" - "\\(struct[ \t][ \t]*term[ \t]*;[ \t]*\\)$/\\1/"; + hackname = AAB_svr4_replace_byteorder; +#ifndef SVR5 + mach = "*-*-sysv4*"; + mach = "i[34567]86-*-sysv5*"; + mach = "i[34567]86-*-udk*"; + mach = "i[34567]86-*-solaris2.[0-4]"; + mach = "powerpcle-*-solaris2.[0-4]"; + mach = "sparc-*-solaris2.[0-4]"; +#endif /* SVR5 */ + files = sys/byteorder.h; + replace = '#ifndef _SYS_BYTEORDER_H +\#define _SYS_BYTEORDER_H + +/* Functions to convert `short\' and `long\' quantities from host byte order + to (internet) network byte order (i.e. big-endian). + + Written by Ron Guilmette (rfg@ncd.com). + + This isn\'t actually used by GCC. It is installed by fixinc.svr4. + + For big-endian machines these functions are essentially no-ops. + + For little-endian machines, we define the functions using specialized + asm sequences in cases where doing so yields better code (e.g. i386). */ + +\#if !defined (__GNUC__) && !defined (__GNUG__) +\#error You lose! This file is only useful with GNU compilers. +\#endif + +\#ifndef __BYTE_ORDER__ +/* Byte order defines. These are as defined on UnixWare 1.1, but with + double underscores added at the front and back. */ +\#define __LITTLE_ENDIAN__ 1234 +\#define __BIG_ENDIAN__ 4321 +\#define __PDP_ENDIAN__ 3412 +\#endif + +\#ifdef __STDC__ +static __inline__ unsigned long htonl (unsigned long); +static __inline__ unsigned short htons (unsigned int); +static __inline__ unsigned long ntohl (unsigned long); +static __inline__ unsigned short ntohs (unsigned int); +\#endif /* defined (__STDC__) */ + +\#if defined (__i386__) + +\#ifndef __BYTE_ORDER__ +\#define __BYTE_ORDER__ __LITTLE_ENDIAN__ +\#endif + +/* Convert a host long to a network long. */ + +/* We must use a new-style function definition, so that this will also + be valid for C++. */ +static __inline__ unsigned long +htonl (unsigned long __arg) +{ + register unsigned long __result; + + __asm__ ("xchg%B0 %b0,%h0 + ror%L0 $16,%0 + xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg)); + return __result; +} + +/* Convert a host short to a network short. */ + +static __inline__ unsigned short +htons (unsigned int __arg) +{ + register unsigned short __result; + + __asm__ ("xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg)); + return __result; +} + +\#elif ((defined (__i860__) && !defined (__i860_big_endian__)) \\ + || defined (__ns32k__) || defined (__vax__) \\ + || defined (__spur__) || defined (__arm__)) + +\#ifndef __BYTE_ORDER__ +\#define __BYTE_ORDER__ __LITTLE_ENDIAN__ +\#endif + +/* For other little-endian machines, using C code is just as efficient as + using assembly code. */ + +/* Convert a host long to a network long. */ + +static __inline__ unsigned long +htonl (unsigned long __arg) +{ + register unsigned long __result; + + __result = (__arg >> 24) & 0x000000ff; + __result |= (__arg >> 8) & 0x0000ff00; + __result |= (__arg << 8) & 0x00ff0000; + __result |= (__arg << 24) & 0xff000000; + return __result; +} + +/* Convert a host short to a network short. */ + +static __inline__ unsigned short +htons (unsigned int __arg) +{ + register unsigned short __result; + + __result = (__arg << 8) & 0xff00; + __result |= (__arg >> 8) & 0x00ff; + return __result; +} + +\#else /* must be a big-endian machine */ + +\#ifndef __BYTE_ORDER__ +\#define __BYTE_ORDER__ __BIG_ENDIAN__ +\#endif + +/* Convert a host long to a network long. */ + +static __inline__ unsigned long +htonl (unsigned long __arg) +{ + return __arg; +} + +/* Convert a host short to a network short. */ + +static __inline__ unsigned short +htons (unsigned int __arg) +{ + return __arg; +} + +\#endif /* big-endian */ + +/* Convert a network long to a host long. */ + +static __inline__ unsigned long +ntohl (unsigned long __arg) +{ + return htonl (__arg); +} + +/* Convert a network short to a host short. */ + +static __inline__ unsigned short +ntohs (unsigned int __arg) +{ + return htons (__arg); +} +\#endif +'; }; /* - * Fix one other error in this file: - * a mismatched quote not inside a C comment. + * Completely replace with a file that includes gcc's + * stdarg.h or varargs.h files as appropriate. */ +#ifdef SVR4 fix = { - hackname = badquote; - files = sundev/vuid_event.h; - sed = "s/doesn't/does not/"; + hackname = AAB_svr4_no_varargs; + files = sys/varargs.h; + replace = "/* This file was generated by fixincludes. */\n" + "#ifndef _SYS_VARARGS_H\n" + "#define _SYS_VARARGS_H\n\n" + + "#ifdef __STDC__\n" + "#include \n" + "#else\n" + "#include \n" + "#endif\n\n" + + "#endif /* _SYS_VARARGS_H */\n"; }; +#endif /* - * Fix #defines under Alpha OSF/1: - * The following files contain '#pragma extern_prefix "_FOO"' followed by - * a '#define something(x,y,z) _FOOsomething(x,y,z)'. The intent of these - * statements is to reduce namespace pollution. While these macros work - * properly in most cases, they don't allow you to take a pointer to the - * "something" being modified. To get around this limitation, change these - * statements to be of the form '#define something _FOOsomething'. + * Cancel out ansi_compat.h on Ultrix. Replace it with an empty file. */ fix = { - hackname = bad_lval; - select = "^[ \t]*#[ \t]*pragma[ \t]extern_prefix"; - files = libgen.h; - files = dirent.h; - files = ftw.h; - files = grp.h; - files = ndbm.h; - files = pthread.h; - files = pwd.h; - files = signal.h; - files = standards.h; - files = stdlib.h; - files = string.h; - files = stropts.h; - files = time.h; - files = unistd.h; - sed = - "s/^[ \t]*#[ \t]*define[ \t]*\\([^(]*\\)\\(([^)]*)\\)[ \t]*" - "\\(_.\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/"; + hackname = AAB_ultrix_ansi_compat; + files = ansi_compat.h; + select = ULTRIX; + replace = "/* This file intentionally left blank. */\n"; }; /* - * check for broken assert.h that needs stdio.h + * sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the + * definition of struct rusage, so the prototype added by fixproto fails. */ fix = { - hackname = broken_assert_stdio; - files = assert.h; - select = stderr; - bypass = "include.*stdio.h"; - sed = "1i\\\n" - "#include \n"; + hackname = aix_syswait; + files = sys/wait.h; + select = "^extern pid_t wait3\\(\\);\n"; + select = "bos325,"; + c_fix = format; + c_fix_arg = "struct rusage;\n%0"; + test_text = "/* bos325, */\n" + "extern pid_t wait3();\n" + "\t/* pid_t wait3(int *, int, struct rusage *); */"; }; /* - * check for broken assert.h that needs stdlib.h + * sys/signal.h on some versions of AIX uses volatile in the typedef of + * sig_atomic_t, which causes gcc to generate a warning about duplicate + * volatile when a sig_atomic_t variable is declared volatile, as + * required by ANSI C. */ fix = { - hackname = broken_assert_stdlib; - files = assert.h; - select = 'exit *\(|abort *\('; - bypass = "include.*stdlib.h"; - sed = "1i\\\n" - "#ifdef __cplusplus\\\n" - "#include \\\n" - "#endif\n"; + hackname = aix_volatile; + files = sys/signal.h; + select = "typedef volatile int sig_atomic_t"; + c_fix = format; + c_fix_arg = "typedef int sig_atomic_t"; + test_text = "typedef volatile int sig_atomic_t;"; }; /* - * Note that BSD43_* are used on recent MIPS systems. + * Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX. */ fix = { - hackname = bsd43_io_macros; - select = "BSD43__IO"; - /* - * Put single quotes aroung the character that appears after '(' - * and before ',', UNLESS it is a 'c' or 'g' or 'x'. - */ - sed = "/[ \t]BSD43__IO[A-Z]*[ \t]*(/" 's/(\(.\),/(\'\1\',/'; - sed = "/#[ \t]*define[ \t]*[ \t]BSD43__IO/" 's/\'\([cgx]\)\'/\1/g'; + hackname = alpha_getopt; + files = "stdio.h"; + files = "stdlib.h"; + select = 'getopt\(int, char \*\[\], *char \*\)'; + c_fix = format; + c_fix_arg = "getopt(int, char *const[], const char *)"; + test_text = 'extern int getopt(int, char *[], char *);'; }; -/* - * Fix on Digital UNIX V4.0: - * It contains a prototype for a DEC C internal asm() function, - * clashing with gcc's asm keyword. So protect this with __DECC. +/* + * Remove erroneous parentheses in sym.h on Alpha OSF/1. */ fix = { - hackname = dec_intern_asm; - files = c_asm.h; - sed = "/^[ \t]*float[ \t]*fasm/i\\\n#ifdef __DECC\n"; - sed = "/^[ \t]*#[ \t]*pragma[ \t]*intrinsic([ \t]*dasm/a\\\n" - "#endif\n"; + hackname = alpha_parens; + files = sym.h; + select = '#ifndef\(__mips64\)'; + c_fix = format; + c_fix_arg = "#ifndef __mips64"; + test_text = "#ifndef(__mips64) /* bogus */\nextern int foo;\n#endif"; }; -#ifdef no_more /* - * And also with the HP-UX 10 and HP-UX 11 sys/pci.h file + * Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0 */ fix = { - hackname = cxx_cmnt_hpux; - files = sys/pci.h; - select = "System Private Structures"; - sed = "s|//.*$||g"; + hackname = alpha_sbrk; + files = unistd.h; + select = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\("; + c_fix = format; + c_fix_arg = "void *sbrk("; + test_text = "extern char* sbrk(ptrdiff_t increment);"; }; /* - * Turning // comments into normal comments trashes this IRIX 4.0.1 - * header file, which embeds // comments inside multi-line - * comments. If this looks like the IRIX header file, we refix it by - * just throwing away the // comments. + * Fix this ARM/RISCiX file where ___type is a Compiler + * hint that is specific to the Norcroft compiler. */ fix = { - hackname = cxx_cmnt_irix; - files = fam.h; - select = indigo.esd; - sed = "s|//.*$||g"; + hackname = arm_norcroft_hint; + select = "___type p_type"; + files = "X11/Intrinsic.h"; + c_fix = format; + c_fix_arg = "p_type"; + test_text = "___type p_type mumble;"; }; /* - * Same problem with a file from SunOS 4.1.3 : a header file containing - * the string "//" embedded in "/ * * /" + * Fix this ARM/RISCiX file to avoid interfering + * with the use of __wchar_t in cc1plus. */ fix = { - hackname = cxx_cmnt_sunos; - files = sbusdev/audiovar.h; - files = sys/audiovar.h; - sed = "s|//.*$||g"; + hackname = arm_wchar; + files = stdlib.h; + select = "#[ \t]*define[ \t]*__wchar_t"; + + c_fix = format; + c_fix_arg = "%1_GCC_WCHAR_T"; + c_fix_arg = "(#[ \t]*(ifndef|define)[ \t]+)__wchar_t"; + + test_text = + "# ifndef \t __wchar_t /* we don't have wchar_t yet, ... */\n" + "# define __wchar_t short\n" + "# endif /* __wchar_t */"; }; /* - * There is a similar problem with the VxWorks drv/netif/if_med.h file. + * This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89; + * gcc doesn't understand it. */ fix = { - hackname = cxx_cmnt_vxworks; - files = drv/netif/if_med.h; - select = "Wind River"; - sed = "s|//.*$||g"; + hackname = aux_asm; + files = sys/param.h; + select = "#ifndef NOINLINE"; + + c_fix = format; + c_fix_arg = "#if !defined(NOINLINE) && !defined(__GNUC__)"; + + test_text = + "#ifndef NOINLINE /* ain't got no inline, so we got it */\n" + "#endif /* NOINLINE */"; }; -#endif + /* - * Remove the double-slash comments - * They *must* be removed so it will not create nested comments!! - * However, they will *not* be removed if the file name ends with - * any of "++", ".hh" or ".H", or if the file name contains "cxx/". - * - * There *used* to be a number of similar problems in various OSes: + * For C++, avoid any typedef or macro definition of bool, + * and use the built in type instead. + * HP/UX 10.20 also has it in curses_colr/curses.h. + */ +fix = { + hackname = avoid_bool_define; + files = curses.h; + files = curses_colr/curses.h; + files = term.h; + files = tinfo.h; - * Turning // comments into normal comments trashes this IRIX 4.0.1 - * header file, which embeds // comments inside multi-line - * comments. If this looks like the IRIX header file, we refix it by - * just throwing away the // comments. + select = "#[ \t]*define[ \t]+bool[ \t]"; + bypass = "we must use the C\\+\\+ compiler's type"; - * Same problem with a file from SunOS 4.1.3 : a header file containing - * the string "//" embedded in "/ * * /" + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; + c_fix_arg = "^[ \t]*#[ \t]*define[ \t]+bool[ \t].*"; - * There is a similar problem with the VxWorks drv/netif/if_med.h file. + test_text = "# define bool\t char \n"; +}; + +fix = { + hackname = avoid_bool_type; + files = curses.h; + files = curses_colr/curses.h; + files = term.h; + files = tinfo.h; - * And also with the HP-UX 10 and HP-UX 11 sys/pci.h file + select = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;"; + bypass = "we must use the C\\+\\+ compiler's type"; - * Now that we delete the // comments instead of converting them to / * * /, - * traditional hacks like irix_bogus_cxx_cmnt, no longer work (which - * strangely enough was also used on alpha-dec-osf4.0d). If we skip the - * hack whenever we see ``"//"'', then the need for the secondary hack - * disappears. Note: it is painful to ensure that the first quote - * exists, so we just check for the trailing quote directly abutting - * the //. Note: We should never touch a line that has // completely - * within quotes but this is somewhat hard to check for. + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; + c_fix_arg = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;.*"; - * Ultimately, this fix ought to go inside of C code where - * we can do a better analysis on the need and method for fixing. - */ -fix = { - hackname = no_double_slash; - /* - * Test that the file-to-fix does not from a C++ directory - * Also, only accept double slashes that are not part of URL's - * and are not the end of a quoted string. - */ - test = '-z `echo ${file} | egrep \'(CC|cxx|\+\+)/\' `'; - select = '(^|[^:])//[^"*]'; - sed = 's,^//.*$,,'; - sed = 's,[^:]//[^"].*$,,'; + test_text = "typedef unsigned int\tbool \t; /* bool type */"; }; /* - * Fix these Sun OS files to avoid an invalid identifier in an #ifdef. + * Fix #defines under Alpha OSF/1: + * The following files contain '#pragma extern_prefix "_FOO"' followed by + * a '#define something(x,y,z) _FOOsomething(x,y,z)'. The intent of these + * statements is to reduce namespace pollution. While these macros work + * properly in most cases, they don't allow you to take a pointer to the + * "something" being modified. To get around this limitation, change these + * statements to be of the form '#define something _FOOsomething'. + * + * sed ain't egrep, lesson 2463: sed can use self-referential + * regular expressions. In the substitute expression below, + * "\\1" and "\\2" refer to subexpressions found earlier in the + * same match. So, we continue to use sed. "extern_prefix" will + * be a rare match anyway... */ fix = { - hackname = ecd_cursor; - files = "sunwindow/win_lock.h"; - files = "sunwindow/win_cursor.h"; - sed = "s/ecd.cursor/ecd_cursor/"; + hackname = bad_lval; + + select = "^[ \t]*#[ \t]*pragma[ \t]+extern_prefix"; + + files = libgen.h; + files = dirent.h; + files = ftw.h; + files = grp.h; + files = ndbm.h; + files = pthread.h; + files = pwd.h; + files = signal.h; + files = standards.h; + files = stdlib.h; + files = string.h; + files = stropts.h; + files = time.h; + files = unistd.h; + + sed = + "s/^[ \t]*#[ \t]*define[ \t][ \t]*\\([^(]*\\)\\(([^)]*)\\)[ \t]*" + "\\(_.*\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/"; + + test_text = '#pragma extern_prefix "_FOO"'"\n" + "#define something(x,y,z) _FOOsomething(x,y,z)\n" + "#define mumble _FOOmumble"; }; + /* - * On SCO OpenServer 5.0.0 through (at least) 5.0.5 contains - * tiny static wrappers that aren't C++ safe. + * Fix `typedef struct term;' on hppa1.1-hp-hpux9. */ fix = { - hackname = sco5_stat_wrappers; - mach = "i*86-*-sco3.2v5*"; - files = "sys/stat.h"; - - sed = "/^static int[ \t]*[a-z]*stat(/i\\\n" - "#ifdef __cplusplus\\\n" - "extern \"C\"\\\n" - "{\\\n" - "#endif\\\n"; + hackname = bad_struct_term; + files = curses.h; + select = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;"; + c_fix = format; + c_fix_arg = "struct term;"; - sed = "/^}$/a\\\n" - "#ifdef __cplusplus\\\n" - "}\\\n" - "#endif \/* __cplusplus *\/\\\n"; + test_text = 'typedef struct term;'; }; - /* - * Fix else directives that contain non-commentary text - * - * The fixinc_eol stuff is to work around a bug in the sed + * Fix one other error in this file: + * a mismatched quote not inside a C comment. */ fix = { - hackname = else_label; - select = "^[ \t]*#[ \t]*else[ \t]+[!-.0-~]"; - sed = ":loop\n" - '/\\\\$/' "N\n" - 's/\\\\$/\\\\+++fixinc_eol+++/' "\n" - '/\\\\$/' "b loop\n" - 's/\\\\+++fixinc_eol+++/\\\\/g' "\n" + hackname = badquote; + files = sundev/vuid_event.h; + select = "doesn't"; + c_fix = format; + c_fix_arg = "does not"; - "s%^\\([ \t]*#[ \t]*else\\)[ \t]*/[^*].*%\\1%\n" - "s%^\\([ \t]*#[ \t]*else\\)[ \t]*[^/ \t].*%\\1%"; + test_text = "/* doesn't have matched single quotes */"; }; /* - * Fix endif directives that contain non-commentary text + * check for broken assert.h that needs stdio.h */ fix = { - hackname = endif_label; - /* - * Select files that contain '#endif' directives with - * some sort of following junk. (Between the ascii '.' - * and '0' lies the character '/'. This will *NOT* - * match '#endif / * foo * /', but it also wont match - * '#endif / done' either. - * - * We use the pattern [!-.0-z{|}~] instead of [^/ \t] to match a noncomment - * following #else or #endif because some buggy egreps think [^/] matches - * newline, and they thus think `#else ' matches - * `#e[ndiflse]*[ \t]+[^/ \t]'. - * [!-.0-~] does not work properly on AIX 4.1. - */ - select = "^[ \t]*#[ \t]*endif[ \t]+[!-.0-z\{\|\}\~]"; + hackname = broken_assert_stdio; + files = assert.h; + select = stderr; + bypass = "include.*stdio\\.h"; + c_fix = wrap; + c_fix_arg = "#include \n"; + test_text = "extern FILE* stderr;"; +}; - /* - * First, join the continued input lines. - * IF the resulting line is an endif preprocessing directive, - * then trim off the following patterns: - * 1. sequences that start with '/' and is *NOT* followed by '*' - * 2. Sequences that start with '*' and is *NOT* followed by '/' - * 3. sequences that do not start with any of '/', '*', '\t' or ' '. - * - * The fixinc_eol stuff is to work around a bug in the sed - */ - sed = ":loop\n" - '/\\\\$/' "N\n" - 's/\\\\$/\\\\+++fixinc_eol+++/' "\n" - '/\\\\$/' "b loop\n" - 's/\\\\+++fixinc_eol+++/\\\\/g' "\n" - "s%^\\([ \t]*#[ \t]*endif\\)[ \t]*/[^*].*%\\1%\n" - "s%^\\([ \t]*#[ \t]*endif\\)[ \t]*\\*[^/].*%\\1%\n" - "s%^\\([ \t]*#[ \t]*endif\\)[ \t]*[^/* \t].*%\\1%"; +/* + * check for broken assert.h that needs stdlib.h + */ +fix = { + hackname = broken_assert_stdlib; + files = assert.h; + select = 'exit *\(|abort *\('; + bypass = "include.*stdlib\\.h"; + c_fix = wrap; + c_fix_arg = "#ifdef __cplusplus\n" + "#include \n" + "#endif\n"; + test_text = "extern void exit ( int );"; }; /* - * Fix HP's use of ../machine/inline.h to refer to - * /usr/include/machine/inline.h + * Remove `extern double cabs' declarations from math.h. + * This conflicts with C9x. Discovered on AIX. + * SunOS4 has its cabs() declaration followed by a comment which + * terminates on the following line. */ fix = { - hackname = hp_inline; - files = sys/spinlock.h; - select = 'include.*"\.\./machine/'; - sed = "s,\"../machine/inline.h\",,"; - sed = "s,\"../machine/psl.h\",,"; + hackname = broken_cabs; + files = "math.h"; + select = '^extern double cabs'; + + c_fix = format; + c_fix_arg = ""; + c_fix_arg = "^extern double cabs\\((struct dbl_hypot|)\\);"; + + test_text = "#ifdef __STDC__\n" + "extern double cabs(struct dbl_hypot);\n" + "#else\n" + "extern double cabs();\n" + "#endif\n" + "extern double cabs(); /* This is a comment\n" + " and it ends here. */"; }; /* - * Check for (...) in C++ code in HP/UX sys/file.h. + * Fix various macros used to define ioctl numbers. + * The traditional syntax was: + * + * #define _CTRL(n, x) (('n'<<8)+x) + * #define TCTRLCFOO _CTRL(T, 1) + * + * but this does not work with the C standard, which disallows macro + * expansion inside strings. We have to rewrite it thus: + * + * #define _CTRL(n, x) ((n<<8)+x) + * #define TCTRLCFOO _CTRL('T', 1) + * + * The select expressions match too much, but the c_fix code is cautious. + * + * CTRL might be: CTRL _CTRL ISCTRL BSD43_CTRL ... */ fix = { - hackname = hp_sysfile; - files = sys/file.h; - select = "HPUX_SOURCE"; - sed = 's/(\.\.\.)/(struct file * ...)/'; + hackname = ctrl_quotes_def; + select = "define[ \t]+[A-Z0-9_]+CTRL\\([a-zA-Z],"; + c_fix = char_macro_def; + c_fix_arg = "CTRL"; + test_text = "#define BSD43_CTRL(n, x) (('n'<<8)+x)"; +}; + +fix = { + hackname = ctrl_quotes_use; + select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+CTRL[ \t]*\\( *[^,']"; + c_fix = char_macro_use; + c_fix_arg = "CTRL"; + test_text = "#define TIOCFOO BSD43_CTRL(T, 1)"; }; @@ -468,217 +848,349 @@ fix = { * sys/mman.h on HP/UX is not C++ ready, * even though NO_IMPLICIT_EXTERN_C is defined on HP/UX. * - * rpc/types.h on OSF1/2.0 is not C++ ready, even though NO_IMPLICIT_EXTERN_C - * is defined for the alpha. The problem is the declaration of malloc. + * rpc/types.h on OSF1/2.0 is not C++ ready, + * even though NO_IMPLICIT_EXTERN_C is defined for the alpha. + * + * The problem is the declaration of malloc. */ fix = { hackname = cxx_unready; files = sys/mman.h; files = rpc/types.h; - bypass = '"C"|__BEGIN_DECLS'; + select = '[^#]+malloc.*;'; /* Catch any form of declaration + not within a macro. */ + bypass = '"C"|__BEGIN_DECLS'; - sed = "1i\\\n" - "#ifdef __cplusplus\\\n" - "extern \"C\" {\\\n" - "#endif\\\n\n"; - sed = "$a\\\n" - "#ifdef __cplusplus\\\n" - "}\\\n" - "#endif\n"; + c_fix = wrap; + c_fix_arg = "#ifdef __cplusplus\n" + "extern \"C\" {\n" + "#endif\n"; + c_fix_arg = "#ifdef __cplusplus\n" + "}\n" + "#endif\n"; + test_text = "extern void* malloc( size_t );"; }; /* - * HPUX 10.x sys/param.h defines MAXINT which clashes with values.h + * Fix on Digital UNIX V4.0: + * It contains a prototype for a DEC C internal asm() function, + * clashing with gcc's asm keyword. So protect this with __DECC. */ fix = { - hackname = hpux_maxint; - files = sys/param.h; - sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/i\\\n" - "#ifndef MAXINT\n"; + hackname = dec_intern_asm; + files = c_asm.h; + sed = "/^[ \t]*float[ \t]*fasm/i\\\n#ifdef __DECC\n"; + sed = "/^[ \t]*#[ \t]*pragma[ \t]*intrinsic([ \t]*dasm/a\\\n" + "#endif\n"; + test_text = + "float fasm {\n" + " ... asm stuff ...\n" + "};\n#pragma intrinsic( dasm )\n/* END ASM TEST*/"; +}; - sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/a\\\n" - "#endif\n"; + +/* + * Fix these Sun OS files to avoid an invalid identifier in an #ifdef. + */ +fix = { + hackname = ecd_cursor; + files = "sunwindow/win_lock.h"; + files = "sunwindow/win_cursor.h"; + select = 'ecd\.cursor'; + c_fix = format; + c_fix_arg = 'ecd_cursor'; + + test_text = "#ifdef ecd.cursor\n#error bogus\n#endif /* ecd+cursor */"; }; /* - * Fix hpux10.20 to avoid invalid forward decl + * fix-header doesn't fix fabs' prototype, and I have no idea why. */ fix = { - hackname = hpux_systime; - files = sys/time.h; - select = "^extern struct sigevent;"; - sed = "s/^extern struct sigevent;/struct sigevent;/"; + hackname = fix_header_breakage; + mach = "m88k-motorola-sysv3*"; + files = "math.h"; + + select = 'extern double floor\(\), ceil\(\), fmod\(\), fabs\(\);'; + c_fix = format; + c_fix_arg = + 'extern double floor(), ceil(), fmod(), fabs _PARAMS((double));'; + test_text = 'extern double floor(), ceil(), fmod(), fabs();'; }; /* - * Determine if we're on Interactive Unix 2.2 or later, in which case we - * need to fix some additional files. This is the same test for ISC that - * Autoconf uses. On Interactive 2.2, certain traditional Unix - * definitions (notably getc and putc in stdio.h) are omitted if __STDC__ - * is defined, not just if _POSIX_SOURCE is defined. This makes it - * impossible to compile any nontrivial program except with -posix. + * Fix HP's use of ../machine/inline.h to refer to + * /usr/include/machine/inline.h */ fix = { - hackname = interactv_add1; + hackname = hp_inline; + files = sys/spinlock.h; + files = machine/machparam.h; + select = "[ \t]*#[ \t]*include[ \t]+" '"\.\./machine/'; - test = " -d /etc/conf/kconfig.d"; - test = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"'; + c_fix = format; + c_fix_arg = "%1"; - files = "stdio.h"; - files = "math.h"; - files = "ctype.h"; - files = "sys/limits.h"; - files = "sys/fcntl.h"; - files = "sys/dirent.h"; + c_fix_arg = "([ \t]*#[ \t]*include[ \t]+)" '"\.\./machine/' + '([a-z]+)\.h"'; - sed = "s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/" - "!defined(_POSIX_SOURCE)/"; + test_text = ' # include "../machine/mumble.h"'; }; + +/* + * Check for (...) in C++ code in HP/UX sys/file.h. + */ fix = { - hackname = interactv_add2; + hackname = hp_sysfile; + files = sys/file.h; + select = "HPUX_SOURCE"; - test = " -d /etc/conf/kconfig.d"; - test = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"'; + c_fix = format; + c_fix_arg = "(struct file *, ...)"; + c_fix_arg = '\(\.\.\.\)'; - files = math.h; - sed = "s/fmod(double)/fmod(double, double)/"; + test_text = "extern void foo(...); /* HPUX_SOURCE - bad varargs */"; }; + +/* + * Keep HP-UX 11 from stomping on C++ math namespace + * with defines for fabsf. + */ fix = { - hackname = interactv_add3; + hackname = hpux11_fabsf; + files = math.h; + select = "^[ \t]*#[ \t]*define[ \t]+fabsf\\(.*"; + bypass = "__cplusplus"; - test = " -d /etc/conf/kconfig.d"; - test = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"'; + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; - files = sys/limits.h; + test_text = + "#ifdef _PA_RISC\n" + "# define fabsf(x) ((float)fabs((double)(float)(x)))\n" + "#endif"; +}; - sed = "/CHILD_MAX/s,/\\* Max, Max,"; - sed = "/OPEN_MAX/s,/\\* Max, Max,"; + +/* + * In inttypes.h on HPUX 11, the use of __CONCAT__ in the definition + * of UINT32_C has undefined behavior according to ISO/ANSI: + * the arguments to __CONCAT__ are not macro expanded before the + * concatination happens so the trailing ')' in the first argument + * is concatinated with the 'l' in the second argument creating an + * invalid pp token. The behavior of invalid pp tokens is undefined. + * GCC does not handle these invalid tokens the way the HP compiler does. + * This problem will potentially occur anytime macros are used in the + * arguments to __CONCAT__. A general solution to this problem would be to + * insert another layer of macro between __CONCAT__ and its use + * in UINT32_C. An example of this solution can be found in the C standard. + * A more specific solution, the one used here, is to change the UINT32_C + * macro to not used macros in the arguments to __CONCAT__. + */ +fix = { + hackname = hpux11_uint32_c; + files = inttypes.h; + select = "^#define UINT32_C\\(__c\\)[ \t]*" + "__CONCAT__\\(__CONCAT_U__\\(__c\\),l\\)"; + c_fix = format; + c_fix_arg = '#define UINT32_C(__c) __CONCAT__(__c,ul)'; + test_text = + "#define CONCAT_U__(__c)\t__CONCAT__(__c,u)\n" + "#define UINT32_C(__c)\t__CONCAT__(__CONCAT_U__(__c),l)"; }; /* - * Fix various _IO* defines, but do *not* quote the characters cgxtf. + * get rid of bogus inline definitions in HP-UX 8.0 */ fix = { - hackname = io_def_quotes; - select = "[ \t](_|DES)IO[A-Z]*[ \t]*\\( *[^,']"; - sed = "s/\\([ \t](_|DES)IO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/"; - sed = "/#[ \t]*define[ \t]*[ \t]_IO/" "s/'\\([cgxtf]\\)'/\\1/g"; - sed = "/#[ \t]*define[ \t]*[ \t]DESIOC/" 's/\'\([cdgx]\)\'/\1/g'; + hackname = hpux8_bogus_inlines; + files = math.h; + select = inline; + sed = "s@inline int abs(int [a-z][a-z]*) {.*}" + "@extern \"C\" int abs(int);@"; + sed = "s@inline double abs(double [a-z][a-z]*) {.*}@@"; + sed = "s@inline int sqr(int [a-z][a-z]*) {.*}@@"; + sed = "s@inline double sqr(double [a-z][a-z]*) {.*}@@"; + test_text = "inline int abs(int v) { return (v>=0)?v:-v; }\n" + "inline double sqr(double v) { return v**0.5; }"; }; /* - * Fix CTRL macros + * Fix return type of abort and free */ fix = { - hackname = ioctl_fix_ctrl; - select = "CTRL[ \t]"; + hackname = int_abort_free_and_exit; + files = stdlib.h; + select = "int[ \t]+(abort|free|exit)[ \t]*\\("; + + c_fix = format; + c_fix_arg = "void\t%1("; - sed = "/[^A-Z0-9_]CTRL[ \t]*(/" - "s/\\([^']\\))/'\\1')/"; + test_text = "extern int abort(int);\n" + "extern int free(void*);\n" + "extern int exit(void*);"; +}; - sed = "/[^A-Z0-9]_CTRL[ \t]*(/" - "s/\\([^']\\))/'\\1')/"; - sed = "/#[ \t]*define[ \t]*[ \t]CTRL/" - "s/'\\([cgx]\\)'/\\1/g"; +/* + * On Interactive Unix 2.2, certain traditional Unix definitions + * (notably getc and putc in stdio.h) are omitted if __STDC__ is + * defined, not just if _POSIX_SOURCE is defined. This makes it + * impossible to compile any nontrivial program except with -posix. + */ +fix = { + hackname = isc_omits_with_stdc; - sed = "/#[ \t]*define[ \t]*[ \t]_CTRL/" - "s/'\\([cgx]\\)'/\\1/g"; + files = "stdio.h"; + files = "math.h"; + files = "ctype.h"; + files = "sys/limits.h"; + files = "sys/fcntl.h"; + files = "sys/dirent.h"; - sed = "/#[ \t]*define[ \t]*[ \t]BSD43_CTRL/" - "s/'\\([cgx]\\)'/\\1/g"; + select = '!defined\(__STDC__\) && !defined\(_POSIX_SOURCE\)'; + c_fix = format; + c_fix_arg = '!defined(_POSIX_SOURCE)'; + test_text = "#if !defined(__STDC__) && !defined(_POSIX_SOURCE) /* ? ! */" + "\nint foo;\n#endif"; }; /* - * Check for missing ';' in struct + * Fix various macros used to define ioctl numbers. + * The traditional syntax was: + * + * #define _IO(n, x) (('n'<<8)+x) + * #define TIOCFOO _IO(T, 1) + * + * but this does not work with the C standard, which disallows macro + * expansion inside strings. We have to rewrite it thus: + * + * #define _IO(n, x) ((n<<8)+x) + * #define TIOCFOO _IO('T', 1) + * + * The select expressions match too much, but the c_fix code is cautious. + * + * _IO might be: _IO DESIO BSD43__IO with W, R, WR, C, ... suffixes. */ fix = { - hackname = ip_missing_semi; - files = netinet/ip.h; - sed = "/^struct/,/^};/s/}$/};/"; + hackname = io_quotes_def; + select = "define[ \t]+[A-Z0-9_]+IO[A-Z]*\\([a-zA-Z],"; + c_fix = char_macro_def; + c_fix_arg = "IO"; + test_text = + "#define BSD43__IOWR(n, x) (('n'<<8)+x)\n" + "#define _IOWN(x,y,t) (_IOC_IN|(((t)&_IOCPARM_MASK)<<16)|('x'<<8)|y)\n" + "#define _IO(x,y) ('x'<<8|y)"; +}; + +fix = { + hackname = io_quotes_use; + select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+IO[A-Z]*[ \t]*" + "\\( *[^,']"; + c_fix = char_macro_use; + c_fix_arg = "IO"; + test_text = "#define TIOCFOO BSD43__IOWR(T, 1)"; }; /* - * IRIX 4.0.5 uses struct sockaddr - * in prototype without previous definition. + * HPUX 10.x sys/param.h defines MAXINT which clashes with values.h */ fix = { - hackname = irix_multiline_cmnt; - files = sys/types.h; + hackname = hpux_maxint; + files = sys/param.h; + select = "^#[ \t]*define[ \t]*MAXINT[ \t]"; - sed = "s@type of the result@type of the result */@"; - sed = "s@of the sizeof@/* of the sizeof@"; + c_fix = format; + c_fix_arg = "#ifndef MAXINT\n%0\n#endif"; + c_fix_arg = "^#[ \t]*define[ \t]*MAXINT[ \t].*"; + + test_text = '#define MAXINT 0x7FFFFFFF'; }; /* - * Some IRIX header files contain the string "//" + * Fix hpux10.20 to avoid invalid forward decl */ fix = { - hackname = irix_sockaddr; - files = rpc/auth.h; - select = "authdes_create.*struct sockaddr"; - sed = "/authdes_create.*struct sockaddr/i\\\n" - "struct sockaddr;\n"; + hackname = hpux_systime; + files = sys/time.h; + select = "^extern struct sigevent;"; + + c_fix = format; + c_fix_arg = "struct sigevent;"; + + test_text = 'extern struct sigevent;'; }; /* - * IRIX 4.0.5 uses struct __file_s - * in prototype without previous definition. + * Check for missing ';' in struct */ fix = { - hackname = irix_struct__file; - files = rpc/xdr.h; - sed = "/xdrstdio_create.*struct __file_s/i\\\n" - "struct __file_s;\n"; + hackname = ip_missing_semi; + files = netinet/ip.h; + select = "}$"; + sed = "/^struct/,/^};/s/}$/};/"; + test_text= + "struct mumble {\n" + " union {\n" + " int x;\n" + " }\n" + "}; /* mumbled struct */\n"; }; /* - * Fixing ISC fmod declaration + * IRIX 5.2's contains an asm comment with a contraction + * that causes the assembly preprocessor to complain about an + * unterminated character constant. */ fix = { - hackname = isc_fmod; - files = math.h; - select = 'fmod\(double\)'; - sed = "s/fmod(double)/fmod(double, double)/"; + hackname = irix_asm_apostrophe; + files = sys/asm.h; + + select = "^[ \t]*#.*[Ww]e're"; + c_fix = format; + c_fix_arg = "%1 are"; + c_fix_arg = "^([ \t]*#.*[Ww]e)'re"; + test_text = "\t# and we're on vacation"; }; - + /* - * Fix nested comments in Motorola's and + * Some IRIX header files contain the string "//" */ fix = { - hackname = motorola_nested; - mach = "m68k-motorola-sysv*"; - files = limits.h; - files = sys/limits.h; - sed = "s@^\\(#undef[ \t][ \t]*PIPE_BUF[ \t]*" - "/\\* max # bytes atomic in write to a\\)$@\\1 */@"; - sed = "s@\\(/\\*#define\tHUGE_VAL\t3.40282346638528860e+38 \\)" - "\\(/\\*error value returned by Math lib\\*/\\)$@\\1*/ \\2@"; + hackname = irix_multiline_cmnt; + files = sys/types.h; + + sed = "s@type of the result@type of the result */@"; + sed = "s@of the sizeof@/* of the sizeof@"; + test_text = + "/* we check the type of the result\n" + "// of the sizeof something. This is a bad test :-( */"; }; - + /* - * Fixing nested comments in ISC + * Fixing ISC fmod declaration */ fix = { - hackname = isc_sys_limits; - files = sys/limits.h; - select = CHILD_MAX; - sed = "/CHILD_MAX/s,/\\* Max, Max,"; - sed = "/OPEN_MAX/s,/\\* Max, Max,"; + hackname = isc_fmod; + files = math.h; + select = 'fmod\(double\)'; + c_fix = format; + c_fix_arg = "fmod(double, double)"; + test_text = "extern double fmod(double);"; }; @@ -707,7 +1219,9 @@ fix = { files = "Xm.acorn/XmP.h"; files = bsd43/bsd43_.h; select = '/\*\*/'; - sed = 's|/\*\*/|##|g'; + c_fix = format; + c_fix_arg = '##'; + test_text = "#define __CONCAT__(a,b) a/**/b"; }; @@ -719,26 +1233,18 @@ fix = { * comment. Fortunately, HP/UX already uses #ifndefs in limits.h; if * we find a #ifndef FLT_MIN we assume that all the required #ifndefs * are there, and we do not add them ourselves. - * Also fix a nested comment problem in sys/limits.h on Motorola sysV68 R3V7.1 */ fix = { hackname = limits_ifndefs; files = "limits.h"; + files = "sys/limits.h"; bypass = "ifndef[ \t]+FLT_MIN"; - sed = "/[ \t]FLT_MIN[ \t]/i\\\n#ifndef FLT_MIN\n"; - sed = "/[ \t]FLT_MIN[ \t]/a\\\n#endif\n"; - sed = "/[ \t]FLT_MAX[ \t]/i\\\n#ifndef FLT_MAX\n"; - sed = "/[ \t]FLT_MAX[ \t]/a\\\n#endif\n"; - sed = "/[ \t]FLT_DIG[ \t]/i\\\n#ifndef FLT_DIG\n"; - sed = "/[ \t]FLT_DIG[ \t]/a\\\n#endif\n"; - sed = "/[ \t]DBL_MIN[ \t]/i\\\n#ifndef DBL_MIN\n"; - sed = "/[ \t]DBL_MIN[ \t]/a\\\n#endif\n"; - sed = "/[ \t]DBL_MAX[ \t]/i\\\n#ifndef DBL_MAX\n"; - sed = "/[ \t]DBL_MAX[ \t]/a\\\n#endif\n"; - sed = "/[ \t]DBL_DIG[ \t]/i\\\n#ifndef DBL_DIG\n"; - sed = "/[ \t]DBL_DIG[ \t]/a\\\n#endif\n"; - sed = "/^\\(\\/\\*#define\tHUGE_VAL\t3\\.[0-9e+]* *\\)\\/\\*/s//\\1/"; + c_fix = format; + c_fix_arg = "#ifndef %1\n%0\n#endif"; + c_fix_arg = "^[ \t]*#[ \t]*define[ \t]+" + "((FLT|DBL)_(MIN|MAX|DIG))[ \t].*"; + test_text = " #\tdefine\tDBL_DIG \t 0 /* somthin' */"; }; @@ -746,10 +1252,12 @@ fix = { * Delete the '#define void int' line from curses.h on Lynx */ fix = { - hackname = lynx_void_int; - files = curses.h; - select = "#[ \t]*define[ \t]+void[ \t]+int"; - sed = "/#[ \t]*define[ \t][ \t]*void[ \t]int/d"; + hackname = lynx_void_int; + files = curses.h; + select = "#[ \t]*define[ \t]+void[ \t]+int[ \t]*"; + c_fix = format; + c_fix_arg = ""; + test_text = "# define\tvoid\tint \t/* curses foiled again */"; }; @@ -757,40 +1265,41 @@ fix = { * Fix fcntl prototype in fcntl.h on LynxOS. */ fix = { - hackname = lynxos_fcntl_proto; - files = fcntl.h; - select = 'fcntl.*\(int, int, int\)'; - sed = 's/\(fcntl.*(int, int, \)int)/\1...)/'; + hackname = lynxos_fcntl_proto; + files = fcntl.h; + select = "fcntl[ \t]*" '\(int, int, int\)'; + c_fix = format; + c_fix_arg = '%1...)'; + c_fix_arg = "(fcntl[ \t]*" '\(int, int, )int\)'; + test_text = "extern int fcntl(int, int, int);"; }; /* * libm.a on m88k-motorola-sysv3 contains a stupid optimization for * function hypot(), which returns the second argument without even - * looking at its value, if the other is 0.0. Another drawback is - * that fix-header doesn't fix fabs' prototype, and I have no idea why. - */ -fix = { - hackname = m88k_bad_hypot_opt; - mach = "m88k-motorola-sysv3*"; - files = "math.h"; - - sed = "s/extern double floor(), ceil(), fmod(), fabs();/" - "extern double floor(), ceil(), fmod(), fabs _PARAMS((double));/"; - - sed = "/^extern double hypot();$/a\\\n" - "\\/* Workaround a stupid Motorola optimization if one\\\n" - " of x or y is 0.0 and the other is negative! *\\/\\\n" - "#ifdef __STDC__\\\n" - "static __inline__ double fake_hypot (double x, double y)\\\n" - "#else\\\n" - "static __inline__ double fake_hypot (x, y)\\\n" - "\tdouble x, y;\\\n" - "#endif\\\n" - "{\\\n" - "\treturn fabs (hypot (x, y));\\\n" - "}\\\n" + * looking at its value, if the other is 0.0. + */ +fix = { + hackname = m88k_bad_hypot_opt; + mach = "m88k-motorola-sysv3*"; + files = "math.h"; + select = "^extern double hypot\\(\\);\n"; + c_fix = format; + c_fix_arg = "%0" + "/* Workaround a stupid Motorola optimization if one\n" + " of x or y is 0.0 and the other is negative! */\n" + "#ifdef __STDC__\n" + "static __inline__ double fake_hypot (double x, double y)\n" + "#else\n" + "static __inline__ double fake_hypot (x, y)\n" + "\tdouble x, y;\n" + "#endif\n" + "{\n" + "\treturn fabs (hypot (x, y));\n" + "}\n" "#define hypot\tfake_hypot\n"; + test_text = "extern double hypot();"; }; @@ -801,15 +1310,15 @@ fix = { hackname = m88k_bad_s_if; mach = "m88k-*-sysv3*"; files = sys/stat.h; - select = "#define[ \t]+S_IS[A-Z]*(m)[ \t]"; + select = "#define[ \t]+S_IS[A-Z]+\\(m\\)[ \t]+\\(m[ \t]*&"; - sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*" - "(m[ \t]*&[ \t]*\\(S_IF[A-Z][A-Z][A-Z][A-Z]*\\)[ \t]*)/" - "\\1 (((m)\\&S_IFMT)==\\2)/"; - - sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*" - "(m[ \t]*&[ \t]*\\(0[0-9]*\\)[ \t]*)/" - "\\1 (((m)\\&S_IFMT)==\\2)/"; + c_fix = format; + c_fix_arg = '#define %1(m) (((m) & S_IFMT) == %2)'; + c_fix_arg = "#define[ \t]+(S_IS[A-Z]+)\\(m\\)[ \t]+" + "\\(m[ \t]*&[ \t]*" + "(S_IF[A-Z][A-Z][A-Z]+|0[0-9]+)" + "[ \t]*\\)"; + test_text = '#define S_ISREG(m) (m & S_IFREG) /* is regular? */'; }; @@ -822,105 +1331,39 @@ fix = { mach = "m88k-tektronix-sysv3*"; files = "time.h"; bypass = "#ifndef"; - shell = - "echo Fixing $file, to protect against multiple inclusion. >&2 - cpp_wrapper=`echo $file | sed -e 's,\\.,_,g' -e 's,/,_,g'` - echo \"#ifndef __GCC_GOT_${cpp_wrapper}_\" - echo \"#define __GCC_GOT_${cpp_wrapper}_\" - cat - echo \"#endif /* ! __GCC_GOT_${cpp_wrapper}_ */\""; + c_fix = wrap; + test_text = ""; +}; + + +/* + * Fix BSD machine/ansi.h to use __builtin_va_list to define _BSD_VA_LIST_. + */ +fix = { + hackname = machine_ansi_h_va_list; + files = machine/ansi.h; + select = "define[ \t]+_BSD_VA_LIST_[ \t]"; + bypass = '__builtin_va_list'; + + c_fix = format; + c_fix_arg = "%1__builtin_va_list"; + c_fix_arg = "(define[ \t]+_BSD_VA_LIST_[ \t]+).*"; + + test_text = " # define _BSD_VA_LIST_\tchar**"; }; /* * Fix non-ansi machine name defines - * File selection is split into two parts: the shell version as - * a single patch, and the program version with each patch separate. - * Each is substantially faster for the particular environment. - * You have a dual maintenance problem here. */ fix = { - hackname = machine_name; - /* - * Select '#if.*' and '#elif" with possible non-ansi symbols - * The only non-ansi symbols we know about start with one of: - * MRS_bhimnprstuv - * If any are added to the substitution list, then add it to - * the selection list as well. Hopefully we can avoid names - * starting with "d" and "l", because this pattern would then - * match "defined" and "lint" as well. I suppose we could add - * a "bypass = lint" if we had to though. - * - * The fixinc_eol stuff is to work around a bug in the sed - */ - select = "^#[ \t]*(if|elif).*" - "[^a-zA-Z0-9_](_*[MSRrhim]|[Mbimnpstuv])[a-zA-Z0-9_]"; - exesel = "^#[ \t]*(if|elif).*[^a-zA-Z0-9_]" - "(" - "M32" - "|_*MIPSE[LB]" - "|_*SYSTYPE_[A-Z0-9]" - "|_*[Rr][34]000" - "|_*host_mips" - "|_*i386" - "|_*mips" - "|bsd4" - "|is68k" - "|m[68]8k" - "|mc680" - "|news" - "|ns32000" - "|pdp11" - "|pyr" - "|sel" - "|sony_news" - "|sparc" - "|sun" - "|tahoe" - "|tower" - "|u370" - "|u3b" - "|unix" - "|vax" - ")"; - - sed = ":loop\n" - '/\\\\$/' "N\n" - 's/\\\\$/\\\\+++fixinc_eol+++/' "\n" - '/\\\\$/' "b loop\n" - 's/\\\\+++fixinc_eol+++/\\\\/g' "\n" - - "/#[\t ]*[el]*if/ {\n" - "\ts/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g\n" - - "\ts/ M32 / __M32__ /g\n" - "\ts/ _*MIPSE\\([LB]\\) / __MIPSE\\1__ /g\n" - "\ts/ _*SYSTYPE_\\([A-Z0-9]*\\) / __SYSTYPE_\\1__ /g\n" - "\ts/ _*\\([Rr][34]\\)000 / __\\1000__ /g\n" - "\ts/ _*host_mips / __host_mips__ /g\n" - "\ts/ _*i386 / __i386__ /g\n" - "\ts/ _*mips / __mips__ /g\n" - "\ts/ bsd4\\([0-9]\\) / __bsd4\\1__ /g\n" - "\ts/ is68k / __is68k__ /g\n" - "\ts/ m68k / __m68k__ /g\n" - "\ts/ m88k / __m88k__ /g\n" - "\ts/ mc680\\([0-9]\\)0 / __mc680\\10__ /g\n" - "\ts/ news\\([0-9]*\\) / __news\\1__ /g\n" - "\ts/ ns32000 / __ns32000__ /g\n" - "\ts/ pdp11 / __pdp11__ /g\n" - "\ts/ pyr / __pyr__ /g\n" - "\ts/ sel / __sel__ /g\n" - "\ts/ sony_news / __sony_news__ /g\n" - "\ts/ sparc / __sparc__ /g\n" - "\ts/ sun\\([a-z0-9]*\\) / __sun\\1__ /g\n" - "\ts/ tahoe / __tahoe__ /g\n" - "\ts/ tower\\([_0-9]*\\) / __tower\\1__ /g\n" - "\ts/ u370 / __u370__ /g\n" - "\ts/ u3b\\([0-9]*\\) / __u3b\\1__ /g\n" - "\ts/ unix / __unix__ /g\n" - "\ts/ vax / __vax__ /g\n" - - "\ts/ \\([a-zA-Z0-9_][a-zA-Z0-9_]*\\) /\\1/g\n\t}"; + hackname = machine_name; + c_test = machine_name; + c_fix = machine_name; + + test_text = "/* MACH_DIFF: */\n" + "#if defined( i386 ) || defined( sparc ) || defined( vax )" + "\n/* no uniform test, so be careful :-) */"; }; @@ -929,129 +1372,127 @@ fix = { * the class exception defined in the C++ file std/stdexcept.h. We * redefine it to __math_exception. This is not a great fix, but I * haven't been able to think of anything better. + * Note that we have to put the #ifdef/#endif blocks at beginning + * and end of file, because fixproto runs after us and may insert + * additional references to struct exception. */ fix = { - hackname = math_exception; - files = math.h; - select = "struct exception"; - sed = "/struct exception/i\\\n" - "#ifdef __cplusplus\\\n" - "#define exception __math_exception\\\n" - "#endif\n"; - sed = "/struct exception/a\\\n" - "#ifdef __cplusplus\\\n" - "#undef exception\\\n" - "#endif\n"; + hackname = math_exception; + files = math.h; + select = "struct exception"; + bypass = 'We have a problem when using C\+\+'; + c_fix = wrap; - sed = "/matherr/i\\\n" - "#ifdef __cplusplus\\\n" - "#define exception __math_exception\\\n" - "#endif\n"; + c_fix_arg = "#ifdef __cplusplus\n" + "#define exception __math_exception\n" + "#endif\n"; - sed = "/matherr/a\\\n" - "#ifdef __cplusplus\\\n" - "#undef exception\\\n" - "#endif\n"; + c_fix_arg = "#ifdef __cplusplus\n" + "#undef exception\n" + "#endif\n"; -#ifdef MATH_EXCEPTION_FIXED - -I think this patch needs some more thinking. -This is from SVR4.2 (With '#' replaced with '@'). -Perhaps we could do without the "/matherr/a" entries? -Can we bypass the entire fix if someone was astute -enough to have '#ifdef __cplusplus' anywhere in the file? - - -*** /usr/include/math.h Fri Apr 3 18:54:59 1998 ---- math.h Sun May 9 07:28:58 1999 -*************** -*** 25,31 **** ---- 25,37 ---- - - @ifndef __cplusplus - -+ @ifdef __cplusplus -+ @define exception __math_exception -+ @endif - struct exception -+ @ifdef __cplusplus -+ @undef exception -+ @endif - { - int type; - char *name; -*************** -*** 34,40 **** ---- 40,58 ---- - double retval; - }; - -+ @ifdef __cplusplus -+ @define exception __math_exception -+ @endif -+ @ifdef __cplusplus -+ @define exception __math_exception -+ @endif - extern int matherr(struct exception *); -+ @ifdef __cplusplus -+ @undef exception -+ @endif -+ @ifdef __cplusplus -+ @undef exception -+ @endif - - @endif /*__cplusplus*/ -#endif + test_text = "typedef struct exception t_math_exception;"; }; /* - * In math.h, put #ifndefs around things that might be defined - * in a gcc specific math-*.h file. + * This looks pretty broken to me. ``dbl_max_def'' will contain + * "define DBL_MAX " at the start, when what we really want is just + * the value portion. Can't figure out how to write a test case + * for this either :-( */ fix = { - hackname = math_gcc_ifndefs; + hackname = math_huge_val_from_dbl_max; files = math.h; - - shell = - /* - * First see if we have a definition for DBL_MAX in float.h - * If we do, we will replace the one in math.h with that one. - */ - /* - * IF we have such a define *and* HUGE_VAL is defined to be DBL_MAX - * *and* DBL_MAX is _not_ defined in the current file (math.h), - * THEN replace the defined value of HUGE_VAL - * ELSE just copy stdin to stdout so the main filter can process it + * IF HUGE_VAL is defined to be DBL_MAX *and* DBL_MAX is _not_ defined + * in math.h, this fix applies. */ + select = "define[ \t]*HUGE_VAL[ \t]*DBL_MAX"; + bypass = "define[ \t]*DBL_MAX"; + shell = /* - * Put conditional guards around the HUGE_VAL definition. + * See if we have a definition for DBL_MAX in float.h. + * If we do, we will replace the one in math.h with that one. */ "\tdbl_max_def=`egrep 'define[ \t]+DBL_MAX[ \t]+.*' float.h " "2>/dev/null`\n\n" - "\tif ( test -n \"${dbl_max_def}\" \\\n" - "\t\t-a -n \"`egrep '#define[ \t]*HUGE_VAL[ \t]+DBL_MAX' $file`\" \\\n" - "\t\t-a -z \"`egrep '#define[ \t]+DBL_MAX[ \t]+' $file`\"\n" - "\t ) > /dev/null 2>&1\n" - "\tthen sed -e '/define[ \t]HUGE_VAL[ \t]DBL_MAX/s/DBL_MAX/$dbl_max_def/'" - "\n\telse cat ; fi |\n" + "\tif ( test -n \"${dbl_max_def}\" ) > /dev/null 2>&1\n" + "\tthen sed -e '/define[ \t]*HUGE_VAL[ \t]*DBL_MAX/" + "s/DBL_MAX/'\"$dbl_max_def/\"\n" + "\telse cat\n" + "\tfi"; +}; + + +/* + * In any case, put #ifndef .. #endif around #define HUGE_VAL in math.h. + */ +fix = { + hackname = math_huge_val_ifndef; + files = math.h; + files = math/math.h; + select = "define[ \t]+HUGE_VAL"; + + c_fix = format; + c_fix_arg = "#ifndef HUGE_VAL\n%0\n#endif"; + c_fix_arg = "^[ \t]*#[ \t]*define[ \t]+HUGE_VAL[ \t].*"; + + test_text = "# define\tHUGE_VAL 3.4e+40"; +}; + - "\tsed -e'/define[ \t]HUGE_VAL[ \t]/i\\\n#ifndef HUGE_VAL\n' " - "-e'/define[ \t]HUGE_VAL[ \t]/a\\\n#endif\n'"; +/* + * Fix nested comments in Motorola's and + */ +fix = { + hackname = nested_motorola; + mach = "m68k-motorola-sysv*"; + files = limits.h; + files = sys/limits.h; + sed = "s@^\\(#undef[ \t][ \t]*PIPE_BUF[ \t]*" + "/\\* max # bytes atomic in write to a\\)$@\\1 */@"; + sed = "s@\\(/\\*#define\tHUGE_VAL\t3.[0-9e+]* \\)" + "\\(/\\*error value returned by Math lib\\*/\\)$@\\1*/ \\2@"; }; /* + * Fixing nested comments in ISC + */ +fix = { + hackname = nested_sys_limits; + files = sys/limits.h; + select = CHILD_MAX; + sed = "/CHILD_MAX/s,/\\* Max, Max,"; + sed = "/OPEN_MAX/s,/\\* Max, Max,"; + test_text = "/*\n#define CHILD_MAX 20 /* Max, Max, ... */ /*\n" + "#define OPEN_MAX 20 /* Max, Max, ... */\n"; +}; + +/* * nested comment */ fix = { - hackname = nested_comment; - files = rpc/rpc.h; - sed = 's@^\(/\*.*rpc/auth_des.h>.*\)/\*@\1*/ /*@'; + hackname = nested_auth_des; + files = rpc/rpc.h; + select = '(/\*.*rpc/auth_des\.h>.*)/\*'; + c_fix = format; + c_fix_arg = "%1*/ /*"; + test_text = "/*#include /* skip this */"; +}; + + +/* + * Avoid nested comments on Ultrix 4.3. + */ +fix = { + hackname = nested_ultrix; + files = rpc/svc.h; + sed = "s@^\\( \\*\tint protocol; \\)/\\*@\\1*/ /*@"; }; @@ -1061,11 +1502,11 @@ fix = { fix = { hackname = news_os_recursion; files = stdlib.h; - select = "#include "; - sed = "/^#include /i\\\n" - "#ifdef BOGUS_RECURSION\n"; - sed = "/^#include /a\\\n" - "#endif\n"; + select = "[ \t]*#include .*"; + + c_fix = format; + c_fix_arg = "#ifdef BOGUS_RECURSION\n%0\n#endif"; + test_text = "#include "; }; @@ -1074,32 +1515,32 @@ fix = { * These conflict with the built-in functions. */ fix = { - hackname = next_math_prefix; - files = ansi/math.h; - select = "^extern.*double.*__const__.*"; + hackname = next_math_prefix; + files = ansi/math.h; + select = "^extern[ \t]+double[ \t]+__const__[ \t]"; - sed = "/^extern.*double.*__const__.*sqrt(/s/__const__//"; - sed = "/^extern.*double.*__const__.*fabs(/s/__const__//"; - sed = "/^extern.*double.*__const__.*cos(/s/__const__//"; - sed = "/^extern.*double.*__const__.*hypot(/s/__const__//"; - sed = "/^extern.*double.*__const__.*sin(/s/__const__//"; + c_fix = format; + c_fix_arg = "extern double %1("; + c_fix_arg = "^extern[ \t]+double[ \t]+__const__[ \t]+([a-z]+)\\("; + + test_text = "extern\tdouble\t__const__\tmumble();"; }; /* * NeXT 3.2 uses the word "template" as a parameter for some * functions. GCC reports an invalid use of a reserved key word - * with the built-in functions. NeXT 3.2 includes the keyword - * volatile in the prototype for abort(). This conflicts with - * the built-in definition. + * with the built-in functions. */ fix = { hackname = next_template; files = bsd/libc.h; - select = template; + select = "[ \t]template\\)"; - sed = '/\(.*template\)/s/template//'; - sed = "/extern.*volatile.*void.*abort/s/volatile//"; + c_fix = format; + c_fix_arg = "(%1)"; + c_fix_arg = "\\(([^)]*)[ \t]template\\)"; + test_text = "extern mumble( char * template); /* fix */"; }; @@ -1110,10 +1551,13 @@ fix = { fix = { hackname = next_volitile; files = ansi/stdlib.h; - select = volatile; + select = "^extern[ \t]+volatile[ \t]+void[ \t]"; + + c_fix = format; + c_fix_arg = "extern void %1("; + c_fix_arg = "^extern[ \t]+volatile[ \t]+void[ \t]+(exit|abort)\\("; - sed = "/extern.*volatile.*void.*exit/s/volatile//"; - sed = "/extern.*volatile.*void.*abort/s/volatile//"; + test_text = "extern\tvolatile\tvoid\tabort();"; }; @@ -1124,12 +1568,13 @@ fix = { * conditional, so it doesn't need this fix. So everything is okay. */ fix = { - hackname = next_wait_union; - files = sys/wait.h; + hackname = next_wait_union; + files = sys/wait.h; - select = 'wait\(union wait'; - - sed = "s@wait(union wait@wait(void@"; + select = 'wait\(union wait'; + c_fix = format; + c_fix_arg = "wait(void"; + test_text = "extern pid_d wait(union wait*);"; }; @@ -1137,9 +1582,12 @@ fix = { * a missing semi-colon at the end of the nodeent structure definition. */ fix = { - hackname = nodeent_syntax; - files = netdnet/dnetdb.h; - sed = "s/char.*na_addr *$/char *na_addr;/"; + hackname = nodeent_syntax; + files = netdnet/dnetdb.h; + select = "char[ \t]*\\*na_addr[ \t]*$"; + c_fix = format; + c_fix_arg = "%0;"; + test_text = "char *na_addr\t"; }; @@ -1157,23 +1605,33 @@ fix = { test = " -n \"`grep '} regex_t;' reg_types.h`\""; test = " -z \"`grep __regex_t regex.h`\""; - sed = "s/regex_t/__regex_t/g"; - sed = "s/regoff_t/__regoff_t/g"; - sed = "s/regmatch_t/__regmatch_t/g"; + c_fix = format; + c_fix_arg = "__%0"; + c_fix_arg = "reg(ex|off|match)_t[^;]"; + + test_text = "`touch inc/sys/lc_core.h`" + "typedef struct {\n int stuff, mo_suff;\n} regex_t;\n" + "extern regex_t re;\n" + "extern regoff_t ro;\n" + "extern regmatch_t rm;\n"; }; fix = { - hackname = osf_namespace_b; + hackname = osf_namespace_c; files = regex.h; test = " -r reg_types.h"; test = " -r sys/lc_core.h"; test = " -n \"`grep '} regex_t;' reg_types.h`\""; test = " -z \"`grep __regex_t regex.h`\""; - sed = "/#include /a\\\n" - "typedef __regex_t\tregex_t;\\\n" - "typedef __regoff_t\tregoff_t;\\\n" - "typedef __regmatch_t\tregmatch_t;\n"; + select = "#include .*"; + c_fix = format; + c_fix_arg = "%0\n" + "typedef __regex_t\tregex_t;\n" + "typedef __regoff_t\tregoff_t;\n" + "typedef __regmatch_t\tregmatch_t;"; + + test_text = "#include "; }; @@ -1183,37 +1641,43 @@ fix = { * This is the default for all ANSI standard C++ compilers. */ fix = { - hackname = pthread_page_size; - files = pthread.h; - select = "^int __page_size"; - sed = "s/^int __page_size/extern int __page_size/"; + hackname = pthread_page_size; + files = pthread.h; + select = "^int __page_size"; + c_fix = format; + c_fix_arg = "extern %0"; + test_text = "int __page_size;"; }; /* * Fix return type of fread and fwrite on sysV68 */ -#ifdef LATER fix = { hackname = read_ret_type; files = stdio.h; - sed = "s/^\\(extern int\tfclose(), fflush()\\), " - "\\(fread(), fwrite()\\)\\(.*\\)$" - "/extern unsigned int\t\\2;\\\n\\1\\3/"; + select = "extern int\t.*, fread\\(\\), fwrite\\(\\)"; + c_fix = format; + c_fix_arg = "extern unsigned int fread(), fwrite();\n%1%2"; + c_fix_arg = "(extern int\t.*), fread\\(\\), fwrite\\(\\)(.*)"; + + test_text = "extern int\tfclose(), fflush(), fread(), fwrite(), foo();"; }; -#endif /* * function class(double x) conflicts with C++ keyword on rs/6000 */ fix = { - hackname = rs6000_double; - files = math.h; - select = '[^a-zA-Z_]class\('; - - sed = "/class[(]/i\\\n#ifndef __cplusplus\n"; - sed = "/class[(]/a\\\n#endif\n"; + hackname = rs6000_double; + files = math.h; + select = '[^a-zA-Z_]class\('; + + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; + c_fix_arg = '^.*[^a-zA-Z_]class\(.*'; + + test_text = "extern int class();"; }; @@ -1221,10 +1685,12 @@ fix = { * Wrong fchmod prototype on RS/6000. */ fix = { - hackname = rs6000_fchmod; - files = sys/stat.h; - select = 'fchmod\(char'; - sed = 's/fchmod(char \*/fchmod(int/'; + hackname = rs6000_fchmod; + files = sys/stat.h; + select = 'fchmod\(char \*'; + c_fix = format; + c_fix_arg = "fchmod(int"; + test_text = "extern int fchmod(char *, mode_t);"; }; @@ -1232,12 +1698,87 @@ fix = { * parameters conflict with C++ new on rs/6000 */ fix = { - hackname = rs6000_param; - files = "stdio.h"; - files = "unistd.h"; + hackname = rs6000_param; + files = "stdio.h"; + files = "unistd.h"; + + select = 'rename\(const char \*old, const char \*new\)'; + c_fix = format; + c_fix_arg = 'rename(const char *_old, const char *_new)'; + + test_text = 'extern int rename(const char *old, const char *new);'; +}; + + +/* + * The static functions lstat() and fchmod() in + * cause G++ grief since they're not wrapped in "if __cplusplus". + * + * On SCO OpenServer 5.0.0 through (at least) 5.0.5 contains + * tiny static wrappers that aren't C++ safe. + */ +fix = { + hackname = sco_static_func; + files = sys/stat.h; + mach = "i?86-*-sco3.2*"; + select = "^static int"; + + sed = "/^static int/i\\\n" + "#if __cplusplus\\\n" + "extern \"C\" {\\\n" + "#endif /* __cplusplus */"; + + sed = "/^}$/a\\\n" + "#if __cplusplus\\\n" + " }\\\n" + "#endif /* __cplusplus */"; + + test_text = + "#ifdef __STDC__\n" + "static int\tstat(const char *__f, struct stat *__p) {\n" + "\treturn __stat32(__f, __p);\n" + "}\n\n# else /* !__STDC__ */\n" - sed = 's@rename(const char \*old, const char \*new)@' - 'rename(const char *_old, const char *_new)@'; + "static int\tstat(__f, __p)\n" + "\tchar *__f;\n" + "\tstruct stat *__p;\n" + "{\n" + "\treturn __stat32(__f, __p);\n" + "}\n" + "#endif"; +}; + + +/* + * "!__STDC__" is "!defined( __STRICT_ANSI__ )" + */ +fix = { + hackname = sco_strict_ansi; + mach = "i?86-*-sco3.2*"; + select = "^[ \t]*#[ \t]*if.*!__STDC__"; + + c_fix = format; + c_fix_arg = "%1defined(__STRICT_ANSI__)%2"; + c_fix_arg = "^([ \t]*#[ \t]*if[ \t].*!)__STDC__(.*)"; + + test_text = "#if !__STDC__ /* not standard C */\nint foo;\n#endif"; +}; + + +/* + * Fix prototype declaration of utime in sys/times.h. + * In 3.2v4.0 the const is missing. + */ +fix = { + hackname = sco_utime; + files = sys/times.h; + mach = "i?86-*-sco3.2v4*"; + + select = '\(const char \*, struct utimbuf \*\);'; + c_fix = format; + c_fix_arg = '(const char *, const struct utimbuf *);'; + + test_text = "extern int utime(const char *, struct utimbuf *);"; }; @@ -1254,6 +1795,23 @@ fix = { }; #endif + +/* + * Sony NEWSOS 5.0 does not support the complete ANSI C standard. + */ +#ifdef SONY +fix = { + hackname = sony_stdio; + files = stdio.h; + test = " -x /bin/sony"; + test = " ! -z \"`if /bin/sony ; then echo true ; fi`\""; + sed = "s/__filbuf/_filbuf/g\n" + "s/__flsbuf/_flsbuf/g\n" + "s/__iob/_iob/g"; +}; +#endif + + /* * Incorrect #include in Sony News-OS 3.2. */ @@ -1280,6 +1838,7 @@ fix = { }; #endif + /* * Add a `static' declaration of `getrnge' into . * @@ -1298,78 +1857,139 @@ fix = { }; #endif + /* * a missing semi-colon at the end of the statsswtch structure definition. */ fix = { - hackname = statsswtch; - files = rpcsvc/rstat.h; - select = "boottime$"; - sed = "s/boottime$/boottime;/"; + hackname = statsswtch; + files = rpcsvc/rstat.h; + select = "boottime$"; + c_fix = format; + c_fix_arg = "boottime;"; + test_text = "struct statswtch {\n int boottime\n};"; +}; + + +/* + * Arrange for stdio.h to use stdarg.h to define __gnuc_va_list. + * On 4BSD-derived systems, stdio.h defers to machine/ansi.h; that's + * OK too. + */ +fix = { + hackname = stdio_stdarg_h; + files = stdio.h; + bypass = "include.*(stdarg\.h|machine/ansi\.h)"; + + c_fix = wrap; + + c_fix_arg = "#define __need___va_list\n#include \n"; + + test_text = ""; }; /* * Don't use or define the name va_list in stdio.h. * This is for ANSI and also to interoperate properly with gcc's varargs.h. - * Arrange for stdio.h to use stdarg.h to define __gnuc_va_list + * Note _BSD_VA_LIST_ is dealt with elsewhere. */ fix = { hackname = stdio_va_list; files = stdio.h; + bypass = '__gnuc_va_list|_BSD_VA_LIST_'; /* * Use __gnuc_va_list in arg types in place of va_list. * On 386BSD use __gnuc_va_list instead of _VA_LIST_. We're hoping the * trailing parentheses and semicolon save all other systems from this. - * Define __va_list__ (something harmless and unused) instead of va_list. + * Define __not_va_list__ (something harmless and unused) + * instead of va_list. * Don't claim to have defined va_list. */ - shell = - "if ( egrep \"__need___va_list\" $file ) > /dev/null 2>&1 ; then - : - else - echo \"#define __need___va_list\" - echo \"#include \" - fi + sed = "s@ va_list @ __gnuc_va_list @\n" + "s@ va_list)@ __gnuc_va_list)@\n" + "s@ _VA_LIST_));@ __gnuc_va_list));@\n" + "s@ va_list@ __not_va_list__@\n" + "s@\\*va_list@*__not_va_list__@\n" + "s@ __va_list)@ __gnuc_va_list)@\n" + "s@typedef[ \t]\\(.*\\)[ \t]va_list[ \t]*;" + "@typedef \\1 __not_va_list__;@\n" + "s@GNUC_VA_LIST@GNUC_Va_LIST@\n" + "s@_NEED___VA_LIST@_NEED___Va_LIST@\n" + "s@VA_LIST@DUMMY_VA_LIST@\n" + "s@_Va_LIST@_VA_LIST@"; +}; + + +/* + * Check for strict ansi compliance + */ +#ifdef STRICT_ANSI +fix = { + hackname = strict_ansi; + select = "__STDC__[ \t]*[=!]=[ \t]*[01]"; + sed = "s/__STDC__[ \t]*==[ \t]*0/!defined (__STRICT_ANSI__)/g"; + sed = "s/__STDC__[ \t]*!=[ \t]*0/defined (__STRICT_ANSI__)/g"; + sed = "s/__STDC__[ \t]*==[ \t]*1/defined (__STRICT_ANSI__)/g"; + sed = "s/__STDC__[ \t]*!=[ \t]*1/!defined (__STRICT_ANSI__)/g"; +}; +#endif + - sed -e 's@ va_list @ __gnuc_va_list @' \\ - -e 's@ va_list)@ __gnuc_va_list)@' \\ - -e 's@ _BSD_VA_LIST_));@ __gnuc_va_list));@' \\ - -e 's@ _VA_LIST_));@ __gnuc_va_list));@' \\ - -e 's@ va_list@ __va_list__@' \\ - -e 's@\\*va_list@*__va_list__@' \\ - -e 's@ __va_list)@ __gnuc_va_list)@' \\ - -e 's@GNUC_VA_LIST@GNUC_Va_LIST@' \\ - -e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \\ - -e 's@VA_LIST@DUMMY_VA_LIST@' \\ - -e 's@_Va_LIST@_VA_LIST@'"; +/* + * IRIX 4.0.5 uses struct __file_s + * in prototype without previous definition. + */ +fix = { + hackname = struct_file; + files = rpc/xdr.h; + select = '^.*xdrstdio_create.*struct __file_s'; + c_fix = format; + c_fix_arg = "struct __file_s;\n%0"; + test_text = "extern void xdrstdio_create( struct __file_s* );"; }; /* - * Check for strict ansi compliance + * IRIX 4.0.5 uses struct sockaddr + * in prototype without previous definition. */ -#ifdef STRICT_ANSI fix = { - hackname = strict_ansi; - select = "__STDC__[ \t]*[=!]=[ \t]*[01]"; - sed = "s/__STDC__[ \t]*==[ \t]*0/!defined (__STRICT_ANSI__)/g"; - sed = "s/__STDC__[ \t]*!=[ \t]*0/defined (__STRICT_ANSI__)/g"; - sed = "s/__STDC__[ \t]*==[ \t]*1/defined (__STRICT_ANSI__)/g"; - sed = "s/__STDC__[ \t]*!=[ \t]*1/!defined (__STRICT_ANSI__)/g"; + hackname = struct_sockaddr; + files = rpc/auth.h; + select = "^.*authdes_create.*struct sockaddr"; + bypass = ""; + c_fix = format; + c_fix_arg = "struct sockaddr;\n%0"; + test_text = "extern AUTH* authdes_create( struct sockaddr* );"; }; -#endif + /* - * Fix bogus #ifdef on SunOS 4.1. + * Apply fix this to all OSs since this problem seems to effect + * more than just SunOS. */ fix = { - hackname = sun_bogus_ifdef; - files = "hsfs/hsfs_spec.h"; - files = "hsfs/iso_spec.h"; - select = '#ifdef __i386__ || __vax__'; - sed = "s/\\#ifdef __i386__ || __vax__/\\#if __i386__ || __vax__/g"; + hackname = sun_auth_proto; + files = rpc/auth.h; + files = rpc/clnt.h; + files = rpc/svc.h; + files = rpc/xdr.h; + /* + * Select those files containing '(*name)()'. + */ + select = '\(\*[a-z][a-z_]*\)\(\)'; + + c_fix = format; + c_fix_arg = "#ifdef __cplusplus\n%1(...);%2\n" + "#else\n%1();%2\n#endif"; + c_fix_arg = '(.*\(\*[a-z][a-z_]*\))\(\);(.*)'; + + test_text = + "struct auth_t {\n" + " int (*name)(); /* C++ bad */\n" + "};"; }; @@ -1377,10 +1997,14 @@ fix = { * Fix bogus #ifdef on SunOS 4.1. */ fix = { - hackname = sun_bogus_ifdef_sun4c; - files = "hsfs/hsnode.h"; - select = '#ifdef __i386__ || __sun4c__'; - sed = "s/\\#ifdef __i386__ || __sun4c__/\\#if __i386__ || __sun4c__/g"; + hackname = sun_bogus_ifdef; + files = "hsfs/hsfs_spec.h"; + files = "hsfs/iso_spec.h"; + select = '#ifdef(.*\|\|.*)'; + c_fix = format; + c_fix_arg = "#if%1"; + + test_text = "#ifdef __i386__ || __vax__ || __sun4c__"; }; @@ -1388,16 +2012,18 @@ fix = { * Fix the CAT macro in SunOS memvar.h. */ fix = { - hackname = sun_catmacro; - files = pixrect/memvar.h; - select = "^#define[ \t]+CAT(a,b)"; - sed = "/^#define[ \t]CAT(a,b)/ i\\\n" - "#ifdef __STDC__ \\\n" - "#define CAT(a,b) a##b\\\n" - "#else\n"; + hackname = sun_catmacro; + files = pixrect/memvar.h; + select = "^#define[ \t]+CAT\\(a,b\\).*"; + c_fix = format; + + c_fix_arg = + "#ifdef __STDC__\n" + "# define CAT(a,b) a##b\n" + "#else\n%0\n#endif"; - sed = "/^#define[ \t]CAT(a,b)/ a\\\n" - "#endif\n"; + test_text = + "#define CAT(a,b)\ta/**/b"; }; @@ -1413,41 +2039,12 @@ fix = { sed = "s/int[ \t][ \t]*free/void\tfree/g"; sed = "s/char\\([ \t]*\\*[ \t]*malloc\\)/void\\1/g"; sed = "s/char\\([ \t]*\\*[ \t]*realloc\\)/void\\1/g"; -}; - - -/* - * Fix non-ANSI memcpy declaration that conflicts with gcc's builtin - * declaration on Sun OS 4.x. We must only fix this on Sun OS 4.x, because - * many other systems have similar text but correct versions of the file. - * To ensure only Sun's is fixed, we grep for a likely unique string. - * Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t ) - */ -fix = { - hackname = sun_memcpy; - files = memory.h; - select = "/\\*\t@\\(#\\)" - "(head/memory.h\t50.1\t " - "|memory\\.h 1\\.[2-4] 8./../.. SMI; from S5R2 1\\.2\t)\\*/"; - - sed = "1i\\\n/* This file was generated by fixincludes */\\\n" - "#ifndef __memory_h__\\\n" - "#define __memory_h__\\\n\\\n" - "#ifdef __STDC__\\\n" - "extern void *memccpy();\\\n" - "extern void *memchr();\\\n" - "extern void *memcpy();\\\n" - "extern void *memset();\\\n" - "#else\\\n" - "extern char *memccpy();\\\n" - "extern char *memchr();\\\n" - "extern char *memcpy();\\\n" - "extern char *memset();\\\n" - "#endif /* __STDC__ */\\\n\\\n" - "extern int memcmp();\\\n\\\n" - "#endif /* __memory_h__ */\n"; - sed = "1,$d"; + test_text = + "typedef char *\tmalloc_t;\n" + "int \tfree();\n" + "char*\tmalloc();\n" + "char*\trealloc();"; }; @@ -1459,6 +2056,7 @@ fix = { files = rpcsvc/rusers.h; select = "_cnt$"; sed = "/^struct/,/^};/s/_cnt$/_cnt;/"; + test_text = "struct mumble\n int _cnt\n};"; }; @@ -1470,45 +2068,15 @@ fix = { hackname = sun_signal; files = sys/signal.h; files = signal.h; - select = "^void\t" '\(\*signal\(\)\)\(\);'; + select = "^void\t" '\(\*signal\(\)\)\(\);.*'; - sed = "/^void\t" '(\*signal())();$/i' "\\\n" - "#ifdef __cplusplus" "\\\n" - "void\t(*signal(...))(...);" "\\\n" - "#else" "\n"; + c_fix = format; + c_fix_arg = + "#ifdef __cplusplus\n" + "void\t(*signal(...))(...);\n" + "#else\n%0\n#endif"; - sed = "/^void\t" '(\*signal())();$/a' "\\\n" - '#endif' "\n"; -}; - - -/* - * Apply fix this to all OSs since this problem seems to effect - * more than just SunOS. In general, fixes which are triggered - * by a specific target are bad. - */ -fix = { - hackname = sun_auth_proto; - files = rpc/auth.h; - files = rpc/clnt.h; - files = rpc/svc.h; - files = rpc/xdr.h; - /* - * Select those files containing '(*name)()' but *not* - * containing '(*name)(junk)'. The change would be innocuous - * but there is no point bothering if the fix is not needed. - */ - select = '\(\*[a-z][a-z_]*\)\(\)'; - bypass = '\(\*[a-z][a-z_]*\)\(' "[ \t]*[a-zA-Z.].*" '\)'; - sed = 's' - '/^\(.*(\*[a-z][a-z_]*)(\)' '\();.*\)' - "/\\\n" - "#ifdef __cplusplus\\\n" - '\1...\2' "\\\n" - "#else\\\n" - '\1\2' "\\\n" - "#endif" - "/"; + test_text = "void\t(*signal())();"; }; @@ -1517,14 +2085,17 @@ fix = { * of struct exception, so the prototype (added by fixproto) causes havoc. */ fix = { - hackname = sunos_matherr_decl; - files = math.h; - /* - * Once a declaration for 'struct exception' is found, - * stop trying to insert a forward reference for it. - */ - sed = "/^struct exception/,$b"; - sed = "/matherr/i\\\nstruct exception;\n"; + hackname = sunos_matherr_decl; + files = math.h; + + /* If matherr has a prototype already, the header needs no fix. */ + bypass = 'matherr.*struct exception'; + select = matherr; + + c_fix = wrap; + c_fix_arg = "struct exception;\n"; + + test_text = "extern int matherr();"; }; @@ -1534,7 +2105,10 @@ fix = { fix = { hackname = sunos_strlen; files = strings.h; - sed = "s/int[ \t]*strlen();/__SIZE_TYPE__ strlen();/"; + select = "int[ \t]*strlen\\(\\);(.*)"; + c_fix = format; + c_fix_arg = "__SIZE_TYPE__ strlen();%1"; + test_text = " int\tstrlen(); /* string length */"; }; @@ -1543,16 +2117,17 @@ fix = { * which conflicts with the fixproto definition. The fixproto * definition and the Solaris definition are used the same way. */ -#ifdef SVR4 fix = { hackname = svr4__p; files = math.h; files = floatingpoint.h; - select = "^#define[ \t]*__P"; - sed = "/^#define[ \t]*__P/i\\\n#ifndef __P\n"; - sed = "/^#define[ \t]*__P/a\\\n#endif\n"; + select = "^#define[ \t]+__P.*"; + c_fix = format; + c_fix_arg = "#ifndef __P\n%0\n#endif"; + + test_text = "#define __P(a) a"; }; -#endif + /* * Disable apparent native compiler optimization cruft in SVR4.2 @@ -1568,13 +2143,25 @@ fix = { }; #endif + /* * Conditionalize some of on __GNUC__ and __GNUG__. + * On some systems (UnixWare 2, UnixWare 7), the file is byteorder.h + * but we still "hijack" it and redirect it to the GNU byteorder.h.. + * + * */ -#ifdef SVR4 +#ifdef SVR5 fix = { hackname = svr4_endian; files = sys/endian.h; +#ifdef LATER + /* + * since we emit our own sys/byteorder.h, + * this fix can never be applied to that file. + */ + files = sys/byteorder.h; +#endif bypass = '__GNUC__'; sed = "/#\tifdef\t__STDC__/i\\\n" @@ -1585,7 +2172,8 @@ fix = { sed = "/# include\t/i\\\n" "# endif /* !defined (__GNUC__) && !defined (__GNUG__) */\n"; }; -#endif +#endif /* SVR5 */ + /* * Remove useless extern keyword from struct forward declarations @@ -1653,16 +2241,19 @@ fix = { /* * Fix broken decl of getcwd present on some svr4 systems. */ -#ifdef SVR4 fix = { hackname = svr4_getcwd; files = stdlib.h; files = unistd.h; + files = prototypes.h; select = 'getcwd\(char \*, int\)'; - sed = 's/getcwd(char \*, int)/getcwd(char *, size_t)/'; + c_fix = format; + c_fix_arg = "getcwd(char *, size_t)"; + + test_text = "extern char* getcwd(char *, int);"; }; -#endif + /* * set ifdef _KERNEL @@ -1679,8 +2270,11 @@ fix = { files = sys/cmn_err.h; files = sys/kdebugger.h; bypass = '_KERNEL'; - sed = "1i\\\n#ifdef _KERNEL"; - sed = "$a\\\n#endif /* _KERNEL */"; + c_fix = wrap; + + c_fix_arg = "#ifdef _KERNEL\n"; + c_fix_arg = "#endif /* _KERNEL */\n"; + test_text = ""; }; #endif @@ -1700,33 +2294,23 @@ fix = { }; #endif + /* * Fix declarations of `makedev', `major', and `minor' in . + * They are declared as non-static then immediately redeclared as static. */ -#ifdef SVR4 +#ifdef SVR5 fix = { hackname = svr4_mkdev; files = sys/mkdev.h; + select = '^static'; - sed = "/^dev_t makedev(const/c\\\n" - "static dev_t makedev(const major_t, const minor_t);"; - - sed = "/^dev_t makedev()/c\\\n" - "static dev_t makedev();"; - - sed = "/^major_t major(const/c\\\n" - "static major_t major(const dev_t);"; - - sed = "/^major_t major()/c\\\n" - "static major_t major();"; - - sed = "/^minor_t minor(const/c\\\n" - "static minor_t minor(const dev_t);"; - - sed = "/^minor_t minor()/c\\\n" - "static minor_t minor();"; + sed = "/^dev_t makedev(/s/^/static /"; + sed = "/^major_t major(/s/^/static /"; + sed = "/^minor_t minor(/s/^/static /"; }; -#endif +#endif /* SVR5 */ + /* * Fix reference to NC_NPI_RAW in . @@ -1754,45 +2338,24 @@ fix = { }; #endif -/* - * Completely replace with a file that includes gcc's - * stdarg.h or varargs.h files as appropriate. - */ -#ifdef SVR4 -fix = { - hackname = svr4_no_varargs; - files = sys/varargs.h; - shell = "cat > /dev/null\n" - "cat << _EOF_\n" - "/* This file was generated by fixincludes. */\n" - "#ifndef _SYS_VARARGS_H\n" - "#define _SYS_VARARGS_H\n\n" - - "#ifdef __STDC__\n" - "#include \n" - "#else\n" - "#include \n" - "#endif\n\n" - - "#endif /* _SYS_VARARGS_H */\n" - "_EOF_"; -}; -#endif /* * Fix broken decl of profil present on some svr4 systems. */ -#ifdef SVR4 fix = { hackname = svr4_profil; files = stdlib.h; files = unistd.h; - sed = 's/profil(unsigned short \*, unsigned int, ' - 'unsigned int, unsigned int)' - '/profil(unsigned short *, size_t, int, unsigned)/'; + select = + 'profil\(unsigned short \*, unsigned int, unsigned int, unsigned int\)'; + c_fix = format; + c_fix_arg = 'profil(unsigned short *, size_t, int, unsigned int)'; + + test_text = + 'profil(unsigned short *, unsigned int, unsigned int, unsigned int);'; }; -#endif + /* * Convert functions to prototype form, and fix arg names in . @@ -1874,13 +2437,24 @@ fix = { }; #endif + +/* + * Like svr4_mach_defines, but with newfangled syntax. + * Source lines are of #define __i386 #machine(i386). Delete them. + */ +#ifdef SVR5 +fix = { + hackname = svr5_mach_defines; + files = ieeefp.h; + select = "#define[ \t]*__i386.*\(i386\)"; + sed = "/#define[ \t]*__i386.*/d"; +}; +#endif /* SVR5 */ + + /* - * Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn} - * in string.h on sysV68 - * Correct the return type for strlen in string.h on Lynx. - * Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0. - * Add missing const for strdup on OSF/1 V3.0. - * On sysV88 layout is slightly different. + * Fix these files to use the same types that we think they should. + * XXX - extremely dubious changes here. */ fix = { hackname = systypes; @@ -1933,28 +2507,32 @@ fix = { /* - * Fix return type of exit and abort in on SunOS 4.1. - * Also wrap protection around size_t for m88k-sysv3 systems. - * We use a funny name to ensure it follows 'systypes' fix. + * Fix files that may contain a stray definition of size_t. Take care + * not to match ssize_t or mere uses of size_t. */ fix = { - hackname = systypes_for_aix; + hackname = systypes_stdlib_size_t; files = sys/types.h; - select = "typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t"; - bypass = "_GCC_SIZE_T"; + files = stdlib.h; + select = "typedef[ \t]+[A-Za-z_][ \tA-Za-z_]*[ \t]size_t.*"; + bypass = "_(GCC|BSD)_SIZE_T"; - sed = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/i\\\n" - "#ifndef _GCC_SIZE_T\\\n" - "#define _GCC_SIZE_T\n"; + c_fix = format; + c_fix_arg = + "#ifndef _GCC_SIZE_T\n" + "#define _GCC_SIZE_T\n%0\n#endif"; - sed = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/a\\\n" - "#endif\n"; + test_text = "typedef unsigned int size_t; /* size of something */"; }; /* - * if the #if says _cplusplus, not the double underscore __cplusplus - * that it should be + * Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn} + * in string.h on sysV68 + * Correct the return type for strlen in string.h on Lynx. + * Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0. + * Add missing const for strdup on OSF/1 V3.0. + * On sysV88 layout is slightly different. */ fix = { hackname = sysv68_string; @@ -1974,26 +2552,21 @@ fix = { /* - * Fix return type of exit and abort in - * Also wrap protection around size_t. + * Fix return type of calloc, malloc, realloc, bsearch and exit */ fix = { hackname = sysz_stdlib_for_sun; files = stdlib.h; - sed = "s/int\tabort/void\tabort/g"; - sed = "s/int\tfree/void\tfree/g"; - sed = "s/char[ \t]*\\*[ \t]*calloc/void \\*\tcalloc/g"; - sed = "s/char[ \t]*\\*[ \t]*malloc/void \\*\tmalloc/g"; - sed = "s/char[ \t]*\\*[ \t]*realloc/void \\*\trealloc/g"; - sed = "s/int[ \t][ \t]*exit/void\texit/g"; + select = "char[ \t]*\\*[ \t]*(calloc|malloc|realloc|bsearch)[ \t]*\\("; + c_fix = format; + c_fix_arg = "void *\t%1("; - sed = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/i\\\n" - "#ifndef _GCC_SIZE_T\\\n" - "#define _GCC_SIZE_T\n"; - - sed = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/a\\\n" - "#endif\n"; + test_text = + "extern char*\tcalloc(size_t);\n" + "extern char*\tmalloc(size_t);\n" + "extern char*\trealloc(void*,size_t);\n" + "extern char*\tbsearch(void*,size_t,size_t);\n"; }; @@ -2028,55 +2601,26 @@ fix = { /* - * Fix this file to avoid interfering with stddef.h, - * but don't mistakenly match ssize_t present in AIX for the ps/2, - * or typedefs which use (but do not set) size_t. + * if the #if says _cplusplus, not the double underscore __cplusplus + * that it should be */ fix = { hackname = tinfo_cplusplus; files = tinfo.h; + select = "[ \t]_cplusplus"; sed = "s/[ \t]_cplusplus/ __cplusplus/"; }; /* - * Cancel out ansi_compat.h on Ultrix. Replace it with empty file. - */ -fix = { - hackname = ultrix_ansi_compat; - files = ansi_compat.h; - select = ULTRIX; - sed = "1i\\\n/* This file intentionally left blank. */\n"; - sed = "1,$d"; -}; - - -/* - * Ultrix V4.[35] puts the declaration of uname before the definition - * of struct utsname, so the prototype (added by fixproto) causes havoc. - */ -fix = { - hackname = ultrix_fix_fixproto; - files = sys/utsname.h; - select = ULTRIX; - sed = "/^[ \t]*extern[ \t]*int[ \t]*uname();$/i\\\n" - "struct utsname;\n"; -}; - - -/* * parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R. - * also get rid of bogus inline definitions in HP-UX 8.0 */ fix = { hackname = ultrix_atof_param; files = math.h; + select = "atof\\([ \t]*char"; sed = "s@atof(\\([ \t]*char[ \t]*\\*[^)]*\\))@atof(const \\1)@"; - sed = "s@inline int abs(int [a-z][a-z]*) {.*}@extern \"C\" int abs(int);@"; - sed = "s@inline double abs(double [a-z][a-z]*) {.*}@@"; - sed = "s@inline int sqr(int [a-z][a-z]*) {.*}@@"; - sed = "s@inline double sqr(double [a-z][a-z]*) {.*}@@"; }; @@ -2103,23 +2647,26 @@ fix = { /* - * Check for bad #ifdef line (in Ultrix 4.1) + * Ultrix V4.[35] puts the declaration of uname before the definition + * of struct utsname, so the prototype (added by fixproto) causes havoc. */ fix = { - hackname = ultrix_ifdef; - select = "#ifdef KERNEL"; - files = sys/file.h; - sed = "s/#ifdef KERNEL/#if defined(KERNEL)/"; + hackname = ultrix_fix_fixproto; + files = sys/utsname.h; + select = ULTRIX; + sed = "/^[ \t]*extern[ \t]*int[ \t]*uname();$/i\\\n" + "struct utsname;\n"; }; /* - * Avoid nested comments on Ultrix 4.3. + * Check for bad #ifdef line (in Ultrix 4.1) */ fix = { - hackname = ultrix_nested_cmnt; - files = rpc/svc.h; - sed = "s@^\\( \\*\tint protocol; \\)/\\*@\\1*/ /*@"; + hackname = ultrix_ifdef; + select = "#ifdef KERNEL[ \t]*[^ \t]"; + files = sys/file.h; + sed = "s/#ifdef KERNEL/#if defined(KERNEL)/"; }; @@ -2138,14 +2685,42 @@ fix = { /* - * Fix multiple defines for NULL + * Fix multiple defines for NULL. Sometimes, we stumble into \r\n + * terminated lines, so accommodate these. Test both ways. + */ +fix = { + hackname = undefine_null; + select = "^#[ \t]*define[ \t]+NULL[ \t]"; + bypass = "#[ \t]*(ifn|un)def[ \t]+NULL($|[ \t\r])"; + + c_fix = format; + c_fix_arg = "#ifndef NULL%2\n#define NULL%1%2\n#endif%2\n"; + c_fix_arg = "^#[ \t]*define[ \t]*[ \t]NULL([^\r\n]+)([\r]*)\n"; + + test_text = "#define NULL 0UL\r\n#define NULL\t((void*)0)\n"; +}; + + +/* + * If arpa/inet.h prototypes are incompatible with the ones we just + * installed in , just remove the protos. + * Because of this close association, this patch must be applied only + * on those systems where the replacement byteorder header is installed. */ fix = { - hackname = undefine_null; - select = "^#[ \t]*define[ \t]*[ \t]NULL[ \t]"; - bypass = "#[ \t]*(ifn|un)def[ \t]*[ \t]NULL($|[ \t])"; - sed = "/^#[ \t]*define[ \t][ \t]*NULL[ \t]/i\\\n" - "#undef NULL\n"; + hackname = unixware7_byteorder_fix; + files = arpa/inet.h; + select = "in_port_t"; +#ifndef SVR5 + mach = "*-*-sysv4*"; + mach = "i[34567]86-*-sysv5*"; + mach = "i[34567]86-*-udk*"; + mach = "i[34567]86-*-solaris2.[0-4]"; + mach = "powerpcle-*-solaris2.[0-4]"; + mach = "sparc-*-solaris2.[0-4]"; +#endif /* SVR5 */ + sed = '/^extern.*htons.*(in_port_t)/d'; + sed = '/^extern.*ntohs.*(in_port_t)/d'; }; @@ -2228,6 +2803,7 @@ fix = { files = time.h; select = "uint_t[ \t][ \t]*_clocks_per_sec"; sed = "s/uint_t/unsigned int/"; + test_text = "uint_t\t_clocks_per_sec;"; }; @@ -2284,6 +2860,10 @@ fix = { "#else\n"; sed = "/char \\*class;/a\\\n" "#endif\n"; + test_text = + "struct {\n" + " char *class;\n" + "} mumble;\n"; }; @@ -2295,6 +2875,7 @@ fix = { files = Xm/BaseClassI.h; bypass = "__cplusplus"; sed = "s/ class[)]/ c_class)/g"; + test_text = "extern mumble (int class);\n"; }; @@ -2315,6 +2896,10 @@ fix = { "#endif\n"; sed = "s/Widget new,/Widget c_new,/g"; + test_text = + "struct wedge {\n" + " Widget\told, new; /* fix the new */\n" + "};\nextern Wedged( Widget new, Widget old );"; }; @@ -2323,106 +2908,14 @@ fix = { */ fix = { hackname = x11_sprintf; - files = X11*/Xmu.h; + files = X11/Xmu.h; + files = X11/Xmu/Xmu.h; + select = 'sprintf\(\)'; + sed = "s,^extern char \\*\tsprintf();$,#ifndef __STDC__\\\n" "extern char *\tsprintf();\\\n" "#endif /* !defined __STDC__ */,"; + test_text = "extern char *\tsprintf();"; }; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * UNDO BROKEN FIXES - * - * We sure do hope that broken fixes and needed fixes are never - * applied to the same file!! :-} - */ - -/* - * Purge some HP-UX 11 files that are only borken after they are "fixed". - */ -fix = { - hackname = zzz_ki_iface; - files = sys/ki_iface.h; - select = 'These definitions are for HP Internal developers'; - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - -/* - * Purge some HP-UX 11 files that are only borken after they are "fixed". - */ -fix = { - hackname = zzz_ki; - files = sys/ki.h; - select = '11.00 HP-UX LP64'; - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - -/* - * Purge some HP-UX 11 files that are only borken after they are "fixed". - */ -fix = { - hackname = zzz_ki_calls; - files = sys/ki_calls.h; - select = 'kthread_create_caller_t'; - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - -/* - * Purge some HP-UX 11 files that are only borken after they are "fixed". - */ -fix = { - hackname = zzz_ki_defs; - files = sys/ki_defs.h; - select = 'Kernel Instrumentation Definitions'; - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - -/* - * This file on SunOS 4 has a very large macro. When the sed loop - * tries pull it in, it overflows the pattern space size of the SunOS - * sed (GNU sed does not have this problem). Since the file does not - * require fixing, we remove it from the fixed directory. - */ -fix = { - hackname = zzz_bad_fixes; - files = sundev/ipi_error.h; - /* shouldn't there be a select expression here??? */ - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - -/* - * Purge some HP-UX 11 files that are only borken after they are "fixed". - */ -fix = { - hackname = zzz_time; - files = sys/time.h; - select = '11.0 and later representation of ki time'; - shell = - "echo \"Removing incorrect fix to <$file>\" >&2\n" - "rm -f ${DESTDIR}/$file ${DESTDIR}/fixinc.tmp\n" - "cat > /dev/null"; -}; - - /*EOF*/