xref: /openbsd-src/regress/lib/libm/toint/toint.c (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
1 /*	$OpenBSD: toint.c,v 1.5 2004/04/02 20:37:42 mickey Exp $	*/
2 
3 /*	Written by Michael Shalayeff, 2003, Public domain.	*/
4 
5 #include <limits.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <signal.h>
10 #include <unistd.h>
11 
12 void
13 sigfpe(int sig, siginfo_t *si, void *v)
14 {
15 	char buf[132];
16 
17 	if (si) {
18 		snprintf(buf, sizeof(buf), "sigfpe: trap=%d code=%d addr=%p\n",
19 		    si->si_trapno, si->si_code, si->si_addr);
20 		write(1, buf, strlen(buf));
21 	}
22 	_exit(1);
23 }
24 
25 int
26 toint(double d)
27 {
28 	return (int)(d + 1);
29 }
30 
31 int
32 main(int argc, char *argv[])
33 {
34 	struct sigaction sa;
35 	int i;
36 
37 	memset(&sa, 0, sizeof(sa));
38 	sa.sa_sigaction = sigfpe;
39 	sa.sa_flags = SA_SIGINFO;
40 	sigaction(SIGFPE, &sa, NULL);
41 
42 	if (toint(8.6) != 9)
43 		exit(1);
44 
45 	i = toint(INT_MAX);
46 	if (i != INT_MIN) {
47 		printf("%d != %d\n", i, INT_MIN);
48 		exit(1);
49 	}
50 
51 	exit(0);
52 }
53