X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=41b3bd98afdaca2392f6da4fab2be6e96b4cad10;hb=6ee292abe0e985d8788d759e9a43aa51df21d322;hp=e131cbbdcc84bd8292c9cf01bb3a1c078a05191d;hpb=b27eb82f920d13f337d36b251ae758f4b128cd9f;p=pdclib.old diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index e131cbb..41b3bd9 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -15,7 +15,9 @@ /* 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 */ +/* FIXME: one too many flags to work on a 16-bit machine, join some (e.g. the + width flags) into a combined field. +*/ #define E_minus 1<<0 #define E_plus 1<<1 #define E_alt 1<<2 @@ -40,7 +42,7 @@ i - pointer to number of characters already delivered in this call n - pointer to maximum number of characters to be delivered in this call s - the buffer into which the character shall be delivered - FIXME: ref. fputs() for a better way to buffer handling + TODO: ref. fputs() for a better way to buffer handling */ #define DELIVER( x ) \ do { \ @@ -253,26 +255,16 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status if ( *spec == '*' ) { /* Retrieve width value from argument stack */ -#if 1 int width = va_arg( status->arg, int ); if ( width < 0 ) { status->flags |= E_minus; - status->width = width * -1; /* FIXME: Should be abs( width ) */ + status->width = abs( width ); } else { status->width = width; } -#else - /* FIXME: Old version - with unsigned status->width, condition <0 is never true */ - if ( ( status->width = va_arg( status->arg, int ) ) < 0 ) - { - /* Negative value is '-' flag plus absolute value */ - status->flags |= E_minus; - status->width *= -1; - } -#endif ++spec; } else @@ -544,15 +536,23 @@ static int testprintf( char * buffer, size_t n, const char * format, ... ) if ( *(_PDCLIB_print( format, &status )) != '\0' ) { printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format ); - ++rc; + ++TEST_RESULTS; } va_end( status.arg ); return status.i; } +#define TEST_CONVERSION_ONLY + +#define TESTCASE_SPRINTF( x ) TESTCASE( x ) + int main( void ) { char buffer[100]; +#include "printf_testcases.incl" + +#if 0 + char buffer[100]; TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); TESTCASE( strcmp( buffer, "-128" ) == 0 ); TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); @@ -791,6 +791,7 @@ int main( void ) TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); +#endif return TEST_RESULTS; }