t2ex/bsd_source/lib/libc/src_bsd/stdlib/strtof.c | bare source | permlink (0.02 seconds) |
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 "gdtoaimp.h" 33: 34: float 35: #ifdef KR_headers 36: strtof(s, sp) CONST char *s; char **sp; 37: #else 38: strtof(CONST char *s, char **sp) 39: #endif 40: { 41: static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI }; 42: ULong bits[1]; 43: Long exp; 44: int k; 45: union { ULong L[1]; float f; } u; 46: #ifdef Honor_FLT_ROUNDS 47: #include "gdtoa_fltrnds.h" 48: #else 49: #define fpi &fpi0 50: #endif 51: 52: k = strtodg(s, sp, fpi, &exp, bits); 53: switch(k & STRTOG_Retmask) { 54: case STRTOG_NoNumber: 55: case STRTOG_Zero: 56: u.L[0] = 0; 57: break; 58: 59: case STRTOG_Normal: 60: case STRTOG_NaNbits: 61: u.L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23); 62: break; 63: 64: case STRTOG_Denormal: 65: u.L[0] = bits[0]; 66: break; 67: 68: case STRTOG_NoMemory: 69: /*errno = ERANGE*/; 70: /* FALLTHROUGH */ 71: case STRTOG_Infinite: 72: u.L[0] = 0x7f800000; 73: break; 74: 75: case STRTOG_NaN: 76: u.L[0] = f_QNAN; 77: } 78: if (k & STRTOG_Neg) 79: u.L[0] |= 0x80000000L; 80: return u.f; 81: }