#! /bin/sh
# Install modified versions of certain ANSI-incompatible system header files
# which are fixed to work correctly with ANSI C
# and placed in a directory that GNU C will search.

# See README-fixinc for more information.

# Directory containing the original header files.
# (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
INPUT=${2-${INPUT-/usr/include}}

# Directory in which to store the results.
LIB=${1?"fixincludes: output directory not specified"}

# Define what target system we're fixing.
if test -r ./Makefile; then
	target_canonical="`sed -n -e 's,^target[ 	]*=[ 	]*\(.*\)$,\1,p' < Makefile`"
	test -z "${target_canonical}" && target_canonical=unknown
else
	target_canonical=unknown
fi

# Define PWDCMD as a command to use to get the working dir
# in the form that we want.
PWDCMD=pwd
case "`pwd`" in
//*)
	# On an Apollo, discard everything before `/usr'.
	PWDCMD="eval pwd | sed -e 's,.*/usr/,/usr/,'"
	;;
esac

# Original directory.
ORIGDIR=`${PWDCMD}`

# Make sure it exists.
if [ ! -d $LIB ]; then
  mkdir $LIB || exit 1
fi

# Make LIB absolute only if needed to avoid problems with the amd.
case $LIB in
/*)
	;;
*)
	cd $LIB; LIB=`${PWDCMD}`
	;;
esac

# Fail if no arg to specify a directory for the output.
if [ x$1 = x ]
then echo fixincludes: no output directory specified
exit 1
fi

echo Building fixed headers in ${LIB}

# Determine whether this system has symbolic links.
if ln -s X $LIB/ShouldNotExist 2>/dev/null; then
  rm -f $LIB/ShouldNotExist
  LINKS=true
elif ln -s X /tmp/ShouldNotExist 2>/dev/null; then
  rm -f /tmp/ShouldNotExist
  LINKS=true
else
  LINKS=false
fi

echo Finding directories and links to directories
cd ${INPUT}
# Find all directories and all symlinks that point to directories.
# Put the list in $files.
# Each time we find a symlink, add it to newdirs
# so that we do another find within the dir the link points to.
# Note that $files may have duplicates in it;
# later parts of this file are supposed to ignore them.
dirs="."
levels=2
while [ -n "$dirs" ] && [ $levels -gt 0 ]
do
    levels=`expr $levels - 1`
    newdirs=
    for d in $dirs
    do
	echo " Searching $INPUT/$d"

	# Find all directories under $d, relative to $d, excluding $d itself.
	# (The /. is needed after $d in case $d is a symlink.)
        files="$files `find $d/. -type d -print | \
		       sed -e '/\/\.$/d' -e 's@/./@/@g'`"
	# Find all links to directories.
	# Using `-exec test -d' in find fails on some systems,
	# and trying to run test via sh fails on others,
	# so this is the simplest alternative left.
	# First find all the links, then test each one.
	theselinks=
	$LINKS && \
	  theselinks=`find $d/. -type l -print | sed -e 's@/./@/@g'`
	for d1 in $theselinks --dummy--
	do
	    # If the link points to a directory,
	    # add that dir to $newdirs
	    if [ -d $d1 ]
	    then
		files="$files $d1"
		if [ "`ls -ld $d1 | sed -n 's/.*-> //p'`" != "." ]
		then
		    newdirs="$newdirs $d1"
		fi
	    fi
	done
    done

    dirs="$newdirs"
done

dirs=
echo "All directories (including links to directories):"
echo $files

for file in $files; do
  rm -rf $LIB/$file
  if [ ! -d $LIB/$file ]
  then mkdir $LIB/$file
  fi
done
mkdir $LIB/root

# treetops gets an alternating list
# of old directories to copy
# and the new directories to copy to.
treetops="${INPUT} ${LIB}"

if $LINKS; then
  echo 'Making symbolic directory links'
  for file in $files; do
    dest=`ls -ld $file | sed -n 's/.*-> //p'`
    if [ "$dest" ]; then    
      cwd=`${PWDCMD}`
      # In case $dest is relative, get to $file's dir first.
      cd ${INPUT}
      cd `echo ./$file | sed -n 's&[^/]*$&&p'`
      # Check that the target directory exists.
      # Redirections changed to avoid bug in sh on Ultrix.
      (cd $dest) > /dev/null 2>&1
      if [ $? = 0 ]; then
	cd $dest
	# X gets the dir that the link actually leads to.
	x=`${PWDCMD}`
	# Canonicalize ${INPUT} now to minimize the time an
	# automounter has to change the result of ${PWDCMD}.
	cinput=`cd ${INPUT}; ${PWDCMD}`
	# If a link points to ., make a similar link to .
	if [ $x = ${cinput} ]; then
	  echo $file '->' . ': Making link'
	  rm -fr ${LIB}/$file > /dev/null 2>&1
	  ln -s . ${LIB}/$file > /dev/null 2>&1
	# If link leads back into ${INPUT},
	# make a similar link here.
	elif expr $x : "${cinput}/.*" > /dev/null; then
	  # Y gets the actual target dir name, relative to ${INPUT}.
	  y=`echo $x | sed -n "s&${cinput}/&&p"`
	  # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
	  dots=`echo "$file" |
	    sed -e 's@^./@@' -e 's@/./@/@g' -e 's@[^/][^/]*@..@g' -e 's@..$@@'`
	  echo $file '->' $dots$y ': Making link'
	  rm -fr ${LIB}/$file > /dev/null 2>&1
	  ln -s $dots$y ${LIB}/$file > /dev/null 2>&1
	else
	  # If the link is to a dir $target outside ${INPUT},
	  # repoint the link at ${INPUT}/root$target
	  # and process $target into ${INPUT}/root$target
	  # treat this directory as if it actually contained the files.
	  echo $file '->' root$x ': Making link'
	  if [ -d $LIB/root$x ]
	  then true
	  else
	    dirname=root$x/
	    dirmade=.
	    cd $LIB
	    while [ x$dirname != x ]; do
	      component=`echo $dirname | sed -e 's|/.*$||'`
	      mkdir $component >/dev/null 2>&1
	      cd $component
	      dirmade=$dirmade/$component
	      dirname=`echo $dirname | sed -e 's|[^/]*/||'`
	    done
	  fi
	  # Duplicate directory structure created in ${LIB}/$file in new
	  # root area.
	  for file2 in $files; do
	    case $file2 in
	      $file/*)
		dupdir=${LIB}/root$x/`echo $file2 | sed -n "s|^${file}/||p"`
		echo "Duplicating ${file}'s ${dupdir}"
		if [ -d ${dupdir} ]
		then true
		else
		  mkdir ${dupdir}
		fi
		;;
	      *)
		;;
	    esac
          done
	  # Get the path from ${LIB} to $file, accounting for symlinks.
	  parent=`echo "$file" | sed -e 's@/[^/]*$@@'`
	  libabs=`cd ${LIB}; ${PWDCMD}`
	  file2=`cd ${LIB}; cd $parent; ${PWDCMD} | sed -e "s@^${libabs}@@"`
	  # DOTS is the relative path from ${LIB}/$file's dir back to ${LIB}.
	  dots=`echo "$file2" | sed -e 's@/[^/]*@../@g'`
	  rm -fr ${LIB}/$file > /dev/null 2>&1
	  ln -s ${dots}root$x ${LIB}/$file > /dev/null 2>&1
	  treetops="$treetops $x ${LIB}/root$x"
	fi
      fi
      cd $cwd
    fi
  done
fi

required=
set x $treetops
shift
while [ $# != 0 ]; do
  # $1 is an old directory to copy, and $2 is the new directory to copy to.
  cd ${INPUT}
  cd $1
# The same dir can appear more than once in treetops.
# There's no need to scan it more than once.
  if [ -f $2/DONE ]
  then
    files=
  else
    touch $2/DONE
    echo Fixing directory $1 into $2
# Check .h files which are symlinks as well as those which are files.
# A link to a header file will not be processed by anything but this.
    if $LINKS; then
      files=`find . -name '*.h' \( -type f -o -type l \) -print`
    else
      files=`find . -name '*.h' -type f -print`
    fi
    echo Checking header files
  fi
# Note that BSD43_* are used on recent MIPS systems.
  for file in $files; do
# This call to egrep is essential, since checking a file with egrep
# is much faster than actually trying to fix it.
# It is also essential that most files *not* match!
# Thus, matching every #endif is unacceptable.
# But the argument to egrep must be kept small, or many versions of egrep
# won't be able to handle it.
#
# We use the pattern [!-.0-z{|}~] instead of [^/ 	] to match a noncomment
# following #else or #endif because some buggy egreps think [^/] matches
# newline, and they thus think `#else ' matches `#e[ndiflse]*[ 	]+[^/ 	]'.
# [!-.0-~] does not work properly on AIX 4.1.
#
# We use the pattern [^a-zA-Z0-9_][_a-ce-km-z][a-z0-9] to match an identifier
# following #if or #elif that is not surrounded by __.  The `a-ce-km-z'
# in this pattern lacks `d' and `l'; this means we don't worry about
# identifiers starting with `d' or `l'.  This is OK, since none of the
# identifiers below start with `d' or `l'.  It also greatly improves
# performance, since many files contain lines of the form `#if ... defined ...'
# or `#if lint'.
    if egrep '//|[ 	_]_IO|CTRL|^#define.NULL|^#e[nl][ds][ief]*[ 	]+[!-.0-z\{\|\}\~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-zA-Z][a-zA-Z0-9]' $file >/dev/null; then
      if [ -r $file ]; then
	cp $file $2/$file >/dev/null 2>&1	\
	|| echo "Can't copy $file"
	chmod +w $2/$file
	chmod a+r $2/$file
	# The fixinc_eol stuff is to work around a bug in the sed
	# program on HP/UX 10.20.
	# Here is how the sed commands in braces work.
	# (It doesn't work to put the comments inside the sed commands.)
		# Surround each word with spaces, to simplify matching below.
		# ANSIfy each pre-ANSI machine-dependent symbol
		# by surrounding it with __ __.
		# Remove the spaces that we inserted around each word.
	sed -e '
				   :loop
	  /\\$/			N
 	  s/\\$/\\*fixinc_eol*/
	  /\\$/			b loop
	  s/\\\*fixinc_eol\*/\\/g
	  s%^\([ 	]*#[ 	]*else\)[ 	]*/[^*].*%\1%
	  s%^\([ 	]*#[ 	]*else\)[ 	]*[^/ 	].*%\1%
	  s%^\([ 	]*#[ 	]*endif\)[ 	]*/[^*].*%\1%
	  s%^\([ 	]*#[ 	]*endif\)[ 	]*\*[^/].*%\1%
	  s%^\([ 	]*#[ 	]*endif\)[ 	]*[^/* 	].*%\1%
	  /\/\/[^*]/			s|//\(.*\)$|/*\1*/|
	  /^[ 	]*\/\/[ 	]*/s///
	  /[ 	]_IO[A-Z]*[ 	]*(/	s/\(_IO[A-Z]*[ 	]*(\)\(.\),/\1'\''\2'\'',/
	  /[ 	]BSD43__IO[A-Z]*[ 	]*(/	s/(\(.\),/('\''\1'\'',/
	  /#[ 	]*define[ 	]*[ 	]_IO/			s/'\''\([cgxtf]\)'\''/\1/g
	  /#[ 	]*define[ 	]*[ 	]BSD43__IO/		s/'\''\([cgx]\)'\''/\1/g
	  /#[ 	]*define[ 	]*[ 	]DESIOC/		s/'\''\([cdgx]\)'\''/\1/g
	  /[^A-Z0-9_]CTRL[ 	]*(/		s/\([^'\'']\))/'\''\1'\'')/
	  /[^A-Z0-9]_CTRL[ 	]*(/		s/\([^'\'']\))/'\''\1'\'')/
	  /#[ 	]*define[ 	]*[ 	]CTRL/		s/'\''\([cgx]\)'\''/\1/g
	  /#[ 	]*define[ 	]*[ 	]_CTRL/		s/'\''\([cgx]\)'\''/\1/g
	  /#[ 	]*define.BSD43_CTRL/		s/'\''\([cgx]\)'\''/\1/g
	  /#[	 ]*[el]*if/{
		s/[a-zA-Z0-9_][a-zA-Z0-9_]*/ & /g

		s/ bsd4\([0-9]\) / __bsd4\1__ /g
		s/ _*host_mips / __host_mips__ /g
		s/ _*i386 / __i386__ /g
		s/ M32 / __M32__ /g
		s/ is68k / __is68k__ /g
		s/ m68k / __m68k__ /g
		s/ mc680\([0-9]\)0 / __mc680\10__ /g
		s/ m88k / __m88k__ /g
		s/ _*mips / __mips__ /g
		s/ news\([0-9]*\) / __news\1__ /g
		s/ ns32000 / __ns32000__ /g
		s/ pdp11 / __pdp11__ /g
		s/ pyr / __pyr__ /g
		s/ sel / __sel__ /g
		s/ sony_news / __sony_news__ /g
		s/ sparc / __sparc__ /g
		s/ sun\([a-z0-9]*\) / __sun\1__ /g
		s/ tahoe / __tahoe__ /g
		s/ tower\([_0-9]*\) / __tower\1__ /g
		s/ u370 / __u370__ /g
		s/ u3b\([0-9]*\) / __u3b\1__ /g
		s/ unix / __unix__ /g
		s/ vax / __vax__ /g
		s/ _*MIPSE\([LB]\) / __MIPSE\1__ /g
		s/ _*\([Rr][34]\)000 / __\1000__ /g
		s/ _*SYSTYPE_\([A-Z0-9]*\) / __SYSTYPE_\1__ /g

		s/ \([a-zA-Z0-9_][a-zA-Z0-9_]*\) /\1/g
	  }
	  /^#define.NULL[ 	]/	i\
		#undef NULL
	' $2/$file > $2/$file.
	mv $2/$file. $2/$file
	if cmp $file $2/$file >/dev/null 2>&1 \
	    || egrep 'This file is part of the GNU C Library' $2/$file >/dev/null 2>&1; then
	   rm $2/$file
	else
	   echo Fixed $file
	   # Find any include directives that use "file".
	   for include in `egrep '^[ 	]*#[ 	]*include[ 	]*"[^/]' $2/$file | sed -e 's/^[ 	]*#[ 	]*include[ 	]*"\([^"]*\)".*$/\1/'`; do
	      dir=`echo $file | sed -e s'|/[^/]*$||'`
	      required="$required $1 $dir/$include $2/$dir/$include"
	   done
	fi
      fi
    fi
  done
  shift; shift
done

cd ${INPUT}

# Install the proper definition of the three standard types in header files
# that they come from.
for file in sys/types.h stdlib.h sys/stdtypes.h stddef.h memory.h unistd.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing size_t, ptrdiff_t and wchar_t in $file
    sed \
      -e '/^[ 	]*\*[ 	]*typedef unsigned int size_t;/N'	\
      -e 's/^\([ 	]*\*[ 	]*typedef unsigned int size_t;\n[ 	]*\*\/\)/\1\
#ifndef __SIZE_TYPE__\
#define __SIZE_TYPE__ long unsigned int\
#endif\
typedef __SIZE_TYPE__ size_t;\
/'	\
      -e '/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]size_t/i\
#ifndef __SIZE_TYPE__\
#define __SIZE_TYPE__ long unsigned int\
#endif
' \
      -e 's/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]size_t/typedef __SIZE_TYPE__ size_t/' \
      -e '/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]ptrdiff_t/i\
#ifndef __PTRDIFF_TYPE__\
#define __PTRDIFF_TYPE__ long int\
#endif
' \
      -e 's/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]ptrdiff_t/typedef __PTRDIFF_TYPE__ ptrdiff_t/' \
      -e '/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]wchar_t/i\
#ifndef __WCHAR_TYPE__\
#define __WCHAR_TYPE__ int\
#endif\
#ifndef __cplusplus
' \
      -e '/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]wchar_t/a\
#endif
' \
      -e 's/typedef[ 	][ 	]*[a-z_][ 	a-z_]*[ 	]wchar_t/typedef __WCHAR_TYPE__ wchar_t/' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# Fix #defines under Alpha OSF/1:
# The following files contain '#pragma extern_prefix "_FOO"' followed by
# a '#define something(x,y,z) _FOOsomething(x,y,z)'.  The intent of these
# statements is to reduce namespace pollution.  While these macros work
# properly in most cases, they don't allow you to take a pointer to the
# "something" being modified.  To get around this limitation, change these
# statements to be of the form '#define something _FOOsomething'.
for file in libgen.h dirent.h ftw.h grp.h ndbm.h pthread.h pwd.h signal.h standards.h stdlib.h string.h stropts.h time.h unistd.h
do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing $file extern_prefix
    sed -e 's/^[ 	]*#[ 	]*define[ 	]*\([^(]*\)\(([^)]*)\)[ 	]*\(_.\)\1\2[ 	]*$/#define \1 \3\1/' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $file | sed -e s'|/[^/]*$||'`
	required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done
 
# Fix one other error in this file: a mismatched quote not inside a C comment.
file=sundev/vuid_event.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sundev 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file comment
  sed -e "s/doesn't/does not/" ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix these Sun OS files to avoid an invalid identifier in an #ifdef.
file=sunwindow/win_cursor.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
#  mkdir ${LIB}/sunwindow 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
file=sunwindow/win_lock.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
#  mkdir ${LIB}/sunwindow 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e "s/ecd.cursor/ecd_cursor/" ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix this Sun file to avoid interfering with stddef.h.
file=sys/stdtypes.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
sed -e '/[	 ]size_t.*;/i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
    -e '/[	 ]size_t.*;/a\
#endif
' \
    -e '/[	 ]ptrdiff_t.*;/i\
#ifndef _GCC_PTRDIFF_T\
#define _GCC_PTRDIFF_T
' \
    -e '/[	 ]ptrdiff_t.*;/a\
#endif
' \
    -e '/[	 ]wchar_t.*;/i\
#ifndef _GCC_WCHAR_T\
#define _GCC_WCHAR_T
' \
    -e '/[	 ]wchar_t.*;/a\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix this ARM/RISCiX file to avoid interfering with the use of __wchar_t
# in cc1plus.
file=stdlib.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e "s/\(#[ 	]*ifndef[ 	]*\)__wchar_t/\1_GCC_WCHAR_T/" \
      -e "s/\(#[ 	]*define[ 	]*\)__wchar_t/\1_GCC_WCHAR_T/" \
     ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix this ARM/RISCiX file where ___type is a Compiler hint that is specific to
# the Norcroft compiler.
file=X11/Intrinsic.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e "s/___type p_type/p_type/" \
     ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[         ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix this file to avoid interfering with stddef.h, but don't mistakenly
# match ssize_t present in AIX for the ps/2, or typedefs which use (but do not
# set) size_t.
file=sys/types.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
sed -e '/typedef[ 	][ 	]*[A-Za-z_][ 	A-Za-z_]*[ 	]size_t/i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
    -e '/typedef[ 	][ 	]*[A-Za-z_][ 	A-Za-z_]*[ 	]size_t/a\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix HP's use of ../machine/inline.h to refer to
# /usr/include/machine/inline.h
file=sys/spinlock.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file
fi
if [ -r ${LIB}/$file ] ; then
  echo Fixing $file
  sed -e 's,"../machine/inline.h",<machine/inline.h>,' \
    -e 's,"../machine/psl.h",<machine/psl.h>,' \
  ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix an error in this file: the #if says _cplusplus, not the double
# underscore __cplusplus that it should be
file=tinfo.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpcsvc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, __cplusplus macro
  sed -e 's/[ 	]_cplusplus/ __cplusplus/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix an error in this file: a missing semi-colon at the end of the statsswtch
# structure definition.
file=rpcsvc/rstat.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpcsvc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, definition of statsswtch
  sed -e 's/boottime$/boottime;/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix an error in this file: a missing semi-colon at the end of the nodeent
# structure definition.
file=netdnet/dnetdb.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/netdnet 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, definition of nodeent
  sed -e 's/char.*na_addr *$/char *na_addr;/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Check for bad #ifdef line (in Ultrix 4.1)
file=sys/file.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, bad \#ifdef line
  sed -e 's/#ifdef KERNEL/#if defined(KERNEL)/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Check for (...) in C++ code in HP/UX sys/file.h.
file=sys/file.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if egrep HPUX_SOURCE ${LIB}/$file > /dev/null; then
    echo Fixing $file, use of '(...)'
    sed -e 's/(\.\.\.)/(struct file * ...)/' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $file | sed -e s'|/[^/]*$||'`
	required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
fi

# Check for superfluous `static' (in Ultrix 4.2)
# On Ultrix 4.3, includes of other files (r3_cpu.h,r4_cpu.h) is broken.
file=machine/cpu.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/machine 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, superfluous static and broken includes of other files.
  sed -e 's/^static struct tlb_pid_state/struct tlb_pid_state/' \
      -e 's/^#include "r3_cpu\.h"$/#include <machine\/r3_cpu\.h>/' \
      -e 's/^#include "r4_cpu\.h"$/#include <machine\/r4_cpu\.h>/' \
      ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
# This file has an alternative name, mips/cpu.h.  Fix that name, too.
    if cmp machine/cpu.h mips/cpu.h > /dev/null 2>&1; then
      mkdir ${LIB}/mips 2>&-
# Don't remove the file first, they may be the same file!
      ln ${LIB}/$file ${LIB}/mips/cpu.h > /dev/null 2>&1
    fi
  fi
fi

# Incorrect sprintf declaration in X11/Xmu.h
file=X11/Xmu.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/X11 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file sprintf declaration
  sed -e 's,^extern char \*	sprintf();$,#ifndef __STDC__\
extern char *	sprintf();\
#endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Incorrect sprintf declaration in X11/Xmu/Xmu.h
# (It's not clear whether the right file name is this or X11/Xmu.h.)
file=X11/Xmu/Xmu.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/X11/Xmu 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file sprintf declaration
  sed -e 's,^extern char \*	sprintf();$,#ifndef __STDC__\
extern char *	sprintf();\
#endif /* !defined __STDC__ */,' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Check for missing ';' in struct
file=netinet/ip.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/netinet 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/^struct/,/^};/s/}$/};/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix the CAT macro in SunOS memvar.h.
file=pixrect/memvar.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/pixrect 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/^#define.CAT(a,b)/ i\
#ifdef __STDC__ \
#define CAT(a,b) a##b\
#else
/^#define.CAT(a,b)/ a\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Check for yet more missing ';' in struct (in SunOS 4.0.x)
file=rpcsvc/rusers.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpcsvc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/^struct/,/^};/s/_cnt$/_cnt;/' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix return type of exit and abort in <stdlib.h> on SunOS 4.1.
# Also wrap protection around size_t for m88k-sysv3 systems.
file=stdlib.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  if grep _GCC_SIZE_T ${LIB}/$file >/dev/null
  then size_t_pattern='<<< do not double-wrap the size_t typedef >>>'
  else size_t_pattern='typedef[ 	a-zA-Z_]*[ 	]size_t[ 	]*;'
  fi
  sed -e 's/int	abort/void	abort/g' \
  -e 's/int	free/void	free/g' \
  -e 's/char[ 	]*\*[ 	]*calloc/void \*	calloc/g' \
  -e 's/char[ 	]*\*[ 	]*malloc/void \*	malloc/g' \
  -e 's/char[ 	]*\*[ 	]*realloc/void \*	realloc/g' \
  -e 's/int[ 	][ 	]*exit/void	exit/g' \
  -e "/$size_t_pattern/"'i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
  -e "/$size_t_pattern/"'a\
#endif
' \
      ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix return type of free and {c,m,re}alloc in <malloc.h> on SunOS 4.1.
