From: solar Date: Wed, 24 May 2006 16:09:32 +0000 (+0000) Subject: Intermediate freeze. X-Git-Tag: v0.5~182 X-Git-Url: https://pd.if.org/git/?p=pdclib;a=commitdiff_plain;h=014988e9a303f1617be511468d70a235a2826362 Intermediate freeze. --- diff --git a/Makefile b/Makefile index 41469ad..dfa14f8 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ SRCFILES := $(shell find $(PROJDIRS) -mindepth 1 -maxdepth 3 -name "*.c") # All header files of the project HDRFILES := $(shell find $(PROJDIRS) -mindepth 1 -maxdepth 3 -name "*.h") # All .c files in functions/_PDCLIB that do not have a regression test driver -INTFILES := _Exit atomax digits print rename remove seed strtox_main strtox_prelim +INTFILES := _Exit atomax digits open print rename remove seed stdinit strtox_main strtox_prelim # All object files in the library OBJFILES := $(patsubst %.c,%.o,$(SRCFILES)) # All test drivers (.t) diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index a8c44f6..9ee2a03 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -29,7 +29,7 @@ #define E_size 1<<11 #define E_ptrdiff 1<<12 #define E_intptr 1<<13 -#define E_double 1<<14 +#define E_ldouble 1<<14 #define E_lower 1<<15 #define E_unsigned 1<<16 @@ -42,11 +42,13 @@ */ #define DELIVER( x ) do { if ( status->i < status->n ) { if ( status->stream != NULL ) putc( x, status->stream ); else status->s[status->i] = x; } ++(status->i); } while ( 0 ) -/* This function recursively converts a given integer value to a given base - into a character string. Persistent information - like the number of digits - parsed so far - is recorded in a struct _PDCLIB_status_t, which allows to - avoid overwriting snprintf() limits, and enables the function to do the - necessary padding / prefixing of the character string eventually printed. +/* This function recursively converts a given integer value to a character + stream. The conversion is done under the control of a given status struct + and written either to a character string or a stream, depending on that + same status struct. The status struct also keeps the function from exceeding + snprintf() limits, and enables any necessary padding / prefixing of the + output once the number of characters to be printed is known, which happens + at the lowermost recursion level. */ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) { @@ -163,14 +165,12 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) } } -/* This function is to be called with spec pointing to the leading '%' of a - printf() conversion specifier. -*/ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status ) { const char * orig_spec = spec; if ( *(++spec) == '%' ) { + /* %% -> print single '%' */ DELIVER( *spec ); return ++spec; } @@ -187,26 +187,32 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status switch ( *spec ) { case '-': + /* left-aligned output */ status->flags |= E_minus; ++spec; break; case '+': + /* positive numbers prefixed with '+' */ status->flags |= E_plus; ++spec; break; case '#': + /* alternative format (leading 0x for hex, 0 for octal) */ status->flags |= E_alt; ++spec; break; case ' ': + /* positive numbers prefixed with ' ' */ status->flags |= E_space; ++spec; break; case '0': + /* right-aligned padding done with '0' instead of ' ' */ status->flags |= E_zero; ++spec; break; default: + /* not a flag, exit flag parsing */ status->flags |= E_done; break; } @@ -270,36 +276,44 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status case 'h': if ( *spec == 'h' ) { + /* hh -> char */ status->flags |= E_char; ++spec; } else { + /* h -> short */ status->flags |= E_short; } break; case 'l': if ( *spec == 'l' ) { + /* ll -> long long */ status->flags |= E_llong; ++spec; } else { + /* k -> long */ status->flags |= E_long; } break; case 'j': + /* j -> intmax_t, which might or might not be long long */ status->flags |= E_intmax; break; case 'z': + /* z -> size_t, which might or might not be unsigned int */ status->flags |= E_size; break; case 't': + /* t -> ptrdiff_t, which might or might not be long */ status->flags |= E_ptrdiff; break; case 'L': - status->flags |= E_double; + /* L -> long double */ + status->flags |= E_ldouble; break; default: --spec; @@ -464,10 +478,395 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status #ifdef TEST #include <_PDCLIB_test.h> +#include +#include + +int testprintf( char * buffer, size_t n, const char * format, ... ) +{ + /* Members: base, flags, n, i, this, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status = { 0, 0, n, 0, 0, buffer, 0, 0, NULL, NULL }; + va_start( status.arg, format ); + if ( *(_PDCLIB_print( format, &status )) != '\0' ) + { + printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format ); + ++rc; + } + va_end( status.arg ); + return status.this; +} + int main( void ) { - TESTCASE( NO_TESTDRIVER ); - return TEST_RESULTS; + char buffer[100]; + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); + TESTCASE( strcmp( buffer, "-128" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "127" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); + TESTCASE( strcmp( buffer, "-32768" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "32767" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); + TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); + TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); + TESTCASE( strcmp( buffer, "0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); + TESTCASE( strcmp( buffer, "255" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); + TESTCASE( strcmp( buffer, "65535" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); + TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); + TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); + puts( buffer ); + /* TODO: This test case is broken, doesn't test what it was intended to. */ + TESTCASE( testprintf( buffer, 100, "%.0#o", 0 ) == 5 ); + TESTCASE( strcmp( buffer, "%.0#o" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, "+0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); + TESTCASE( strcmp( buffer, " 0" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); + TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 8, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 9, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%9d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 9, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%10d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 10, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 12, "%11d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 11, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -21474836" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 12, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -214748364" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MAX ) == 12 ); + TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 13, "%12d", INT_MIN ) == 12 ); + TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); + TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); + TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); + TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); + TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); + TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); + TESTCASE( strcmp( buffer, "x" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); + TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); + puts( buffer ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); + TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); + puts( buffer ); + { + int val1, val2; + TESTCASE( testprintf( buffer, 100, "123456%n789%n", &val1, &val2 ) == 9 ); + TESTCASE( strcmp( buffer, "123456789" ) == 0 ); + puts( buffer ); + TESTCASE( val1 == 6 ); + TESTCASE( val2 == 9 ); + } return TEST_RESULTS; } #endif diff --git a/functions/stdio/snprintf.c b/functions/stdio/snprintf.c index 2b38c43..9fd2dd7 100644 --- a/functions/stdio/snprintf.c +++ b/functions/stdio/snprintf.c @@ -277,7 +277,7 @@ int main( void ) TESTCASE( strcmp( buffer, "x" ) == 0 ); TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%p", 0xdeadbeef ) == 10 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); { int val1, val2; diff --git a/functions/stdio/sprintf.c b/functions/stdio/sprintf.c index b36a80d..41bcc10 100644 --- a/functions/stdio/sprintf.c +++ b/functions/stdio/sprintf.c @@ -230,7 +230,7 @@ int main( void ) TESTCASE( strcmp( buffer, "x" ) == 0 ); TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%p", 0xdeadbeef ) == 10 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); { int val1, val2; diff --git a/functions/stdio/vsnprintf.c b/functions/stdio/vsnprintf.c index 3dcca64..96a151b 100644 --- a/functions/stdio/vsnprintf.c +++ b/functions/stdio/vsnprintf.c @@ -46,12 +46,12 @@ int vsnprintf( char * s, size_t n, const char * format, _PDCLIB_va_list arg ) static int testprintf( char * s, size_t n, const char * format, ... ) { - int rc; + int i; va_list arg; va_start( arg, format ); - rc = vsnprintf( s, n, format, arg ); + i = vsnprintf( s, n, format, arg ); va_end( arg ); - return rc; + return i; } int main( void ) @@ -300,7 +300,7 @@ int main( void ) TESTCASE( strcmp( buffer, "x" ) == 0 ); TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%p", 0xdeadbeef ) == 10 ); + TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); { int val1, val2; diff --git a/internals/_PDCLIB_int.h b/internals/_PDCLIB_int.h index 9d83c66..b32b14a 100644 --- a/internals/_PDCLIB_int.h +++ b/internals/_PDCLIB_int.h @@ -326,5 +326,11 @@ _PDCLIB_uintmax_t _PDCLIB_strtox_main( const char ** p, unsigned int base, _PDCL extern char _PDCLIB_digits[]; extern char _PDCLIB_Xdigits[]; -/* The worker for all printf() type of functions. */ +/* The worker for all printf() type of functions. The pointer spec should point + to the introducing '%' of a conversion specifier. The status structure is to + be that of the current printf() function, of which the members n, s, stream + and arg will be preserved, i will be updated, and all others will be trashed + by the function. + Returns a pointer to the first character not parsed as conversion specifier. +*/ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status );