Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

floatingpoint(3)

ieee_handler(3)

sigfpe(3)

signal(3)

sigvec(3)

signal(2)

abort(3C)





   ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)


   NAME
         ieee_handler - IEEE exception trap handler function

   SYNOPSIS
         cc [ flag... ] file ... -lucb

         #include <fp.h>

         int ieee_handler(action,exception,hdl)
         char action[], 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(3).
         ``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.




   7/91                                                                 Page 1









   ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)


         Unlike sigfpe(3), 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(2), signal(3), signal(3F),
         sigfpe(3), or ieee_handler(3M).  In a particular program, to avoid
         confusion, use only one of these interfaces to handle SIGFPE signals.

   RETURN VALUE
         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).

   EXAMPLE
         A user-specified signal handler might look like this:
               void sample_handler( sig, code, scp, addr)
               int sig ;               /* sig == SIGFPE always */
               int code ;
               struct sigcontext *scp ;
               char *addr ;
               {
                     /*
                        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");
                     ...


   Page 2                                                                 7/91









   ieee_handler(3M)        (BSD Compatibility Package)        ieee_handler(3M)


               /*
               * 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

   SEE ALSO
         floatingpoint(3), ieee_handler(3), sigfpe(3), signal(3) sigvec(3),

         signal(2), abort(3C) in the Programmer's Reference Manual.






































   7/91                                                                 Page 3





Typewritten Software • bear@typewritten.org • Edmonds, WA 98026