diff packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx @ 177:4c750ce71ae3

Merge from eCos master repository on 2001-08-10-19:22:57-BST
author jlarmour
date Fri, 10 Aug 2001 19:27:55 +0000
parents ac086aa3217e
children e0c0827131d1
line wrap: on
line diff
--- a/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx
+++ b/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx
@@ -735,20 +735,23 @@ static int
 cvt(double number, int prec, int flags, char *signp, int fmtch, char *startp,
     char *endp)
 {
-        char *p, *t;
+    Cyg_libm_ieee_double_shape_type ieeefp;
+    char *t = startp;
+
+    ieeefp.value = number;
+    *signp = 0;
+    if ( ieeefp.number.sign ){  // this checks for <0.0 and -0.0
+        number = -number;
+        *signp = '-';
+    }
+
+    if (finite(number)) {
+        char *p;
         double fract;
         int dotrim, expcnt, gformat;
         double integer, tmp;
-        Cyg_libm_ieee_double_shape_type ieeefp;
 
         dotrim = expcnt = gformat = 0;
-        ieeefp.value = number;
-        if ( ieeefp.number.sign ){  // this checks for <0.0 and -0.0
-                number = -number;
-                *signp = '-';
-        } else
-                *signp = 0;
-
         fract = modf(number, &integer);
 
         /* get an extra slot for rounding. */
@@ -917,7 +920,28 @@ eformat:        if (expcnt) {
                                 ++t;
                 }
         }
-        return (t - startp);
+    } else {
+	unsigned case_adj;
+	switch (fmtch) {
+	case 'f':
+	case 'g':
+	case 'e':
+	    case_adj = 'a' - 'A';
+	    break;
+	default:
+	    case_adj = 0;
+	}
+	if (isnan(number)) {
+	    *t++ = 'N' + case_adj;
+	    *t++ = 'A' + case_adj;
+	    *t++ = 'N' + case_adj;
+	} else { // infinite
+	    *t++ = 'I' + case_adj;
+	    *t++ = 'N' + case_adj;
+	    *t++ = 'F' + case_adj;
+	}
+    }
+    return (t - startp);
 } // cvt()
 
 #endif // ifdef CYGSEM_LIBC_STDIO_PRINTF_FLOATING_POINT