X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ffixinc%2Finclhack.def;h=45f0afe585cd05c846739eeb26d93a9d478bbcfa;hp=fd282c851f3b03633cae2cc1fe04577cf66d03ae;hb=f9dd0bf96d1f0d13e398a3c3c43042b8e3adf9ef;hpb=c940c2ae38e0d9b3b67cf8f38cf8443e8941d58f diff --git a/gcc/fixinc/inclhack.def b/gcc/fixinc/inclhack.def index fd282c851f3..45f0afe585c 100644 --- a/gcc/fixinc/inclhack.def +++ b/gcc/fixinc/inclhack.def @@ -517,16 +517,78 @@ fix = { /* - * 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. + * The Ultrix 4.3 file limits.h is a symbolic link to sys/limits.h. + * Replace limits.h with a file that includes sys/limits.h. + */ +fix = { + hackname = AAB_ultrix_limits; + files = limits.h; + mach = "*-*-ultrix4.3"; + replace = +'/* @(#)limits.h */ +/* This file was generated by fixincludes */ +\#ifndef _LIMITS_INCLUDED +\#define _LIMITS_INCLUDED +\#include +\#endif /* _LIMITS_INCLUDED */ +'; +}; + + +/* + * The ULTRIX 4.3 version of memory.h duplicates definitions + * present in strings.h. Replace memory.h with a file that includes + * strings.h to prevent problems from multiple inclusion. + */ +fix = { + hackname = AAB_ultrix_memory; + files = memory.h; + mach = "*-*-ultrix4.3"; + replace = +'/* @(#)memory.h */ +/* This file was generated by fixincludes */ +\#ifndef _MEMORY_INCLUDED +\#define _MEMORY_INCLUDED +\#include +\#endif /* _MEMORY_INCLUDED */ +'; +}; + + +/* + * The Ultrix 4.3 file string.h is a symbolic link to strings.h. + * Replace string.h link with a file that includes strings.h to prevent + * problems from multiple inclusion. + */ +fix = { + hackname = AAB_ultrix_string; + files = string.h; + mach = "*-*-ultrix4.3"; + replace = +'/* @(#)string.h */ +/* This file was generated by fixincludes */ +\#ifndef _STRING_INCLUDED +\#define _STRING_INCLUDED +\#include +\#endif /* _STRING_INCLUDED */ +'; +}; + + +/* + * 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 = aix_syswait; files = sys/wait.h; + select = "^extern pid_t wait3\\(\\);\n"; select = "bos325,"; - sed = "/^extern pid_t wait3();$/i\\\n" - "struct rusage;\n"; - test_text = "/* bos325, */\nextern pid_t wait3();"; + 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 *); */"; }; @@ -540,8 +602,8 @@ 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/"; + c_fix = format; + c_fix_arg = "typedef int sig_atomic_t"; test_text = "typedef volatile int sig_atomic_t;"; }; @@ -554,8 +616,8 @@ fix = { files = "stdio.h"; files = "stdlib.h"; select = 'getopt\(int, char \*\[\], *char \*\)'; - sed = 's/getopt(int, char \*\[\],[ ]*char \*)/' - 'getopt(int, char *const[], const char *)/'; + c_fix = format; + c_fix_arg = "getopt(int, char *const[], const char *)"; test_text = 'extern int getopt(int, char *[], char *);'; }; @@ -567,7 +629,8 @@ fix = { hackname = alpha_parens; files = sym.h; select = '#ifndef\(__mips64\)'; - sed = "s/#ifndef(__mips64)/#ifndef __mips64/"; + c_fix = format; + c_fix_arg = "#ifndef __mips64"; test_text = "#ifndef(__mips64) /* bogus */\nextern int foo;\n#endif"; }; @@ -579,7 +642,8 @@ fix = { hackname = alpha_sbrk; files = unistd.h; select = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\("; - sed = "s/char\\([ \t]*\\*[\t ]*sbrk[ \t]*(\\)/void\\1/"; + c_fix = format; + c_fix_arg = "void *sbrk("; test_text = "extern char* sbrk(ptrdiff_t increment);"; }; @@ -592,7 +656,8 @@ fix = { hackname = arm_norcroft_hint; select = "___type p_type"; files = "X11/Intrinsic.h"; - sed = "s/___type p_type/p_type/"; + c_fix = format; + c_fix_arg = "p_type"; test_text = "___type p_type mumble;"; }; @@ -605,8 +670,11 @@ 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/"; + + 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" @@ -622,8 +690,10 @@ fix = { hackname = aux_asm; files = sys/param.h; select = "#ifndef NOINLINE"; - sed = "s|#ifndef NOINLINE" - "|#if !defined(NOINLINE) \\&\\& !defined(__GNUC__)|"; + + 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 */"; @@ -636,71 +706,37 @@ fix = { * HP/UX 10.20 also has it in curses_colr/curses.h. */ fix = { - hackname = avoid_bool; - files = curses.h; - files = curses_colr/curses.h; - files = term.h; - files = tinfo.h; + hackname = avoid_bool_define; + files = curses.h; + files = curses_colr/curses.h; + files = term.h; + files = tinfo.h; - select = "char[ \t]+bool|bool[ \t]+char"; - bypass = "we must use the C\\+\\+ compiler's type"; + select = "#[ \t]*define[ \t]+bool[ \t]"; + bypass = "we must use the C\\+\\+ compiler's type"; - sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/i\\\n" - "#ifndef __cplusplus\n"; + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; + c_fix_arg = "^[ \t]*#[ \t]*define[ \t]+bool[ \t].*"; - sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/a\\\n" - "#endif\n"; - - sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/i\\\n" - "#ifndef __cplusplus\n"; - - sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/a\\\n" - "#endif\n"; - - 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"; - - sed = "/^typedef[ \t][ \t]*int[ \t][ \t]*bool[ \t]*;/i\\\n" - "#ifndef __cplusplus\n"; - - sed = "/^typedef[ \t][ \t]*int[ \t][ \t]*bool[ \t]*;/a\\\n" - "#endif\n"; - - sed = "/^[ ]*typedef[ \t][ \t]*unsigned int[ \t][ \t]*bool[ \t]*;/i\\\n" - "#ifndef __cplusplus\n"; - - sed = "/^[ ]*typedef[ \t][ \t]*unsigned int[ \t][ \t]*bool[ \t]*;/a\\\n" - "#endif\n"; - test_text = "# define bool\t char \n" - "typedef unsigned int\tbool \t; /* bool type */"; + test_text = "# define bool\t char \n"; }; - -/* - * Fix `typedef struct term;' on hppa1.1-hp-hpux9. - */ 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/"; - test_text = 'typedef struct term;'; -}; + hackname = avoid_bool_type; + files = curses.h; + files = curses_colr/curses.h; + files = term.h; + files = tinfo.h; + select = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;"; + bypass = "we must use the C\\+\\+ compiler's type"; -/* - * Fix one other error in this file: - * a mismatched quote not inside a C comment. - */ -fix = { - hackname = badquote; - files = sundev/vuid_event.h; - sed = "s/doesn't/does not/"; - test_text = "/* doesn't have matched single quotes */"; + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; + c_fix_arg = "^[ \t]*typedef[ \t].*[ \t]bool[ \t]*;.*"; + + test_text = "typedef unsigned int\tbool \t; /* bool type */"; }; @@ -712,6 +748,12 @@ fix = { * 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 = bad_lval; @@ -732,27 +774,56 @@ fix = { files = stropts.h; files = time.h; files = unistd.h; + sed = - "s/^[ \t]*#[ \t]*define[ \t]+\\([^(]*\\)\\(([^)]*)\\)[ \t]*" - "\\(_.\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/"; + "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 otherwise(x,y,z) BAR_Something(x,y,z)\n" "#define mumble _FOOmumble"; }; /* + * Fix `typedef struct term;' on hppa1.1-hp-hpux9. + */ +fix = { + hackname = bad_struct_term; + files = curses.h; + select = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;"; + c_fix = format; + c_fix_arg = "struct term;"; + + test_text = 'typedef struct term;'; +}; + + +/* + * Fix one other error in this file: + * a mismatched quote not inside a C comment. + */ +fix = { + hackname = badquote; + files = sundev/vuid_event.h; + select = "doesn't"; + c_fix = format; + c_fix_arg = "does not"; + + test_text = "/* doesn't have matched single quotes */"; +}; + + +/* * check for broken assert.h that needs stdio.h */ fix = { - hackname = broken_assert_stdio; - files = assert.h; - select = stderr; - bypass = "include.*stdio\\.h"; - sed = "1i\\\n" - "#include \n"; + 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;"; }; @@ -761,14 +832,14 @@ fix = { * check for broken assert.h that needs stdlib.h */ 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 = 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 );"; }; @@ -776,18 +847,93 @@ fix = { /* * 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 = broken_cabs; files = "math.h"; select = '^extern double cabs'; - sed = '/^extern double cabs();/d'; - sed = '/^extern double cabs(struct dbl_hypot);/d'; + + 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"; + "#endif\n" + "extern double cabs(); /* This is a comment\n" + " and it ends here. */"; +}; + + +/* + * 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 = ctrl_quotes_def; + select = "define[ \t]+[A-Z0-9_]+CTRL\\([a-zA-Z][,)]"; + c_fix = char_macro_def; + c_fix_arg = "CTRL"; + + /* + * This is two tests in order to ensure that the "CTRL(c)" can + * be selected in isolation from the multi-arg format + */ + test_text = "#define BSD43_CTRL(n, x) (('n'<<8)+x)\n"; + test_text = "#define _CTRL(c) ('c'&037)"; +}; + +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 TCTRLFOO BSD43_CTRL(T, 1)"; +}; + + +/* + * 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. + */ +fix = { + hackname = cxx_unready; + files = sys/mman.h; + files = rpc/types.h; + select = '[^#]+malloc.*;'; /* Catch any form of declaration + not within a macro. */ + bypass = '"C"|__BEGIN_DECLS'; + + 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 );"; }; @@ -813,109 +959,90 @@ fix = { * 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"; - sed = "s/ecd.cursor/ecd_cursor/"; + 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 HP's use of ../machine/inline.h to refer to - * /usr/include/machine/inline.h + * fix-header doesn't fix fabs' prototype, and I have no idea why. */ fix = { - hackname = hp_inline; - files = sys/spinlock.h; - select = 'include.*"\.\./machine/'; - sed = "s,\"../machine/inline.h\",,"; - sed = "s,\"../machine/psl.h\",,"; - test_text = '# include "../machine/fumble.h"'; + 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();'; }; /* - * Check for (...) in C++ code in HP/UX sys/file.h. + * Fix HP's use of ../machine/inline.h to refer to + * /usr/include/machine/inline.h */ fix = { - hackname = hp_sysfile; - files = sys/file.h; - select = "HPUX_SOURCE"; - sed = 's/(\.\.\.)/(struct file *, ...)/'; - test_text = "extern void foo(...); /* bad varargs */"; -}; + hackname = hp_inline; + files = sys/spinlock.h; + files = machine/machparam.h; + select = "[ \t]*#[ \t]*include[ \t]+" '"\.\./machine/'; + c_fix = format; + c_fix_arg = "%1"; -/* - * 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. - */ -fix = { - hackname = cxx_unready; - files = sys/mman.h; - files = rpc/types.h; - select = '[^#]+malloc.*;'; /* Should catch any form of a declaration - but not mention within a macro. */ - bypass = '"C"|__BEGIN_DECLS'; + c_fix_arg = "([ \t]*#[ \t]*include[ \t]+)" '"\.\./machine/' + '([a-z]+)\.h"'; - sed = "1i\\\n" - "#ifdef __cplusplus\\\n" - "extern \"C\" {\\\n" - "#endif\\\n\n"; - sed = "$a\\\n" - "#ifdef __cplusplus\\\n" - "}\\\n" - "#endif\n"; + test_text = ' # include "../machine/mumble.h"'; }; /* - * HPUX 10.x sys/param.h defines MAXINT which clashes with values.h + * Check for (...) in C++ code in HP/UX sys/file.h. */ fix = { - hackname = hpux_maxint; - files = sys/param.h; - select = "^#[ \t]*define[ \t]*MAXINT[ \t]"; - sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/i\\\n" - "#ifndef MAXINT\n"; + hackname = hp_sysfile; + files = sys/file.h; + select = "HPUX_SOURCE"; - sed = "/^#[ \t]*define[ \t]*MAXINT[ \t]/a\\\n" - "#endif\n"; - test_text = '#define MAXINT 0x7FFFFFFF'; + c_fix = format; + c_fix_arg = "(struct file *, ...)"; + c_fix_arg = '\(\.\.\.\)'; + + test_text = "extern void foo(...); /* HPUX_SOURCE - bad varargs */"; }; /* - * Fix hpux10.20 to avoid invalid forward decl + * Keep HP-UX 11 from stomping on C++ math namespace + * with defines for fabsf. */ fix = { - hackname = hpux_systime; - files = sys/time.h; - select = "^extern struct sigevent;"; - sed = "s/^extern struct sigevent;/struct sigevent;/"; - test_text = 'extern struct sigevent;'; -}; + hackname = hpux11_fabsf; + files = math.h; + select = "^[ \t]*#[ \t]*define[ \t]+fabsf\\(.*"; + bypass = "__cplusplus"; + c_fix = format; + c_fix_arg = "#ifndef __cplusplus\n%0\n#endif"; -/* - * get rid of bogus inline definitions in HP-UX 8.0 - */ -fix = { - 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 = + "#ifdef _PA_RISC\n" + "# define fabsf(x) ((float)fabs((double)(float)(x)))\n" + "#endif"; }; -/* +/* * 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 @@ -930,16 +1057,53 @@ fix = { * 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\\)"; - sed = "s/^#define UINT32_C(__c)\\([ \t]*\\)__CONCAT__(__CONCAT_U__(__c),l)/#define UINT32_C(__c)\\1__CONCAT__(__c,ul)/"; + 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)"; }; + +/* + * get rid of bogus inline definitions in HP-UX 8.0 + */ +fix = { + 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 return type of abort and free + */ +fix = { + 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("; + + test_text = "extern int abort(int);\n" + "extern int free(void*);\n" + "extern int exit(void*);"; +}; + + /* * On Interactive Unix 2.2, certain traditional Unix definitions * (notably getc and putc in stdio.h) are omitted if __STDC__ is @@ -949,166 +1113,138 @@ fix = { fix = { hackname = isc_omits_with_stdc; - files = "stdio.h"; - files = "math.h"; - files = "ctype.h"; - files = "sys/limits.h"; - files = "sys/fcntl.h"; - files = "sys/dirent.h"; - - select = "!defined\(__STDC__\) && !defined\(_POSIX_SOURCE\)"; - - sed = "s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/" - "!defined(_POSIX_SOURCE)/"; + files = "stdio.h"; + files = "math.h"; + files = "ctype.h"; + files = "sys/limits.h"; + files = "sys/fcntl.h"; + files = "sys/dirent.h"; + + 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"; }; + /* - * Fix various macros used to define ioctl numbers. The traditional - * syntax was - * #define _IO(n, x) (('n'<<8)+x) - * #define TIOCFOO _IO(T, 1) + * 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) + * + * #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 = io_use_quotes; - select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+IO[A-Z]*[ \t]*\\( *[^,']"; - c_fix = char_macro_use; - c_fix_arg = "IO"; -}; - -fix = { - hackname = io_def_quotes; - select = "define[ \t]+[A-Z0-9_]+IO[A-Z]*\\(([a-zA-Z]).*'\\1'"; + 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)"; + test_text = + "#define XX_IO(x) ('x'<<8|256)"; }; - - -/* - * Same deal for CTRL() macros. - * CTRL might be: CTRL _CTRL ISCTRL BSD43_CTRL ... - */ + fix = { - hackname = ctrl_use_quotes; - select = "define[ \t]+[A-Z0-9_]+[ \t]+[A-Z0-9_]+CTRL[ \t]*\\( *[^,']"; + 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 = "CTRL"; -}; - -fix = { - hackname = ctrl_def_quotes; - select = "define[ \t]+[A-Z0-9_]+CTRL\\(([a-zA-Z]).*'\\1'"; - c_fix = char_macro_def; - c_fix_arg = "CTRL"; + c_fix_arg = "IO"; + test_text = "#define TIOCFOO BSD43__IOWR(T, 1)\n" + "#define TIOCFOO \\\\\n" + "BSD43__IOWR(T, 1) /* Some are multi-line */"; }; /* - * Check for missing ';' in struct + * HPUX 10.x sys/param.h defines MAXINT which clashes with values.h */ fix = { - hackname = ip_missing_semi; - files = netinet/ip.h; - select = "}$"; - sed = "/^struct/,/^};/s/}$/};/"; -}; - + hackname = hpux_maxint; + files = sys/param.h; + select = "^#[ \t]*define[ \t]*MAXINT[ \t]"; -/* - * Some IRIX header files contain the string "//" - */ -fix = { - hackname = irix_multiline_cmnt; - files = sys/types.h; + c_fix = format; + c_fix_arg = "#ifndef MAXINT\n%0\n#endif"; + c_fix_arg = "^#[ \t]*define[ \t]*MAXINT[ \t].*"; - sed = "s@type of the result@type of the result */@"; - sed = "s@of the sizeof@/* of the sizeof@"; + test_text = '#define MAXINT 0x7FFFFFFF'; }; /* - * IRIX 4.0.5 uses struct sockaddr - * in prototype without previous definition. + * Fix hpux10.20 to avoid invalid forward decl */ fix = { - hackname = irix_sockaddr; - files = rpc/auth.h; - select = "authdes_create.*struct sockaddr"; - bypass = ""; - 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;"; -/* - * IRIX 4.0.5 uses struct __file_s - * in prototype without previous definition. - */ -fix = { - hackname = irix_struct__file; - files = rpc/xdr.h; - sed = "/xdrstdio_create.*struct __file_s/i\\\n" - "struct __file_s;\n"; + test_text = 'extern struct sigevent;'; }; /* - * IRIX 5.2's contains an asm comment with a contraction - * that causes the assembly preprocessor to complain about an - * unterminated character constant. + * Check for missing ';' in struct */ fix = { - hackname = irix_asm_apostrophe; - files = sys/asm.h; - - select = "^[ \t]*#.*[Ww]e're"; - sed = "/^[ \t]*#/s/\\([Ww]e\\)'re/\\1 are/"; + 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 - */ -fix = { - hackname = isc_fmod; - files = math.h; - select = 'fmod\(double\)'; - sed = "s/fmod(double)/fmod(double, double)/"; -}; - - -/* - * Fix nested comments in Motorola's and + * 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 = 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_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"; }; - + /* - * 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);"; }; @@ -1137,7 +1273,40 @@ 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"; +}; + + +/* GNU libc1 string.h does not prototype memcpy and memcmp for gcc + versions > 1. That's a problem. This fix will expose the prototype + for C++. */ +fix = { + hackname = libc1_ifdefd_memx; + + /* The string.h result is overwritten by AAB_ultrix_string when doing + "make check" and will fail. Therefore, we add the following kludgery + to insert the test_text into the special testing header. :-} */ + files = testing.h; + files = string.h; + + c_fix = format; + select = "' is a built-in function for gcc 2\\.x\\. \\*/"; + bypass = __cplusplus; + c_fix_arg = "%1 || defined(__cplusplus)\n%2"; + c_fix_arg = "/\\* `mem...' is a built-in function for gcc 2\\.x\\. \\*/\n" + "(#if defined\\(__STDC__\\) && __GNUC__ < 2)\n" + "(/\\* .* \\*/\n" + "extern [a-z_]+ mem)"; + + test_text = + "/* \\`memcpy' is a built-in function for gcc 2.x. */\n" + "#if defined(__STDC__) && __GNUC__ < 2\n" + "/* Copy N bytes of SRC to DEST. */\n" + "extern __ptr_t memcpy __P ((__ptr_t __dest, __const __ptr_t __src,\n" + " size_t __n));\n" + "#endif"; }; @@ -1149,27 +1318,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"; + files = "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' */"; }; @@ -1177,10 +1337,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 */"; }; @@ -1188,40 +1350,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();"; }; @@ -1232,15 +1395,15 @@ fix = { hackname = m88k_bad_s_if; mach = "m88k-*-sysv3*"; files = sys/stat.h; - select = "#define[ \t]+S_IS[A-Z]*(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)/"; + select = "#define[ \t]+S_IS[A-Z]+\\(m\\)[ \t]+\\(m[ \t]*&"; - 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? */'; }; @@ -1253,13 +1416,8 @@ 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 = ""; }; @@ -1269,10 +1427,14 @@ fix = { fix = { hackname = machine_ansi_h_va_list; files = machine/ansi.h; - select = '_BSD_VA_LIST_'; + select = "define[ \t]+_BSD_VA_LIST_[ \t]"; bypass = '__builtin_va_list'; - sed = "s/\\(_BSD_VA_LIST_[ \t][ \t]*\\).*$/\\1__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**"; }; @@ -1280,9 +1442,13 @@ fix = { * Fix non-ansi machine name defines */ fix = { - hackname = machine_name; - c_test = machine_name; - c_fix = machine_name; + 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 :-) */"; }; @@ -1296,20 +1462,30 @@ fix = { * additional references to struct exception. */ fix = { - hackname = math_exception; - files = math.h; - select = "struct exception"; - bypass = "We have a problem when using C\\+\\+"; - sed = "1i\\\n" - "#ifdef __cplusplus\\\n" - "#define exception __math_exception\\\n" - "#endif\n"; - sed = "$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; + + c_fix_arg = "#ifdef __cplusplus\n" + "#define exception __math_exception\n" + "#endif\n"; + + c_fix_arg = "#ifdef __cplusplus\n" + "#undef exception\n" + "#endif\n"; + + test_text = "typedef struct exception t_math_exception;"; }; + +/* + * 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_huge_val_from_dbl_max; files = math.h; @@ -1336,25 +1512,62 @@ fix = { "\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"; + 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"; +}; + + +/* + * Fix nested comments in Motorola's and + */ +fix = { + hackname = nested_motorola; + mach = "m68k-motorola-sysv*"; + files = sys/limits.h; + files = 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@"; +}; - sed = "/define[ \t]HUGE_VAL[ \t]/i\\\n#ifndef HUGE_VAL\n"; - sed = "/define[ \t]HUGE_VAL[ \t]/a\\\n#endif\n"; + +/* + * 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 */"; }; @@ -1364,11 +1577,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 "; }; @@ -1377,32 +1590,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 */"; }; @@ -1413,10 +1626,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();"; }; @@ -1427,12 +1643,13 @@ fix = { * conditional, so it doesn't need this fix. So everything is okay. */ fix = { - hackname = next_wait_union; - files = sys/wait.h; - - select = 'wait\(union wait'; + hackname = next_wait_union; + files = sys/wait.h; - 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*);"; }; @@ -1440,9 +1657,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"; }; @@ -1460,23 +1680,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 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 "; }; @@ -1486,10 +1716,12 @@ 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;"; }; @@ -1500,9 +1732,11 @@ fix = { hackname = read_ret_type; files = stdio.h; select = "extern int\t.*, fread\\(\\), fwrite\\(\\)"; - sed = "s/^\\(extern int\tfclose(), fflush()\\), " - "\\(fread(), fwrite()\\)\\(.*\\)$" - "/extern unsigned int\t\\2;\\\n\\1\\3/"; + 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();"; }; @@ -1510,12 +1744,15 @@ fix = { * 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();"; }; @@ -1523,10 +1760,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);"; }; @@ -1534,24 +1773,15 @@ fix = { * parameters conflict with C++ new on rs/6000 */ fix = { - hackname = rs6000_param; - files = "stdio.h"; - files = "unistd.h"; - select = 'const char new'; - - sed = 's@rename(const char \*old, const char \*new)@' - 'rename(const char *_old, const char *_new)@'; -}; + 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)'; -/* - * "!__STDC__" is "!defined( __STRICT_ANSI__ )" - */ -fix = { - hackname = sco_strict_ansi; - mach = "i?86-*-sco3.2*"; - select = "^[ \t]*#[ \t]*if.*!__STDC__"; - sed = 's/!__STDC__/!defined(__STRICT_ANSI__)/g'; + test_text = 'extern int rename(const char *old, const char *new);'; }; @@ -1577,6 +1807,36 @@ fix = { "#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" + + "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"; }; @@ -1585,12 +1845,15 @@ fix = { * 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 \*\);"; - sed = 's/(const char \*, struct utimbuf \*);/' - '(const char *, const struct utimbuf *);/'; + 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 *);"; }; @@ -1607,6 +1870,7 @@ fix = { }; #endif + /* * Incorrect #include in Sony News-OS 3.2. */ @@ -1633,6 +1897,7 @@ fix = { }; #endif + /* * Add a `static' declaration of `getrnge' into . * @@ -1656,10 +1921,12 @@ fix = { * 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};"; }; @@ -1673,11 +1940,11 @@ fix = { files = stdio.h; bypass = "include.*(stdarg\.h|machine/ansi\.h)"; - sed = '1i\\ -\#define __need___va_list\\ -\#include -'; + c_fix = wrap; + + c_fix_arg = "#define __need___va_list\n#include \n"; + test_text = ""; }; @@ -1730,6 +1997,35 @@ fix = { /* + * 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* );"; +}; + + +/* + * IRIX 4.0.5 uses struct sockaddr + * in prototype without previous definition. + */ +fix = { + 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* );"; +}; + + +/* * Apply fix this to all OSs since this problem seems to effect * more than just SunOS. */ @@ -1742,28 +2038,17 @@ fix = { /* * Select those files containing '(*name)()'. */ - select = '\(\*[a-z][a-z_]*\)\(\)'; - sed = 's' - '/^\(.*(\*[a-z][a-z_]*)(\)' '\();.*\)' - "/\\\n" - "#ifdef __cplusplus\\\n" - '\1...\2' "\\\n" - "#else\\\n" - '\1\2' "\\\n" - "#endif" - "/"; -}; + 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_]*\))\(\);(.*)'; -/* - * Fix bogus #ifdef on SunOS 4.1. - */ -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"; + test_text = + "struct auth_t {\n" + " int (*name)(); /* C++ bad */\n" + "};"; }; @@ -1771,10 +2056,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__"; }; @@ -1782,16 +2071,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"; }; @@ -1807,6 +2098,14 @@ 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"; + sed = "s/char\\([ \t]*\\*[ \t]*calloc\\)/void\\1/g"; + + test_text = + "typedef char *\tmalloc_t;\n" + "int \tfree();\n" + "char*\tmalloc();\n" + "char*\tcalloc();\n" + "char*\trealloc();"; }; @@ -1818,6 +2117,7 @@ fix = { files = rpcsvc/rusers.h; select = "_cnt$"; sed = "/^struct/,/^};/s/_cnt$/_cnt;/"; + test_text = "struct mumble\n int _cnt\n};"; }; @@ -1829,15 +2129,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"; + test_text = "void\t(*signal())();"; }; @@ -1846,16 +2146,17 @@ fix = { * of struct exception, so the prototype (added by fixproto) causes havoc. */ fix = { - hackname = sunos_matherr_decl; - files = math.h; + hackname = sunos_matherr_decl; + files = math.h; + /* If matherr has a prototype already, the header needs no fix. */ - bypass = 'matherr.*struct exception'; - /* - * 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"; + bypass = 'matherr.*struct exception'; + select = matherr; + + c_fix = wrap; + c_fix_arg = "struct exception;\n"; + + test_text = "extern int matherr();"; }; @@ -1865,8 +2166,10 @@ fix = { fix = { hackname = sunos_strlen; files = strings.h; - select = "int[ \t]*strlen"; - 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 */"; }; @@ -1875,16 +2178,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 @@ -2005,7 +2309,10 @@ fix = { 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);"; }; @@ -2024,8 +2331,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 @@ -2056,9 +2366,9 @@ fix = { files = sys/mkdev.h; select = '^static'; - sed = "/^dev_t makedev(/s/^/static /"; - sed = "/^major_t major(/s/^/static /"; - sed = "/^minor_t minor(/s/^/static /"; + sed = "/^dev_t makedev(/s/^/static /"; + sed = "/^major_t major(/s/^/static /"; + sed = "/^minor_t minor(/s/^/static /"; }; #endif /* SVR5 */ @@ -2098,9 +2408,13 @@ fix = { 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);'; }; @@ -2261,15 +2575,15 @@ fix = { hackname = systypes_stdlib_size_t; files = sys/types.h; files = stdlib.h; - select = "typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t"; + 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 */"; }; @@ -2299,19 +2613,21 @@ fix = { /* - * Fix return type of exit and abort in + * 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/char[ \t]*\\*[ \t]*bsearch/void \\*\tbsearch/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("; + + 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"; }; @@ -2342,6 +2658,10 @@ fix = { sed = "/[\t ]wchar_t.*;/a\\\n" "#endif\n"; + + test_text = "typedef int size_t; /* ??? */\n" + "typedef int ptrdiff_t; /* result of subtracting two pointers */\n" + "typedef unsigned short wchar_t; /* big enough for biggest char set */\n"; }; @@ -2353,32 +2673,47 @@ fix = { hackname = tinfo_cplusplus; files = tinfo.h; select = "[ \t]_cplusplus"; - sed = "s/[ \t]_cplusplus/ __cplusplus/"; + + c_fix = format; + c_fix_arg = " __cplusplus"; + test_text = "#ifdef _cplusplus\nint bogus;\n#endif"; }; /* - * Ultrix V4.[35] puts the declaration of uname before the definition - * of struct utsname, so the prototype (added by fixproto) causes havoc. + * parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R. */ fix = { - hackname = ultrix_fix_fixproto; - files = sys/utsname.h; - select = ULTRIX; - sed = "/^[ \t]*extern[ \t]*int[ \t]*uname();$/i\\\n" - "struct utsname;\n"; + hackname = ultrix_atof_param; + files = math.h; + select = "atof\\([ \t]*char"; + + c_fix = format; + c_fix_arg = "atof(const char"; + + test_text = "extern double atof( char *__nptr);\n"; }; /* - * parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R. + * parameters not const on DECstation Ultrix V4.0 and OSF/1. */ fix = { - hackname = ultrix_atof_param; - files = math.h; - select = "atof\\([ \t]*char"; + hackname = ultrix_const; + files = stdio.h; + select = 'perror\( char \*'; + + c_fix = format; + c_fix_arg = "%1 const %3 *__"; + c_fix_arg = "([ \t*](perror|fputs|fwrite|scanf|fscanf)\\(.*)" + "[ \t]+(char|void) \\*__"; - sed = "s@atof(\\([ \t]*char[ \t]*\\*[^)]*\\))@atof(const \\1)@"; + test_text = + "extern void perror( char *__s );\n" + "extern int fputs( char *__s, FILE *);\n" + "extern size_t fwrite( void *__ptr, size_t, size_t, FILE *);\n" + "extern int fscanf( FILE *__stream, char *__format, ...);\n" + "extern int scanf( char *__format, ...);\n"; }; @@ -2386,21 +2721,39 @@ fix = { * parameters not const on DECstation Ultrix V4.0 and OSF/1. */ fix = { - hackname = ultrix_const; - files = stdio.h; + hackname = ultrix_const2; + files = stdio.h; + + select = '\*fopen\( char \*'; + c_fix = format; + c_fix_arg = "%1( const char *%3, const char *"; + c_fix_arg = "([ \t*](fopen|sscanf|popen|tempnam))\\(" + "[ \t]*char[ \t]*\\*([^,]*)," + "[ \t]*char[ \t]*\\*[ \t]*"; + + test_text = + "extern FILE *fopen( char *__filename, char *__type );\n" + "extern int sscanf( char *__s, char *__format, ...);\n" + "extern FILE *popen(char *, char *);\n" + "extern char *tempnam(char*,char*);\n"; +}; + + +/* + * 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 = 's@perror( char \*__s );@perror( const char *__s );@'; - sed = 's@fputs( char \*__s,@fputs( const char *__s,@'; - sed = 's@fopen( char \*__filename, char \*__type );@' - 'fopen( const char *__filename, const char *__type );@'; - sed = 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@'; - sed = 's@fscanf( FILE \*__stream, char \*__format,@' - 'fscanf( FILE *__stream, const char *__format,@'; - sed = 's@scanf( char \*__format,@scanf( const char *__format,@'; - sed = 's@sscanf( char \*__s, char \*__format,@' - 'sscanf( const char *__s, const char *__format,@'; - sed = 's@popen(char \*, char \*);@popen(const char *, const char *);@'; - sed = 's@tempnam(char\*,char\*);@tempnam(const char*,const char*);@'; + c_fix = format; + c_fix_arg = "struct utsname;\n%0"; + c_fix_arg = "^[ \t]*extern[ \t]*int[ \t]*uname\\(\\);"; + + test_text = + "/* ULTRIX's uname */\nextern\tint\tuname();"; }; @@ -2409,9 +2762,30 @@ fix = { */ fix = { hackname = ultrix_ifdef; - select = "#ifdef KERNEL[ \t]*[^ \t]"; + select = "^#ifdef KERNEL[ \t]+&&"; files = sys/file.h; - sed = "s/#ifdef KERNEL/#if defined(KERNEL)/"; + + c_fix = format; + c_fix_arg = "#if defined(KERNEL) &&"; + + test_text = + "#ifdef KERNEL\t&& defined( mumbojumbo )\nint oops;\n#endif"; +}; + + +/* + * Strip "|| CC$gfloat" from Ultrix math headers. + */ +fix = { + hackname = ultrix_math_ifdef; + files = sys/limits.h; + files = float.h; + files = math.h; + select = "^(#if.*)\\|\\|[ \t]+CC\\$[a-z]+"; + c_fix = format; + c_fix_arg = "%1"; + + test_text = '#if defined(__GFLOAT) || CC\$gfloat'; }; @@ -2419,9 +2793,45 @@ fix = { * Avoid nested comments on Ultrix 4.3. */ fix = { - hackname = ultrix_nested_cmnt; + hackname = ultrix_nested_ioctl; + files = sys/ioctl.h; + select = "^/\\* #define SIOCSCREEN"; + sed = "/^\\/\\* #define SIOCSCREEN/s@/\\* screend@*//* screend@"; + test_text = + "/* #define SIOCSCREENON _IOWR('i', 49, int)" + "/* screend, net/gw_screen.h */\n"; +}; + + +fix = { + hackname = ultrix_nested_svc; files = rpc/svc.h; + select = "^ \\*[ \t]*int protocol; */\\*"; sed = "s@^\\( \\*\tint protocol; \\)/\\*@\\1*/ /*@"; + test_text = + " *\tint protocol; /* like TCP or UDP\n"; +}; + + +/* + * Add missing prototype for lstat and define for S_ISLNK + * in Ultrix V4.3 sys/stat.h. + */ +fix = { + hackname = ultrix_stat; + files = sys/stat.h; + select = "@\\(#\\)stat\\.h.*6\\.1.*\\(ULTRIX\\)"; + sed = "/^#define[ \t]S_IFPORT[ \t]*S_IFIFO$/a\\\n" + "\\\n" + "/* macro to test for symbolic link */\\\n" + "#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)\\\n" + "\n"; + sed = "/^[ \t]*fstat(),$/a\\\n" + "\tlstat(),\n"; + test_text = + "@(#)stat.h 6.1 (ULTRIX)\n" + "#define S_IFPORT S_IFIFO\n" + "\tfstat(),\n"; }; @@ -2436,18 +2846,39 @@ fix = { sed = "s/^static struct tlb_pid_state/struct tlb_pid_state/"; sed = 's/^#include "r3_cpu\.h"$/#include /'; sed = 's/^#include "r4_cpu\.h"$/#include /'; + test_text = + "static struct tlb_pid_state {\n" + "#include \"r3_cpu.h\"\n"; +}; + + +/* + * Add once-only latch to Ultrix V4.3 strings.h. + */ +fix = { + hackname = ultrix_strings; + files = strings.h; + select = "@\\(#\\)strings\\.h.*6\\.1.*\\(ULTRIX\\)"; + c_fix = wrap; + test_text = + "@(#)strings.h 6.1 (ULTRIX)\n"; }; /* - * 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]*[ \t]NULL[ \t\r]"; - bypass = "#[ \t]*(ifn|un)def[ \t]*[ \t]NULL($|[ \t\r])"; - sed = "/^#[ \t]*define[ \t][ \t]*NULL[ \t\r]/i\\\n" - "#undef NULL\n"; + 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"; }; @@ -2463,9 +2894,9 @@ fix = { 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 = "i?86-*-sysv5*"; + mach = "i?86-*-udk*"; + mach = "i?86-*-solaris2.[0-4]"; mach = "powerpcle-*-solaris2.[0-4]"; mach = "sparc-*-solaris2.[0-4]"; #endif /* SVR5 */ @@ -2478,13 +2909,18 @@ fix = { * Fix definitions of macros used by va-i960.h in VxWorks header file. */ fix = { - hackname = va_i960_macro; - files = arch/i960/archI960.h; - select = "__(vsiz|vali|vpad|alignof__)"; - sed = "s/__vsiz/__vxvsiz/"; - sed = "s/__vali/__vxvali/"; - sed = "s/__vpad/__vxvpad/"; - sed = "s/__alignof__/__vxalignof__/"; + hackname = va_i960_macro; + files = arch/i960/archI960.h; + select = "__(vsiz|vali|vpad|alignof__)"; + + c_fix = format; + c_fix_arg = "__vx%1"; + + test_text = + "extern int __vsiz vsiz;\n" + "extern int __vali vali;\n" + "extern int __vpad vpad;\n" + "#define __alignof__(x) ..."; }; @@ -2493,21 +2929,22 @@ fix = { * which is illegal in ANSI C++. */ fix = { - hackname = void_null; - files = curses.h; - files = dbm.h; - files = locale.h; - files = stdio.h; - files = stdlib.h; - files = string.h; - files = time.h; - files = unistd.h; - files = sys/dir.h; - files = sys/param.h; - files = sys/types.h; - select = "#[ \t]*define[ \t][ \t]*NULL[ \t].*void"; - sed = "s/^#[ \t]*define[ \t]*NULL[ \t]*((void[ \t]*\\*)0)" - "/#define NULL 0/"; + hackname = void_null; + files = curses.h; + files = dbm.h; + files = locale.h; + files = stdio.h; + files = stdlib.h; + files = string.h; + files = time.h; + files = unistd.h; + files = sys/dir.h; + files = sys/param.h; + files = sys/types.h; + select = "^#[ \t]*define[ \t]+NULL[ \t]+\\(\\(void[ \t]*\\*\\)0\\)"; + c_fix = format; + c_fix_arg = "#define NULL 0"; + test_text = "# define\tNULL \t((void *)0) /* typed NULL */"; }; @@ -2542,6 +2979,13 @@ fix = { sed = "/[ \t]wchar_t/a\\\n" "#endif\n"; + + test_text = + "#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__\n" + "typedef unsigned int size_t;\n" + "typedef long ptrdiff_t;\n" + "typedef unsigned short wchar_t;\n" + "#endif /* __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__ */\n"; }; @@ -2549,10 +2993,11 @@ fix = { * Fix VxWorks to not require including . */ fix = { - hackname = vxworks_needs_vxtypes; - files = time.h; - select = "uint_t[ \t][ \t]*_clocks_per_sec"; - sed = "s/uint_t/unsigned int/"; + hackname = vxworks_needs_vxtypes; + files = time.h; + select = "uint_t([ \t]+_clocks_per_sec)"; + c_fix = format; + c_fix_arg = "unsigned int%1"; test_text = "uint_t\t_clocks_per_sec;"; }; @@ -2566,10 +3011,14 @@ fix = { test = " -r types/vxTypesOld.h"; test = " -n \"`egrep '#include' $file`\""; test = " -n \"`egrep ULONG $file`\""; - select = "#[ \t]define[ \t][ \t]*__INCstath"; + select = "#[ \t]define[ \t]+__INCstath"; sed = "/#[ \t]define[ \t][ \t]*__INCstath/a\\\n" "#include \n"; + + test_text = "`touch types/vxTypesOld.h`" + "#include /* ULONG */\n" + "# define\t__INCstath "; }; @@ -2579,19 +3028,24 @@ fix = { fix = { hackname = vxworks_time; files = time.h; - select = "VOIDFUNCPTR"; test = " -r vxWorks.h"; - sed = "/VOIDFUNCPTR/i\\\n" - "#ifndef __gcc_VOIDFUNCPTR_defined\\\n" - "#ifdef __cplusplus\\\n" - "typedef void (*__gcc_VOIDFUNCPTR) (...);\\\n" - "#else\\\n" - "typedef void (*__gcc_VOIDFUNCPTR) ();\\\n" - "#endif\\\n" - "#define __gcc_VOIDFUNCPTR_defined\\\n" - "#endif\n"; - sed = "s/VOIDFUNCPTR/__gcc_VOIDFUNCPTR/g"; + select = "#[ \t]*define[ \t]+VOIDFUNCPTR[ \t].*"; + c_fix = format; + + c_fix_arg = + "#ifndef __gcc_VOIDFUNCPTR_defined\n" + "#ifdef __cplusplus\n" + "typedef void (*__gcc_VOIDFUNCPTR) (...);\n" + "#else\n" + "typedef void (*__gcc_VOIDFUNCPTR) ();\n" + "#endif\n" + "#define __gcc_VOIDFUNCPTR_defined\n" + "#endif\n" + "#define VOIDFUNCPTR __gcc_VOIDFUNCPTR"; + + test_text = "`touch vxWorks.h`" + "#define VOIDFUNCPTR (void(*)())"; }; @@ -2601,15 +3055,13 @@ fix = { * we find __cplusplus in the file. These were found on the RS/6000. */ fix = { - hackname = x11_class; - files = X11/ShellP.h; - bypass = __cplusplus; - sed = "/char \\*class;/i\\\n" - "#ifdef __cplusplus\\\n" - "\tchar *c_class;\\\n" - "#else\n"; - sed = "/char \\*class;/a\\\n" - "#endif\n"; + hackname = x11_class; + files = X11/ShellP.h; + bypass = __cplusplus; + select = "^([ \t]*char \\*)class;(.*)"; + c_fix = format; + c_fix_arg = "#ifdef __cplusplus\n%1c_class;%2\n" + "#else\n%1class;%2\n#endif"; test_text = "struct {\n" " char *class;\n" @@ -2624,7 +3076,11 @@ fix = { hackname = x11_class_usage; files = Xm/BaseClassI.h; bypass = "__cplusplus"; - sed = "s/ class[)]/ c_class)/g"; + + select = " class\\)"; + c_fix = format; + c_fix_arg = " c_class)"; + test_text = "extern mumble (int class);\n"; }; @@ -2660,11 +3116,11 @@ fix = { hackname = x11_sprintf; files = X11/Xmu.h; files = X11/Xmu/Xmu.h; - select = 'sprintf\(\)'; + select = "^extern char \\*\tsprintf\\(\\);$"; + + c_fix = format; + c_fix_arg = "#ifndef __STDC__\n%0\n#endif /* !defined __STDC__ */"; - sed = "s,^extern char \\*\tsprintf();$,#ifndef __STDC__\\\n" - "extern char *\tsprintf();\\\n" - "#endif /* !defined __STDC__ */,"; test_text = "extern char *\tsprintf();"; };