File: fpe_test

package info (click to toggle)
mawk 1.3.4.20250131-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 2,224 kB
  • sloc: ansic: 19,901; sh: 4,600; yacc: 1,177; awk: 853; makefile: 290
file content (122 lines) | stat: -rwxr-xr-x 2,583 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/bin/sh
# $MawkId: fpe_test,v 1.10 2023/11/02 23:20:31 tom Exp $
###############################################################################
# copyright 2009-2022,2023, Thomas E. Dickey
# copyright 2010, Guido Berhoerster
# copyright 1994,1995, Michael D. Brennan
#
# This is a source file for mawk, an implementation of
# the AWK programming language.
#
# Mawk is distributed without warranty under the terms of
# the GNU General Public License, version 2, 1991.
###############################################################################

# tests if mawk has been compiled to correctly handle
# floating point exceptions

PROG="${MAWK:-../mawk}"

: "${EGREP:=grep -E}"
: "${FGREP:=grep -F}"

echo "testing floating point exception handling"

STDOUT=${TMPDIR-/tmp}/mawktest$$

test1='BEGIN{ print 4/0 }'


test2='BEGIN {
  x = 100
  do { y = x ; x *= 1000 } while ( y != x )
  print "loop terminated"
}'

# this used to test log(-8), but that was too challenging for cygwin hackers
test3='BEGIN{ print sqrt(-8) }'


echo "testing division by zero"
echo "$PROG" "$test1"
$PROG "$test1"
ret1=$?
echo

echo "testing overflow"
echo "$PROG" "$test2"
$PROG "$test2"
ret2=$?
echo

echo "testing domain error"
echo "$PROG" "$test3"
$PROG "$test3"  > "$STDOUT"
ret3=$?
cat "$STDOUT"
echo


# the returns should all be zero or all 2
# core dumps not allowed

trap '
echo compilation defines for floating point are incorrect
rm -f $STDOUT
exit 1'  0

echo
echo ==============================

echo return1 = $ret1
echo return2 = $ret2
echo return3 = $ret3


[ $ret1 -gt 128 ] && { echo test1 failed ; exception=1 ; }
[ $ret2 -gt 128 ] && { echo test2 failed ; exception=1 ; }
[ $ret3 -gt 128 ] && { echo test3 failed ; exception=1 ; }

[ "$exception" = 1 ] && { rm -f ./*core* "$STDOUT" ; exit 1 ; }


same=0

[ $ret1 = $ret2 ] && [ $ret2 = $ret3 ] && same=1


if [ $same = 1 ]
then
	if [ $ret1 = 0 ]
	then
		echo "results consistent: ignoring floating exceptions"
		# some versions of hpux print NAN as ?
		if $EGREP '[nN][aA][nN]|\?' "$STDOUT"  > /dev/null
		then
			:
		# MSYS / MinGW uses a different string...
		elif $FGREP '#IND' "$STDOUT" > /dev/null
		then
			echo "found MinGW hack for NaN..."
		else
			echo "but the library is not IEEE754 compatible"
			echo "test 3 failed"
			exit 1
		fi
		else echo "results consistent: trapping floating exceptions"
	fi

	trap  0
	rm -f "$STDOUT"
	exit 0

	else
		cat <<-EOF
		results are not consistent
		return values should all be 0 if ignoring FPEs (e.g. with IEEE754)
		or all 2 if trapping FPEs
EOF

	exit 1
fi
# vile: ts=4 sw=4