Annotation of src/lib/libc/gdtoa/strtopQ.c, Revision 1.5
1.5 ! christos 1: /* $NetBSD: strtopQ.c,v 1.4 2008/03/21 23:13:48 christos Exp $ */
1.1 kleink 2:
3: /****************************************************************
4:
5: The author of this software is David M. Gay.
6:
7: Copyright (C) 1998, 2000 by Lucent Technologies
8: All Rights Reserved
9:
10: Permission to use, copy, modify, and distribute this software and
11: its documentation for any purpose and without fee is hereby
12: granted, provided that the above copyright notice appear in all
13: copies and that both that the copyright notice and this
14: permission notice and warranty disclaimer appear in supporting
15: documentation, and that the name of Lucent or any of its entities
16: not be used in advertising or publicity pertaining to
17: distribution of the software without specific, written prior
18: permission.
19:
20: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
23: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
25: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27: THIS SOFTWARE.
28:
29: ****************************************************************/
30:
31: /* Please send bug reports to David M. Gay (dmg at acm dot org,
32: * with " at " changed at "@" and " dot " changed to "."). */
33:
34: #include "gdtoaimp.h"
35:
36: #undef _0
37: #undef _1
38:
1.2 kleink 39: /* one or the other of IEEE_BIG_ENDIAN or IEEE_LITTLE_ENDIAN should be #defined */
1.1 kleink 40:
1.2 kleink 41: #ifdef IEEE_BIG_ENDIAN
1.1 kleink 42: #define _0 0
43: #define _1 1
44: #define _2 2
45: #define _3 3
46: #endif
1.2 kleink 47: #ifdef IEEE_LITTLE_ENDIAN
1.1 kleink 48: #define _0 3
49: #define _1 2
50: #define _2 1
51: #define _3 0
52: #endif
53:
54: int
55: #ifdef KR_headers
56: strtopQ(s, sp, V) CONST char *s; char **sp; void *V;
57: #else
58: strtopQ(CONST char *s, char **sp, void *V)
59: #endif
60: {
1.5 ! christos 61: static CONST FPI fpi0 = { 113, 1-16383-113+1, 32766 - 16383 - 113 + 1, 1, SI };
1.1 kleink 62: ULong bits[4];
1.3 kleink 63: Long expt;
1.1 kleink 64: int k;
65: ULong *L = (ULong*)V;
1.5 ! christos 66: #ifdef Honor_FLT_ROUNDS
! 67: #include "gdtoa_fltrnds.h"
! 68: #else
! 69: #define fpi &fpi0
! 70: #endif
1.1 kleink 71:
1.5 ! christos 72: k = strtodg(s, sp, fpi, &expt, bits);
1.4 christos 73: if (k == STRTOG_NoMemory)
74: return k;
1.1 kleink 75: switch(k & STRTOG_Retmask) {
76: case STRTOG_NoNumber:
77: case STRTOG_Zero:
78: L[0] = L[1] = L[2] = L[3] = 0;
79: break;
80:
81: case STRTOG_Normal:
82: case STRTOG_NaNbits:
83: L[_3] = bits[0];
84: L[_2] = bits[1];
85: L[_1] = bits[2];
1.3 kleink 86: L[_0] = (bits[3] & ~0x10000) | ((expt + 0x3fff + 112) << 16);
1.1 kleink 87: break;
88:
89: case STRTOG_Denormal:
90: L[_3] = bits[0];
91: L[_2] = bits[1];
92: L[_1] = bits[2];
93: L[_0] = bits[3];
94: break;
95:
96: case STRTOG_Infinite:
97: L[_0] = 0x7fff0000;
98: L[_1] = L[_2] = L[_3] = 0;
99: break;
100:
101: case STRTOG_NaN:
102: L[0] = ld_QNAN0;
103: L[1] = ld_QNAN1;
104: L[2] = ld_QNAN2;
105: L[3] = ld_QNAN3;
106: }
107: if (k & STRTOG_Neg)
108: L[_0] |= 0x80000000L;
109: return k;
110: }
CVSweb <webmaster@jp.NetBSD.org>