| Index: third_party/dmg_fp/g_fmt.cc
|
| ===================================================================
|
| --- third_party/dmg_fp/g_fmt.cc (revision 0)
|
| +++ third_party/dmg_fp/g_fmt.cc (revision 0)
|
| @@ -0,0 +1,100 @@
|
| +/****************************************************************
|
| + *
|
| + * 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(register char *b, double x)
|
| +{
|
| + register int i, k;
|
| + register 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 */ {
|
| + while(*b++ = *s++);
|
| + goto done0;
|
| + }
|
| + if (decpt <= -4 || decpt > se - s + 5) {
|
| + *b++ = *s++;
|
| + if (*s) {
|
| + *b++ = '.';
|
| + while(*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++ = i + '0';
|
| + if (--j <= 0)
|
| + break;
|
| + decpt -= i*k;
|
| + decpt *= 10;
|
| + }
|
| + *b = 0;
|
| + }
|
| + else if (decpt <= 0) {
|
| + *b++ = '.';
|
| + for(; decpt < 0; decpt++)
|
| + *b++ = '0';
|
| + while(*b++ = *s++);
|
| + }
|
| + else {
|
| + while(*b = *s++) {
|
| + b++;
|
| + if (--decpt == 0 && *s)
|
| + *b++ = '.';
|
| + }
|
| + for(; decpt > 0; decpt--)
|
| + *b++ = '0';
|
| + *b = 0;
|
| + }
|
| + done0:
|
| + freedtoa(s0);
|
| + done:
|
| + return b0;
|
| + }
|
| +
|
| +} // namespace dmg_fp
|
|
|