#! /bin/sh
#
# The script is created for Cygnus by vmakarov@cygnus.com and based on
# fixinc.wrap
#
# This script is designed for x86 with gnulibc of version 2.0 and less
# for solution of problems with invalid asm-statements by creating
# small wrappers around the include files containg the asm-statements.
#
# See README-fixinc for more information.


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

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

# Make LIB absolute if it is relative.
# Don't do this if not necessary, since may screw up automounters.
case $LIB in
/*)
	;;
*)
	cd $LIB; LIB=`${PWDCMD-pwd}`
	;;
esac

echo Building fixed headers in ${LIB}
  
file=selectbits.h
echo Fixed $file for glibc-2.0.x
rm -f $LIB/$file
cat <<'__EOF__' >$LIB/$file
/* This file fixes __FD_ZERO bug for glibc-2.0.x. */
#ifndef _SELECTBITS_H_WRAPPER
#include <features.h>
#include_next <selectbits.h>

#if defined(__FD_ZERO) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
#undef __FD_ZERO
#define __FD_ZERO(fdsetp) \
  do { \
    int __d0, __d1; \
  __asm__ __volatile__ ("cld; rep; stosl" \
                        : "=&c" (__d0), "=&D" (__d1) \
                        : "a" (0), "0" (sizeof (__fd_set) \
                                        / sizeof (__fd_mask)), \
                          "1" ((__fd_mask *) (fdsetp)) \
                        : "memory"); \
  } while (0)
#endif

#define _SELECTBITS_H_WRAPPER
#endif /* _SELECTBITS_H_WRAPPER */
__EOF__
# Define _SELECTBITS_H_WRAPPER at the end of the wrapper, not
# the start, so that if #include_next gets another instance of
# the wrapper, this will follow the #include_next chain until
# we arrive at the real <selectbits.h>.
chmod a+r $LIB/$file

# asm/posix_types.h for libc version 1.x
file=asm/posix_types.h
echo Fixed $file for glibc-1.x
rm -f $LIB/$file
dir=`dirname $LIB/$file`
if [ ! -d $dir ]; then
  mkdir -p $dir || exit 1
fi
cat <<'__EOF__' >$LIB/$file
/* This file fixes __FD_ZERO bug for glibc-1.x. */
#ifndef _POSIX_TYPES_H_WRAPPER
#include <features.h>
#include_next <asm/posix_types.h>

#if defined(__FD_ZERO) && !defined(__GLIBC__)
#undef __FD_ZERO
#define __FD_ZERO(fdsetp) \
  do { \
    int __d0, __d1; \
		__asm__ __volatile__("cld ; rep ; stosl" \
			: "=&c" (__d0), "=&D" (__d1) \
			: "a" (0), "0" (__FDSET_LONGS), \
			  "1" ((__kernel_fd_set *) (fdsetp)) :"memory"); \
  } while (0)
#endif

#define _POSIX_TYPES_H_WRAPPER
#endif /* _POSIX_TYPES_H_WRAPPER */
__EOF__
# Define _POSIX_TYPES_H_WRAPPER at the end of the wrapper, not
# the start, so that if #include_next gets another instance of
# the wrapper, this will follow the #include_next chain until
# we arrive at the real <asm/posix_types.h>.
chmod a+r $LIB/$file

# gnu/types.h for libc version 1.x
file=gnu/types.h
echo Fixed $file for glibc-1.x
rm -f $LIB/$file
dir=`dirname $LIB/$file`
if [ ! -d $dir ]; then
  mkdir -p $dir || exit 1
fi
cat <<'__EOF__' >$LIB/$file
/* This file fixes __FD_ZERO bug for glibc-1.x. */
#ifndef _TYPES_H_WRAPPER
#include <features.h>
#include_next <gnu/types.h>

#if defined(__FD_ZERO) && !defined(__GLIBC__)
#undef __FD_ZERO
# define __FD_ZERO(fdsetp) \
  do { \
    int __d0, __d1; \
	__asm__ __volatile__("cld ; rep ; stosl" \
        	: "=&c" (__d0), "=&D" (__d1) \
        	: "a" (0), "0" (__FDSET_LONGS), \
		  "1" ((__fd_set *) (fdsetp)) :"memory"); \
  } while (0)
#endif

#define _TYPES_H_WRAPPER
#endif /* _TYPES_H_WRAPPER */
__EOF__
# Define _TYPES_H_WRAPPER at the end of the wrapper, not the start,
# so that if #include_next gets another instance of the wrapper,
# this will follow the #include_next chain until we arrive at
# the real <gnu/types.h>.
chmod a+r $LIB/$file

if [ x${INSTALL_ASSERT_H} != x ]
then
  cd ${ORIG_DIR}
  rm -f include/assert.h
  cp ${srcdir}/assert.h include/assert.h || exit 1
  chmod a+r include/assert.h
fi

exit 0
