static char * fcvtbuf (double value, int ndigits, int *decpt, int *sign, char *buf) { static const char INFINITY[] = "Infinity"; char decimal = '.' ; char chBuffer[20]; char *cvtbuf = chBuffer; char *s = cvtbuf; char *dot; char *pchRet = 0; ftoa(value, cvtbuf); *sign = ('-' == *s++) ? 1 : 0; /* The sign. */ /* Where's the decimal point? */ dot = strchr(s, decimal); *decpt = dot ? (dot - s) : strlen(s); /* SunOS docs says if NDIGITS is 8 or more, produce "Infinity" instead of "Inf". */ if (strncmp (s, "Inf", 3) == 0) { memcpy (buf, INFINITY, ndigits >= 8 ? 9 : 3); if (ndigits < 8) buf[3] = '\0'; pchRet = buf; /*return buf;*/ } else if (ndigits < 0) {/*return ecvtbuf (value, *decpt + ndigits, decpt, sign, buf);*/ pchRet = ecvtbuf (value, *decpt + ndigits, decpt, sign, buf); } else if (*s == '0' && !IS_DOUBLE_ZERO(value)/*value != 0.0*/) {/*return ecvtbuf (value, ndigits, decpt, sign, buf);*/ pchRet = ecvtbuf(value, ndigits, decpt, sign, buf); } else { memcpy (buf, s, *decpt); if (s[*decpt] == decimal) { memcpy (buf + *decpt, s + *decpt + 1, ndigits); buf[*decpt + ndigits] = '\0'; } else { buf[*decpt] = '\0'; } __ecvround (buf, buf + *decpt + ndigits - 1, s + *decpt + ndigits + 1, decpt); pchRet = buf; /*return buf;*/ } /*delete [] cvtbuf; */ return pchRet; }
static void cfltcvt(double value, char *buffer, char fmt, int precision) { int decpt, sign, exp, pos; char *digits = NULL; char cvtbuf[80]; int capexp = 0; int magnitude; if (fmt == 'G' || fmt == 'E') { capexp = 1; fmt += 'a' - 'A'; } if (fmt == 'g') { digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); magnitude = decpt - 1; if (magnitude < -4 || magnitude > precision - 1) { fmt = 'e'; precision -= 1; } else { fmt = 'f'; precision -= decpt; } } if (fmt == 'e') { digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); if (sign) *buffer++ = '-'; *buffer++ = *digits; if (precision > 0) *buffer++ = '.'; memcpy(buffer, digits + 1, precision); buffer += precision; *buffer++ = capexp ? 'E' : 'e'; if (decpt == 0) { if (value == 0.0) exp = 0; else exp = -1; } else exp = decpt - 1; if (exp < 0) { *buffer++ = '-'; exp = -exp; } else *buffer++ = '+'; buffer[2] = (exp % 10) + '0'; exp = exp / 10; buffer[1] = (exp % 10) + '0'; exp = exp / 10; buffer[0] = (exp % 10) + '0'; buffer += 3; } else if (fmt == 'f') { digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); if (sign) *buffer++ = '-'; if (*digits) { if (decpt <= 0) { *buffer++ = '0'; *buffer++ = '.'; for (pos = 0; pos < -decpt; pos++) *buffer++ = '0'; while (*digits) *buffer++ = *digits++; } else { pos = 0; while (*digits) { if (pos++ == decpt) *buffer++ = '.'; *buffer++ = *digits++; } } } else { *buffer++ = '0'; if (precision > 0) { *buffer++ = '.'; for (pos = 0; pos < precision; pos++) *buffer++ = '0'; } } } *buffer = '\0'; }
inline char* _Stl_qecvtR(long double x, int n, int* pt, int* sign, char* buf) { return ecvtbuf(x, n, pt, sign, buf); }
static void cfltcvt(double value, char *buffer, char fmt, int precision) { int decpt, sign; char cvtbuf[80]; int capexp = 0; if ('G' == fmt || 'E' == fmt) { capexp = 1; fmt += 'a' - 'A'; } if (fmt == 'g') { char * digits = ecvtbuf(value, precision, &decpt, &sign, cvtbuf); int magnitude = decpt - 1; if (magnitude < -4 || magnitude > precision - 1) { fmt = 'e'; precision -= 1; } else { fmt = 'f'; precision -= decpt; } } if ('e' == fmt) { char * digits = ecvtbuf(value, precision + 1, &decpt, &sign, cvtbuf); int exp = 0; if (sign) *buffer++ = '-'; *buffer++ = *digits; if (precision > 0) *buffer++ = '.'; memcpy(buffer, digits + 1, precision); buffer += precision; *buffer++ = capexp ? 'E' : 'e'; if (decpt == 0) { exp = (IS_DOUBLE_ZERO(value)) ? 0 : -1; /* if (value == 0.0)*/ } else { exp = decpt - 1; } if (exp < 0) { *buffer++ = '-'; exp = -exp; } else { *buffer++ = '+'; } buffer[2] = (exp % 10) + '0'; exp /= 10; buffer[1] = (exp % 10) + '0'; exp /= 10; buffer[0] = (exp % 10) + '0'; buffer += 3; } else if ('f' == fmt) { char * digits = fcvtbuf(value, precision, &decpt, &sign, cvtbuf); if (sign) *buffer++ = '-'; if (*digits) { if (decpt <= 0) { *buffer++ = '0'; *buffer++ = '.'; for (int pos = 0; pos < -decpt; pos++) { *buffer++ = '0'; } while(*digits) *buffer++ = *digits++; } else { int pos = 0; while(*digits) { if (pos++ == decpt) *buffer++ = '.'; *buffer++ = *digits++; } } } else { *buffer++ = '0'; if(precision > 0) { *buffer++ = '.'; for(int pos = 0; pos < precision; pos++) { *buffer++ = '0'; } } } } *buffer = '\0'; }