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