X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=1c0f5d6d62509280ad3a75aeda0dd4398043e08f;hb=d865c4403fc91d1f1ac95ba76febcee9f429bb97;hp=72db66bed2590a275e9bb346a1bc5a06ff2c55e5;hpb=bdad1f82d0c0aa0b83e8b195303d7957c578da2e;p=pdclib diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index 72db66b..1c0f5d6 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -1,5 +1,3 @@ -/* $Id$ */ - /* _PDCLIB_print( const char *, struct _PDCLIB_status_t * ) This file is part of the Public Domain C Library (PDCLib). @@ -12,12 +10,13 @@ #include #include +#ifndef REGTEST + /* Using an integer's bits as flags for both the conversion flags and length modifiers. */ /* FIXME: one too many flags to work on a 16-bit machine, join some (e.g. the - width flags) into a combined field. -*/ + width flags) into a combined field. */ #define E_minus 1<<0 #define E_plus 1<<1 #define E_alt 1<<2 @@ -31,7 +30,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 @@ -396,7 +395,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status 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 +416,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 +436,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 */ @@ -488,6 +493,9 @@ 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 ) @@ -506,11 +514,15 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status return ++spec; } +#endif + #ifdef TEST #define _PDCLIB_FILEID "_PDCLIB/print.c" #define _PDCLIB_STRINGIO -#include <_PDCLIB_test.h> +#include "_PDCLIB_test.h" + +#ifndef REGTEST static int testprintf( char * buffer, const char * format, ... ) { @@ -536,12 +548,16 @@ static int testprintf( char * buffer, const char * format, ... ) return status.i; } +#endif + #define TEST_CONVERSION_ONLY int main( void ) { +#ifndef REGTEST char target[100]; #include "printf_testcases.h" +#endif return TEST_RESULTS; }