# Also fix return type of {m,re}alloc in <malloc.h> on sysV68
file=malloc.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/typedef[ 	]char \*	malloc_t/typedef void \*	malloc_t/g' \
  -e 's/int[ 	][ 	]*free/void	free/g' \
  -e 's/char\([ 	]*\*[ 	]*malloc\)/void\1/g' \
  -e 's/char\([ 	]*\*[ 	]*realloc\)/void\1/g' \
  ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix bogus #ifdef in <hsfs/hsfs_spec.h> on SunOS 4.1.
file=hsfs/hsfs_spec.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/hsfs 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \
    ${LIB}/$file > ${LIB}/${file}.
  rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix bogus #ifdef in <hsfs/hsnode.h> on SunOS 4.1.
file=hsfs/hsnode.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/hsfs 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/\#ifdef __i386__ || __sun4c__/\#if __i386__ || __sun4c__/g' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix bogus #ifdef in <hsfs/iso_spec.h> on SunOS 4.1.
file=hsfs/iso_spec.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/hsfs 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/\#ifdef __i386__ || __vax__/\#if __i386__ || __vax__/g' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Incorrect #include in Sony News-OS 3.2.
file=machine/machparam.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/machine 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, incorrect \#include
  sed -e 's@"../machine/endian.h"@<machine/endian.h>@' \
    ${LIB}/$file > ${LIB}/${file}.
  rm -f ${LIB}/$file; mv ${LIB}/${file}. ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Multiline comment after typedef on IRIX 4.0.1.
