ieee_handler(3bsd) (BSD System Compatibility)


ieee_handler -- (BSD) IEEE exception trap handler function

Synopsis

   /usr/ucb/cc [flag . . . ] file . . . 
   

#include <fp.h>

int ieee_handler(char action[], char exception[], sigfpe_handler_type hdl);

Description

This function provides easy exception handling to exploit ANSI/IEEE Std 754-1985 arithmetic in a C program. All arguments are pointers to strings. Results arising from invalid arguments and invalid combinations are undefined for efficiency.

There are three types of action: get, set, and clear. There are five types of exception:

inexact

division
division by zero exception

underflow

overflow

invalid

all
all five exceptions above

common
invalid, overflow, and division exceptions

Note: all and common only make sense with set or clear

hdl contains the address of a signal-handling routine. fp.h defines sigfpe_handler_type.

get will get the location of the current handler routine for exception in hdl . set will set the routine pointed at by hdl to be the handler routine and at the same time enable the trap on exception, except when hdl == SIGFPE_DEFAULT or SIGFPE_IGNORE; then ieee_handler will disable the trap on exception. When hdl == SIGFPE_ABORT, any trap on exception will dump core using abort(3C). clear all disables trapping on all five exceptions.

Two steps are required to intercept an IEEE-related SIGFPE code with ieee_handler:

1.
Set up a handler with ieee_handler.

2.
Perform a floating-point operation that generates the intended IEEE exception.

Unlike sigfpe(3bsd), ieee_handler also adjusts floating-point hardware mode bits affecting IEEE trapping. For clear, set SIGFPE_DEFAULT, or set SIGFPE_IGNORE, the hardware trap is disabled. For any other set, the hardware trap is enabled.

SIGFPE signals can be handled using sigvec(3bsd), signal(3bsd), sigfpe(3bsd), or ieee_handler. In a particular program, to avoid confusion, use only one of these interfaces to handle SIGFPE signals.

<Return> values

ieee_handler normally returns 0. In the case of set, 1 will be returned if the action is not available (for instance, not supported in hardware).

Examples

A user-specified signal handler might look like this:

   void sample_handler(int sig, int code, 
   	struct sigcontext *scp,  char *addr); 
   	/* sig == SIGFPE always */ 
   { 
   	/* 
   	   Sample user-written sigfpe code handler. 
   	   Prints a message and continues. 
   	   struct sigcontext is defined in <signal.h>. 
   	 */ 
   	printf("ieee exception code %x occurred at pc %X \n", 
   	 code,scp->sc_pc); 
   } 

and it might be set up like this:

   extern void sample_handler; 
   main 
   { 
   	sigfpe_handler_type hdl, old_handler1, old_handler2; 
   /* 
   * save current overflow and invalid handlers 
   */ 
   	ieee_handler("get","overflow",old_handler1); 
   	ieee_handler("get","invalid", old_handler2); 
   /* 
   * set new overflow handler to sample_handler and set new 
   * invalid handler to SIGFPE_ABORT (abort on invalid) 
   */ 
   	hdl = (sigfpe_handler_type) sample_handler; 
   	if(ieee_handler("set","overflow",hdl) != 0) 
   		printf("ieee_handler can't set overflow \n"); 
   	if(ieee_handler("set","invalid",SIGFPE_ABORT) != 0) 
   		printf("ieee_handler can't set invalid \n"); 
   	... 
   /* 
   * restore old overflow and invalid handlers 
   */ 
   	ieee_handler("set","overflow", old_handler1); 
   	ieee_handler("set","invalid", old_handler2); 
   } 

Files

/usr/include/fp.h

/usr/include/signal.h

References

abort(3C), floatingpoint(3bsd), sigfpe(3bsd), signal(3bsd), sigvec(3bsd)
30 January 1998
© 1998 The Santa Cruz Operation, Inc. All rights reserved.