- Fix printf with floats

This commit is contained in:
Marcus Boerger 2004-05-16 14:01:45 +00:00
parent 6d7346f4b9
commit 251b627684

View file

@ -65,6 +65,7 @@ static char HEXCHARS[] = "0123456789ABCDEF";
static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *sign, int eflag) static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *sign, int eflag)
{ {
register int r2; register int r2;
int mvl;
double fi, fj; double fi, fj;
register char *p, *p1; register char *p, *p1;
/*THREADX*/ /*THREADX*/
@ -90,13 +91,21 @@ static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *si
p1 = &cvt_buf[NDIG]; p1 = &cvt_buf[NDIG];
while (fi != 0) { while (fi != 0) {
fj = modf(fi / 10, &fi); fj = modf(fi / 10, &fi);
if (p1 <= &cvt_buf[0]) {
mvl = NDIG - ndigits;
memmove(&cvt_buf[mvl], &cvt_buf[0], NDIG-mvl-1);
p1 += mvl;
}
*--p1 = (int) ((fj + .03) * 10) + '0'; *--p1 = (int) ((fj + .03) * 10) + '0';
r2++; r2++;
} }
while (p1 < &cvt_buf[NDIG]) while (p1 < &cvt_buf[NDIG])
*p++ = *p1++; *p++ = *p1++;
} else if (arg > 0) { } else if (arg > 0) {
while ((fj = arg * 10.0) < 0.9999999) { while ((fj = arg * 10) < 1) {
if (!eflag && (r2 * -1) < ndigits) {
break;
}
arg = fj; arg = fj;
r2--; r2--;
} }
@ -109,10 +118,17 @@ static char *php_convert_to_decimal(double arg, int ndigits, int *decpt, int *si
cvt_buf[0] = '\0'; cvt_buf[0] = '\0';
return (cvt_buf); return (cvt_buf);
} }
while (p <= p1 && p < &cvt_buf[NDIG]) { if (p <= p1 && p < &cvt_buf[NDIG]) {
arg *= 10; arg = modf(arg * 10, &fj);
arg = modf(arg, &fj); if ((int)fj==10) {
*p++ = '1';
fj = 0;
*decpt = ++r2;
}
while (p <= p1 && p < &cvt_buf[NDIG]) {
*p++ = (int) fj + '0'; *p++ = (int) fj + '0';
arg = modf(arg * 10, &fj);
}
} }
if (p1 >= &cvt_buf[NDIG]) { if (p1 >= &cvt_buf[NDIG]) {
cvt_buf[NDIG - 1] = '\0'; cvt_buf[NDIG - 1] = '\0';
@ -286,7 +302,7 @@ php_sprintf_appenddouble(char **buffer, int *pos,
char numbuf[NUM_BUF_SIZE]; char numbuf[NUM_BUF_SIZE];
char *cvt; char *cvt;
register int i = 0, j = 0; register int i = 0, j = 0;
int sign, decpt; int sign, decpt, cvt_len;
char decimal_point = EG(float_separator)[0]; char decimal_point = EG(float_separator)[0];
PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n", PRINTF_DEBUG(("sprintf: appenddouble(%x, %x, %x, %f, %d, '%c', %d, %c)\n",
@ -312,6 +328,7 @@ php_sprintf_appenddouble(char **buffer, int *pos,
} }
cvt = php_convert_to_decimal(number, precision, &decpt, &sign, (fmt == 'e')); cvt = php_convert_to_decimal(number, precision, &decpt, &sign, (fmt == 'e'));
cvt_len = strlen(cvt);
if (sign) { if (sign) {
numbuf[i++] = '-'; numbuf[i++] = '-';
@ -330,10 +347,15 @@ php_sprintf_appenddouble(char **buffer, int *pos,
} }
} }
} else { } else {
while (decpt-- > 0) while (decpt-- > 0) {
numbuf[i++] = cvt[j++]; numbuf[i++] = j < cvt_len ? cvt[j++] : '0';
if (precision > 0) }
if (precision > 0) {
numbuf[i++] = decimal_point; numbuf[i++] = decimal_point;
while (precision-- > 0) {
numbuf[i++] = j < cvt_len ? cvt[j++] : '0';
}
}
} }
} else if (fmt == 'e' || fmt == 'E') { } else if (fmt == 'e' || fmt == 'E') {
char *exp_p; char *exp_p;