file=sys/types.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, comment in the middle of \#ifdef
  sed -e 's@type of the result@type of the result */@' \
    -e 's@of the sizeof@/* of the sizeof@' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Turning // comments into /* */ comments trashes this IRIX 4.0.1
# header file, which embeds // comments inside multi-line /* */
# comments.  If this looks like the IRIX header file, we refix it by
# just throwing away the // comments.
file=fam.h
if [ -r ${LIB}/$file ]; then
  if egrep indigo.esd ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
    sed -e 's|//.*$||g' $file > ${LIB}/$file
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi
fi

# There is a similar problem with the VxWorks drv/netif/if_med.h file.
file=drv/netif/if_med.h
if [ -r ${LIB}/$file ]; then
  if egrep 'Wind River' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
    sed -e 's|//.*$||g' $file > ${LIB}/$file
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi
fi

# And also with the HP-UX 10 and HP-UX 11 sys/pci.h file
file=sys/pci.h
if [ -r ${LIB}/$file ]; then
  if egrep 'System Private Structures' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
    sed -e 's|//.*$||g' $file > ${LIB}/$file
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi
fi

# And also with a few more HP-UX 11 headers which are only broken
# after they are "fixed".
file=sys/ki_iface.h
if [ -r ${LIB}/$file ]; then
  if egrep 'These definitions are for HP Internal developers' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
  fi
