1 /* $OpenBSD: toint.c,v 1.7 2010/02/06 18:53:19 otto 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 long long 32 toll(double d) 33 { 34 return (long long)d; 35 } 36 37 int 38 main(int argc, char *argv[]) 39 { 40 struct sigaction sa; 41 int i; 42 43 memset(&sa, 0, sizeof(sa)); 44 sa.sa_sigaction = sigfpe; 45 sa.sa_flags = SA_SIGINFO; 46 sigaction(SIGFPE, &sa, NULL); 47 48 if (toint(8.6) != 9) 49 exit(1); 50 51 if (toll(2.3456e+17) != 234560000000000000LL) 52 exit(1); 53 54 exit(0); 55 } 56