Added script front-end for primer-design code
[htsworkflow.git] / htswanalysis / MACS / lib / gsl / gsl-1.11 / ieee-utils / fp-sunos4.c
1 /* ieee-utils/fp-sunos4.c
2  * 
3  * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Brian Gough
4  * 
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or (at
8  * your option) any later version.
9  * 
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  * 
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19
20 #include <sys/ieeefp.h>
21 #include <floatingpoint.h>
22 #include <signal.h>
23 #include <gsl/gsl_ieee_utils.h>
24 #include <gsl/gsl_errno.h>
25
26 int
27 gsl_ieee_set_mode (int precision, int rounding, int exception_mask)
28 {
29   char * out ;
30
31   switch (precision)
32     {
33     case GSL_IEEE_SINGLE_PRECISION:
34       ieee_flags ("set", "precision", "single", out) ;
35       break ;
36     case GSL_IEEE_DOUBLE_PRECISION:
37       ieee_flags ("set", "precision", "double", out) ;
38       break ;
39     case GSL_IEEE_EXTENDED_PRECISION:
40       ieee_flags ("set", "precision", "extended", out) ;
41       break ;
42     default:
43       ieee_flags ("set", "precision", "extended", out) ;
44     }
45
46   switch (rounding)
47     {
48     case GSL_IEEE_ROUND_TO_NEAREST:
49       ieee_flags ("set", "direction", "nearest", out) ;
50       break ;
51     case GSL_IEEE_ROUND_DOWN:
52       ieee_flags ("set", "direction", "negative", out) ;
53       break ;
54     case GSL_IEEE_ROUND_UP:
55       ieee_flags ("set", "direction", "positive", out) ;
56       break ;
57     case GSL_IEEE_ROUND_TO_ZERO:
58       ieee_flags ("set", "direction", "tozero", out) ;
59       break ;
60     default:
61       ieee_flags ("set", "direction", "nearest", out) ;
62     }
63
64   if (exception_mask & GSL_IEEE_MASK_INVALID)
65     {
66       ieee_handler ("set", "invalid", SIGFPE_IGNORE) ;
67     }
68   else 
69     {
70       ieee_handler ("set", "invalid", SIGFPE_ABORT) ;
71     }
72
73   if (exception_mask & GSL_IEEE_MASK_DENORMALIZED)
74     {
75       ieee_handler ("set", "denormalized", SIGFPE_IGNORE) ;
76     }
77   else
78     {
79       GSL_ERROR ("sunos4 does not support the denormalized operand exception. "
80                  "Use 'mask-denormalized' to work around this.",
81                  GSL_EUNSUP) ;
82     }
83
84
85   if (exception_mask & GSL_IEEE_MASK_DIVISION_BY_ZERO)
86     {
87       ieee_handler ("set", "division", SIGFPE_IGNORE) ;
88     } 
89   else
90     {
91       ieee_handler ("set", "division", SIGFPE_ABORT) ;
92     }
93   
94   if (exception_mask & GSL_IEEE_MASK_OVERFLOW)
95     {
96       ieee_handler ("set", "overflow", SIGFPE_IGNORE) ;
97     }
98   else 
99     {
100       ieee_handler ("set", "overflow", SIGFPE_ABORT) ;
101     }
102
103   if (exception_mask & GSL_IEEE_MASK_UNDERFLOW)
104     {
105       ieee_handler ("set", "underflow", SIGFPE_IGNORE) ;
106     }
107   else
108     {
109       ieee_handler ("set", "underflow", SIGFPE_ABORT) ;
110     }
111
112   if (exception_mask & GSL_IEEE_TRAP_INEXACT)
113     {
114       ieee_handler ("set", "inexact", SIGFPE_ABORT) ;
115     }
116   else
117     {
118       ieee_handler ("set", "inexact", SIGFPE_IGNORE) ;
119     }
120
121   return GSL_SUCCESS ;
122 }