| /**************************************************************** | 
 |  * | 
 |  * The author of this software is David M. Gay. | 
 |  * | 
 |  * Copyright (c) 1991, 1996 by Lucent Technologies. | 
 |  * | 
 |  * Permission to use, copy, modify, and distribute this software for any | 
 |  * purpose without fee is hereby granted, provided that this entire notice | 
 |  * is included in all copies of any software which is or includes a copy | 
 |  * or modification of this software and in all copies of the supporting | 
 |  * documentation for such software. | 
 |  * | 
 |  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED | 
 |  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY | 
 |  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY | 
 |  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. | 
 |  * | 
 |  ***************************************************************/ | 
 |  | 
 | /* g_fmt(buf,x) stores the closest decimal approximation to x in buf; | 
 |  * it suffices to declare buf | 
 |  *	char buf[32]; | 
 |  */ | 
 |  | 
 | #include "dmg_fp.h" | 
 |  | 
 | namespace dmg_fp { | 
 |  | 
 |  char * | 
 | g_fmt(char *b, double x) | 
 | { | 
 | 	int i, k; | 
 | 	char *s; | 
 | 	int decpt, j, sign; | 
 | 	char *b0, *s0, *se; | 
 |  | 
 | 	b0 = b; | 
 | #ifdef IGNORE_ZERO_SIGN | 
 | 	if (!x) { | 
 | 		*b++ = '0'; | 
 | 		*b = 0; | 
 | 		goto done; | 
 | 		} | 
 | #endif | 
 | 	s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se); | 
 | 	if (sign) | 
 | 		*b++ = '-'; | 
 | 	if (decpt == 9999) /* Infinity or Nan */ { | 
 | 		for(*b = *s++; *b++; *b = *s++) {} | 
 | 		goto done0; | 
 | 		} | 
 | 	if (decpt <= -4 || decpt > se - s + 5) { | 
 | 		*b++ = *s++; | 
 | 		if (*s) { | 
 | 			*b++ = '.'; | 
 | 			for(*b = *s++; *b; *b = *s++) | 
 | 				b++; | 
 | 			} | 
 | 		*b++ = 'e'; | 
 | 		/* sprintf(b, "%+.2d", decpt - 1); */ | 
 | 		if (--decpt < 0) { | 
 | 			*b++ = '-'; | 
 | 			decpt = -decpt; | 
 | 			} | 
 | 		else | 
 | 			*b++ = '+'; | 
 | 		for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10) {} | 
 | 		for(;;) { | 
 | 			i = decpt / k; | 
 | 			*b++ = (char)i + '0'; | 
 | 			if (--j <= 0) | 
 | 				break; | 
 | 			decpt -= i*k; | 
 | 			decpt *= 10; | 
 | 			} | 
 | 		*b = 0; | 
 | 		} | 
 | 	else if (decpt <= 0) { | 
 | 		*b++ = '.'; | 
 | 		for(; decpt < 0; decpt++) | 
 | 			*b++ = '0'; | 
 | 		for(*b = *s++; *b++; *b = *s++) {} | 
 | 		} | 
 | 	else { | 
 | 		for(*b = *s++; *b; *b = *s++) { | 
 | 			b++; | 
 | 			if (--decpt == 0 && *s) | 
 | 				*b++ = '.'; | 
 | 			} | 
 | 		for(; decpt > 0; decpt--) | 
 | 			*b++ = '0'; | 
 | 		*b = 0; | 
 | 		} | 
 |  done0: | 
 | 	freedtoa(s0); | 
 | #ifdef IGNORE_ZERO_SIGN | 
 |  done: | 
 | #endif | 
 | 	return b0; | 
 | 	} | 
 |  | 
 | }  // namespace dmg_fp |