diff --git a/vsnprintf.c b/vsnprintf.c.new index 1e4cdc5..9b15535 100644 --- a/vsnprintf.c +++ b/vsnprintf.c.new @@ -1210,6 +1210,7 @@ cvt(double value, int ndigits, int flags, char *sign, int *decpt, int ch, int *l { int mode, dsgn; char *digits, *bp, *rve; + static char *buffer = NULL; if (ch == 'f') mode = 3; @@ -1232,11 +1233,12 @@ cvt(double value, int ndigits, int flags, char *sign, int *decpt, int ch, int *l else { digits = BSD__dtoa(value, mode, ndigits, decpt, &dsgn, &rve); } - buf[0] = 0; /* rve - digits may be 0 */ - memcpy(buf, digits, rve - digits); + buffer = xrealloc(buffer,rve - digits + 1); + buffer[0] = 0; /* rve - digits may be 0 */ + memcpy(buffer, digits, rve - digits); + rve = buffer + (rve - digits); xfree(digits); - rve = buf + (rve - digits); - digits = buf; + digits = buffer; if (flags & ALT) { /* Print trailing zeros */ bp = digits + ndigits; if (ch == 'f') { @@ -1244,6 +1246,12 @@ cvt(double value, int ndigits, int flags, char *sign, int *decpt, int ch, int *l *decpt = -ndigits + 1; bp += *decpt; } + if(rve < bp) { + buffer = xrealloc(buffer,bp - buffer + 1); + rve = buffer + (rve - digits); + bp = buffer + (bp - digits); + digits = buffer; + } while (rve < bp) *rve++ = '0'; }