OSDN Git Service

Double the backslash so sed gets a chance to see it.
[pf3gnuchains/gcc-fork.git] / gcc / fixinc / inclhack.def
1 /* -*- Mode: C -*-  */
2
3 autogen definitions inclhack;
4
5 /*
6
7 Define all the fixes we know about for repairing damaged headers
8
9 The rules for making fixes:
10
11 1.  Every fix must have a "hackname" that is compatible with C syntax
12     for variable names and is unique without regard to alphabetic case.
13
14 2.  If the problem is known to exist only in certain files,
15     then name each such file with a "files = " entry.
16
17 3.  It is relatively expensive to fire off a process to fix a source
18     file, therefore write apply tests to avoid unnecessary fix
19     processes.  The preferred apply tests are "select" and "bypass"
20     because they are performed internally.  "test" sends a command
21     to a server shell that actually fires off one or more processes
22     to do the testing.  Avoid it, if you can, but it is still more
23     efficient than a fix process.
24
25     These tests are required to:
26
27     1.  Be positive for all header files that require the fix.
28
29     It is desireable to:
30
31     2.  Be negative as often as possible whenever the fix is not
32         required, avoiding the process overhead.
33
34     It is nice if:
35
36     3.  The expression is as simple as possible to both
37         process and uderstand by people.  :-)
38
39         Please take advantage of the fact AutoGen will glue
40         together string fragments.  It helps.  Also take note
41         that double quote strings and single quote strings have
42         different formation rules.  Double quote strings are
43         a tiny superset of C string syntax.  Single quote strings
44         follow shell single quote string formation rules, except
45         that the backslash is processed before '\\', '\'' and '#'
46         characters (using C character syntax).
47
48 4.  There are currently two methods of fixing a file:
49
50     1.  a series of sed expressions.  Each will be an individual
51         "-e" argument to a single invocation of sed.
52
53     2.  a shell script.  These scripts are _required_ to read all
54         of stdin in order to avoid pipe stalls.  They may choose to
55         discard the input.
56
57     A C language subroutine method is planned for both tests and fixes
58     in the near term.  Awk ought to be possible too, but there may
59     be portability issues that I am not familiar with.
60
61 5.  If the fix is to remove the file (i.e. the fixing process broke
62     the file), then you must use a shell script that deletes all
63     copies of the output file and does not write _anything_ to stdout.
64     See the "zzz_*" fixes at the end of this file.
65
66 Let the fixes begin: */
67
68 /*
69  *  sys/wait.h on AIX 3.2.5 puts the declaration of wait3 before the definition
70  *  of struct rusage, so the prototype (added by fixproto) causes havoc.
71  */
72 fix = {
73     hackname = aix_syswait;
74     files    = sys/wait.h;
75     select = "bos325,";
76     sed    = "/^extern pid_t wait3();$/i\\\n"
77              "struct rusage;\n";
78 };
79
80
81 /*
82  *  sys/signal.h on some versions of AIX uses volatile in the typedef of
83  *  sig_atomic_t, which causes gcc to generate a warning about duplicate
84  *  volatile when a sig_atomic_t variable is declared volatile, as
85  *  required by ANSI C.
86  */
87 fix = {
88     hackname = aix_volatile;
89     files    = sys/signal.h;
90     select   = "typedef volatile int sig_atomic_t";
91     sed      = "s/typedef volatile int sig_atomic_t"
92                 "/typedef int sig_atomic_t/";
93 };
94
95
96 /*
97  *  Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX.
98  */
99 fix = {
100     hackname = alpha_getopt;
101     files  = "stdio.h";
102     files  = "stdlib.h";
103     select = 'getopt\(int, char \*\[';
104     sed    = 's/getopt(int, char \*\[\],[ ]*char \*)/'
105                'getopt(int, char *const[], const char *)/';
106 };
107
108
109 /* 
110  * Remove erroneous parentheses in sym.h on Alpha OSF/1.
111  */
112 fix = {
113     hackname = alpha_parens;
114     files    = sym.h;
115     select   = '#ifndef\(__mips64\)';
116     sed      = "s/#ifndef(__mips64)/#ifndef __mips64/";
117 };
118
119
120 /*
121  *  Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0
122  */
123 fix = {
124     hackname = alpha_sbrk;
125     files    = unistd.h;
126     select   = "char[ \t]*\\*[\t ]*sbrk[ \t]*\\(";
127     sed  = "s/char\\([ \t]*\\*[\t ]*sbrk[ \t]*(\\)/void\\1/";
128 };
129
130
131 /*
132  *  Fix this ARM/RISCiX file where ___type is a Compiler
133  *  hint that is specific to the Norcroft compiler.
134  */
135 fix = {
136     hackname = arm_norcroft_hint;
137     select   = "___type p_type";
138     files    = "X11/Intrinsic.h";
139     sed      = "s/___type p_type/p_type/";
140 };
141
142
143 /*
144  *  Fix this ARM/RISCiX file to avoid interfering
145  *  with the use of __wchar_t in cc1plus.
146  */
147 fix = {
148     hackname = arm_wchar;
149     files  = stdlib.h;
150     select = "#[ \t]*define[ \t]*__wchar_t";
151     sed    = "s/\\(#[ \t]*ifndef[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/";
152     sed    = "s/\\(#[ \t]*define[ \t]*\\)__wchar_t/\\1_GCC_WCHAR_T/";
153 };
154
155
156 /*
157  *  This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89;
158  *  gcc doesn't understand it.
159  */
160 fix = {
161     hackname = aux_asm;
162     files    = sys/param.h;
163     select   = "#ifndef NOINLINE";
164     sed      = "s|#ifndef NOINLINE"
165                 "|#if !defined(NOINLINE) \\&\\& !defined(__GNUC__)|";
166 };
167
168
169 /*
170  *  For C++, avoid any typedef or macro definition of bool,
171  *  and use the built in type instead.
172  *  HP/UX 10.20 also has it in curses_colr/curses.h.
173  */
174 fix = {
175     hackname = avoid_bool;
176     files    = curses.h;
177     files    = curses_colr/curses.h;
178     files    = term.h;
179     files    = tinfo.h;
180
181     sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/i\\\n"
182                 "#ifndef __cplusplus\n";
183
184     sed = "/^#[ \t]*define[ \t][ \t]*bool[ \t][ \t]*char[ \t]*$/a\\\n"
185                 "#endif\n";
186
187     sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/i\\\n"
188                 "#ifndef __cplusplus\n";
189
190     sed = "/^typedef[ \t][ \t]*char[ \t][ \t]*bool[ \t]*;/a\\\n"
191                 "#endif\n";
192
193     sed = "/^[ ]*typedef[ \t][ \t]*unsigned char[ \t][ \t]*bool[ \t]*;/i\\\n"
194                 "#ifndef __cplusplus\n";
195
196     sed = "/^[ ]*typedef[ \t][ \t]*unsigned char[ \t][ \t]*bool[ \t]*;/a\\\n"
197                 "#endif\n";
198
199     sed = "/^typedef[ \t][ \t]*int[ \t][ \t]*bool[ \t]*;/i\\\n"
200                 "#ifndef __cplusplus\n";
201
202     sed = "/^typedef[ \t][ \t]*int[ \t][ \t]*bool[ \t]*;/a\\\n"
203                 "#endif\n";
204
205     sed = "/^[ ]*typedef[ \t][ \t]*unsigned int[ \t][ \t]*bool[ \t]*;/i\\\n"
206                 "#ifndef __cplusplus\n";
207
208     sed = "/^[ ]*typedef[ \t][ \t]*unsigned int[ \t][ \t]*bool[ \t]*;/a\\\n"
209                 "#endif\n";
210 };
211
212
213 /*
214  *  Fix `typedef struct term;' on hppa1.1-hp-hpux9.
215  */
216 fix = {
217     hackname = bad_struct_term;
218     files  = curses.h;
219     select = "^[ \t]*typedef[ \t]+struct[ \t]+term[ \t]*;";
220     sed    = "s/^[ \t]*typedef[ \t][ \t]*"
221              "\\(struct[ \t][ \t]*term[ \t]*;[ \t]*\\)$/\\1/";
222 };
223
224
225 /*
226  *  Fix one other error in this file:
227  *  a mismatched quote not inside a C comment.
228  */
229 fix = {
230     hackname = badquote;
231     files    = sundev/vuid_event.h;
232     sed      = "s/doesn't/does not/";
233 };
234
235
236 /*
237  *  Fix #defines under Alpha OSF/1:
238  *  The following files contain '#pragma extern_prefix "_FOO"' followed by
239  *  a '#define something(x,y,z) _FOOsomething(x,y,z)'.  The intent of these
240  *  statements is to reduce namespace pollution.  While these macros work
241  *  properly in most cases, they don't allow you to take a pointer to the
242  *  "something" being modified.  To get around this limitation, change these
243  *  statements to be of the form '#define something _FOOsomething'.
244  */
245 fix = {
246     hackname = bad_lval;
247     files    = libgen.h;
248     files    = dirent.h;
249     files    = ftw.h;
250     files    = grp.h;
251     files    = ndbm.h;
252     files    = pthread.h;
253     files    = pwd.h;
254     files    = signal.h;
255     files    = standards.h;
256     files    = stdlib.h;
257     files    = string.h;
258     files    = stropts.h;
259     files    = time.h;
260     files    = unistd.h;
261     sed      =
262         "s/^[ \t]*#[ \t]*define[ \t]*\\([^(]*\\)\\(([^)]*)\\)[ \t]*"
263                "\\(_.\\)\\1\\2[ \t]*$/#define \\1 \\3\\1/";
264 };
265
266
267 /*
268  *  check for broken assert.h that needs stdio.h
269  */
270 fix = {
271     hackname = broken_assert_stdio;
272     files    = assert.h;
273     select   = stderr;
274     bypass   = "include.*stdio.h";
275     sed      = "1i\\\n"
276                "#include <stdio.h>\n";
277 };
278
279
280 /*
281  *  check for broken assert.h that needs stdlib.h
282  */
283 fix = {
284     hackname = broken_assert_stdlib;
285     files    = assert.h;
286     select   = 'exit *\(|abort *\(';
287     bypass   = "include.*stdlib.h";
288     sed      = "1i\\\n"
289                "#ifdef __cplusplus\\\n"
290                "#include <stdlib.h>\\\n"
291                "#endif\n";
292 };
293
294
295 /*
296  *  Note that BSD43_* are used on recent MIPS systems.
297  */
298 fix = {
299     hackname = bsd43_io_macros;
300     select   = "BSD43__IO";
301     /*
302      *  Put single quotes aroung the character that appears after '('
303      *  and before ',', UNLESS it is a 'c' or 'g' or 'x'.
304      */
305     sed = "/[ \t]BSD43__IO[A-Z]*[ \t]*(/"       's/(\(.\),/(\'\1\',/';
306     sed = "/#[ \t]*define[ \t]*[ \t]BSD43__IO/" 's/\'\([cgx]\)\'/\1/g';
307 };
308
309
310 /*
311  *  Fix <c_asm.h> on Digital UNIX V4.0:
312  *  It contains a prototype for a DEC C internal asm() function,
313  *  clashing with gcc's asm keyword.  So protect this with __DECC.
314  */
315 fix = {
316     hackname = dec_intern_asm;
317     files    = c_asm.h;
318     sed = "/^[ \t]*float[ \t]*fasm/i\\\n#ifdef __DECC\n";
319     sed = "/^[ \t]*#[ \t]*pragma[ \t]*intrinsic([ \t]*dasm/a\\\n"
320           "#endif\n";
321 };
322
323
324 /*
325  *  Completely replace &lt;_int_varargs.h&gt; with a file that includes gcc's
326  *  stdarg.h or varargs.h files as appropriate on DG/UX
327  */
328 fix = {
329     hackname = dgux_int_varargs;
330     files    = _int_varargs.h;
331     shell    = "cat > /dev/null\ncat << '_EOF_'
332 \#ifndef __INT_VARARGS_H
333 \#define __INT_VARARGS_H
334
335 /************************************************************************/
336 /* _INT_VARARGS.H - Define the common stuff for varargs/stdarg/stdio.   */
337 /************************************************************************/
338
339 /*
340 ** This file is a DG internal header.  Never include this
341 ** file directly.
342 */
343
344 \#ifndef ___int_features_h
345 \#include &lt;sys/_int_features.h&gt;
346 \#endif
347
348 \#if !(defined(_VA_LIST) || defined(_VA_LIST_))
349 \#define _VA_LIST
350 \#define _VA_LIST_
351
352 \#ifdef __LINT__
353
354 \#ifdef __STDC__
355 typedef void * va_list;
356 \#else
357 typedef char * va_list;
358 \#endif
359
360 \#else
361 \#if _M88K_ANY
362
363 \#if defined(__DCC__)
364
365 typedef struct {
366       int     next_arg;
367       int     *mem_ptr;
368       int     *reg_ptr;
369 } va_list;
370
371 \#else  /* ! defined(__DCC__) */
372
373 typedef struct {
374       int  __va_arg;       /* argument number */
375       int *__va_stk;       /* start of args passed on stack */
376       int *__va_reg;       /* start of args passed in regs */
377 } va_list;
378
379 \#endif  /* ! defined(__DCC__) */
380
381 \#elif _IX86_ANY
382
383 \#if defined(__GNUC__) || defined(__STDC__)
384 typedef void * va_list;
385 \#else
386 typedef char * va_list;
387 \#endif
388
389 \#endif  /*  _IX86_ANY */
390
391 \#endif /* __LINT__ */
392 \#endif /*  !(defined(_VA_LIST) || defined(_VA_LIST_)) */
393 \#endif /*  #ifndef __INT_VARARGS_H  */
394 _EOF_\n";
395 };
396
397
398 /*
399  *  Remove the double-slash comments
400  *  They *must* be removed so it will not create nested comments!!
401  *  However, they will *not* be removed if the file name ends with
402  *  any of "++", ".hh" or ".H", or if the file name contains "cxx/".
403  *
404  *  There *used* to be a number of similar problems in various OSes:
405
406  *  Turning // comments into normal comments trashes this IRIX 4.0.1
407  *  header file, which embeds // comments inside multi-line
408  *  comments.  If this looks like the IRIX header file, we refix it by
409  *  just throwing away the // comments.
410
411  *  Same problem with a file from SunOS 4.1.3 : a header file containing
412  *  the string "//" embedded in "/ * * /"
413
414  *  There is a similar problem with the VxWorks drv/netif/if_med.h file.
415
416  *  And also with the HP-UX 10 and HP-UX 11 sys/pci.h file
417
418  *  Now that we delete the // comments instead of converting them to / * * /,
419  *  traditional hacks like irix_bogus_cxx_cmnt, no longer work (which
420  *  strangely enough was also used on alpha-dec-osf4.0d).  If we skip the
421  *  hack whenever we see ``"//"' ', then the need for the secondary hack
422  *  disappears.  Note: it is painful to ensure that the first quote
423  *  exists, so we just check for the trailing quote directly abutting
424  *  the //.  Note: We should never touch a line that has // completely
425  *  within quotes but this is somewhat hard to check for.
426
427  *  Ultimately, this fix ought to go inside of C code where
428  *  we can do a better analysis on the need and method for fixing.
429  */
430 fix = {
431     hackname = no_double_slash;
432     /*
433      *  Test that the file-to-fix does not from a C++ directory
434      *  Also, only accept double slashes that are not part of URL's
435      *  and are not the end of a quoted string.
436      */
437     test   = ' -z "`echo ${file} | egrep \'(CC|cxx|\+\+)/\'`"';
438     select = '(^|[^:])//[^"*]';
439     sed    = 's,^//.*$,,';
440     sed    = 's,[^:]//[^"].*$,,';
441 };
442
443
444 /*
445  * Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
446  */
447 fix = {
448     hackname = ecd_cursor;
449     files  = "sunwindow/win_lock.h";
450     files  = "sunwindow/win_cursor.h";
451     sed    = "s/ecd.cursor/ecd_cursor/";
452 };
453
454 /*
455  *  On SCO OpenServer 5.0.0 through (at least) 5.0.5 <sys/stat.h> contains
456  *  tiny static wrappers that aren't C++ safe.
457  */
458 fix = {
459     hackname = sco5_stat_wrappers;
460     mach     = "i*86-*-sco3.2v5*";
461     files    = "sys/stat.h";
462
463     sed = "/^static int[ \t]*[a-z]*stat(/i\\\n"
464         "#ifdef __cplusplus\\\n"
465         "extern \"C\"\\\n"
466         "{\\\n"
467         "#endif\\\n";
468
469     sed = "/^}$/a\\\n"
470         "#ifdef __cplusplus\\\n"
471         "}\\\n"
472         "#endif \/* __cplusplus *\/\\\n";
473 };
474
475
476
477 /*
478  *  Fix else and endif directives that contain non-commentary text
479  */
480 fix = {
481     hackname = end_else_label;
482
483     /*
484      *  Select files that contain '#endif' or '#else' directives with
485      *  some sort of following junk.  (Between the ascii '.'
486      *  and '0' lies the character '/'.  This will *NOT*
487      *  match '#endif / * foo * /', but it also wont match
488      *  '#endif / done' either.
489      *
490      *  We have a second regexp in the selector to detect
491      *  #endif followed by a / followed by anything other
492      *  than a *.  For example "#endif / * foo * /" or 
493      *  "#endif /% blah %/ which appear on OSF4.0A and AIX4.2
494      *  repsectively.
495      * 
496      *  We use the pattern [!-.0-z{|}~] instead of [^/ \t] to match a
497      *  noncomment following #else or #endif because some buggy egreps
498      *  think [^/] matches newline, and they thus think `#else ' matches
499      *  `#e[ndiflse]*[ \t]+[^/ \t]'.
500      *  [!-.0-~] does not work properly on AIX 4.1.
501      */
502     select   = "^[ \t]*#[ \t]*(else|endif)[ \t]+"
503                "("  '[!-.0-z\{\|\}\~]'  "|"  '/[^\*]'  ")";
504
505     /*
506      *  First, join the continued input lines.
507      *  IF the resulting line is an endif preprocessing directive,
508      *  then trim off the following patterns:
509      *  1.  sequences that start with '/' and is *NOT* followed by '*'
510      *  2.  Sequences that start with '*' and is *NOT* followed by '/'
511      *  3.  sequences that do not start with any of '/', '*', '\t' or ' '.
512      *
513      * The fixinc_eol stuff is to work around a bug in the sed
514      */
515     sed =      ":loop\n"
516                '/\\\\$/'                       "N\n"
517                's/\\\\$/\\\\+++fixinc_eol+++/' "\n"
518                '/\\\\$/'                       "b loop\n"
519                's/\\\\+++fixinc_eol+++/\\\\/g' "\n"
520
521                "s%^\\([ \t]*#[ \t]*else\\)[ \t][ \t]*/[^*].*%\\1%\n"
522                "s%^\\([ \t]*#[ \t]*else\\)[ \t][ \t]*[^/ \t].*%\\1%\n"
523                "s%^\\([ \t]*#[ \t]*endif\\)[ \t][ \t]*/[^*].*%\\1%\n"
524                "s%^\\([ \t]*#[ \t]*endif\\)[ \t][ \t]*\\*[^/].*%\\1%\n"
525                "s%^\\([ \t]*#[ \t]*endif\\)[ \t][ \t]*[^/* \t].*%\\1%";
526 };
527
528
529 /*
530  *  Fix HP's use of ../machine/inline.h to refer to
531  *    /usr/include/machine/inline.h
532  */
533 fix = {
534     hackname = hp_inline;
535     files  = sys/spinlock.h;
536     select = 'include.*"\.\./machine/';
537     sed    = "s,\"../machine/inline.h\",<machine/inline.h>,";
538     sed    = "s,\"../machine/psl.h\",<machine/psl.h>,";
539 };
540
541
542 /*
543  *  Check for (...) in C++ code in HP/UX sys/file.h.
544  */
545 fix = {
546     hackname = hp_sysfile;
547     files    = sys/file.h;
548     select   = "HPUX_SOURCE";
549     sed      = 's/(\.\.\.)/(struct file * ...)/';
550 };
551
552
553 /*
554  *  sys/mman.h on HP/UX is not C++ ready,
555  *  even though NO_IMPLICIT_EXTERN_C is defined on HP/UX.
556  *
557  *  rpc/types.h on OSF1/2.0 is not C++ ready, even though NO_IMPLICIT_EXTERN_C
558  *  is defined for the alpha.  The problem is the declaration of malloc.
559  */
560 fix = {
561     hackname = cxx_unready;
562     files    = sys/mman.h;
563     files    = rpc/types.h;
564     bypass = '"C"|__BEGIN_DECLS';
565
566     sed      = "1i\\\n"
567                "#ifdef __cplusplus\\\n"
568                "extern \"C\" {\\\n"
569                "#endif\\\n\n";
570     sed      = "$a\\\n"
571                "#ifdef __cplusplus\\\n"
572                "}\\\n"
573                "#endif\n";
574 };
575
576
577 /*
578  *  HPUX 10.x sys/param.h defines MAXINT which clashes with values.h
579  */
580 fix = {
581     hackname = hpux_maxint;
582     files    = sys/param.h;
583     sed      = "/^#[ \t]*define[ \t]*MAXINT[ \t]/i\\\n"
584                "#ifndef MAXINT\n";
585
586     sed      = "/^#[ \t]*define[ \t]*MAXINT[ \t]/a\\\n"
587                "#endif\n";
588 };
589
590
591 /*
592  *  Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
593  */
594 fix = {
595     hackname = hpux_systime;
596     files    = sys/time.h;
597     select   = "^extern struct sigevent;";
598     sed      = "s/^extern struct sigevent;/struct sigevent;/";
599 };
600
601
602 /*
603  *  Determine if we're on Interactive Unix 2.2 or later, in which case we
604  *  need to fix some additional files.  This is the same test for ISC that
605  *  Autoconf uses.  On Interactive 2.2, certain traditional Unix
606  *  definitions (notably getc and putc in stdio.h) are omitted if __STDC__
607  *  is defined, not just if _POSIX_SOURCE is defined.  This makes it
608  *  impossible to compile any nontrivial program except with -posix.
609  */
610 fix = {
611     hackname = interactv_add1;
612
613     test   = " -d /etc/conf/kconfig.d";
614     test   = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
615
616     files  = "stdio.h";
617     files  = "math.h";
618     files  = "ctype.h";
619     files  = "sys/limits.h";
620     files  = "sys/fcntl.h";
621     files  = "sys/dirent.h";
622
623     sed    = "s/!defined(__STDC__) && !defined(_POSIX_SOURCE)/"
624                "!defined(_POSIX_SOURCE)/";
625 };
626
627 fix = {
628     hackname = interactv_add2;
629
630     test   = " -d /etc/conf/kconfig.d";
631     test   = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
632
633     files  = math.h;
634     sed    = "s/fmod(double)/fmod(double, double)/";
635 };
636
637 fix = {
638     hackname = interactv_add3;
639
640     test   = " -d /etc/conf/kconfig.d";
641     test   = ' -n "`grep _POSIX_VERSION /usr/include/sys/unistd.h`"';
642
643     files  = sys/limits.h;
644
645     sed    = "/CHILD_MAX/s,/\\* Max, Max,";
646     sed    = "/OPEN_MAX/s,/\\* Max, Max,";
647 };
648
649
650 /*
651  *  Fix various _IO* defines, but do *not* quote the characters cgxtf.
652  */
653 fix = {
654     hackname = io_def_quotes;
655     select = "[ \t]*[ \t](_|DES)IO[A-Z]*[ \t]*\\( *[^,']";
656     sed = "s/\\([ \t]*[ \t]_IO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/";
657     sed = "s/\\([ \t]*[ \t]DESIO[A-Z]*[ \t]*(\\)\\([^,']\\),/\\1'\\2',/";
658     sed = "/#[ \t]*define[ \t]*[ \t]_IO/"       "s/'\\([cgxtf]\\)'/\\1/g";
659     sed = "/#[ \t]*define[ \t]*[ \t]DESIOC/"    's/\'\([cdgx]\)\'/\1/g';
660 };
661
662
663 /*
664  *  Fix CTRL macros
665  *
666  * Basically, what is supposed to be happening is that every
667  * _invocation_ of the "_CTRL()" or "CTRL()" macros is supposed to have
668  * its argument inserted into single quotes.  We _must_ do this because
669  * ANSI macro substitution rules prohibit looking inside quoted strings
670  * for the substitution names.  A side effect is that the quotes are
671  * inserted in the definitions of those macros as well.  So, the last
672  * several sed expressions are supposed to clean up the definitions, as
673  * long as those definitions are using "c", "g" or "x" as the macro
674  * argument :).  Yuck.
675  */
676 fix = {
677     hackname = ioctl_fix_ctrl;
678     select = "CTRL[ \t]*\\(";
679
680     sed = "/[^A-Z0-9_]CTRL[ \t]*(/"
681               "s/\\([^']\\))/'\\1')/";
682
683     sed = "/[^A-Z0-9]_CTRL[ \t]*(/"
684               "s/\\([^']\\))/'\\1')/";
685
686     sed = "/#[ \t]*define[ \t]*[ \t]CTRL/"
687               "s/'\\([cgx]\\)'/\\1/g";
688
689     sed = "/#[ \t]*define[ \t]*[ \t]_CTRL/"
690               "s/'\\([cgx]\\)'/\\1/g";
691
692     sed = "/#[ \t]*define[ \t]*[ \t]BSD43_CTRL/"
693               "s/'\\([cgx]\\)'/\\1/g";
694
695     sed = "/#[ \t]*define[ \t]*[ \t][_]*ISCTRL/"
696               "s/'\\([cgx]\\)'/\\1/g";
697 };
698
699
700 /*
701  *  Check for missing ';' in struct
702  */
703 fix = {
704     hackname = ip_missing_semi;
705     files    = netinet/ip.h;
706     sed      = "/^struct/,/^};/s/}$/};/";
707 };
708
709
710 /*
711  *  IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr
712  *  in prototype without previous definition.
713  */
714 fix = {
715     hackname = irix_multiline_cmnt;
716     files    = sys/types.h;
717
718     sed   = "s@type of the result@type of the result */@";
719     sed   = "s@of the sizeof@/* of the sizeof@";
720 };
721
722
723 /*
724  *  Some IRIX header files contain the string "//"
725  */
726 fix = {
727     hackname = irix_sockaddr;
728     files    = rpc/auth.h;
729     select   = "authdes_create.*struct sockaddr";
730     sed      = "/authdes_create.*struct sockaddr/i\\\n"
731                "struct sockaddr;\n";
732 };
733
734
735 /*
736  *  IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s
737  *  in prototype without previous definition.
738  */
739 fix = {
740     hackname = irix_struct__file;
741     files = rpc/xdr.h;
742     sed   = "/xdrstdio_create.*struct __file_s/i\\\n"
743             "struct __file_s;\n";
744 };
745
746
747 /*
748  * Fixing ISC fmod declaration
749  */
750 fix = {
751     hackname = isc_fmod;
752     files    = math.h;
753     select   = 'fmod\(double\)';
754     sed      = "s/fmod(double)/fmod(double, double)/";
755 };
756
757   
758 /*
759  * Fix nested comments in Motorola's <limits.h> and <sys/limits.h>
760  */
761 fix = {
762     hackname = motorola_nested;
763     mach     = "m68k-motorola-sysv*";
764     files    = limits.h;
765     files    = sys/limits.h;
766     sed = "s@^\\(#undef[ \t][ \t]*PIPE_BUF[ \t]*"
767                    "/\\* max # bytes atomic in write to a\\)$@\\1 */@";
768     sed = "s@\\(/\\*#define\tHUGE_VAL\t3.40282346638528860e+38 \\)"
769           "\\(/\\*error value returned by Math lib\\*/\\)$@\\1*/ \\2@";
770 };
771
772   
773 /*
774  * Fixing nested comments in ISC <sys/limits.h>
775  */
776 fix = {
777     hackname = isc_sys_limits;
778     files  = sys/limits.h;
779     select = CHILD_MAX;
780     sed    = "/CHILD_MAX/s,/\\* Max, Max,";
781     sed    = "/OPEN_MAX/s,/\\* Max, Max,";
782 };
783
784
785 /*
786  * These files in Sun OS 4.x and ARM/RISCiX and BSD4.3
787  * use / * * / to concatenate tokens.
788  */
789 fix = {
790     hackname = kandr_concat;
791     files  = "sparc/asm_linkage.h";
792     files  = "sun3/asm_linkage.h";
793     files  = "sun3x/asm_linkage.h";
794     files  = "sun4/asm_linkage.h";
795     files  = "sun4c/asm_linkage.h";
796     files  = "sun4m/asm_linkage.h";
797     files  = "sun4c/debug/asm_linkage.h";
798     files  = "sun4m/debug/asm_linkage.h";
799     files  = "arm/as_support.h";
800     files  = "arm/mc_type.h";
801     files  = "arm/xcb.h";
802     files  = "dev/chardefmac.h";
803     files  = "dev/ps_irq.h";
804     files  = "dev/screen.h";
805     files  = "dev/scsi.h";
806     files  = "sys/tty.h";
807     files  = "Xm.acorn/XmP.h";
808     files  = bsd43/bsd43_.h;
809     select = '/\*\*/';
810     sed    = 's|/\*\*/|##|g';
811 };
812
813
814 /*
815  *  In limits.h, put #ifndefs around things that are supposed to be defined
816  *  in float.h to avoid redefinition errors if float.h is included first.
817  *  On HP/UX this patch does not work, because on HP/UX limits.h uses
818  *  multi line comments and the inserted #endif winds up inside the
819  *  comment.  Fortunately, HP/UX already uses #ifndefs in limits.h; if
820  *  we find a #ifndef FLT_MIN we assume that all the required #ifndefs
821  *  are there, and we do not add them ourselves.
822  *  Also fix a nested comment problem in sys/limits.h on Motorola sysV68 R3V7.1
823  */
824 fix = {
825     hackname = limits_ifndefs;
826     files  = "limits.h";
827     files  = "sys/limits.h";
828     bypass = "ifndef[ \t]+FLT_MIN";
829
830     sed  = "/[ \t]FLT_MIN[ \t]/i\\\n#ifndef FLT_MIN\n";
831     sed  = "/[ \t]FLT_MIN[ \t]/a\\\n#endif\n";
832     sed  = "/[ \t]FLT_MAX[ \t]/i\\\n#ifndef FLT_MAX\n";
833     sed  = "/[ \t]FLT_MAX[ \t]/a\\\n#endif\n";
834     sed  = "/[ \t]FLT_DIG[ \t]/i\\\n#ifndef FLT_DIG\n";
835     sed  = "/[ \t]FLT_DIG[ \t]/a\\\n#endif\n";
836     sed  = "/[ \t]DBL_MIN[ \t]/i\\\n#ifndef DBL_MIN\n";
837     sed  = "/[ \t]DBL_MIN[ \t]/a\\\n#endif\n";
838     sed  = "/[ \t]DBL_MAX[ \t]/i\\\n#ifndef DBL_MAX\n";
839     sed  = "/[ \t]DBL_MAX[ \t]/a\\\n#endif\n";
840     sed  = "/[ \t]DBL_DIG[ \t]/i\\\n#ifndef DBL_DIG\n";
841     sed  = "/[ \t]DBL_DIG[ \t]/a\\\n#endif\n";
842     sed  = "/^\\(\\/\\*#define\tHUGE_VAL\t3\\.[0-9e+]* *\\)\\/\\*/s//\\1/";
843 };
844
845
846 /*
847  *  Delete the '#define void int' line from curses.h on Lynx
848  */
849 fix = {
850     hackname = lynx_void_int;
851     files    = curses.h;
852     select   = "#[ \t]*define[ \t]+void[ \t]+int";
853     sed      = "/#[ \t]*define[ \t][ \t]*void[ \t]int/d";
854 };
855
856
857 /*
858  *  Fix fcntl prototype in fcntl.h on LynxOS.
859  */
860 fix = {
861     hackname = lynxos_fcntl_proto;
862     files    = fcntl.h;
863     select   = 'fcntl.*\(int, int, int\)';
864     sed      = 's/\(fcntl.*(int, int, \)int)/\1...)/';
865 };
866
867
868 /*
869  *  libm.a on m88k-motorola-sysv3 contains a stupid optimization for
870  *  function hypot(), which returns the second argument without even
871  *  looking at its value, if the other is 0.0.  Another drawback is
872  *  that fix-header doesn't fix fabs' prototype, and I have no idea why.
873  */
874 fix = {
875     hackname = m88k_bad_hypot_opt;
876     mach     = "m88k-motorola-sysv3*";
877     files    = "math.h";
878
879     sed = "s/extern double floor(), ceil(), fmod(), fabs();/"
880             "extern double floor(), ceil(), fmod(), fabs _PARAMS((double));/";
881
882     sed = "/^extern double hypot();$/a\\\n"
883           "\\/* Workaround a stupid Motorola optimization if one\\\n"
884           "   of x or y is 0.0 and the other is negative!  *\\/\\\n"
885           "#ifdef __STDC__\\\n"
886           "static __inline__ double fake_hypot (double x, double y)\\\n"
887           "#else\\\n"
888           "static __inline__ double fake_hypot (x, y)\\\n"
889           "\tdouble x, y;\\\n"
890           "#endif\\\n"
891           "{\\\n"
892           "\treturn fabs (hypot (x, y));\\\n"
893           "}\\\n"
894           "#define hypot\tfake_hypot\n";
895 };
896
897
898 /*
899  *  Fix incorrect S_IF* definitions on m88k-sysv3.
900  */
901 fix = {
902     hackname = m88k_bad_s_if;
903     mach     = "m88k-*-sysv3*";
904     files    = sys/stat.h;
905     select   = "#define[ \t]+S_IS[A-Z]*(m)[ \t]";
906
907     sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*"
908             "(m[ \t]*&[ \t]*\\(S_IF[A-Z][A-Z][A-Z][A-Z]*\\)[ \t]*)/"
909             "\\1 (((m)\\&S_IFMT)==\\2)/";
910
911     sed = "s/^\\(#define[ \t]*S_IS[A-Z]*(m)\\)[ \t]*"
912             "(m[ \t]*&[ \t]*\\(0[0-9]*\\)[ \t]*)/"
913             "\\1 (((m)\\&S_IFMT)==\\2)/";
914 };
915
916
917 /*
918  * Put cpp wrappers around these include files to avoid redeclaration
919  * errors during multiple inclusion on m88k-tektronix-sysv3.
920  */
921 fix = {
922     hackname = m88k_multi_incl;
923     mach     = "m88k-tektronix-sysv3*";
924     files    = "time.h";
925     bypass   = "#ifndef";
926     shell    =
927       "echo Fixing $file, to protect against multiple inclusion. >&2
928       cpp_wrapper=`echo $file | sed -e 's,\\.,_,g' -e 's,/,_,g'`
929       echo \"#ifndef __GCC_GOT_${cpp_wrapper}_\"
930       echo \"#define __GCC_GOT_${cpp_wrapper}_\"
931       cat
932       echo \"#endif /* ! __GCC_GOT_${cpp_wrapper}_ */\"";
933 };
934
935
936 /*
937  *  Fix non-ansi machine name defines
938  *  File selection is split into two parts:  the shell version as
939  *  a single patch, and the program version with each patch separate.
940  *  Each is substantially faster for the particular environment.
941  *  You have a dual maintenance problem here.
942  */
943 fix = {
944     hackname = machine_name;
945     /*
946      *  Select '#if.*' and '#elif" with possible non-ansi symbols
947      *  The only non-ansi symbols we know about start with one of:
948      *     MRS_bhimnprstuv
949      *  If any are added to the substitution list, then add it to
950      *  the selection list as well.  Hopefully we can avoid names
951      *  starting with "d" and "l", because this pattern would then
952      *  match "defined" and "lint" as well.  I suppose we could add
953      *  a "bypass = lint" if we had to though.
954      *
955      * The fixinc_eol stuff is to work around a bug in the sed
956      */
957     select = "^#[ \t]*(if|elif).*"
958              "[^a-zA-Z0-9_](_*[MSRrhim]|[Mbimnpstuv])[a-zA-Z0-9_]";
959     exesel = "^#[ \t]*(if|elif).*[^a-zA-Z0-9_]"
960              "("
961                   "M32"
962                  "|_*MIPSE[LB]"
963                  "|_*SYSTYPE_[A-Z0-9]"
964                  "|_*[Rr][34]000"
965                  "|_*host_mips"
966                  "|_*i386"
967                  "|_*mips"
968                  "|bsd4"
969                  "|is68k"
970                  "|m[68]8k"
971                  "|mc680"
972                  "|news"
973                  "|ns32000"
974                  "|pdp11"
975                  "|pyr"
976                  "|sel"
977                  "|sony_news"
978                  "|sparc"
979                  "|sun"
980                  "|tahoe"
981                  "|tower"
982                  "|u370"
983                  "|u3b"
984                  "|unix"
985                  "|vax"
986              ")";
987
988     sed =      ":loop\n"
989                '/\\\\$/'                       "N\n"
990                's/\\\\$/\\\\+++fixinc_eol+++/' "\n"
991                '/\\\\$/'                       "b loop\n"
992                's/\\\\+++fixinc_eol+++/\\\\/g' "\n"
993
994           "/#[\t ]*[el]*if/ {\n"
995                 "\ts/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g\n"
996
997                 "\ts/ M32 / __M32__ /g\n"
998                 "\ts/ _*MIPSE\\([LB]\\) / __MIPSE\\1__ /g\n"
999                 "\ts/ _*SYSTYPE_\\([A-Z0-9]*\\) / __SYSTYPE_\\1__ /g\n"
1000                 "\ts/ _*\\([Rr][34]\\)000 / __\\1000__ /g\n"
1001                 "\ts/ _*host_mips / __host_mips__ /g\n"
1002                 "\ts/ _*i386 / __i386__ /g\n"
1003                 "\ts/ _*mips / __mips__ /g\n"
1004                 "\ts/ bsd4\\([0-9]\\) / __bsd4\\1__ /g\n"
1005                 "\ts/ is68k / __is68k__ /g\n"
1006                 "\ts/ m68k / __m68k__ /g\n"
1007                 "\ts/ m88k / __m88k__ /g\n"
1008                 "\ts/ mc680\\([0-9]\\)0 / __mc680\\10__ /g\n"
1009                 "\ts/ news\\([0-9]*\\) / __news\\1__ /g\n"
1010                 "\ts/ ns32000 / __ns32000__ /g\n"
1011                 "\ts/ pdp11 / __pdp11__ /g\n"
1012                 "\ts/ pyr / __pyr__ /g\n"
1013                 "\ts/ sel / __sel__ /g\n"
1014                 "\ts/ sony_news / __sony_news__ /g\n"
1015                 "\ts/ sparc / __sparc__ /g\n"
1016                 "\ts/ sun\\([a-z0-9]*\\) / __sun\\1__ /g\n"
1017                 "\ts/ tahoe / __tahoe__ /g\n"
1018                 "\ts/ tower\\([_0-9]*\\) / __tower\\1__ /g\n"
1019                 "\ts/ u370 / __u370__ /g\n"
1020                 "\ts/ u3b\\([0-9]*\\) / __u3b\\1__ /g\n"
1021                 "\ts/ unix / __unix__ /g\n"
1022                 "\ts/ vax / __vax__ /g\n"
1023
1024                 "\ts/ \\([a-zA-Z0-9_][a-zA-Z0-9_]*\\) /\\1/g\n\t}";
1025 };
1026
1027
1028 /*
1029  *  Some math.h files define struct exception, which conflicts with
1030  *  the class exception defined in the C++ file std/stdexcept.h.  We
1031  *  redefine it to __math_exception.  This is not a great fix, but I
1032  *  haven't been able to think of anything better.
1033  */
1034 fix = {
1035     hackname = math_exception;
1036     files    = math.h;
1037     select   = "struct exception";
1038     sed      = "/struct exception/i\\\n"
1039                "#ifdef __cplusplus\\\n"
1040                "#define exception __math_exception\\\n"
1041                "#endif\n";
1042     sed      = "/struct exception/a\\\n"
1043                "#ifdef __cplusplus\\\n"
1044                "#undef exception\\\n"
1045                "#endif\n";
1046
1047     sed      = "/matherr/i\\\n"
1048                "#ifdef __cplusplus\\\n"
1049                "#define exception __math_exception\\\n"
1050                "#endif\n";
1051
1052     sed      = "/matherr/a\\\n"
1053                "#ifdef __cplusplus\\\n"
1054                "#undef exception\\\n"
1055                "#endif\n";
1056
1057 #ifdef MATH_EXCEPTION_FIXED
1058
1059 I think this patch needs some more thinking.
1060 This is from SVR4.2 (With '#' replaced with '@').
1061 Perhaps we could do without the "/matherr/a" entries?
1062 Can we bypass the entire fix if someone was astute
1063 enough to have '#ifdef __cplusplus' anywhere in the file?
1064
1065
1066 *** /usr/include/math.h Fri Apr  3 18:54:59 1998
1067 --- math.h      Sun May  9 07:28:58 1999
1068 ***************
1069 *** 25,31 ****
1070 --- 25,37 ----
1071   
1072   @ifndef __cplusplus
1073   
1074 + @ifdef __cplusplus
1075 + @define exception __math_exception
1076 + @endif
1077   struct exception
1078 + @ifdef __cplusplus
1079 + @undef exception
1080 + @endif
1081   {
1082         int     type;
1083         char    *name;
1084 ***************
1085 *** 34,40 ****
1086 --- 40,58 ----
1087         double  retval;
1088   };
1089   
1090 + @ifdef __cplusplus
1091 + @define exception __math_exception
1092 + @endif
1093 + @ifdef __cplusplus
1094 + @define exception __math_exception
1095 + @endif
1096   extern int    matherr(struct exception *);
1097 + @ifdef __cplusplus
1098 + @undef exception
1099 + @endif
1100 + @ifdef __cplusplus
1101 + @undef exception
1102 + @endif
1103   
1104   @endif /*__cplusplus*/
1105 #endif
1106 };
1107
1108
1109 /*
1110  * In math.h, put #ifndefs around things that might be defined
1111  * in a gcc specific math-*.h file.
1112  */
1113 fix = {
1114     hackname = math_gcc_ifndefs;
1115     files    = math.h;
1116
1117     shell    =
1118     /*
1119      *  First see if we have a definition for DBL_MAX in float.h
1120      *  If we do, we will replace the one in math.h with that one.
1121      */
1122
1123     /*
1124      *  IF we have such a define *and* HUGE_VAL is defined to be DBL_MAX
1125      *     *and* DBL_MAX is _not_ defined in the current file (math.h),
1126      *  THEN replace the defined value of HUGE_VAL
1127      *  ELSE just copy stdin to stdout so the main filter can process it
1128      */
1129
1130     /*
1131      *  Put conditional guards around the HUGE_VAL definition.
1132      */
1133
1134     "\tdbl_max_def=`egrep 'define[ \t]+DBL_MAX[ \t]+.*' float.h "
1135                 "2>/dev/null`\n\n"
1136
1137     "\tif ( test -n \"${dbl_max_def}\" \\\n"
1138     "\t\t-a -n \"`egrep '#define[ \t]*HUGE_VAL[ \t]+DBL_MAX' $file`\" \\\n"
1139     "\t\t-a -z \"`egrep '#define[ \t]+DBL_MAX[ \t]+' $file`\"\n"
1140              "\t   ) > /dev/null 2>&1\n"
1141     "\tthen sed -e '/define[ \t]HUGE_VAL[ \t]DBL_MAX/s/DBL_MAX/$dbl_max_def/'"
1142     "\n\telse cat ; fi |\n"
1143
1144     "\tsed -e '/define[ \t]HUGE_VAL[ \t]/i\\\n#ifndef HUGE_VAL\n' "
1145           "-e '/define[ \t]HUGE_VAL[ \t]/a\\\n#endif\n'";
1146 };
1147
1148
1149 /*
1150  *  nested comment
1151  */
1152 fix = {
1153     hackname = nested_comment;
1154     files    = rpc/rpc.h;
1155     sed      = 's@^\(/\*.*rpc/auth_des.h>.*\)/\*@\1*/ /*@';
1156 };
1157
1158
1159 /*
1160  *  fix bogus recursive stdlib.h in NEWS-OS 4.0C
1161  */
1162 fix = {
1163     hackname = news_os_recursion;
1164     files    = stdlib.h;
1165     select   = "#include <stdlib.h>";
1166     sed      = "/^#include <stdlib.h>/i\\\n"
1167                     "#ifdef BOGUS_RECURSION\n";
1168     sed      = "/^#include <stdlib.h>/a\\\n"
1169                     "#endif\n";
1170 };
1171
1172
1173 /*
1174  *  NeXT 3.2 adds const prefix to some math functions.
1175  *  These conflict with the built-in functions.
1176  */
1177 fix = {
1178     hackname = next_math_prefix;
1179     files    = ansi/math.h;
1180     select   = "^extern.*double.*__const__.*";
1181
1182     sed = "/^extern.*double.*__const__.*sqrt(/s/__const__//";
1183     sed = "/^extern.*double.*__const__.*fabs(/s/__const__//";
1184     sed = "/^extern.*double.*__const__.*cos(/s/__const__//";
1185     sed = "/^extern.*double.*__const__.*hypot(/s/__const__//";
1186     sed = "/^extern.*double.*__const__.*sin(/s/__const__//";
1187 };
1188
1189
1190 /*
1191  *  NeXT 3.2 uses the word "template" as a parameter for some
1192  *  functions. GCC reports an invalid use of a reserved key word
1193  *  with the built-in functions. NeXT 3.2 includes the keyword
1194  *  volatile in the prototype for abort(). This conflicts with
1195  *  the built-in definition.
1196  */
1197 fix = {
1198     hackname = next_template;
1199     files    = bsd/libc.h;
1200     select   = template;
1201
1202     sed = '/\(.*template\)/s/template//';
1203     sed = "/extern.*volatile.*void.*abort/s/volatile//";
1204 };
1205
1206
1207 /*
1208  *  NeXT 3.2 includes the keyword volatile in the abort() and  exit()
1209  *  function prototypes. That conflicts with the  built-in functions.
1210  */
1211 fix = {
1212     hackname = next_volitile;
1213     files    = ansi/stdlib.h;
1214     select   = volatile;
1215
1216     sed    = "/extern.*volatile.*void.*exit/s/volatile//";
1217     sed    = "/extern.*volatile.*void.*abort/s/volatile//";
1218 };
1219
1220
1221 /*
1222  *  NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1.
1223  *  Note that version 3 of the NeXT system has wait.h in a different directory,
1224  *  so that this code won't do anything.  But wait.h in version 3 has a
1225  *  conditional, so it doesn't need this fix.  So everything is okay.
1226  */
1227 fix = {
1228     hackname = next_wait_union;
1229     files    = sys/wait.h;
1230
1231     select = 'wait\(union wait';
1232
1233     sed = "s@wait(union wait@wait(void@";
1234 };
1235
1236
1237 /*
1238  *  a missing semi-colon at the end of the nodeent structure definition.
1239  */
1240 fix = {
1241     hackname = nodeent_syntax;
1242     files    = netdnet/dnetdb.h;
1243     sed      = "s/char.*na_addr *$/char *na_addr;/";
1244 };
1245
1246
1247 /*
1248  *  sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by
1249  *  defining regex.h related types.  This causes libg++ build and usage
1250  *  failures.  Fixing this correctly requires checking and modifying 3 files.
1251  */
1252 fix = {
1253     hackname = osf_namespace_a;
1254     files    = reg_types.h;
1255     files    = sys/lc_core.h;
1256     test     = " -r reg_types.h";
1257     test     = " -r sys/lc_core.h";
1258     test     = " -n \"`grep '} regex_t;' reg_types.h`\"";
1259     test     = " -z \"`grep __regex_t regex.h`\"";
1260
1261     sed      = "s/regex_t/__regex_t/g";
1262     sed      = "s/regoff_t/__regoff_t/g";
1263     sed      = "s/regmatch_t/__regmatch_t/g";
1264 };
1265
1266 fix = {
1267     hackname = osf_namespace_b;
1268     files    = regex.h;
1269     test     = " -r reg_types.h";
1270     test     = " -r sys/lc_core.h";
1271     test     = " -n \"`grep '} regex_t;' reg_types.h`\"";
1272     test     = " -z \"`grep __regex_t regex.h`\"";
1273
1274     sed      = "/#include <reg_types.h>/a\\\n"
1275                "typedef __regex_t\tregex_t;\\\n"
1276                "typedef __regoff_t\tregoff_t;\\\n"
1277                "typedef __regmatch_t\tregmatch_t;\n";
1278 };
1279
1280
1281 /*
1282  *  Fix __page_size* declarations in pthread.h AIX 4.1.[34].
1283  *  The original ones fail if uninitialized externs are not common.
1284  *  This is the default for all ANSI standard C++ compilers.
1285  */
1286 fix = {
1287     hackname = pthread_page_size;
1288     files    = pthread.h;
1289     select   = "^int __page_size";
1290     sed      = "s/^int __page_size/extern int __page_size/";
1291 };
1292
1293
1294 /*
1295  *  Fix return type of fread and fwrite on sysV68
1296  */
1297 fix = {
1298     hackname = read_ret_type;
1299     files    = stdio.h;
1300     select   = "extern int\t.*, fread\\(\\), fwrite\\(\\)";
1301     sed      = "s/^\\(extern int\tfclose(), fflush()\\), "
1302                  "\\(fread(), fwrite()\\)\\(.*\\)$"
1303                "/extern unsigned int\t\\2;\\\n\\1\\3/";
1304 };
1305
1306
1307 /*
1308  *  function class(double x) conflicts with C++ keyword on rs/6000 
1309  */
1310 fix = {
1311     hackname = rs6000_double;
1312     files    = math.h;
1313     select   = '[^a-zA-Z_]class\(';
1314     
1315     sed   = "/class[(]/i\\\n#ifndef __cplusplus\n";
1316     sed   = "/class[(]/a\\\n#endif\n";
1317 };
1318
1319
1320 /*
1321  *  Wrong fchmod prototype on RS/6000.
1322  */
1323 fix = {
1324     hackname = rs6000_fchmod;
1325     files    = sys/stat.h;
1326     select   = 'fchmod\(char';
1327     sed      = 's/fchmod(char \*/fchmod(int/';
1328 };
1329
1330
1331 /*
1332  *  parameters conflict with C++ new on rs/6000 
1333  */
1334 fix = {
1335     hackname = rs6000_param;
1336     files  = "stdio.h";
1337     files  = "unistd.h";
1338
1339     sed = 's@rename(const char \*old, const char \*new)@'
1340             'rename(const char *_old, const char *_new)@';
1341 };
1342
1343
1344 /*
1345  *  Sony NEWSOS 5.0 does not support the complete ANSI C standard.
1346  */
1347 #ifdef SONY
1348 fix = {
1349     hackname = sony_ctype;
1350     files    = ctype.h;
1351     test     = " -x /bin/sony";
1352     test     = " ! -z \"`if /bin/sony ; then echo true ; fi`\"";
1353     sed      = "s/__ctype/_ctype/g";
1354 };
1355 #endif
1356
1357 /*
1358  *  Incorrect #include in Sony News-OS 3.2.
1359  */
1360 fix = {
1361     hackname = sony_include;
1362     files    = machine/machparam.h;
1363     select   = '"\.\./machine/endian.h"';
1364     sed      = 's@"../machine/endian.h"@<machine/endian.h>@';
1365 };
1366
1367
1368 /*
1369  *  Sony NEWSOS 5.0 does not support the complete ANSI C standard.
1370  */
1371 #ifdef SONY
1372 fix = {
1373     hackname = sony_stdio;
1374     files    = stdio.h;
1375     test     = " -x /bin/sony";
1376     test     = " ! -z \"`if /bin/sony ; then echo true ; fi`\"";
1377     sed      = "s/__filbuf/_filbuf/g\n"
1378                "s/__flsbuf/_flsbuf/g\n"
1379                "s/__iob/_iob/g";
1380 };
1381 #endif
1382
1383 /*
1384  *  Add a `static' declaration of `getrnge' into <regexp.h>.
1385  *
1386  *  Don't do this if there is already a `static void getrnge' declaration
1387  *  present, since this would cause a redeclaration error.  Solaris 2.x has
1388  *  such a declaration.
1389  */
1390 #ifdef SVR4
1391 fix = {
1392     hackname = static_getrnge;
1393     files    = regexp.h;
1394     bypass   = "static void getrnge";
1395     sed      = "/^static int[ \t]*size;/c\\\n"
1396                "static int      size ;\\\n\\\n"
1397                "static int getrnge ();";
1398 };
1399 #endif
1400
1401 /*
1402  *  a missing semi-colon at the end of the statsswtch structure definition.
1403  */
1404 fix = {
1405     hackname = statsswtch;
1406     files    = rpcsvc/rstat.h;
1407     select   = "boottime$";
1408     sed      = "s/boottime$/boottime;/";
1409 };
1410
1411
1412 /*
1413  *  Don't use or define the name va_list in stdio.h.
1414  *  This is for ANSI and also to interoperate properly with gcc's varargs.h.
1415  *  Arrange for stdio.h to use stdarg.h to define __gnuc_va_list
1416  */
1417 fix = {
1418     hackname = stdio_va_list;
1419     files    = stdio.h;
1420
1421     /*
1422      * Use __gnuc_va_list in arg types in place of va_list.
1423      * On 386BSD use __gnuc_va_list instead of _VA_LIST_.  We're hoping the
1424      * trailing parentheses and semicolon save all other systems from this.
1425      * Define __va_list__ (something harmless and unused) instead of va_list.
1426      * Don't claim to have defined va_list.
1427      */
1428     shell =
1429  "if ( egrep \"__need___va_list\" $file ) > /dev/null 2>&1 ; then
1430     :
1431   else
1432     echo \"#define __need___va_list\"
1433     echo \"#include <stdarg.h>\"
1434   fi
1435
1436   sed -e 's@ va_list @ __gnuc_va_list @' \\
1437       -e 's@ va_list)@ __gnuc_va_list)@' \\
1438       -e 's@ _BSD_VA_LIST_))@ __gnuc_va_list))@' \\
1439       -e 's@ _VA_LIST_));@ __gnuc_va_list));@' \\
1440       -e 's@ va_list@ __va_list__@' \\
1441       -e 's@\\*va_list@*__va_list__@' \\
1442       -e 's@ __va_list)@ __gnuc_va_list)@' \\
1443       -e 's@GNUC_VA_LIST@GNUC_Va_LIST@' \\
1444       -e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \\
1445       -e 's@VA_LIST@DUMMY_VA_LIST@' \\
1446       -e 's@_Va_LIST@_VA_LIST@'";
1447 };
1448
1449
1450 /*
1451  *  Check for strict ansi compliance
1452  */
1453 #ifdef STRICT_ANSI
1454 fix = {
1455     hackname = strict_ansi;
1456     select   = "__STDC__[ \t]*[=!]=[ \t]*[01]";
1457     sed      = "s/__STDC__[ \t]*==[ \t]*0/!defined (__STRICT_ANSI__)/g";
1458     sed      = "s/__STDC__[ \t]*!=[ \t]*0/defined (__STRICT_ANSI__)/g";
1459     sed      = "s/__STDC__[ \t]*==[ \t]*1/defined (__STRICT_ANSI__)/g";
1460     sed      = "s/__STDC__[ \t]*!=[ \t]*1/!defined (__STRICT_ANSI__)/g";
1461 };
1462 #endif
1463
1464 /*
1465  *  Fix bogus #ifdef on SunOS 4.1.
1466  */
1467 fix = {
1468     hackname = sun_bogus_ifdef;
1469     files  = "hsfs/hsfs_spec.h";
1470     files  = "hsfs/iso_spec.h";
1471     select = '#ifdef __i386__ || __vax__';
1472     sed    = "s/\\#ifdef __i386__ || __vax__/\\#if __i386__ || __vax__/g";
1473 };
1474
1475
1476 /*
1477  *  Fix bogus #ifdef on SunOS 4.1.
1478  */
1479 fix = {
1480     hackname = sun_bogus_ifdef_sun4c;
1481     files  = "hsfs/hsnode.h";
1482     select = '#ifdef __i386__ || __sun4c__';
1483     sed    = "s/\\#ifdef __i386__ || __sun4c__/\\#if __i386__ || __sun4c__/g";
1484 };
1485
1486
1487 /*
1488  *  Fix the CAT macro in SunOS memvar.h.
1489  */
1490 fix = {
1491     hackname = sun_catmacro;
1492     files  = pixrect/memvar.h;
1493     select = "^#define[ \t]+CAT\\(a,b\\)";
1494     sed    = "/^#define[ \t]CAT(a,b)/ i\\\n"
1495                  "#ifdef __STDC__ \\\n"
1496                  "#define CAT(a,b) a##b\\\n"
1497                  "#else\n";
1498
1499     sed    = "/^#define[ \t]CAT(a,b)/ a\\\n"
1500                  "#endif\n";
1501 };
1502
1503
1504 /*
1505  *  Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1.
1506  *  Also fix return type of {m,re}alloc in <malloc.h> on sysV68
1507  */
1508 fix = {
1509     hackname = sun_malloc;
1510     files    = malloc.h;
1511
1512     sed   = "s/typedef[ \t]char \\*\tmalloc_t/typedef void \\*\tmalloc_t/g";
1513     sed   = "s/int[ \t][ \t]*free/void\tfree/g";
1514     sed   = "s/char\\([ \t]*\\*[ \t]*malloc\\)/void\\1/g";
1515     sed   = "s/char\\([ \t]*\\*[ \t]*realloc\\)/void\\1/g";
1516 };
1517
1518
1519 /*
1520  *  Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
1521  *  declaration on Sun OS 4.x.  We must only fix this on Sun OS 4.x, because
1522  *  many other systems have similar text but correct versions of the file.
1523  *  To ensure only Sun's is fixed, we grep for a likely unique string.
1524  *  Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t )
1525  */
1526 fix = {
1527     hackname = sun_memcpy;
1528     files    = memory.h;
1529     select = "/\\*\t@\\(#\\)"
1530              "(head/memory.h\t50.1\t "
1531              "|memory\\.h 1\\.[2-4] 8./../.. SMI; from S5R2 1\\.2\t)\\*/";
1532
1533     sed    = "1i\\\n/* This file was generated by fixincludes */\\\n"
1534              "#ifndef __memory_h__\\\n"
1535              "#define __memory_h__\\\n\\\n"
1536              "#ifdef __STDC__\\\n"
1537              "extern void *memccpy();\\\n"
1538              "extern void *memchr();\\\n"
1539              "extern void *memcpy();\\\n"
1540              "extern void *memset();\\\n"
1541              "#else\\\n"
1542              "extern char *memccpy();\\\n"
1543              "extern char *memchr();\\\n"
1544              "extern char *memcpy();\\\n"
1545              "extern char *memset();\\\n"
1546              "#endif /* __STDC__ */\\\n\\\n"
1547              "extern int memcmp();\\\n\\\n"
1548              "#endif /* __memory_h__ */\n";
1549
1550     sed    = "1,$d";
1551 };
1552
1553
1554 /*
1555  *  Check for yet more missing ';' in struct (in SunOS 4.0.x)
1556  */
1557 fix = {
1558     hackname = sun_rusers_semi;
1559     files    = rpcsvc/rusers.h;
1560     select   = "_cnt$";
1561     sed      = "/^struct/,/^};/s/_cnt$/_cnt;/";
1562 };
1563
1564
1565 /*
1566  *  signal.h on SunOS defines signal using (),
1567  *  which causes trouble when compiling with g++ -pedantic.
1568  */
1569 fix = {
1570     hackname = sun_signal;
1571     files    = sys/signal.h;
1572     files    = signal.h;
1573     select   = "^void\t" '\(\*signal\(\)\)\(\);';
1574
1575     sed = "/^void\t" '(\*signal())();$/i'  "\\\n"
1576           "#ifdef __cplusplus"             "\\\n"
1577           "void\t(*signal(...))(...);"     "\\\n"
1578           "#else"                          "\n";
1579
1580     sed = "/^void\t" '(\*signal())();$/a'  "\\\n"
1581           '#endif'                         "\n";
1582 };
1583
1584
1585 /*
1586  *  Apply fix this to all OSs since this problem seems to effect
1587  *  more than just SunOS.  In general, fixes which are triggered
1588  *  by a specific target are bad.
1589  */
1590 fix = {
1591     hackname = sun_auth_proto;
1592     files    = rpc/auth.h;
1593     files    = rpc/clnt.h;
1594     files    = rpc/svc.h;
1595     files    = rpc/xdr.h;
1596     /*
1597      *  Select those files containing '(*name)()'.
1598      */
1599     select   = '\(\*[a-z][a-z_]*\)\(\)';
1600     sed      = 's'
1601                 '/^\(.*(\*[a-z][a-z_]*)(\)'      '\();.*\)'
1602                 "/\\\n"
1603                     "#ifdef __cplusplus\\\n"
1604                     '\1...\2' "\\\n"
1605                     "#else\\\n"
1606                     '\1\2' "\\\n"
1607                     "#endif"
1608                 "/";
1609 };
1610
1611
1612 /*
1613  *  math.h on SunOS 4 puts the declaration of matherr before the definition
1614  *  of struct exception, so the prototype (added by fixproto) causes havoc.
1615  */
1616 fix = {
1617     hackname = sunos_matherr_decl;
1618     files    = math.h;
1619     /*
1620      *  Once a declaration for 'struct exception' is found,
1621      *  stop trying to insert a forward reference for it.
1622      */
1623     sed = "/^struct exception/,$b";
1624     sed = "/matherr/i\\\nstruct exception;\n";
1625 };
1626
1627
1628 /*
1629  *  Correct the return type for strlen in strings.h in SunOS 4.
1630  */
1631 fix = {
1632     hackname = sunos_strlen;
1633     files    = strings.h;
1634     sed = "s/int[ \t]*strlen();/__SIZE_TYPE__ strlen();/";
1635 };
1636
1637
1638 /*
1639  *  Solaris math.h and floatingpoint.h define __P without protection,
1640  *  which conflicts with the fixproto definition.  The fixproto
1641  *  definition and the Solaris definition are used the same way.
1642  */
1643 #ifdef SVR4
1644 fix = {
1645     hackname = svr4__p;
1646     files    = math.h;
1647     files    = floatingpoint.h;
1648     select   = "^#define[ \t]*__P";
1649     sed      = "/^#define[ \t]*__P/i\\\n#ifndef __P\n";
1650     sed      = "/^#define[ \t]*__P/a\\\n#endif\n";
1651 };
1652 #endif
1653
1654 /*
1655  *  Disable apparent native compiler optimization cruft in SVR4.2 <string.h>
1656  *  that is visible to any ANSI compiler using this include.  Simply
1657  *  delete the lines that #define some string functions to internal forms.
1658  */
1659 #ifdef SVR4
1660 fix = {
1661     hackname = svr4_disable_opt;
1662     files    = string.h;
1663     select   = '#define.*__std_hdr_';
1664     sed      = '/#define.*__std_hdr_/d';
1665 };
1666 #endif
1667
1668 /*
1669  *  Conditionalize some of <sys/endian.h> on __GNUC__ and __GNUG__.
1670  */
1671 #ifdef SVR4
1672 fix = {
1673     hackname = svr4_endian;
1674     files    = sys/endian.h;
1675     bypass   = '__GNUC__';
1676
1677     sed      = "/#\tifdef\t__STDC__/i\\\n"
1678                "#   if !defined (__GNUC__) && !defined (__GNUG__)\n";
1679
1680     sed      = "/#\t\tinclude\t<sys\\/byteorder.h>/s/\t\t/   /";
1681
1682     sed      = "/#   include\t<sys\\/byteorder.h>/i\\\n"
1683                "#   endif /* !defined (__GNUC__) && !defined (__GNUG__) */\n";
1684 };
1685 #endif
1686
1687 /*
1688  *  Remove useless extern keyword from struct forward declarations
1689  *  in <sys/stream.h> and <sys/strsubr.h>
1690  */
1691 #ifdef SVR4
1692 fix = {
1693     hackname = svr4_extern_struct;
1694     files    = sys/stream.h;
1695     files    = sys/strsubr.h;
1696     select   = 'extern struct [a-z_]*;';
1697     sed      = 's/extern struct \([a-z][a-z_]*\)/struct \1/';
1698 };
1699 #endif
1700
1701 /*
1702  *  Fix declarations of `ftw' and `nftw' in <ftw.h>.  On some/most SVR4
1703  *  systems the file <ftw.h> contains extern declarations of these
1704  *  functions followed by explicitly `static' definitions of these
1705  *  functions... and that's not allowed according to ANSI C.  (Note
1706  *  however that on Solaris, this header file glitch has been pre-fixed by
1707  *  Sun.  In the Solaris version of <ftw.h> there are no static
1708  *  definitions of any function so we don't need to do any of this stuff
1709  *  when on Solaris.
1710  */
1711 #ifdef SVR4
1712 #ifndef SOLARIS
1713 fix = {
1714     hackname = svr4_ftw;
1715     files    = ftw.h;
1716     select   = '^extern int ftw\(const';
1717
1718     sed = '/^extern int ftw(const/i' "\\\n"
1719             "#if !defined(_STYPES)\\\n"
1720             "static\\\n"
1721             "#else\\\n"
1722             "extern\\\n"
1723             "#endif";
1724     sed = 's/extern \(int ftw(const.*\)$/\1/';
1725     sed = "/^extern int nftw/i\\\n"
1726             "#if defined(_STYPES)\\\n"
1727             "static\\\n"
1728             "#else\\\n"
1729             "extern\\\n"
1730             "#endif";
1731     sed = 's/extern \(int nftw.*\)$/\1/';
1732     sed = "/^extern int ftw(),/c\\\n"
1733             "#if !defined(_STYPES)\\\n"
1734             "static\\\n"
1735             "#else\\\n"
1736             "extern\\\n"
1737             "#endif\\\n"
1738             "  int ftw();\\\n"
1739             "#if defined(_STYPES)\\\n"
1740             "static\\\n"
1741             "#else\\\n"
1742             "extern\\\n"
1743             "#endif\\\n"
1744             "  int nftw();";
1745 };
1746 #endif
1747 #endif
1748
1749
1750 /*
1751  *   Fix broken decl of getcwd present on some svr4 systems.
1752  */
1753 #ifdef SVR4
1754 fix = {
1755     hackname = svr4_getcwd;
1756     files    = stdlib.h;
1757     files    = unistd.h;
1758     select   = 'getcwd\(char \*, int\)';
1759
1760     sed = 's/getcwd(char \*, int)/getcwd(char *, size_t)/';
1761 };
1762 #endif
1763
1764 /*
1765  *  set ifdef _KERNEL
1766  */
1767 #ifdef SVR4
1768 fix = {
1769     hackname = svr4_kernel;
1770     files    = fs/rfs/rf_cache.h;
1771     files    = sys/erec.h;
1772     files    = sys/err.h;
1773     files    = sys/char.h;
1774     files    = sys/getpages.h;
1775     files    = sys/map.h;
1776     files    = sys/cmn_err.h;
1777     files    = sys/kdebugger.h;
1778     bypass   = '_KERNEL';
1779     sed      = "1i\\\n#ifdef _KERNEL";
1780     sed      = "$a\\\n#endif /* _KERNEL */";
1781 };
1782 #endif
1783
1784 /*
1785  *  Delete any #defines of `__i386' which may be present in <ieeefp.h>.  They
1786  *  tend to conflict with the compiler's own definition of this symbol.  (We
1787  *  will use the compiler's definition.)
1788  *  Likewise __sparc, for Solaris, and __i860, and a few others
1789  *  (guessing it is necessary for all of them).
1790  */
1791 #ifdef SVR4
1792 fix = {
1793     hackname = svr4_mach_defines;
1794     files    = ieeefp.h;
1795     select   = "#define[ \t]*__(i386|i860|mips|sparc|m88k|m68k)[ \t]";
1796     sed      = "/#define[ \t]*__\\(i386|i860|mips|sparc|m88k|m68k\\)[ \t]/d";
1797 };
1798 #endif
1799
1800 /*
1801  *  Fix declarations of `makedev', `major', and `minor' in <sys/mkdev.h>.
1802  */
1803 #ifdef SVR4
1804 fix = {
1805     hackname = svr4_mkdev;
1806     files    = sys/mkdev.h;
1807
1808     sed      = "/^dev_t makedev(const/c\\\n"
1809                "static dev_t makedev(const major_t, const minor_t);";
1810
1811     sed      = "/^dev_t makedev()/c\\\n"
1812                "static dev_t makedev();";
1813
1814     sed      = "/^major_t major(const/c\\\n"
1815                "static major_t major(const dev_t);";
1816
1817     sed      = "/^major_t major()/c\\\n"
1818                "static major_t major();";
1819
1820     sed      = "/^minor_t minor(const/c\\\n"
1821                "static minor_t minor(const dev_t);";
1822
1823     sed      = "/^minor_t minor()/c\\\n"
1824                "static minor_t minor();";
1825 };
1826 #endif
1827
1828 /*
1829  *  Fix reference to NC_NPI_RAW in <sys/netcspace.h>.
1830  *  Also fix types of array initializers.
1831  */
1832 #ifdef SVR4
1833 fix = {
1834     hackname = svr4_netcspace;
1835     files    = sys/netcspace.h;
1836     select   = 'NC_NPI_RAW';
1837     sed      = 's/NC_NPI_RAW/NC_TPI_RAW/g';
1838     sed      = 's/NC_/(unsigned long) NC_/';
1839 };
1840 #endif
1841
1842 /*
1843  *  Fix reference to NMSZ in <sys/adv.h>.
1844  */
1845 #ifdef SVR4
1846 fix = {
1847     hackname = svr4_nmsz;
1848     files    = sys/adv.h;
1849     select   = '\[NMSZ\]';
1850     sed      = 's/\[NMSZ\]/\[RFS_NMSZ\]/g';
1851 };
1852 #endif
1853
1854 /*
1855  *  Completely replace <sys/varargs.h> with a file that includes gcc's
1856  *  stdarg.h or varargs.h files as appropriate.
1857  */
1858 #ifdef SVR4
1859 fix = {
1860     hackname = svr4_no_varargs;
1861     files    = sys/varargs.h;
1862     shell    = "cat > /dev/null\n"
1863                "cat << _EOF_\n"
1864                "/* This file was generated by fixincludes.  */\n"
1865                "#ifndef _SYS_VARARGS_H\n"
1866                "#define _SYS_VARARGS_H\n\n"
1867
1868                "#ifdef __STDC__\n"
1869                "#include <stdarg.h>\n"
1870                "#else\n"
1871                "#include <varargs.h>\n"
1872                "#endif\n\n"
1873
1874                "#endif  /* _SYS_VARARGS_H */\n"
1875                "_EOF_";
1876 };
1877 #endif
1878
1879 /*
1880  *   Fix broken decl of profil present on some svr4 systems.
1881  */
1882 #ifdef SVR4
1883 fix = {
1884     hackname = svr4_profil;
1885     files    = stdlib.h;
1886     files    = unistd.h;
1887
1888     sed = 's/profil(unsigned short \*, unsigned int, '
1889                          'unsigned int, unsigned int)'
1890            '/profil(unsigned short *, size_t, int, unsigned)/';
1891 };
1892 #endif
1893
1894 /*
1895  *  Convert functions to prototype form, and fix arg names in <sys/stat.h>.
1896  */
1897 #ifdef SVR4
1898 fix = {
1899     hackname = svr4_proto_form;
1900     files    = sys/stat.h;
1901     select   = 'const extern';
1902
1903     sed      = "/^stat([ \t]*[^c]/ {\nN\nN\n"
1904                    "s/(.*)\\n/( /\n"
1905                    "s/;\\n/, /\n"
1906                    "s/;$/)/\n"  "}";
1907
1908     sed      = "/^lstat([ \t]*[^c]/ {\nN\nN\n"
1909                    "s/(.*)\\n/( /\n"
1910                    "s/;\\n/, /\n"
1911                    "s/;$/)/\n"  "}";
1912
1913     sed      = "/^fstat([ \t]*[^i]/ {\nN\nN\n"
1914                    "s/(.*)\\n/( /\n"
1915                    "s/;\\n/, /\n"
1916                    "s/;$/)/\n"  "}";
1917
1918     sed      = "/^mknod([ \t]*[^c]/{\nN\nN\nN\n"
1919                    "s/(.*)\\n/( /\n"
1920                    "s/;\\n/, /g\n"
1921                    "s/;$/)/\n"  "}";
1922
1923     sed      = "1,$s/\\([^A-Za-z]\\)path\\([^A-Za-z]\\)/\\1__path\\2/g";
1924     sed      = "1,$s/\\([^A-Za-z]\\)buf\\([^A-Za-z]\\)/\\1__buf\\2/g";
1925     sed      = "1,$s/\\([^A-Za-z]\\)fd\\([^A-Za-z]\\)/\\1__fd\\2/g";
1926     sed      = "1,$s/ret\\([^u]\\)/__ret\\1/g";
1927     sed      = "1,$s/\\([^_]\\)mode\\([^_]\\)/\\1__mode\\2/g";
1928     sed      = "1,$s/\\([^_r]\\)dev\\([^_]\\)/\\1__dev\\2/g";
1929 };
1930 #endif
1931
1932 /*
1933  *  Add a prototyped declaration of mmap to <sys/mman.h>.
1934  */
1935 #ifdef SVR4
1936 fix = {
1937     hackname = svr4_proto_mmap;
1938     files    = sys/mman.h;
1939     select   = '^extern caddr_t mmap();$';
1940     sed = '/^extern caddr_t mmap();$/c' "\\\n"
1941           "#ifdef __STDC__\\\n"
1942           "extern caddr_t mmap (caddr_t, size_t, int, int, int, off_t);\\\n"
1943           "#else /* !defined(__STDC__) */\\\n"
1944           "extern caddr_t mmap ();\\\n"
1945           "#endif /* !defined(__STDC__) */\\\n";
1946 };
1947 #endif
1948
1949 /*
1950  *  Add a #define of _SIGACTION_ into <sys/signal.h>.
1951  */
1952 #ifdef SVR4
1953 fix = {
1954     hackname = svr4_sigaction;
1955     files    = sys/signal.h;
1956     sed      = "/^struct sigaction {/i\\\n"
1957                "#define _SIGACTION_";
1958     sed      = 's/(void *(\*)())/(void (*)(int))/';
1959 };
1960 #endif
1961
1962 /*
1963  *  Put storage class at start of decl, to avoid warning.
1964  */
1965 #ifdef SVR4
1966 fix = {
1967     hackname = svr4_storage_class;
1968     files    = rpc/types.h;
1969     select   = 'const extern';
1970     sed      = 's/const extern/extern const/g';
1971 };
1972 #endif
1973
1974 /*
1975  *  Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn}
1976  *  in string.h on sysV68
1977  *  Correct the return type for strlen in string.h on Lynx.
1978  *  Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0.
1979  *  Add missing const for strdup on OSF/1 V3.0.
1980  *  On sysV88 layout is slightly different.
1981  */
1982 fix = {
1983     hackname = systypes;
1984     files  = "sys/types.h";
1985     files  = "stdlib.h";
1986     files  = "sys/stdtypes.h";
1987     files  = "stddef.h";
1988     files  = "memory.h";
1989     files  = "unistd.h";
1990     select = "typedef[ \t]+[a-z_][ \ta-z_]*[ \t]"
1991              "(size|ptrdiff|wchar)_t";
1992
1993       sed  = "/^[ \t]*\\*[ \t]*typedef unsigned int size_t;/N";
1994
1995       sed  = "s/^\\([ \t]*\\*[ \t]*typedef unsigned int size_t;\\n"
1996                "[ \t]*\\*\\/\\)/\\1\\\n"
1997              "#ifndef __SIZE_TYPE__\\\n"
1998              "#define __SIZE_TYPE__ long unsigned int\\\n"
1999              "#endif\\\n"
2000              "typedef __SIZE_TYPE__ size_t;\\\n/";
2001
2002       sed  = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]size_t/i\\\n"
2003                    "#ifndef __SIZE_TYPE__\\\n"
2004                    "#define __SIZE_TYPE__ long unsigned int\\\n"
2005                    "#endif\n";
2006
2007       sed  = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]size_t/"
2008                "typedef __SIZE_TYPE__ size_t/";
2009
2010       sed  = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]ptrdiff_t/i\\\n"
2011                    "#ifndef __PTRDIFF_TYPE__\\\n"
2012                    "#define __PTRDIFF_TYPE__ long int\\\n"
2013                    "#endif\n";
2014
2015       sed  = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]ptrdiff_t/"
2016                "typedef __PTRDIFF_TYPE__ ptrdiff_t/";
2017
2018       sed  = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/i\\\n"
2019                    "#ifndef __WCHAR_TYPE__\\\n"
2020                    "#define __WCHAR_TYPE__ int\\\n"
2021                    "#endif\\\n"
2022                    "#ifndef __cplusplus\n";
2023
2024       sed  = "/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/a\\\n"
2025                    "#endif\n";
2026
2027       sed  = "s/typedef[ \t][ \t]*[a-z_][ \ta-z_]*[ \t]wchar_t/"
2028                "typedef __WCHAR_TYPE__ wchar_t/";
2029 };
2030
2031
2032 /*
2033  *  Fix return type of exit and abort in <stdlib.h> on SunOS 4.1.
2034  *  Also wrap protection around size_t for m88k-sysv3 systems.
2035  *  We use a funny name to ensure it follows 'systypes' fix.
2036  */
2037 fix = {
2038     hackname = systypes_for_aix;
2039     files    = sys/types.h;
2040     select   = "typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t";
2041     bypass   = "_GCC_SIZE_T";
2042
2043     sed    = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/i\\\n"
2044                  "#ifndef _GCC_SIZE_T\\\n"
2045                  "#define _GCC_SIZE_T\n";
2046
2047     sed    = "/typedef[ \t][ \t]*[A-Za-z_][ \tA-Za-z_]*[ \t]size_t/a\\\n"
2048                  "#endif\n";
2049 };
2050
2051
2052 /*
2053  *  if the #if says _cplusplus, not the double underscore __cplusplus
2054  *  that it should be
2055  */
2056 fix = {
2057     hackname = sysv68_string;
2058     files    = string.h;
2059
2060     sed = "s/extern[ \t]*int[ \t]*strlen();/extern unsigned int strlen();/";
2061     sed = "s/extern[ \t]*int[ \t]*ffs[ \t]*(long);/extern int ffs(int);/";
2062     sed = "s/strdup(char \\*s1);/strdup(const char *s1);/";
2063     sed = "/^extern char$/N";
2064     sed = "s/^extern char\\(\\n\t\\*memccpy(),\\)$/extern void\\1/";
2065     sed = "/^\tstrncmp(),$/N";
2066     sed = "s/^\\(\tstrncmp()\\),\\n\\(\tstrlen(),\\)$/\\1;\\\n"
2067           "extern unsigned int\\\n\\2/";
2068     sed = "/^extern int$/N";
2069     sed = "s/^extern int\\(\\n\tstrlen(),\\)/extern size_t\\1/";
2070 };
2071
2072
2073 /*
2074  *  Fix return type of exit and abort in <stdlib.h>
2075  *  Also wrap protection around size_t.
2076  */
2077 fix = {
2078     hackname = sysz_stdlib_for_sun;
2079     files    = stdlib.h;
2080
2081     sed   = "s/int\tabort/void\tabort/g";
2082     sed   = "s/int\tfree/void\tfree/g";
2083     sed   = "s/char[ \t]*\\*[ \t]*calloc/void \\*\tcalloc/g";
2084     sed   = "s/char[ \t]*\\*[ \t]*malloc/void \\*\tmalloc/g";
2085     sed   = "s/char[ \t]*\\*[ \t]*realloc/void \\*\trealloc/g";
2086     sed   = "s/int[ \t][ \t]*exit/void\texit/g";
2087
2088     sed   = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/i\\\n"
2089                 "#ifndef _GCC_SIZE_T\\\n"
2090                 "#define _GCC_SIZE_T\n";
2091
2092     sed   = "/typedef[ \ta-zA-Z_]*[ \t]size_t[ \t]*;/a\\\n"
2093                 "#endif\n";
2094 };
2095
2096
2097 /*
2098  *  Fix this Sun file to avoid interfering with stddef.h.
2099  *  We use a funny name to ensure it follows 'systypes' fix.
2100  */
2101 fix = {
2102     hackname = sysz_stdtypes_for_sun;
2103     files = sys/stdtypes.h;
2104     sed   = "/[\t ]size_t.*;/i\\\n"
2105               "#ifndef _GCC_SIZE_T\\\n"
2106               "#define _GCC_SIZE_T\n";
2107
2108     sed   = "/[\t ]size_t.*;/a\\\n"
2109               "#endif\n";
2110
2111     sed   = "/[\t ]ptrdiff_t.*;/i\\\n"
2112               "#ifndef _GCC_PTRDIFF_T\\\n"
2113               "#define _GCC_PTRDIFF_T\n";
2114
2115     sed   = "/[\t ]ptrdiff_t.*;/a\\\n"
2116               "#endif\n";
2117
2118     sed   = "/[\t ]wchar_t.*;/i\\\n"
2119               "#ifndef _GCC_WCHAR_T\\\n"
2120               "#define _GCC_WCHAR_T\n";
2121
2122     sed   = "/[\t ]wchar_t.*;/a\\\n"
2123               "#endif\n";
2124 };
2125
2126
2127 /*
2128  *  Fix this file to avoid interfering with stddef.h,
2129  *  but don't mistakenly match ssize_t present in AIX for the ps/2,
2130  *  or typedefs which use (but do not set) size_t.
2131  */
2132 fix = {
2133     hackname = tinfo_cplusplus;
2134     files    = tinfo.h;
2135     sed      = "s/[ \t]_cplusplus/ __cplusplus/";
2136 };
2137
2138
2139 /*
2140  *  Cancel out ansi_compat.h on Ultrix.  Replace it with empty file.
2141  */
2142 fix = {
2143     hackname = ultrix_ansi_compat;
2144     files    = ansi_compat.h;
2145     select   = ULTRIX;
2146     sed      = "1i\\\n/* This file intentionally left blank. */\n";
2147     sed      = "1,$d";
2148 };
2149
2150
2151 /*
2152  * Ultrix V4.[35] puts the declaration of uname before the definition
2153  * of struct utsname, so the prototype (added by fixproto) causes havoc.
2154  */
2155 fix = {
2156     hackname = ultrix_fix_fixproto;
2157     files    = sys/utsname.h;
2158     select   = ULTRIX;
2159     sed      = "/^[ \t]*extern[ \t]*int[ \t]*uname();$/i\\\n"
2160                "struct utsname;\n";
2161 };
2162
2163
2164 /*
2165  *  parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R.
2166  *  also get rid of bogus inline definitions in HP-UX 8.0
2167  */
2168 fix = {
2169     hackname = ultrix_atof_param;
2170     files    = math.h;
2171
2172     sed = "s@atof(\\([ \t]*char[ \t]*\\*[^)]*\\))@atof(const \\1)@";
2173     sed = "s@inline int abs(int [a-z][a-z]*) {.*}@extern \"C\" int abs(int);@";
2174     sed = "s@inline double abs(double [a-z][a-z]*) {.*}@@";
2175     sed = "s@inline int sqr(int [a-z][a-z]*) {.*}@@";
2176     sed = "s@inline double sqr(double [a-z][a-z]*) {.*}@@";
2177 };
2178
2179
2180 /*
2181  *  parameters not const on DECstation Ultrix V4.0 and OSF/1.
2182  */
2183 fix = {
2184     hackname = ultrix_const;
2185     files    = stdio.h;
2186
2187     sed   = 's@perror( char \*__s );@perror( const char *__s );@';
2188     sed   = 's@fputs( char \*__s,@fputs( const char *__s,@';
2189     sed   = 's@fopen( char \*__filename, char \*__type );@'
2190               'fopen( const char *__filename, const char *__type );@';
2191     sed   = 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@';
2192     sed   = 's@fscanf( FILE \*__stream, char \*__format,@'
2193               'fscanf( FILE *__stream, const char *__format,@';
2194     sed   = 's@scanf( char \*__format,@scanf( const char *__format,@';
2195     sed   = 's@sscanf( char \*__s, char \*__format,@'
2196               'sscanf( const char *__s, const char *__format,@';
2197     sed   = 's@popen(char \*, char \*);@popen(const char *, const char *);@';
2198     sed   = 's@tempnam(char\*,char\*);@tempnam(const char*,const char*);@';
2199 };
2200
2201
2202 /*
2203  *  Check for bad #ifdef line (in Ultrix 4.1)
2204  */
2205 fix = {
2206     hackname = ultrix_ifdef;
2207     select   = "#ifdef KERNEL";
2208     files    = sys/file.h;
2209     sed      = "s/#ifdef KERNEL/#if defined(KERNEL)/";
2210 };
2211
2212
2213 /*
2214  *  Avoid nested comments on Ultrix 4.3.
2215  */
2216 fix = {
2217     hackname = ultrix_nested_cmnt;
2218     files    = rpc/svc.h;
2219     sed      = "s@^\\( \\*\tint protocol;  \\)/\\*@\\1*/ /*@";
2220 };
2221
2222
2223 /*
2224  *  Check for superfluous `static' (in Ultrix 4.2)
2225  *  On Ultrix 4.3, includes of other files (r3_cpu.h,r4_cpu.h) is broken.
2226  */
2227 fix = {
2228     hackname = ultrix_static;
2229     files  = machine/cpu.h;
2230     select = '#include "r[34]_cpu';
2231     sed    = "s/^static struct tlb_pid_state/struct tlb_pid_state/";
2232     sed    = 's/^#include "r3_cpu\.h"$/#include <machine\/r3_cpu\.h>/';
2233     sed    = 's/^#include "r4_cpu\.h"$/#include <machine\/r4_cpu\.h>/';
2234 };
2235
2236
2237 /*
2238  *  Fix multiple defines for NULL
2239  */
2240 fix = {
2241     hackname = undefine_null;
2242     select = "^#[ \t]*define[ \t]*[ \t]NULL[ \t]";
2243     bypass = "#[ \t]*(ifn|un)def[ \t]*[ \t]NULL($|[ \t])";
2244     sed    = "/^#[ \t]*define[ \t][ \t]*NULL[ \t]/i\\\n"
2245                 "#undef NULL\n";
2246 };
2247
2248
2249 /*
2250  *  Fix definitions of macros used by va-i960.h in VxWorks header file.
2251  */
2252 fix = {
2253     hackname = va_i960_macro;
2254     files    = arch/i960/archI960.h;
2255     select   = "__(vsiz|vali|vpad|alignof__)";
2256     sed = "s/__vsiz/__vxvsiz/";
2257     sed = "s/__vali/__vxvali/";
2258     sed = "s/__vpad/__vxvpad/";
2259     sed = "s/__alignof__/__vxalignof__/";
2260 };
2261
2262
2263 /*
2264  *  AIX headers define NULL to be cast to a void pointer,
2265  *  which is illegal in ANSI C++.
2266  */
2267 fix = {
2268     hackname = void_null;
2269     files    = curses.h;
2270     files    = dbm.h;
2271     files    = locale.h;
2272     files    = stdio.h;
2273     files    = stdlib.h;
2274     files    = string.h;
2275     files    = time.h;
2276     files    = unistd.h;
2277     files    = sys/dir.h;
2278     files    = sys/param.h;
2279     files    = sys/types.h;
2280     select   = "#[ \t]*define[ \t][ \t]*NULL[ \t].*void";
2281     sed      = "s/^#[ \t]*define[ \t]*NULL[ \t]*((void[ \t]*\\*)0)"
2282                 "/#define NULL 0/";
2283 };
2284
2285
2286 /*
2287  *  Make VxWorks header which is almost gcc ready fully gcc ready.
2288  */
2289 fix = {
2290     hackname = vxworks_gcc_problem;
2291     files    = types/vxTypesBase.h;
2292     select   = "__GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__";
2293
2294     sed = "s/#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__/"
2295           "#if 1/";
2296
2297     sed = "/[ \t]size_t/i\\\n"
2298         "#ifndef _GCC_SIZE_T\\\n"
2299         "#define _GCC_SIZE_T\n";
2300
2301     sed = "/[ \t]size_t/a\\\n"
2302         "#endif\n";
2303
2304     sed = "/[ \t]ptrdiff_t/i\\\n"
2305         "#ifndef _GCC_PTRDIFF_T\\\n"
2306         "#define _GCC_PTRDIFF_T\n";
2307
2308     sed = "/[ \t]ptrdiff_t/a\\\n"
2309         "#endif\n";
2310
2311     sed = "/[ \t]wchar_t/i\\\n"
2312         "#ifndef _GCC_WCHAR_T\\\n"
2313         "#define _GCC_WCHAR_T\n";
2314
2315     sed = "/[ \t]wchar_t/a\\\n"
2316         "#endif\n";
2317 };
2318
2319
2320 /*
2321  *  Fix VxWorks <time.h> to not require including <vxTypes.h>.
2322  */
2323 fix = {
2324     hackname = vxworks_needs_vxtypes;
2325     files    = time.h;
2326     select   = "uint_t[ \t][ \t]*_clocks_per_sec";
2327     sed      = "s/uint_t/unsigned int/";
2328 };
2329
2330
2331 /*
2332  *  Fix VxWorks <sys/stat.h> to not require including <vxWorks.h>.
2333  */
2334 fix = {
2335     hackname = vxworks_needs_vxworks;
2336     files    = sys/stat.h;
2337     test     = " -r types/vxTypesOld.h";
2338     test     = " -n \"`egrep '#include' $file`\"";
2339     test     = " -n \"`egrep ULONG $file`\"";
2340     select   = "#[ \t]define[ \t][ \t]*__INCstath";
2341
2342     sed = "/#[ \t]define[ \t][ \t]*__INCstath/a\\\n"
2343           "#include <types/vxTypesOld.h>\n";
2344 };
2345
2346
2347 /*
2348  *  Another bad dependency in VxWorks 5.2 <time.h>.
2349  */
2350 fix = {
2351     hackname = vxworks_time;
2352     files    = time.h;
2353     select   = "VOIDFUNCPTR";
2354     test     = " -r vxWorks.h";
2355     sed      = "/VOIDFUNCPTR/i\\\n"
2356                "#ifndef __gcc_VOIDFUNCPTR_defined\\\n"
2357                "#ifdef __cplusplus\\\n"
2358                "typedef void (*__gcc_VOIDFUNCPTR) (...);\\\n"
2359                "#else\\\n"
2360                "typedef void (*__gcc_VOIDFUNCPTR) ();\\\n"
2361                "#endif\\\n"
2362                "#define __gcc_VOIDFUNCPTR_defined\\\n"
2363                "#endif\n";
2364
2365     sed      = "s/VOIDFUNCPTR/__gcc_VOIDFUNCPTR/g";
2366 };
2367
2368
2369 /*
2370  *  There are several name conflicts with C++ reserved words in X11 header
2371  *  files.  These are fixed in some versions, so don't do the fixes if
2372  *  we find __cplusplus in the file.  These were found on the RS/6000.
2373  */
2374 fix = {
2375     hackname = x11_class;
2376     files    = X11/ShellP.h;
2377     bypass   = __cplusplus;
2378     sed      = "/char \\*class;/i\\\n"
2379                    "#ifdef __cplusplus\\\n"
2380                    "\tchar *c_class;\\\n"
2381                    "#else\n";
2382     sed      = "/char \\*class;/a\\\n"
2383                    "#endif\n";
2384 };
2385
2386
2387 /*
2388  *  class in Xm/BaseClassI.h
2389  */
2390 fix = {
2391     hackname = x11_class_usage;
2392     files    = Xm/BaseClassI.h;
2393     bypass   = "__cplusplus";
2394     sed      = "s/ class[)]/ c_class)/g";
2395 };
2396
2397
2398 /*
2399  *  new in Xm/Traversal.h
2400  */
2401 fix = {
2402     hackname = x11_new;
2403     files    = Xm/Traversal.h;
2404     bypass   = __cplusplus;
2405
2406     sed      = "/Widget\told, new;/i\\\n"
2407                    "#ifdef __cplusplus\\\n"
2408                    "\tWidget\told, c_new;\\\n"
2409                    "#else\n";
2410
2411     sed      = "/Widget\told, new;/a\\\n"
2412                    "#endif\n";
2413
2414     sed      = "s/Widget new,/Widget c_new,/g";
2415 };
2416
2417
2418 /*
2419  *  Incorrect sprintf declaration in X11/Xmu.h
2420  */
2421 fix = {
2422     hackname = x11_sprintf;
2423     files    = X11*/Xmu.h;
2424     sed      = "s,^extern char \\*\tsprintf();$,#ifndef __STDC__\\\n"
2425                "extern char *\tsprintf();\\\n"
2426                "#endif /* !defined __STDC__ */,";
2427 };
2428
2429
2430 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2431  *
2432  *  UNDO BROKEN FIXES
2433  *
2434  *  We sure do hope that broken fixes and needed fixes are never
2435  *  applied to the same file!!  :-}
2436  */
2437
2438 /*
2439  *  Purge some HP-UX 11 files that are only borken after they are "fixed".
2440  */
2441 fix = {
2442     hackname = zzz_ki_iface;
2443     files    = sys/ki_iface.h;
2444     select   = 'These definitions are for HP Internal developers';
2445     shell    =
2446          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2447          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2448          "cat > /dev/null";
2449 };
2450
2451
2452 /*
2453  *  Purge some HP-UX 11 files that are only borken after they are "fixed".
2454  */
2455 fix = {
2456     hackname = zzz_ki;
2457     files    = sys/ki.h;
2458     select   = '11.00 HP-UX LP64';
2459     shell    =
2460          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2461          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2462          "cat > /dev/null";
2463 };
2464
2465
2466 /*
2467  *  Purge some HP-UX 11 files that are only borken after they are "fixed".
2468  */
2469 fix = {
2470     hackname = zzz_ki_calls;
2471     files    = sys/ki_calls.h;
2472     select   = 'kthread_create_caller_t';
2473     shell    =
2474          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2475          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2476          "cat > /dev/null";
2477 };
2478
2479
2480 /*
2481  *  Purge some HP-UX 11 files that are only borken after they are "fixed".
2482  */
2483 fix = {
2484     hackname = zzz_ki_defs;
2485     files    = sys/ki_defs.h;
2486     select   = 'Kernel Instrumentation Definitions';
2487     shell    =
2488          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2489          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2490          "cat > /dev/null";
2491 };
2492
2493
2494 /*
2495  *  This file on SunOS 4 has a very large macro.  When the sed loop
2496  *  tries pull it in, it overflows the pattern space size of the SunOS
2497  *  sed (GNU sed does not have this problem).  Since the file does not
2498  *  require fixing, we remove it from the fixed directory.
2499  */
2500 fix = {
2501     hackname = zzz_bad_fixes;
2502     files    = sundev/ipi_error.h;
2503     /* shouldn't there be a select expression here??? */
2504     shell    =
2505          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2506          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2507          "cat > /dev/null";
2508 };
2509
2510
2511 /*
2512  *  Purge some HP-UX 11 files that are only borken after they are "fixed".
2513  */
2514 fix = {
2515     hackname = zzz_time;
2516     files    = sys/time.h;
2517     select   = '11.0 and later representation of ki time';
2518     shell    =
2519          "echo \"Removing incorrect fix to <$file>\" >&2\n"
2520          "rm -f ${DESTFILE} ${DESTDIR}/fixinc.tmp\n"
2521          "cat > /dev/null";
2522 };
2523
2524 /*EOF*/