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