177943Sdfr/**************************************************************** 277943Sdfr 377943SdfrThe author of this software is David M. Gay. 477943Sdfr 577943SdfrCopyright (C) 1998 by Lucent Technologies 677943SdfrAll Rights Reserved 777943Sdfr 877943SdfrPermission to use, copy, modify, and distribute this software and 977943Sdfrits documentation for any purpose and without fee is hereby 1077943Sdfrgranted, provided that the above copyright notice appear in all 1177943Sdfrcopies and that both that the copyright notice and this 1277943Sdfrpermission notice and warranty disclaimer appear in supporting 1377943Sdfrdocumentation, and that the name of Lucent or any of its entities 1477943Sdfrnot be used in advertising or publicity pertaining to 1577943Sdfrdistribution of the software without specific, written prior 1677943Sdfrpermission. 1777943Sdfr 1877943SdfrLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1977943SdfrINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. 2077943SdfrIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY 2177943SdfrSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 2277943SdfrWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 2377943SdfrIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 2477943SdfrARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 2577943SdfrTHIS SOFTWARE. 2677943Sdfr 27113038Sobrien****************************************************************/ 28113038Sobrien 2978320Sobrien/* Please send bug reports to David M. Gay (dmg at acm dot org, 3077943Sdfr * with " at " changed at "@" and " dot " changed to "."). */ 3177943Sdfr 3277943Sdfr#include "gdtoaimp.h" 3377943Sdfr 3477943Sdfr char* 3577943Sdfr#ifdef KR_headers 3677943Sdfrg_dfmt(buf, d, ndig, bufsize) char *buf; double *d; int ndig; size_t bufsize; 3777943Sdfr#else 3877943Sdfrg_dfmt(char *buf, double *d, int ndig, size_t bufsize) 3977943Sdfr#endif 4078320Sobrien{ 4178320Sobrien static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0 }; 4277943Sdfr char *b, *s, *se; 4377943Sdfr ULong bits[2], *L, sign; 4477943Sdfr int decpt, ex, i, mode; 4577943Sdfr#ifdef Honor_FLT_ROUNDS 4677943Sdfr#include "gdtoa_fltrnds.h" 4777943Sdfr#else 48#define fpi &fpi0 49#endif 50 51 if (ndig < 0) 52 ndig = 0; 53 if (bufsize < ndig + 10) 54 return 0; 55 56 L = (ULong*)d; 57 sign = L[_0] & 0x80000000L; 58 if ((L[_0] & 0x7ff00000) == 0x7ff00000) { 59 /* Infinity or NaN */ 60 if (bufsize < 10) 61 return 0; 62 if (L[_0] & 0xfffff || L[_1]) { 63 return strcp(buf, "NaN"); 64 } 65 b = buf; 66 if (sign) 67 *b++ = '-'; 68 return strcp(b, "Infinity"); 69 } 70 if (L[_1] == 0 && (L[_0] ^ sign) == 0 /*d == 0.*/) { 71 b = buf; 72#ifndef IGNORE_ZERO_SIGN 73 if (L[_0] & 0x80000000L) 74 *b++ = '-'; 75#endif 76 *b++ = '0'; 77 *b = 0; 78 return b; 79 } 80 bits[0] = L[_1]; 81 bits[1] = L[_0] & 0xfffff; 82 if ( (ex = (L[_0] >> 20) & 0x7ff) !=0) 83 bits[1] |= 0x100000; 84 else 85 ex = 1; 86 ex -= 0x3ff + 52; 87 mode = 2; 88 if (ndig <= 0) 89 mode = 0; 90 i = STRTOG_Normal; 91 if (sign) 92 i = STRTOG_Normal | STRTOG_Neg; 93 s = gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se); 94 return g__fmt(buf, s, se, decpt, sign, bufsize); 95 } 96