summaryrefslogtreecommitdiff
path: root/main/snprintf.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2001-05-01 16:29:52 +0000
committerAndi Gutmans <andi@php.net>2001-05-01 16:29:52 +0000
commitd04562e84552fbdd9444a26a98e85ba78287b425 (patch)
treecf17e4633a0e260b873be171d00e2ff94f00fbdf /main/snprintf.c
parent78b54eaa8b35285a898dd0b37495125ba764972c (diff)
downloadphp-git-d04562e84552fbdd9444a26a98e85ba78287b425.tar.gz
- Fix snprintf() to work with nan and inf properly
Diffstat (limited to 'main/snprintf.c')
-rw-r--r--main/snprintf.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/main/snprintf.c b/main/snprintf.c
index b3afec1146..e4d42d5fff 100644
--- a/main/snprintf.c
+++ b/main/snprintf.c
@@ -112,7 +112,8 @@ static char *
*/
if (fi != 0) {
p1 = &buf[NDIG];
- while (fi != 0) {
+// while (fi != 0) {
+ while (p1 > &buf[0] && fi != 0) {
fj = modf(fi / 10, &fi);
*--p1 = (int) ((fj + .03) * 10) + '0';
r2++;
@@ -743,15 +744,23 @@ static int format_converter(register buffy * odp, const char *fmt,
case 'E':
fp_num = va_arg(ap, double);
- s = conv_fp(*fmt, fp_num, alternate_form,
- (adjust_precision == NO) ? FLOAT_DIGITS : precision,
- &is_negative, &num_buf[1], &s_len);
- if (is_negative)
- prefix_char = '-';
- else if (print_sign)
- prefix_char = '+';
- else if (print_blank)
- prefix_char = ' ';
+ if (zend_isnan(fp_num)) {
+ s = "nan";
+ s_len = 3;
+ } else if (zend_isinf(fp_num)) {
+ s = "inf";
+ s_len = 3;
+ } else {
+ s = conv_fp(*fmt, fp_num, alternate_form,
+ (adjust_precision == NO) ? FLOAT_DIGITS : precision,
+ &is_negative, &num_buf[1], &s_len);
+ if (is_negative)
+ prefix_char = '-';
+ else if (print_sign)
+ prefix_char = '+';
+ else if (print_blank)
+ prefix_char = ' ';
+ }
break;