From 0711226145f12c37217681b57944860bdeb6ace0 Mon Sep 17 00:00:00 2001 From: Owen Shepherd Date: Tue, 23 Apr 2013 19:29:41 +0100 Subject: [PATCH] PDCLIB-20 #resolve Add support for "unusual" cases. Ammend test suite to verify support. --- functions/stdio/_PDCLIB_print.c | 28 +++++++++++++++++++++++----- functions/stdio/fprintf.c | 2 ++ functions/stdio/printf.c | 2 ++ functions/stdio/snprintf.c | 2 ++ functions/stdio/sprintf.c | 1 + functions/stdio/vfprintf.c | 2 +- functions/stdio/vprintf.c | 3 ++- functions/stdio/vsnprintf.c | 3 ++- functions/stdio/vsprintf.c | 3 ++- testing/printf_testcases.h | 5 +++++ 10 files changed, 42 insertions(+), 9 deletions(-) diff --git a/functions/stdio/_PDCLIB_print.c b/functions/stdio/_PDCLIB_print.c index ec7dc4a..21177af 100644 --- a/functions/stdio/_PDCLIB_print.c +++ b/functions/stdio/_PDCLIB_print.c @@ -30,6 +30,7 @@ #define E_space (1<<3) #define E_zero (1<<4) #define E_done (1<<5) + #define E_char (1<<6) #define E_short (1<<7) #define E_long (1<<8) @@ -38,10 +39,15 @@ #define E_size (1<<11) #define E_ptrdiff (1<<12) #define E_intptr (1<<13) + #define E_ldouble (1<<14) + #define E_lower (1<<15) #define E_unsigned (1<<16) +#define E_TYPES (E_char | E_short | E_long | E_llong | E_intmax \ + | E_size | E_ptrdiff | E_intptr) + /* This macro delivers a given character to either a memory buffer or a stream, depending on the contents of 'status' (struct _PDCLIB_status_t). x - the character to be delivered @@ -423,9 +429,8 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status 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_intptr ); break; case 'n': { @@ -437,7 +442,6 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status /* No conversion specifier. Bad conversion. */ return orig_spec; } - /* Do the actual output based on our findings */ if ( status->base != 0 ) { @@ -446,7 +450,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_TYPES ) { case E_char: value = (uintmax_t)(unsigned char)va_arg( status->arg, int ); @@ -466,12 +470,20 @@ 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_intptr: + value = (uintmax_t)va_arg( status->arg, uintptr_t ); + break; + case E_ptrdiff: + value = (uintmax_t)va_arg( status->arg, ptrdiff_t ); + break; + case E_intmax: + value = va_arg( status->arg, uintmax_t ); } int2base( value, status ); } else { - switch ( status->flags & ( E_char | E_short | E_long | E_llong | E_intmax ) ) + switch ( status->flags & E_TYPES ) { case E_char: int2base( (intmax_t)(char)va_arg( status->arg, int ), status ); @@ -488,6 +500,12 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status case E_llong: int2base( (intmax_t)va_arg( status->arg, long long ), status ); break; + case E_size: + int2base( (intmax_t)va_arg( status->arg, size_t ), status ); + break; + case E_intptr: + int2base( (intmax_t)va_arg( status->arg, intptr_t ), status ); + break; case E_ptrdiff: int2base( (intmax_t)va_arg( status->arg, ptrdiff_t ), status ); break; diff --git a/functions/stdio/fprintf.c b/functions/stdio/fprintf.c index 66566a4..07283b2 100644 --- a/functions/stdio/fprintf.c +++ b/functions/stdio/fprintf.c @@ -39,6 +39,8 @@ int fprintf( FILE * _PDCLIB_restrict stream, #endif #ifdef TEST +#include +#include #define _PDCLIB_FILEID "stdio/fprintf.c" #define _PDCLIB_FILEIO diff --git a/functions/stdio/printf.c b/functions/stdio/printf.c index 2b147e4..9dcb4fc 100644 --- a/functions/stdio/printf.c +++ b/functions/stdio/printf.c @@ -37,6 +37,8 @@ int _PDCLIB_printf_unlocked( const char * _PDCLIB_restrict format, ... ) #ifdef TEST #define _PDCLIB_FILEID "stdio/printf.c" #define _PDCLIB_FILEIO +#include +#include #include <_PDCLIB_test.h> diff --git a/functions/stdio/snprintf.c b/functions/stdio/snprintf.c index 564436a..69d4106 100644 --- a/functions/stdio/snprintf.c +++ b/functions/stdio/snprintf.c @@ -26,6 +26,8 @@ int snprintf( char * _PDCLIB_restrict s, size_t n, const char * _PDCLIB_restrict #ifdef TEST #define _PDCLIB_FILEID "stdio/snprintf.c" #define _PDCLIB_STRINGIO +#include +#include #include <_PDCLIB_test.h> diff --git a/functions/stdio/sprintf.c b/functions/stdio/sprintf.c index 4f4a5d4..11328ee 100644 --- a/functions/stdio/sprintf.c +++ b/functions/stdio/sprintf.c @@ -27,6 +27,7 @@ int sprintf( char * _PDCLIB_restrict s, const char * _PDCLIB_restrict format, .. #ifdef TEST #define _PDCLIB_FILEID "stdio/sprintf.c" #define _PDCLIB_STRINGIO +#include #include <_PDCLIB_test.h> diff --git a/functions/stdio/vfprintf.c b/functions/stdio/vfprintf.c index 9be5b2d..7dd7f2d 100644 --- a/functions/stdio/vfprintf.c +++ b/functions/stdio/vfprintf.c @@ -65,7 +65,7 @@ int vfprintf( FILE * _PDCLIB_restrict stream, #ifdef TEST #define _PDCLIB_FILEID "stdio/vfprintf.c" #define _PDCLIB_FILEIO - +#include #include <_PDCLIB_test.h> static int testprintf( FILE * stream, const char * format, ... ) diff --git a/functions/stdio/vprintf.c b/functions/stdio/vprintf.c index ae2b037..6d2b55c 100644 --- a/functions/stdio/vprintf.c +++ b/functions/stdio/vprintf.c @@ -28,7 +28,8 @@ int vprintf( const char * _PDCLIB_restrict format, _PDCLIB_va_list arg ) #ifdef TEST #define _PDCLIB_FILEID "stdio/vprintf.c" #define _PDCLIB_FILEIO - +#include +#include #include <_PDCLIB_test.h> static int testprintf( FILE * stream, const char * format, ... ) diff --git a/functions/stdio/vsnprintf.c b/functions/stdio/vsnprintf.c index fd29580..cda7ab6 100644 --- a/functions/stdio/vsnprintf.c +++ b/functions/stdio/vsnprintf.c @@ -62,7 +62,8 @@ int vsnprintf( char * _PDCLIB_restrict s, #ifdef TEST #define _PDCLIB_FILEID "stdio/vsnprintf.c" #define _PDCLIB_STRINGIO - +#include +#include #include <_PDCLIB_test.h> static int testprintf( char * s, const char * format, ... ) diff --git a/functions/stdio/vsprintf.c b/functions/stdio/vsprintf.c index 5f08688..9ace50d 100644 --- a/functions/stdio/vsprintf.c +++ b/functions/stdio/vsprintf.c @@ -24,7 +24,8 @@ int vsprintf( char * _PDCLIB_restrict s, #ifdef TEST #define _PDCLIB_FILEID "stdio/vsprintf.c" #define _PDCLIB_STRINGIO - +#include +#include #include <_PDCLIB_test.h> static int testprintf( char * s, const char * format, ... ) diff --git a/testing/printf_testcases.h b/testing/printf_testcases.h index f7f1413..a36be11 100644 --- a/testing/printf_testcases.h +++ b/testing/printf_testcases.h @@ -125,6 +125,11 @@ } #endif } + /* PDCLIB-20: Verify "unusual" combinations of length and signedness */ + PRINTF_TEST( 1, "1", "%tu", (ptrdiff_t) 1); // unsigned prtdiff_t + PRINTF_TEST( 2, "-1", "%jd", (intmax_t) -1); // intmax_t + PRINTF_TEST( 1, "1", "%ju", (uintmax_t) 1); // uintmax_t + PRINTF_TEST( 1, "1", "%zd", (size_t) 1); // signed size_t #ifndef TEST_CONVERSION_ONLY /****************************************************************************** -- 2.40.0