Rev 6099 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6099 | serge | 1 | /**************************************************************** |
2 | |||
3 | The author of this software is David M. Gay. |
||
4 | |||
5 | Copyright (C) 1998, 2000 by Lucent Technologies |
||
6 | All Rights Reserved |
||
7 | |||
8 | Permission to use, copy, modify, and distribute this software and |
||
9 | its documentation for any purpose and without fee is hereby |
||
10 | granted, provided that the above copyright notice appear in all |
||
11 | copies and that both that the copyright notice and this |
||
12 | permission notice and warranty disclaimer appear in supporting |
||
13 | documentation, and that the name of Lucent or any of its entities |
||
14 | not be used in advertising or publicity pertaining to |
||
15 | distribution of the software without specific, written prior |
||
16 | permission. |
||
17 | |||
18 | LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
||
19 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. |
||
20 | IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY |
||
21 | SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
||
22 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER |
||
23 | IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
||
24 | ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF |
||
25 | THIS SOFTWARE. |
||
26 | |||
27 | ****************************************************************/ |
||
28 | |||
29 | /* Please send bug reports to David M. Gay (dmg at acm dot org, |
||
30 | * with " at " changed at "@" and " dot " changed to "."). */ |
||
31 | |||
32 | #include <_ansi.h> |
||
33 | #include |
||
34 | #include |
||
35 | #include |
||
36 | #include "mprec.h" |
||
37 | #include "gdtoa.h" |
||
38 | #include "gd_qnan.h" |
||
39 | |||
40 | #if defined (_HAVE_LONG_DOUBLE) && !defined (_LDBL_EQ_DBL) |
||
41 | |||
42 | #undef _0 |
||
43 | #undef _1 |
||
44 | |||
45 | /* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */ |
||
46 | |||
47 | #ifdef IEEE_MC68k |
||
48 | #define _0 0 |
||
49 | #define _1 1 |
||
50 | #define _2 2 |
||
51 | #define _3 3 |
||
52 | #define _4 4 |
||
53 | #endif |
||
54 | #ifdef IEEE_8087 |
||
55 | #define _0 4 |
||
56 | #define _1 3 |
||
57 | #define _2 2 |
||
58 | #define _3 1 |
||
59 | #define _4 0 |
||
60 | #endif |
||
61 | |||
62 | void |
||
63 | #ifdef KR_headers |
||
64 | ULtox(L, bits, exp, k) __UShort *L; __ULong *bits; Long exp; int k; |
||
65 | #else |
||
66 | ULtox(__UShort *L, __ULong *bits, Long exp, int k) |
||
67 | #endif |
||
68 | { |
||
69 | switch(k & STRTOG_Retmask) { |
||
70 | case STRTOG_NoNumber: |
||
71 | case STRTOG_Zero: |
||
72 | L[0] = L[1] = L[2] = L[3] = L[4] = 0; |
||
73 | break; |
||
74 | |||
75 | case STRTOG_Denormal: |
||
76 | L[_0] = 0; |
||
77 | goto normal_bits; |
||
78 | |||
79 | case STRTOG_Normal: |
||
80 | case STRTOG_NaNbits: |
||
81 | L[_0] = exp + 0x3fff + 63; |
||
82 | normal_bits: |
||
83 | L[_4] = (__UShort)bits[0]; |
||
84 | L[_3] = (__UShort)(bits[0] >> 16); |
||
85 | L[_2] = (__UShort)bits[1]; |
||
86 | L[_1] = (__UShort)(bits[1] >> 16); |
||
87 | break; |
||
88 | |||
89 | case STRTOG_Infinite: |
||
90 | L[_0] = 0x7fff; |
||
6536 | serge | 91 | L[_1] = 0x8000; |
92 | L[_2] = L[_3] = L[_4] = 0; |
||
6099 | serge | 93 | break; |
94 | |||
95 | case STRTOG_NaN: |
||
96 | L[0] = ldus_QNAN0; |
||
97 | L[1] = ldus_QNAN1; |
||
98 | L[2] = ldus_QNAN2; |
||
99 | L[3] = ldus_QNAN3; |
||
100 | L[4] = ldus_QNAN4; |
||
101 | } |
||
102 | if (k & STRTOG_Neg) |
||
103 | L[_0] |= 0x8000; |
||
104 | } |
||
105 | |||
106 | int |
||
107 | #ifdef KR_headers |
||
108 | _strtorx_r(p, s, sp, rounding, L) struct _reent *p; const char *s; char **sp; int rounding; void *L; |
||
109 | #else |
||
110 | _strtorx_r(struct _reent *p, const char *s, char **sp, int rounding, void *L) |
||
111 | #endif |
||
112 | { |
||
113 | static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; |
||
114 | FPI *fpi, fpi1; |
||
115 | __ULong bits[2]; |
||
116 | Long exp; |
||
117 | int k; |
||
118 | |||
119 | fpi = &fpi0; |
||
120 | if (rounding != FPI_Round_near) { |
||
121 | fpi1 = fpi0; |
||
122 | fpi1.rounding = rounding; |
||
123 | fpi = &fpi1; |
||
124 | } |
||
125 | k = _strtodg_r(p, s, sp, fpi, &exp, bits); |
||
126 | ULtox((__UShort*)L, bits, exp, k); |
||
127 | return k; |
||
128 | } |
||
129 | |||
130 | #endif /* _HAVE_LONG_DOUBLE && !_LDBL_EQ_DBL */ |