fi

file=sys/ki.h
if [ -r ${LIB}/$file ]; then
  if egrep '11.00 HP-UX LP64' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
  fi
fi

file=sys/ki_calls.h
if [ -r ${LIB}/$file ]; then
  if egrep 'KI_MAX_PROCS is an arbitrary number' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
  fi
fi

file=sys/ki_defs.h
if [ -r ${LIB}/$file ] ; then
  if egrep 'Kernel Instrumentation Definitions' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
  fi
fi

file=sys/time.h
if [ -r ${LIB}/$file ] ; then
  if egrep 'For CASPEC, look in' ${LIB}/$file > /dev/null; then
    echo Fixing $file, overeager sed script
    rm ${LIB}/$file
  fi
fi

# Some IRIX header files contains the string "//"
for file in elf_abi.h elf.h; do
  if [ -r ${LIB}/$file ]; then
    echo Fixing $file, overeager sed script
    sed -e 's|"/\*"\*/|"//"|' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
    fi
  fi
done

# IRIX 4.0.5 <rpc/auth.h> uses struct sockaddr in prototype without
# previous definition.
file=rpc/auth.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, undefined type
  sed -e '/authdes_create.*struct sockaddr/i\
struct sockaddr;
' \
    ${LIB}/$file > ${LIB}/$file.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# IRIX 4.0.5 <rpc/xdr.h> uses struct __file_s in prototype without previous
# definition.
file=rpc/xdr.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, undefined type
  sed -e '/xdrstdio_create.*struct __file_s/i\
struct __file_s;
' \
    ${LIB}/$file > ${LIB}/$file.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Same problem with a file from SunOS 4.1.3 : a header file containing
# the string "//" embedded in "/**/"
file=sbusdev/audiovar.h
if [ -r ${LIB}/$file ]; then
  echo Fixing $file, overeager sed script
  rm ${LIB}/$file
  sed -e 's|//.*$||g' $file > ${LIB}/$file
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

