#! /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 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-~] 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]*[ 	]+[^/ 	]'.
#
# 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-~]|^#[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*/|
	  /[ 	]_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
	  /[^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[ 	][ 	]*[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 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
  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 '/typedef[ 	a-zA-Z_]*[ 	]size_t[ 	]*;/i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
  -e '/typedef[ 	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 -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

# 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__.*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.
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
'\
	${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.
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/'\
    ${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 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

# 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

# assert.h and sys/mman.h on HP/UX are not C++ ready, even though
# NO_IMPLICIT_EXTERN_C is defined on HP/UX.
for file in assert.h 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

# check for broken assert.h that needs stdio.h or stdlib.h
file=assert.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 'stderr' ${LIB}/$file >/dev/null 2>/dev/null; then
    if grep 'include.*stdio.h' ${LIB}/$file >/dev/null 2>/dev/null; then
      true
    else
      echo "Fixing $file (needs stdio.h)"
      echo '#include <stdio.h>' >>${LIB}/$file
    fi
  fi
  if grep 'exit *(' ${LIB}/$file >/dev/null 2>/dev/null || 
     grep 'abort *(' ${LIB}/$file >/dev/null 2>/dev/null; then
    if grep 'include.*stdlib.h' ${LIB}/$file >/dev/null 2>/dev/null; then
      true
    else
      echo "Fixing $file (needs stdlib.h)"
      echo '#ifdef __cplusplus
#include <stdlib.h>
#endif' >>${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 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 related types.  This causes libg++ 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

# 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
