]> pd.if.org Git - pdclib/blobdiff - functions/_PDCLIB/print.c
Fixed pointer handling of printf() / scanf().
[pdclib] / functions / _PDCLIB / print.c
index 8f019796c757342a5610e29e6e92f575d01d3daa..5214612c630fa920a7b006fc8688a4ccc74006f7 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id$ */
-
 /* _PDCLIB_print( const char *, struct _PDCLIB_status_t * )
 
    This file is part of the Public Domain C Library (PDCLib).
@@ -31,7 +29,7 @@
 #define E_intmax   1<<10
 #define E_size     1<<11
 #define E_ptrdiff  1<<12
-#define E_intptr   1<<13
+#define E_pointer  1<<13
 #define E_ldouble  1<<14
 #define E_lower    1<<15
 #define E_unsigned 1<<16
@@ -43,7 +41,7 @@
    n - pointer to maximum number of characters to be delivered in this call
    s - the buffer into which the character shall be delivered
 */
-#define DELIVER( x ) \
+#define PUT( x ) \
 do { \
     int character = x; \
     if ( status->i < status->n ) { \
@@ -104,7 +102,7 @@ static void intformat( intmax_t value, struct _PDCLIB_status_t * status )
         {
             for ( size_t i = 0; i < status->width - characters; ++i )
             {
-                DELIVER( ' ' );
+                PUT( ' ' );
                 ++(status->current);
             }
         }
@@ -113,7 +111,7 @@ static void intformat( intmax_t value, struct _PDCLIB_status_t * status )
     preidx = 0;
     while ( preface[ preidx ] != '\0' )
     {
-        DELIVER( preface[ preidx++ ] );
+        PUT( preface[ preidx++ ] );
         ++(status->current);
     }
     if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) )
@@ -123,14 +121,14 @@ static void intformat( intmax_t value, struct _PDCLIB_status_t * status )
         */
         while ( status->current < status->width )
         {
-            DELIVER( '0' );
+            PUT( '0' );
             ++(status->current);
         }
     }
     /* Do the precision padding if necessary. */
     for ( size_t i = 0; i < prec_pads; ++i )
     {
-        DELIVER( '0' );
+        PUT( '0' );
     }
     }
 }
@@ -175,12 +173,12 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status )
     if ( status->flags & E_lower )
     {
         /* Lowercase letters. Same array used for strto...(). */
-        DELIVER( _PDCLIB_digits[ digit ] );
+        PUT( _PDCLIB_digits[ digit ] );
     }
     else
     {
         /* Uppercase letters. Array only used here, only 0-F. */
-        DELIVER( _PDCLIB_Xdigits[ digit ] );
+        PUT( _PDCLIB_Xdigits[ digit ] );
     }
     }
 }
@@ -192,7 +190,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
     if ( *(++spec) == '%' )
     {
         /* %% -> print single '%' */
-        DELIVER( *spec );
+        PUT( *spec );
         return ++spec;
     }
     /* Initializing status structure */
@@ -381,7 +379,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
             break;
         case 'c':
             /* TODO: Flags, wide chars. */
-            DELIVER( va_arg( status->arg, int ) );
+            PUT( va_arg( status->arg, int ) );
             return ++spec;
         case 's':
             /* TODO: Flags, wide chars. */
@@ -389,14 +387,14 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
                 char * s = va_arg( status->arg, char * );
                 while ( *s != '\0' )
                 {
-                    DELIVER( *(s++) );
+                    PUT( *(s++) );
                 }
                 return ++spec;
             }
         case 'p':
             /* TODO: E_long -> E_intptr */
             status->base = 16;
-            status->flags |= ( E_lower | E_unsigned | E_alt | E_long );
+            status->flags |= ( E_lower | E_unsigned | E_alt | E_pointer );
             break;
         case 'n':
            {
@@ -417,7 +415,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
         if ( status->flags & E_unsigned )
         {
             uintmax_t value;
-            switch ( status->flags & ( E_char | E_short | E_long | E_llong | E_size ) )
+            switch ( status->flags & ( E_char | E_short | E_long | E_llong | E_size | E_pointer ) )
             {
                 case E_char:
                     value = (uintmax_t)(unsigned char)va_arg( status->arg, int );
@@ -437,6 +435,12 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
                 case E_size:
                     value = (uintmax_t)va_arg( status->arg, size_t );
                     break;
+                case E_pointer:
+                    value = (uintmax_t)(uintptr_t)va_arg( status->arg, void * );
+                    break;
+                default:
+                    puts( "UNSUPPORTED PRINTF FLAG COMBINATION" );
+                    return NULL;
             }
             ++(status->current);
             /* FIXME: The if clause means one-digit values do not get formatted */
@@ -456,11 +460,11 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
             }
             if ( status->flags & E_lower )
             {
-                DELIVER( _PDCLIB_digits[ digit ] );
+                PUT( _PDCLIB_digits[ digit ] );
             }
             else
             {
-                DELIVER( _PDCLIB_Xdigits[ digit ] );
+                PUT( _PDCLIB_Xdigits[ digit ] );
             }
         }
         else
@@ -488,13 +492,16 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
                 case E_intmax:
                     int2base( va_arg( status->arg, intmax_t ), status );
                     break;
+                default:
+                    puts( "UNSUPPORTED PRINTF FLAG COMBINATION" );
+                    return NULL;
             }
         }
         if ( status->flags & E_minus )
         {
             while ( status->current < status->width )
             {
-                DELIVER( ' ' );
+                PUT( ' ' );
                 ++(status->current);
             }
         }
@@ -507,10 +514,10 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status
 }
 
 #ifdef TEST
-#include <_PDCLIB_test.h>
+#define _PDCLIB_FILEID "_PDCLIB/print.c"
+#define _PDCLIB_STRINGIO
 
-#include <limits.h>
-#include <string.h>
+#include <_PDCLIB_test.h>
 
 static int testprintf( char * buffer, const char * format, ... )
 {
@@ -538,13 +545,10 @@ static int testprintf( char * buffer, const char * format, ... )
 
 #define TEST_CONVERSION_ONLY
 
-#define TESTCASE_SPRINTF( x ) if ( strcmp( target, x ) == 0 ) {} \
-                              else { TEST_RESULTS += 1; printf( "FAILED: " __FILE__ ", line %d - \"%s\" != %s\n", __LINE__, target, #x ); }
-
 int main( void )
 {
     char target[100];
-#include "printf_testcases.incl"
+#include "printf_testcases.h"
     return TEST_RESULTS;
 }