?RCS: $Id: d_casti32.U,v 3.0.1.3 1995/05/12 12:10:45 ram Exp $
?RCS:
?RCS: Copyright (c) 1991-1993, Raphael Manfredi
?RCS:
?RCS: You may redistribute only under the terms of the Artistic License,
?RCS: as specified in the README file that comes with the distribution.
?RCS: You may reuse parts of this distribution only within the terms of
?RCS: that same Artistic License; a copy of which may be found at the root
?RCS: of the source tree for dist 3.0.
?RCS:
?RCS: Original Author: Andy Dougherty <doughera@lafcol.lafayette.edu>
?RCS:
?RCS: $Log: d_casti32.U,v $
?RCS: Revision 3.0.1.3  1995/05/12  12:10:45  ram
?RCS: patch54: made sure cc and ccflags are conditional dependencies
?RCS:
?RCS: Revision 3.0.1.2  1994/10/29  16:09:37  ram
?RCS: patch36: declare signal handler correctly (ADO)
?RCS:
?RCS: Revision 3.0.1.1  1994/08/29  16:07:06  ram
?RCS: patch32: created by ADO
?RCS:
?X:
?X:	Can the compiler cast large floats to 32-bit integers?
?X:
?MAKE:d_casti32: cat Compile rm_try intsize Setvar test signal_t run i_stdlib
?MAKE:	-pick add $@ %<
?S:d_casti32:
?S:	This variable conditionally defines CASTI32, which indicates
?S:	whether the C compiler can cast large floats to 32-bit ints.
?S:.
?C:CASTI32:
?C:	This symbol is defined if the C compiler can cast negative
?C:	or large floating point numbers to 32-bit ints.
?C:.
?H:#$d_casti32	CASTI32		/**/
?H:.
?T:xxx yyy
?F:!try
?LINT:set d_casti32
: check for ability to cast large floats to 32-bit ints.
echo " "
echo 'Checking whether your C compiler can cast large floats to int32.' >&4
if $test "$intsize" -ge 4; then
	xxx=int
else
	xxx=long
fi
$cat >try.c <<EOCP
#include <stdio.h>
#$i_stdlib I_STDLIB
#ifdef I_STDLIB
#include <stdlib.h>
#endif
#include <sys/types.h>
#include <signal.h>
$signal_t blech(int s) { exit(3); }
int main()
{
	$xxx i32;
	double f, g;
	int result = 0;
	char str[16];
	signal(SIGFPE, blech);

	/* Don't let compiler optimize the test away.  Store the number
	   in a writable string for gcc to pass to sscanf under HP-UX.
	*/
	sprintf(str, "2147483647");
	sscanf(str, "%lf", &f); /* f = (double) 0x7fffffff; */
	g = 10 * f;
	i32  = ($xxx) g;

	/* x86 processors will probably give 0x8000 0000, which is a
	   sign change.  We don't want that.  We want to mimic SPARC
	   behavior here, which is to preserve the sign and give
	   back 0x7fff ffff.
	*/
	if (i32 != ($xxx) f)
		result |= 1;
	exit(result);
}
EOCP
set try
if eval $compile_ok; then
	$run ./try 2>/dev/null
	yyy=$?
else
	echo "(I can't seem to compile the test program--assuming it can't)"
	yyy=1
fi
case "$yyy" in
0)	val="$define"
	echo "Yup, it can."
	;;
*)	val="$undef"
	echo "Nope, it can't."
	;;
esac
set d_casti32
eval $setvar
$rm_try