# Fix non-ANSI memcpy declaration that conflicts with gcc's builtin
# declaration on Sun OS 4.x.  We must only fix this on Sun OS 4.x, because
# many other systems have similar text but correct versions of the file.
# To ensure only Sun's is fixed, we grep for a likely unique string.
# Fix also on sysV68 R3V7.1 (head/memory.h\t50.1\t )
file=memory.h
if [ -r $file ] && egrep '/\*	@\(#\)(head/memory.h	50.1	 |memory\.h 1\.[2-4] 8./../.. SMI; from S5R2 1\.2	)\*/' $file > /dev/null; then
  if [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi
  if [ -r ${LIB}/$file ]; then
    echo Replacing $file
    cat > ${LIB}/$file << EOF
/* This file was generated by fixincludes */
#ifndef __memory_h__
#define __memory_h__

#ifdef __STDC__
extern void *memccpy();
extern void *memchr();
extern void *memcpy();
extern void *memset();
#else
extern char *memccpy();
extern char *memchr();
extern char *memcpy();
extern char *memset();
#endif /* __STDC__ */

extern int memcmp();

#endif /* __memory_h__ */
EOF
  fi
fi

# Fix return type of fread and fwrite on sysV68
file=stdio.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, fread and fwrite return type
  sed -e 's/^\(extern int	fclose(), fflush()\), \(fread(), fwrite()\)\(.*\)$/extern unsigned int	\2;\
\1\3/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# parameters not const on DECstation Ultrix V4.0 and OSF/1.
file=stdio.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, non-const arg
  sed -e 's@perror( char \*__s );@perror( const char *__s );@' \
      -e 's@fputs( char \*__s,@fputs( const char *__s,@' \
      -e 's@fopen( char \*__filename, char \*__type );@fopen( const char *__filename, const char *__type );@' \
      -e 's@fwrite( void \*__ptr,@fwrite( const void *__ptr,@' \
      -e 's@fscanf( FILE \*__stream, char \*__format,@fscanf( FILE *__stream, const char *__format,@' \
      -e 's@scanf( char \*__format,@scanf( const char *__format,@' \
      -e 's@sscanf( char \*__s, char \*__format,@sscanf( const char *__s, const char *__format,@' \
      -e 's@popen(char \*, char \*);@popen(const char *, const char *);@' \
      -e 's@tempnam(char\*,char\*);@tempnam(const char*,const char*);@' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# parameters conflict with C++ new on rs/6000 
for file in stdio.h unistd.h ; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing $file, parameter name conflicts
    sed -e 's@rename(const char \*old, const char \*new)@rename(const char *_old, const char *_new)@' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# function class(double x) conflicts with C++ keyword on rs/6000 
file=math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if grep '[^a-zA-Z_]class[(]' ${LIB}/$file >/dev/null; then
    echo Fixing $file
    sed -e '/class[(]/i\
#ifndef __cplusplus
' \
        -e '/class[(]/a\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
fi

# Wrong fchmod prototype on RS/6000.
file=sys/stat.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, fchmod prototype
  sed -e 's/fchmod(char \*/fchmod(int/' \
    ${LIB}/$file > ${LIB}/$file.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# There are several name conflicts with C++ reserved words in X11
# header files.  These are fixed in some versions, so don't do the
# fixes if we find __cplusplus in the file.  These were found on the
# RS/6000.

# class in X11/ShellP.h
file=X11/ShellP.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then
    true;
  else
    echo Fixing $file, field class
    sed -e '/char [*]class;/i\
#ifdef __cplusplus\
	char *c_class;\
#else
' \
        -e '/char [*]class;/a\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
# new in Xm/Traversal.h
file=Xm/Traversal.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then
    true;
  else
    echo Fixing $file, uses of new
    sed -e '/Widget	old, new;/i\
#ifdef __cplusplus\
	Widget	old, c_new;\
#else
' \
        -e '/Widget	old, new;/a\
#endif
' \
	-e 's/Widget new,/Widget c_new,/g' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
# class in Xm/BaseClassI.h
file=Xm/BaseClassI.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if grep __cplusplus ${LIB}/$file >/dev/null 2>/dev/null; then
    true;
  else
    echo Fixing $file, prototype parameter name
    sed -e 's/ class[)]/ c_class)/g' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# NeXT 3.2 adds const prefix to some math functions. These conflict
# with the built-in functions.
file=ansi/math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/^extern.*double.*__const__.*sqrt(/s/__const__//' \
      -e '/^extern.*double.*__const__.*fabs(/s/__const__//' \
      -e '/^extern.*double.*__const__.*cos(/s/__const__//' \
      -e '/^extern.*double.*__const__.*hypot(/s/__const__//' \
      -e '/^extern.*double.*__const__.*sin(/s/__const__//' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# 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.
file=bsd/libc.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/\(.*template\)/s/template//' \
      -e '/extern.*volatile.*void.*abort/s/volatile//' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# NeXT 3.2 includes the keyword volatile in the abort() and 
# exit() function prototypes. That conflicts with the 
# built-in functions.
file=ansi/stdlib.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/extern.*volatile.*void.*exit/s/volatile//' \
      -e '/extern.*volatile.*void.*abort/s/volatile//' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# 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.
file=sys/wait.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ] \
  && grep 'bos325,' ${LIB}/$file >/dev/null; then
  echo Fixing $file, wait3 declaration
  sed -e '/^extern pid_t wait3();$/i\
struct rusage;
'\
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# NeXT 2.0 defines 'int wait(union wait*)', which conflicts with Posix.1.
# Note that version 3 of the NeXT system has wait.h in a different directory,
# so that this code won't do anything.  But wait.h in version 3 has a
# conditional, so it doesn't need this fix.  So everything is okay.
file=sys/wait.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ] \
  && grep 'wait[(]union wait' ${LIB}/$file >/dev/null; then
  echo Fixing $file, bad wait formal
  sed -e 's@wait(union wait@wait(void@' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Don't use or define the name va_list in stdio.h.
# This is for ANSI and also to interoperate properly with gcc's varargs.h.
file=stdio.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, use of va_list
  # Arrange for stdio.h to use stdarg.h to define __gnuc_va_list
  if egrep "__need___va_list" ${LIB}/$file >/dev/null 2>&1; then
    touch ${LIB}/${file}.sed
  else
    (echo "#define __need___va_list"
     echo "#include <stdarg.h>") > ${LIB}/${file}.sed
  fi
  # Use __gnuc_va_list in arg types in place of va_list.
  # On 386BSD use __gnuc_va_list instead of _VA_LIST_. We're hoping the
  # trailing parentheses and semicolon save all other systems from this.
  # Define __va_list__ (something harmless and unused) instead of va_list.
  # Don't claim to have defined va_list.
  sed -e 's@ va_list @ __gnuc_va_list @' \
      -e 's@ va_list)@ __gnuc_va_list)@' \
      -e 's@ _BSD_VA_LIST_));@ __gnuc_va_list));@' \
      -e 's@ _VA_LIST_));@ __gnuc_va_list));@' \
      -e 's@ va_list@ __va_list__@' \
      -e 's@\*va_list@*__va_list__@' \
      -e 's@ __va_list)@ __gnuc_va_list)@' \
      -e 's@GNUC_VA_LIST@GNUC_Va_LIST@' \
      -e 's@_NEED___VA_LIST@_NEED___Va_LIST@' \
      -e 's@VA_LIST@DUMMY_VA_LIST@' \
      -e 's@_Va_LIST@_VA_LIST@' \
    ${LIB}/$file >> ${LIB}/${file}.sed
  
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Cancel out ansi_compat.h on Ultrix.  Replace it with empty file.
file=ansi_compat.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  if grep -s ULTRIX $file; then
    echo "/* This file intentionally left blank.  */" > $LIB/$file
  fi
fi

# parameter to atof not const on DECstation Ultrix V4.0 and NEWS-OS 4.2R.
# also get rid of bogus inline definitions in HP-UX 8.0
file=math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, non-const arg
  sed -e 's@atof(\([ 	]*char[ 	]*\*[^)]*\))@atof(const \1)@' \
      -e 's@inline int abs(int [a-z][a-z]*) {.*}@extern "C" int abs(int);@' \
      -e 's@inline double abs(double [a-z][a-z]*) {.*}@@' \
      -e 's@inline int sqr(int [a-z][a-z]*) {.*}@@' \
      -e 's@inline double sqr(double [a-z][a-z]*) {.*}@@' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# fix bogus recursive stdlib.h in NEWS-OS 4.0C
file=stdlib.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, recursive inclusion
  sed -e '/^#include <stdlib.h>/i\
#if 0
' \
      -e '/^#include <stdlib.h>/a\
#endif
' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Avoid nested comments on Ultrix 4.3.
file=rpc/svc.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, nested comment
  sed -e 's@^\( \*	int protocol;  \)/\*@\1*/ /*@' \
    ${LIB}/$file > ${LIB}/$file.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# This file in RISC/os uses /**/ to concatenate two tokens.
file=bsd43/bsd43_.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  sed -e 's|/\*\*/|##|' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

file=rpc/rpc.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, nested comment
  sed -e 's@^\(/\*.*rpc/auth_des.h>.*\)/\*@\1*/ /*@' \
    ${LIB}/$file > ${LIB}/$file.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# 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.
file=rpc/types.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/rpc 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi
if [ -r ${LIB}/$file ]; then
  if egrep '"C"' ${LIB}/$file >/dev/null 2>&1; then
    true
  else
    echo Fixing $file
    echo '#ifdef __cplusplus
extern "C" {
#endif' > ${LIB}/${file}.sed
    cat ${LIB}/${file} >> ${LIB}/${file}.sed
    echo '#ifdef __cplusplus
}
#endif' >> ${LIB}/${file}.sed 
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
fi

# In limits.h, put #ifndefs around things that are supposed to be defined
# in float.h to avoid redefinition errors if float.h is included first.
# On HP/UX this patch does not work, because on HP/UX limits.h uses
# multi line comments and the inserted #endif winds up inside the
# 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
for file in limits.h sys/limits.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    mkdir ${LIB}/sys 2>/dev/null
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    if egrep 'ifndef[ 	]+FLT_MIN' ${LIB}/$file >/dev/null; then
      true
    else
      echo Fixing $file
      sed -e '/[ 	]FLT_MIN[ 	]/i\
#ifndef FLT_MIN
'\
	  -e '/[ 	]FLT_MIN[ 	]/a\
#endif
'\
	  -e '/[ 	]FLT_MAX[ 	]/i\
#ifndef FLT_MAX
'\
	  -e '/[ 	]FLT_MAX[ 	]/a\
#endif
'\
	  -e '/[ 	]FLT_DIG[ 	]/i\
#ifndef FLT_DIG
'\
	  -e '/[ 	]FLT_DIG[ 	]/a\
#endif
'\
	  -e '/[ 	]DBL_MIN[ 	]/i\
#ifndef DBL_MIN
'\
	  -e '/[ 	]DBL_MIN[ 	]/a\
#endif
'\
	  -e '/[ 	]DBL_MAX[ 	]/i\
#ifndef DBL_MAX
'\
	  -e '/[ 	]DBL_MAX[ 	]/a\
#endif
'\
	  -e '/[ 	]DBL_DIG[ 	]/i\
#ifndef DBL_DIG
'\
	  -e '/[ 	]DBL_DIG[ 	]/a\
#endif
'\
	  -e '/^\(\/\*#define	HUGE_VAL	3\.[0-9e+]* *\)\/\*/s//\1/'\
	${LIB}/$file > ${LIB}/${file}.sed
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    fi
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      echo Deleting ${LIB}/$file\; no fixes were needed.
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# In math.h, put #ifndefs around things that might be defined in a gcc
# specific math-*.h file.
file=math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/define[ 	]HUGE_VAL[ 	]/i\
#ifndef HUGE_VAL
'\
      -e '/define[ 	]HUGE_VAL[ 	]/a\
#endif
'\
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file

  # In addition, copy the definition of DBL_MAX from float.h
  # if math.h requires one.  The Lynx math.h requires it.
  if egrep '#define[ 	]*HUGE_VAL[ 	]+DBL_MAX' $file >/dev/null 2>&1; then
    if egrep '#define[ 	]+DBL_MAX[ 	]+' $file >/dev/null 2>&1; then
      true;
    else
      dbl_max_def=`egrep 'define[ 	]+DBL_MAX[ 	]+.*' float.h 2>/dev/null`
      if [ "$dbl_max_def" != "" ]; then
        dbl_max_def=`echo $dbl_max_def | sed 's/.*define[ 	]*DBL_MAX[ 	]*//'`
        sed -e "/define[ 	]HUGE_VAL[ 	]DBL_MAX/s/DBL_MAX/$dbl_max_def/" \
          ${LIB}/$file > ${LIB}/${file}.sed
	rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
      fi
    fi
  fi

  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    echo Deleting ${LIB}/$file\; no fixes were needed.
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Remove erroneous parentheses in sym.h on Alpha OSF/1.
file=sym.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/#ifndef(__mips64)/#ifndef __mips64/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix return value of mem{ccpy,chr,cpy,set} and str{len,spn,cspn}
# in string.h on sysV68
# Correct the return type for strlen in string.h on Lynx.
# Correct the argument type for ffs in string.h on Alpha OSF/1 V2.0.
# Add missing const for strdup on OSF/1 V3.0.
# On sysV88 layout is slightly different.
file=string.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, mem{ccpy,chr,cpy,set} and str{len,spn,cspn} return value
  sed -e 's/extern[ 	]*int[ 	]*strlen();/extern unsigned int strlen();/' \
      -e 's/extern[ 	]*int[ 	]*ffs[ 	]*(long);/extern int ffs(int);/' \
      -e 's/strdup(char \*s1);/strdup(const char *s1);/' \
      -e '/^extern char$/N' \
      -e 's/^extern char\(\n	\*memccpy(),\)$/extern void\1/'\
      -e '/^	strncmp(),$/N'\
      -e 's/^\(	strncmp()\),\n\(	strlen(),\)$/\1;\
extern unsigned int\
\2/'\
      -e '/^extern int$/N'\
      -e 's/^extern int\(\n	strlen(),\)/extern size_t\1/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Correct the return type for strlen in strings.h in SunOS 4.
file=strings.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/int[ 	]*strlen();/__SIZE_TYPE__ strlen();/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Delete the '#define void int' line from curses.h on Lynx
file=curses.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e '/#[ 	]*define[ 	][ 	]*void[ 	]int/d' \
     ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix `typedef struct term;' on hppa1.1-hp-hpux9.
file=curses.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/^[ 	]*typedef[ 	][ 	]*\(struct[ 	][ 	]*term[ 	]*;[ 	]*\)$/\1/' \
     ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# For C++, avoid any typedef or macro definition of bool, and use the
# built in type instead.
for files in curses.h; do
  if [ -r $file ] && egrep bool $file >/dev/null 2>&1; then
    if [ ! -r ${LIB}/$file ]; then
      cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
      chmod +w ${LIB}/$file 2>/dev/null
      chmod a+r ${LIB}/$file 2>/dev/null
    fi

    echo Fixing $file
    sed -e '/^#[ 	]*define[ 	][ 	]*bool[ 	][ 	]*char[ 	]*$/i\
#ifndef __cplusplus
'\
	-e '/^#[ 	]*define[ 	][ 	]*bool[ 	][ 	]*char[ 	]*$/a\
#endif
'\
	-e '/^typedef[ 	][ 	]*char[ 	][ 	]*bool[ 	]*;/i\
#ifndef __cplusplus
'\
	-e '/^typedef[ 	][ 	]*char[ 	][ 	]*bool[ 	]*;/a\
#endif
'\
	${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# Fix incorrect S_IF* definitions on m88k-sysv3.
file=sys/stat.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/^\(#define[ 	]*S_IS[A-Z]*(m)\)[ 	]*(m[ 	]*&[ 	]*\(S_IF[A-Z][A-Z][A-Z][A-Z]*\)[ 	]*)/\1 (((m)\&S_IFMT)==\2)/' \
      -e 's/^\(#define[ 	]*S_IS[A-Z]*(m)\)[ 	]*(m[ 	]*&[ 	]*\(0[0-9]*\)[ 	]*)/\1 (((m)\&S_IFMT)==\2)/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix nested comments in Motorola's <limits.h> and <sys/limits.h>
for file in limits.h sys/limits.h; do
  if [ $target_canonical = m88k-motorola-sysv3 -o \
       $target_canonical = m68k-motorola-sysv ]; then

    if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
      cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
      chmod +w ${LIB}/$file 2>/dev/null
      chmod a+r ${LIB}/$file 2>/dev/null
    fi

    if [ -r ${LIB}/$file ]; then
      echo "Fixing nested comments in Motorola's $file"
      sed \
        -e 's@^\(#undef[ 	][ 	]*PIPE_BUF[ 	]*/\* max # bytes atomic in write to a\)$@\1 */@' \
        -e 's@\(/\*#define	HUGE_VAL	3.40282346638528860e+38 \)\(/\*error value returned by Math lib\*/\)$@\1*/ \2@'	\
  	  < ${LIB}/$file > ${LIB}/${file}.sed
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
      if cmp $file ${LIB}/$file >/dev/null 2>&1; then
        rm -f ${LIB}/$file
      fi
    fi
  fi
done

# Fix getopt declarations in stdio.h and stdlib.h on Alpha OSF/1 and AIX.
for file in stdio.h stdlib.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing $file, getopt declaration
    sed -e 's/getopt(int, char \*\[\],[ ]*char \*)/getopt(int, char *const[], const char *)/' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# Fix __page_size* declarations in pthread.h AIX 4.1.[34].
# The original ones fail if uninitialized externs are not common.
# This is the default for all ANSI standard C++ compilers.
for file in pthread.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing $file, __page_size* declarations
    sed -e 's/^int __page_size/extern int __page_size/' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# Determine if we're on Interactive Unix 2.2 or later, in which case we
# need to fix some additional files.  This is the same test for ISC that
# Autoconf uses.
if test -d /etc/conf/kconfig.d \
    && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1; then
  echo "Fixing ISC __STDC__ goof in several files..."
  for name in stdio.h math.h ctype.h sys/limits.h sys/fcntl.h sys/dirent.h; do
    echo $name
    if test -r ${LIB}/$name; then
      file=${LIB}/$name
    else
      file=${INPUT}/$name
    fi
    # On Interactive 2.2, certain traditional Unix definitions
    # (notably getc and putc in stdio.h) are omitted if __STDC__ is
    # defined, not just if _POSIX_SOURCE is defined.  This makes it
    # impossible to compile any nontrivial program except with -posix.
    sed \
's/!defined(__STDC__) && !defined(_POSIX_SOURCE)/!defined(_POSIX_SOURCE)/' \
	    < $file > ${LIB}/$name.
    mv ${LIB}/$name. ${LIB}/$name
  done
  
  echo "Fixing ISC fmod declaration"
  # This one's already been fixed for other things.
  file=${LIB}/math.h
  sed 's/fmod(double)/fmod(double, double)/' <$file >$file.
  mv $file. $file
  
  echo "Fixing nested comments in ISC <sys/limits.h>"
  file=sys/limits.h
  sed '/CHILD_MAX/s,/\* Max, Max,' < ${INPUT}/$file >${LIB}/$file.
  sed '/OPEN_MAX/s,/\* Max, Max,' < ${LIB}/$file. >${LIB}/$file
fi

# These files in Sun OS 4.x use /**/ to concatenate tokens.
for file in sparc/asm_linkage.h sun3/asm_linkage.h sun3x/asm_linkage.h	\
	sun4/asm_linkage.h sun4c/asm_linkage.h sun4m/asm_linkage.h	\
	sun4c/debug/asm_linkage.h sun4m/debug/asm_linkage.h;
do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
        dir=`echo $file | sed -e s'|/[^/]*$||'`
        required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# These files in ARM/RISCiX use /**/ to concatenate tokens.
for file in arm/as_support.h arm/mc_type.h arm/xcb.h dev/chardefmac.h \
	dev/ps_irq.h dev/screen.h dev/scsi.h sys/tty.h Xm.acorn/XmP.h
do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    sed -e 's|/\*\*/|##|g' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
    fi
  fi
done

# 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.
file=math.h
if [ $target_canonical = m88k-motorola-sysv3 ]; then
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo Fixing $file, fabs/hypot definition
    sed \
      -e 's/extern double floor(), ceil(), fmod(), fabs();/extern double floor(), ceil(), fmod(), fabs _PARAMS((double));/' \
      -e '/^extern double hypot();$/a\
\/* Workaround a stupid Motorola optimization if one\
   of x or y is 0.0 and the other is negative!  *\/\
#ifdef __STDC__\
static __inline__ double fake_hypot (double x, double y)\
#else\
static __inline__ double fake_hypot (x, y)\
	double x, y;\
#endif\
{\
	return fabs (hypot (x, y));\
}\
#define hypot	fake_hypot
' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    fi
  fi
fi

# math.h on SunOS 4 puts the declaration of matherr before the definition
# of struct exception, so the prototype (added by fixproto) causes havoc.
file=math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, matherr declaration
  sed -e '/^struct exception/,$b' \
      -e '/matherr/i\
struct exception;
'\
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# sys/mman.h on HP/UX is not C++ ready, even though
# NO_IMPLICIT_EXTERN_C is defined on HP/UX.
for file in sys/mman.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    if egrep '"C"' ${LIB}/$file >/dev/null 2>&1 \
       || egrep '__BEGIN_DECLS' ${LIB}/$file >/dev/null 2>&1; then
      true
    else
      echo Fixing $file
      echo '#ifdef __cplusplus
extern "C" {
#endif' > ${LIB}/${file}.sed
      cat ${LIB}/${file} >> ${LIB}/${file}.sed
      echo '#ifdef __cplusplus
}
#endif' >> ${LIB}/${file}.sed 
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    fi
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $file | sed -e s'|/[^/]*$||'`
	required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# Fix return value of sbrk in unistd.h on Alpha OSF/1 V2.0
file=unistd.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, sbrk declaration
  sed -e 's/char\([ 	]*\*[	 ]*sbrk[ 	]*(\)/void\1/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# This file on SunOS 4 has a very large macro.  When the sed loop
# tries pull it in, it overflows the pattern space size of the SunOS
# sed (GNU sed does not have this problem).  Since the file does not
# require fixing, we remove it from the fixed directory.
file=sundev/ipi_error.h
if [ -r ${LIB}/$file ]; then
  echo "Removing incorrect fix to SunOS <sundev/ipi_error.h>"
  rm -f ${LIB}/$file
fi

# Put cpp wrappers around these include files to avoid redeclaration
# errors during multiple inclusion on m88k-tektronix-sysv3.
for file in time.h sys/time.h ; do
  if egrep '#ifndef' $file >/dev/null 2>&1; then
    true
  else
    if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
      cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
      chmod +w ${LIB}/$file 2>/dev/null
    fi
    if [ -r ${LIB}/$file ]; then
      echo Fixing $file, to protect against multiple inclusion.
      cpp_wrapper=`echo $file | sed -e 's,\.,_,g' -e 's,/,_,g'`
      (echo "#ifndef __GCC_GOT_${cpp_wrapper}_"
      echo "#define __GCC_GOT_${cpp_wrapper}_"
      cat ${LIB}/${file}
      echo '#endif /* !_GCC_GOT_'${cpp_wrapper}_' */')  > ${LIB}/${file}.new
      rm -f ${LIB}/$file; mv ${LIB}/${file}.new ${LIB}/$file
    fi
  fi
done

# Fix fcntl prototype in fcntl.h on LynxOS.
file=fcntl.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, fcntl declaration
  sed -e 's/\(fcntl.*(int, int, \)int)/\1...)/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix definitions of macros used by va-i960.h in VxWorks header file.
file=arch/i960/archI960.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/__vsiz/__vxvsiz/' -e 's/__vali/__vxvali/' \
      -e s'/__vpad/__vxvpad/' -e 's/__alignof__/__vxalignof__/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Make VxWorks header which is almost gcc ready fully gcc ready.
file=types/vxTypesBase.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file
  sed -e 's/#ifdef __GNUC_TYPEOF_FEATURE_BROKEN_USE_DEFAULT_UNTIL_FIXED__/#if 1/' \
      -e '/[ 	]size_t/i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
      -e '/[ 	]size_t/a\
#endif
' \
      -e '/[ 	]ptrdiff_t/i\
#ifndef _GCC_PTRDIFF_T\
#define _GCC_PTRDIFF_T
' \
      -e '/[ 	]ptrdiff_t/a\
#endif
' \
      -e '/[ 	]wchar_t/i\
#ifndef _GCC_WCHAR_T\
#define _GCC_WCHAR_T
' \
      -e '/[ 	]wchar_t/a\
#endif
' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix VxWorks <sys/stat.h> to not require including <vxWorks.h>.
file=sys/stat.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if egrep '#include' ${LIB}/$file >/dev/null 2>&1; then
    :
  else
    if egrep 'ULONG' ${LIB}/$file >/dev/null 2>&1 \
       && [ -r types/vxTypesOld.h ]; then
      echo Fixing $file
      sed -e '/#define[ 	][ 	]*__INCstath/a\
#include <types/vxTypesOld.h>
' \
    ${LIB}/$file > ${LIB}/${file}.sed
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    fi
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Fix VxWorks <time.h> to not require including <vxTypes.h>.
file=time.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if egrep 'uint_t[ 	][ 	]*_clocks_per_sec' ${LIB}/$file >/dev/null 2>&1; then
    echo Fixing $file
    sed -e 's/uint_t/unsigned int/' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
    
# Fix hpux10.20 <sys/time.h> to avoid invalid forward decl
file=sys/time.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if egrep '^extern struct sigevent;' ${LIB}/$file >/dev/null 2>&1; then
    echo Fixing $file
    sed -e 's/^extern struct sigevent;/struct sigevent;/' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
    
# Another bad dependency in VxWorks 5.2 <time.h>.
file=time.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  mkdir ${LIB}/sys 2>/dev/null
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  if egrep VOIDFUNCPTR ${LIB}/$file >/dev/null 2>&1; then
    if [ -r vxWorks.h ]; then
      echo Fixing $file
      sed -e '/VOIDFUNCPTR/i\
#ifndef __gcc_VOIDFUNCPTR_defined\
#ifdef __cplusplus\
typedef void (*__gcc_VOIDFUNCPTR) (...);\
#else\
typedef void (*__gcc_VOIDFUNCPTR) ();\
#endif\
#define __gcc_VOIDFUNCPTR_defined\
#endif
' \
	  -e 's/VOIDFUNCPTR/__gcc_VOIDFUNCPTR/g' \
	${LIB}/$file > ${LIB}/${file}.sed
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    fi
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi
    
# This file in A/UX 3.0.x/3.1.x contains an __asm directive for c89; gcc
# doesn't understand it.
file=sys/param.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo "Fixing __asm directive in sys/param.h"
  sed -e 's|#ifndef NOINLINE|#if !defined(NOINLINE) \&\& !defined(__GNUC__)|' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# signal.h on SunOS defines signal using (), which causes trouble when
# compiling with g++ -pedantic.
for file in signal.h sys/signal.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    echo "Checking for bad C++ prototype in $file"
    sed -e '/^void	(\*signal())();$/i\
  #ifdef __cplusplus\
  void	(*signal(...))(...);\
  #else
  ' \
	-e '/^void	(\*signal())();$/a\
  #endif
  ' \
      ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
    if cmp $file ${LIB}/$file >/dev/null 2>&1; then
      rm -f ${LIB}/$file
    else
      # Find any include directives that use "file".
      for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $file | sed -e s'|/[^/]*$||'`
	required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
      done
    fi
  fi
done

# sys/signal.h on some versions of AIX uses volatile in the typedef of
# sig_atomic_t, which causes gcc to generate a warning about duplicate
# volatile when a sig_atomic_t variable is declared volatile, as
# required by ANSI C.
file=sys/signal.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo "Checking for duplicate volatile in sys/signal.h"
  sed -e 's/typedef volatile int sig_atomic_t/typedef int sig_atomic_t/' \
    ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# Some math.h files define struct exception, which conflicts with
# the class exception defined in the C++ file std/stdexcept.h.  We
# redefine it to __math_exception.  This is not a great fix, but I
# haven't been able to think of anything better.
file=math.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo Fixing $file, exception
  sed -e '/struct exception/i\
#ifdef __cplusplus\
#define exception __math_exception\
#endif
'\
      -e '/struct exception/a\
#ifdef __cplusplus\
#undef exception\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if egrep 'matherr()' ${LIB}/$file >/dev/null 2>&1; then
    sed -e '/matherr/i\
#ifdef __cplusplus\
#define exception __math_exception\
#endif
'\
        -e '/matherr/a\
#ifdef __cplusplus\
#undef exception\
#endif
' ${LIB}/$file > ${LIB}/${file}.sed
    rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  fi
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# rpc/xdr.h on SunOS needs prototypes for its XDR->xdr_ops function pointers.
file=rpc/xdr.h
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
  cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
  chmod +w ${LIB}/$file 2>/dev/null
  chmod a+r ${LIB}/$file 2>/dev/null
fi

if [ -r ${LIB}/$file ]; then
  echo "Checking for needed C++ prototype in $file"
  sed -e 's/^\(.*\)\*\(x_.*\)();\(.*\)/\
#ifdef __cplusplus\
\1*\2(...);\3\
#else\
\1*\2();\3\
#endif/g' \
     $LIB/$file > ${LIB}/${file}.sed

  rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $file | sed -e s'|/[^/]*$||'`
	required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
fi

# sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by
# defining regex.h types.  This causes C++ library build and usage failures.
# Fixing this correctly requires checking and modifying 3 files.
for file in reg_types.h regex.h sys/lc_core.h; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi
done
if [ -r ${LIB}/reg_types.h ]; then
  if egrep '} regex_t;' ${LIB}/reg_types.h >/dev/null 2>&1; then
    if [ -r ${LIB}/sys/lc_core.h ]; then
      if egrep ' regex_t ' ${LIB}/sys/lc_core.h >/dev/null 2>&1; then
        if [ -r ${LIB}/regex.h ]; then
	  if egrep '__regex_t' ${LIB}/regex.h >/dev/null 2>&1; then
	    true;
	  else
	    echo Fixing reg_types.h, regex.h, sys/lc_core.h
	    for file in reg_types.h sys/lc_core.h; do
	      sed -e 's/regex_t/__regex_t/g' \
	        -e 's/regoff_t/__regoff_t/g' \
		-e 's/regmatch_t/__regmatch_t/g' \
		${LIB}/$file > ${LIB}/${file}.sed
	      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
	    done
	    sed -e '/#include <reg_types.h>/a\
typedef __regex_t	regex_t;\
typedef __regoff_t	regoff_t;\
typedef __regmatch_t	regmatch_t;\
' \
	      ${LIB}/regex.h > ${LIB}/regex.h.sed
	    rm -f ${LIB}/regex.h; mv ${LIB}/regex.h.sed ${LIB}/regex.h
	  fi
	fi
      fi
    fi
  fi
fi
for file in reg_types.h regex.h sys/lc_core.h; do
  if cmp $file ${LIB}/$file >/dev/null 2>&1; then
    rm -f ${LIB}/$file
  else
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
done

# AIX headers define NULL to be cast to a void pointer, which is illegal
# in ANSI C++.
for file in curses.h dbm.h locale.h stdio.h stdlib.h string.h time.h unistd.h sys/dir.h sys/param.h sys/types.h ; do
  if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
    cp $file ${LIB}/$file >/dev/null 2>&1 || echo "Can't copy $file"
    chmod +w ${LIB}/$file 2>/dev/null
    chmod a+r ${LIB}/$file 2>/dev/null
  fi

  if [ -r ${LIB}/$file ]; then
    if egrep '#.*define.*NULL.*void' ${LIB}/$file >/dev/null 2>&1; then
      echo "Fixing $file, bad NULL macro"
      sed -e 's/^#[ 	]*define[ 	]*NULL[ 	]*((void[ 	]*\*)0)/#define NULL 0/' \
        ${LIB}/$file > ${LIB}/${file}.sed
      rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
      if cmp $file ${LIB}/$file >/dev/null 2>&1; then
        rm -f ${LIB}/$file
      else
        # Find any include directives that use "file".
        for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[      ]*"\([^"]*\)".*$/\1/'`; do
  	  dir=`echo $file | sed -e s'|/[^/]*$||'`
	  required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
        done
      fi
    fi
  fi
