strtof_l(CONST char *s, char **sp, locale_t loc) #endif { static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI }; ULong bits[1]; Long exp; int k; union { ULong L[1]; float f; } u; #ifdef Honor_FLT_ROUNDS #include "gdtoa_fltrnds.h" #else #define fpi &fpi0 #endif k = strtodg_l(s, sp, fpi, &exp, bits, loc); switch(k & STRTOG_Retmask) { case STRTOG_NoNumber: case STRTOG_Zero: u.L[0] = 0; break; case STRTOG_Normal: u.L[0] = (bits[0] & 0x7fffff) | ((exp + 0x7f + 23) << 23); break; case STRTOG_NaNbits: /* FreeBSD local: always return a quiet NaN */ u.L[0] = bits[0] | 0x7fc00000; break; case STRTOG_Denormal: u.L[0] = bits[0]; break; case STRTOG_Infinite: u.L[0] = 0x7f800000; break; case STRTOG_NaN: u.L[0] = f_QNAN; } if (k & STRTOG_Neg) u.L[0] |= 0x80000000L; return u.f; }
strtorx_l(CONST char *s, char **sp, int rounding, void *L, locale_t locale) #endif { static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI }; FPI *fpi, fpi1; ULong bits[2]; Long exp; int k; fpi = &fpi0; if (rounding != FPI_Round_near) { fpi1 = fpi0; fpi1.rounding = rounding; fpi = &fpi1; } k = strtodg_l(s, sp, fpi, &exp, bits, locale); ULtox((UShort*)L, bits, exp, k); return k; }