]> pd.if.org Git - pdclib/commitdiff
Clearing the Tyndur tests.
authorMartin Baute <solar@rootdirectory.de>
Fri, 8 Apr 2016 06:18:17 +0000 (08:18 +0200)
committerMartin Baute <solar@rootdirectory.de>
Fri, 8 Apr 2016 06:18:17 +0000 (08:18 +0200)
functions/_PDCLIB/print.c
functions/stdio/vfprintf.c
functions/stdio/vfscanf.c
functions/stdio/vsnprintf.c
functions/stdio/vsscanf.c

index 3ddf11daad8d7188e027222bd594d319cc876b08..6db55e85a27307ef8211091f2891148f69c0ed3f 100644 (file)
@@ -159,6 +159,12 @@ static void intformat( intmax_t value, struct _PDCLIB_status_t * status )
 */
 static void int2base( intmax_t value, struct _PDCLIB_status_t * status )
 {
+    /* Special case: zero value, zero precision -- no output (but padding) */
+    if ( status->current == 0 && value == 0 && status->prec == 0 )
+    {
+        intformat( value, status );
+        return;
+    }
     /* Registering the character being printed at the end of the function here
        already so it will be taken into account when the deepestmost recursion
        does the prefix / padding stuff.
@@ -505,28 +511,39 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
                     puts( "UNSUPPORTED PRINTF FLAG COMBINATION" );
                     return NULL;
             }
-            ++(status->current);
-            if ( ( value / status->base ) != 0 )
-            {
-                /* Get value to "safe" levels re. uintmax_t. */
-                int2base( (intmax_t)(value / status->base), status );
-            }
-            else
-            {
-                intformat( (intmax_t)value, status );
-            }
-            int digit = value % status->base;
-            if ( digit < 0 )
-            {
-                digit *= -1;
-            }
-            if ( status->flags & E_lower )
+            /* Special case: zero value, zero precision: No output, just padding */
+            if ( value == 0 && status->prec == 0 )
             {
-                PUT( _PDCLIB_digits[ digit ] );
+                int2base( 0, status );
             }
             else
             {
-                PUT( _PDCLIB_Xdigits[ digit ] );
+                /* To make the call to int2base (using intmax_t) safe for
+                   uintmax_t values > INTMAX_MAX, we basically to the first
+                   "recursion" level of int2base right here.
+                */
+                ++(status->current);
+                if ( ( value / status->base ) != 0 )
+                {
+                    int2base( (intmax_t)(value / status->base), status );
+                }
+                else
+                {
+                    intformat( (intmax_t)value, status );
+                }
+                int digit = value % status->base;
+                if ( digit < 0 )
+                {
+                    digit *= -1;
+                }
+                if ( status->flags & E_lower )
+                {
+                    PUT( _PDCLIB_digits[ digit ] );
+                }
+                else
+                {
+                    PUT( _PDCLIB_Xdigits[ digit ] );
+                }
             }
         }
         else
@@ -596,7 +613,7 @@ static int testprintf( char * buffer, const char * format, ... )
     status.current = 0;
     status.s = buffer;
     status.width = 0;
-    status.prec = 0;
+    status.prec = EOF;
     status.stream = NULL;
     va_start( status.arg, format );
     memset( buffer, '\0', 100 );
index 9d53d1819b72e950b0cd6b8f9b75820d7ca16f34..6f31bbd632c05a6d0947278583cd54a2d76d4417 100644 (file)
@@ -21,7 +21,7 @@ int vfprintf( struct _PDCLIB_file_t * _PDCLIB_restrict stream, const char * _PDC
     status.current = 0;
     status.s = NULL;
     status.width = 0;
-    status.prec = 0;
+    status.prec = EOF;
     status.stream = stream;
     va_copy( status.arg, arg );
 
index a19f18ef13e6fc9233572dd735da66d419ceb4be..d70f5d5c92bbfcec9069412d4f12c0c1c09b2291 100644 (file)
@@ -21,7 +21,7 @@ int vfscanf( FILE * _PDCLIB_restrict stream, const char * _PDCLIB_restrict forma
     status.current = 0;
     status.s = NULL;
     status.width = 0;
-    status.prec = 0;
+    status.prec = EOF;
     status.stream = stream;
     va_copy( status.arg, arg );
 
index a46491d157d8bb7bd0607e9f56bda55bef6783fe..e57e6824d6486b2d4fadc741097ee76278b063ee 100644 (file)
@@ -20,7 +20,7 @@ int vsnprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restric
     status.current = 0;
     status.s = s;
     status.width = 0;
-    status.prec = 0;
+    status.prec = EOF;
     status.stream = NULL;
     va_copy( status.arg, arg );
 
index a9076d0291e4030a0f58798a3d9824f5aaad374e..4998b68ce0cd1bc248d2110a251f600bb44901f0 100644 (file)
@@ -21,7 +21,7 @@ int vsscanf( const char * _PDCLIB_restrict s, const char * _PDCLIB_restrict form
     status.current = 0;
     status.s = (char *) s;
     status.width = 0;
-    status.prec = 0;
+    status.prec = EOF;
     status.stream = NULL;
     va_copy( status.arg, arg );