done

# HPUX 10.x sys/param.h defines MAXINT which clashes with values.h
file=sys/param.h
base=`basename $file`
if [ -r ${LIB}/$file ]; then
  file_to_fix=${LIB}/$file
else
  if [ -r ${INPUT}/$file ]; then
    file_to_fix=${INPUT}/$file
  else
    file_to_fix=""
  fi
fi
if [ \! -z "$file_to_fix" ]; then
  echo Checking $file_to_fix
  sed -e '/^#[ 	]*define[ 	]*MAXINT[ 	]/i\
#ifndef MAXINT
'\
      -e '/^#[ 	]*define[ 	]*MAXINT[ 	]/a\
#endif
' $file_to_fix > /tmp/$base
  if cmp $file_to_fix /tmp/$base >/dev/null 2>&1; then \
    true
  else
    echo Fixed $file_to_fix
    rm -f ${LIB}/$file
    cp /tmp/$base ${LIB}/$file
    chmod a+r ${LIB}/$file
    # Find any include directives that use "file".
    for include in `egrep '^[       ]*#[    ]*include[      ]*"[^/]' ${LIB}/$file | sed -e 's/^[    ]*#[    ]*include[ 	]*"\([^"]*\)".*$/\1/'`; do
      dir=`echo $file | sed -e s'|/[^/]*$||'`
      required="$required ${INPUT} $dir/$include ${LIB}/$dir/$include"
    done
  fi
  rm -f /tmp/$base
