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 <errno.h> |
---|
34 | #include <stdlib.h> |
---|
35 | #include <string.h> |
---|
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; |
---|
91 | L[_1] = 0x8000; |
---|
92 | L[_2] = L[_3] = L[_4] = 0; |
---|
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_l(p, s, sp, rounding, L, loc) struct _reent *p; const char *s; char **sp; int rounding; void *L; locale_t loc; |
---|
109 | #else |
---|
110 | _strtorx_l(struct _reent *p, const char *s, char **sp, int rounding, void *L, |
---|
111 | locale_t loc) |
---|
112 | #endif |
---|
113 | { |
---|
114 | static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; |
---|
115 | FPI *fpi, fpi1; |
---|
116 | __ULong bits[2]; |
---|
117 | Long exp; |
---|
118 | int k; |
---|
119 | |
---|
120 | fpi = &fpi0; |
---|
121 | if (rounding != FPI_Round_near) { |
---|
122 | fpi1 = fpi0; |
---|
123 | fpi1.rounding = rounding; |
---|
124 | fpi = &fpi1; |
---|
125 | } |
---|
126 | k = _strtodg_l(p, s, sp, fpi, &exp, bits, loc); |
---|
127 | ULtox((__UShort*)L, bits, exp, k); |
---|
128 | return k; |
---|
129 | } |
---|
130 | |
---|
131 | #endif /* _HAVE_LONG_DOUBLE && !_LDBL_EQ_DBL */ |
---|