229
229
#if !defined(TRIO_EMBED_NAN)
230
static TRIO_CONST char rcsid[] = "@(#)$Id: trionan.c,v 1.33 2005/05/29 11:57:25 breese Exp $";
230
static TRIO_CONST char rcsid[] = "@(#)$Id$";
233
233
#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE) \
299
#if defined(TRIO_PLATFORM_UNIX) && defined(TRIO_INTERNAL_ISNAN_FALLBACK)
301
/* Assume that if SA_SIGINFO is defined, then sigaction() and
302
* 'struct sigaction' are also properly defined on this platform.
304
#ifndef TRIO_USE_SIGACTION
306
# define TRIO_USE_SIGACTION 1
308
# define TRIO_USE_SIGACTION 0
312
# if TRIO_USE_SIGACTION
313
typedef struct sigaction signal_handler_t;
315
typedef void (*signal_handler_t) TRIO_PROTO((int));
319
* internal_ignore_signal_handler
322
TRIO_PRIVATE_NAN signal_handler_t
323
internal_ignore_signal_handler
327
# if TRIO_USE_SIGACTION
328
signal_handler_t old_handler, new_handler;
329
memset(&new_handler, '\0', sizeof(new_handler));
330
new_handler.sa_handler = SIG_IGN;
331
new_handler.sa_flags = SA_RESTART;
332
sigaction(signum, &new_handler, &old_handler);
335
return signal(signum, SIG_IGN);
340
* internal_restore_signal_handler
342
TRIO_PRIVATE_NAN void
343
internal_restore_signal_handler
344
TRIO_ARGS2((signum, handler),
346
signal_handler_t handler)
348
# if TRIO_USE_SIGACTION
349
sigaction(signum, &handler, NULL);
351
signal(signum, handler);
297
358
* internal_make_double
299
360
#if defined(TRIO_FUNC_INTERNAL_MAKE_DOUBLE)
649
710
double integral, fraction;
651
712
# if defined(TRIO_PLATFORM_UNIX)
652
void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);
713
signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);
713
774
# if defined(TRIO_PLATFORM_UNIX)
714
void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);
775
signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);
717
778
double infinity = trio_pinf();
721
782
: ((number == -infinity) ? -1 : 0));
723
784
# if defined(TRIO_PLATFORM_UNIX)
724
signal(SIGFPE, signal_handler);
785
internal_restore_signal_handler(SIGFPE, sigfpe_handler);
997
1058
* operation to generate infinity.
999
1060
# if defined(TRIO_PLATFORM_UNIX)
1000
void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);
1061
signal_handler_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);
1003
1064
pinf_value = HUGE_VAL;
1086
1147
* the Invalid Operation floating-point exception is unmasked.
1088
1149
# if defined(TRIO_PLATFORM_UNIX)
1089
void (*signal_handler)(int) = signal(SIGFPE, SIG_IGN);
1150
signal_handle_t sigfpe_handler = internal_ignore_signal_handler(SIGFPE);
1092
1153
nan_value = trio_pinf() / trio_pinf();
1094
1155
# if defined(TRIO_PLATFORM_UNIX)
1095
signal(SIGFPE, signal_handler);
1156
internal_restore_signal_handler(SIGFPE, sigfpe_handler);
1207
1268
trio_isnan(my_ninf), trio_isinf(my_ninf), trio_isfinite(my_ninf));
1209
1270
# if defined(TRIO_PLATFORM_UNIX)
1210
signal_handler = signal(SIGFPE, SIG_IGN);
1271
signal_handler = internal_ignore_signal_handler(SIGFPE);
1213
1274
my_pinf = DBL_MAX + DBL_MAX;
1215
1276
my_nan = my_pinf / my_pinf;
1217
1278
# if defined(TRIO_PLATFORM_UNIX)
1218
signal(SIGFPE, signal_handler);
1279
internal_restore_signal_handler(SIGFPE, signal_handler);
1221
1282
printf("NaN : %4g 0x%02x%02x%02x%02x%02x%02x%02x%02x (%2d, %2d, %2d)\n",