fi


# This loop does not appear to do anything, because it uses file
# rather than $file when setting target.  It also appears to be
# unnecessary, since the main loop processes symbolic links.
#if $LINKS; then
#  echo 'Making internal symbolic non-directory links'
#  cd ${INPUT}
#  files=`find . -type l -print`
#  for file in $files; do
#    dest=`ls -ld $file | sed -n 's/.*-> //p'`
#    if expr "$dest" : '[^/].*' > /dev/null; then    
#      target=${LIB}/`echo file | sed "s|[^/]*\$|$dest|"`
#      if [ -f $target ]; then
#        ln -s $dest ${LIB}/$file >/dev/null 2>&1
#      fi
#    fi
#  done
#fi

# Make sure that any include files referenced using double quotes
# exist in the fixed directory.  This comes last since otherwise
# we might end up deleting some of these files "because they don't
# need any change."
set x $required
shift
while [ $# != 0 ]; do
  newreq=
  while [ $# != 0 ]; do
    # $1 is the directory to copy from, $2 is the unfixed file,
    # $3 is the fixed file name.
    cd ${INPUT}
    cd $1
    if [ -r $2 ] && [ ! -r $3 ]; then
      cp $2 $3 >/dev/null 2>&1 || echo "Can't copy $2"
      chmod +w $3 2>/dev/null
      chmod a+r $3 2>/dev/null
      echo Copied $2
      for include in `egrep '^[ 	]*#[ 	]*include[ 	]*"[^/]' $3 | sed -e 's/^[ 	]*#[ 	]*include[ 	]*"\([^"]*\)".*$/\1/'`; do
	dir=`echo $2 | sed -e s'|/[^/]*$||'`
	dir2=`echo $3 | sed -e s'|/[^/]*$||'`
	newreq="$newreq $1 $dir/$include $dir2/$include"
      done
    fi
    shift; shift; shift
  done
  set x $newreq
  shift
done

echo 'Cleaning up DONE files.'
cd $LIB
find . -name DONE -exec rm -f '{}' ';'

echo 'Removing unneeded directories:'
cd $LIB
files=`find . -type d -print | sort -r`
for file in $files; do
  rmdir $LIB/$file > /dev/null 2>&1
done


exit 0
