]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/language/c/libc/stdio/v2_0/src/output/vfnprintf.cxx
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / language / c / libc / stdio / v2_0 / src / output / vfnprintf.cxx
index 2b345d14d24b097e5a05d06de325ed3d3b3e697f..bc4e8f27be8437b4928cb08ecde797446b61314b 100644 (file)
@@ -210,7 +210,7 @@ vfnprintf ( FILE *stream, size_t n, const char *format, va_list arg) __THROW
 #define PRINT(ptr, len)                                                      \
 CYG_MACRO_START                                                              \
     cyg_ucount32 length = MIN( (cyg_ucount32) len, n - ret - 1);             \
-    if (((Cyg_StdioStream *)stream)->write( (const cyg_uint8 *)ptr,          \
+    if (((Cyg_OutputStream *)stream)->write( (const cyg_uint8 *)ptr,         \
                                             length, &length ))               \
         goto error;                                                          \
     if (length < (cyg_ucount32)len) {                                        \
@@ -476,13 +476,13 @@ reswitch:       switch (ch) {
                         /* NOSTRICT */
                         _uquad = (unsigned long)va_arg(arg, void *);
                         base = HEX;
-                        xdigs = "0123456789abcdef";
+                        xdigs = (char *)"0123456789abcdef";
                         flags |= HEXPREFIX;
                         ch = 'x';
                         goto nosign;
                 case 's':
                         if ((cp = va_arg(arg, char *)) == NULL)
-                                cp = "(null)";
+                                cp = (char *)"(null)";
                         if (prec >= 0) {
                                 /*
                                  * can't use strlen; can only look for the
@@ -509,10 +509,10 @@ reswitch:       switch (ch) {
                         base = DEC;
                         goto nosign;
                 case 'X':
-                        xdigs = "0123456789ABCDEF";
+                        xdigs = (char *)"0123456789ABCDEF";
                         goto hex;
                 case 'x':
-                        xdigs = "0123456789abcdef";
+                        xdigs = (char *)"0123456789abcdef";
 hex:                    _uquad = UARG();
                         base = HEX;
                         /* leading 0x/X only if non-zero */
@@ -553,12 +553,26 @@ number:                 if ((dprec = prec) >= 0)
                                         break;
 
                                 case DEC:
-                                        /* many numbers are 1 digit */
-                                        while (_uquad >= 10) {
-                                                *--cp = to_char(_uquad % 10);
-                                                _uquad /= 10;
+                                        if (!(flags & QUADINT)) {
+                                                /* many numbers are 1 digit */
+                                                unsigned long v = (unsigned long)_uquad;
+                                                while (v >= 10) {
+                                                       /* The following is usually faster than using a modulo */
+                                                        unsigned long next = v / 10;
+                                                        *--cp = to_char(v - (next * 10));
+                                                        v = next;
+                                                }
+                                                *--cp = to_char(v);
+                                        }
+                                        else {
+                                                while (_uquad >= 10) {
+                                                       /* The following is usually faster than using a modulo */
+                                                        u_quad_t next = _uquad / 10;
+                                                        *--cp = to_char(_uquad - (next * 10));
+                                                        _uquad = next;
+                                                }
+                                                *--cp = to_char(_uquad);
                                         }
-                                        *--cp = to_char(_uquad);
                                         break;
 
                                 case HEX:
@@ -569,7 +583,7 @@ number:                 if ((dprec = prec) >= 0)
                                         break;
 
                                 default:
-                                        cp = "bug in vfprintf: bad base";
+                                        cp = (char *)"bug in vfprintf: bad base";
                                         size = strlen(cp);
                                         goto skipsize;
                                 }
@@ -670,7 +684,7 @@ number:                 if ((dprec = prec) >= 0)
         }
 done:
 error:
-        return (((Cyg_StdioStream *) stream)->get_error() ? EOF : ret);
+        return (((Cyg_OutputStream *) stream)->get_error() ? EOF : ret);
         /* NOTREACHED */
 }