Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ ieee_handler(3BSD) — UnixWare 2.01

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

abort(3C)

floatingpoint(3BSD)

sigfpe(3BSD)

signal(3BSD)

sigvec(3BSD)






       ieee_handler(3BSD)   (BSD System Compatibility)   ieee_handler(3BSD)


       NAME
             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.




                           Copyright 1994 Novell, Inc.               Page 1













      ieee_handler(3BSD)   (BSD System Compatibility)   ieee_handler(3BSD)


            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)


                          Copyright 1994 Novell, Inc.               Page 2













       ieee_handler(3BSD)   (BSD System Compatibility)   ieee_handler(3BSD)


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



























                           Copyright 1994 Novell, Inc.               Page 3








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