X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=95fbe9c752e62acd964b2f5c981e3c6e2d7d56da;hb=29387e76cd5cd340fe7d811dc9830931d3d0ec9b;hp=95e71c6c5a8ab979c25dc1fac5606576cecbc9a1;hpb=d79c5a289feef16ce8fd04dc8db1efb934e1aa18;p=pdclib diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index 95e71c6..95fbe9c 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -9,29 +9,37 @@ #include #include #include +#include #include #include +#include +#include + +#ifndef REGTEST /* Using an integer's bits as flags for both the conversion flags and length modifiers. */ -#define E_minus 1<<0 -#define E_plus 1<<1 -#define E_alt 1<<2 -#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 -#define E_llong 1<<9 -#define E_intmax 1<<10 -#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 +/* 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) +#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) +#define E_llong (1<<9) +#define E_intmax (1<<10) +#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) /* This macro delivers a given character to either a memory buffer or a stream, depending on the contents of 'status' (struct _PDCLIB_status_t). @@ -40,161 +48,178 @@ 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 ) { \ - if ( status->stream != NULL ) { \ - status->stream->buffer[status->stream->bufidx++] = x; \ - if ( ( status->stream->bufidx == status->stream->bufsize ) \ - || ( ( status->stream->status & _IOLBF ) && ( x == '\n' ) ) \ - || ( status->stream->status & _IONBF ) ) \ - fflush( status->stream ); \ - } else \ - status->s[status->i] = x; \ + if ( status->stream != NULL ) \ + putc_unlocked( character, status->stream ); \ + else \ + status->s[status->i] = character; \ } \ ++(status->i); \ } while ( 0 ) -/* 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 ) +/* Maximum number of output characters = + * number of bits in (u)intmax_t / number of bits per character in smallest + * base. Smallest base is octal, 3 bits/char. + * + * Additionally require 2 extra characters for prefixes + */ +static const size_t maxIntLen = sizeof(intmax_t) * CHAR_BIT / 3 + 1; + +static void int2base( uintmax_t value, struct _PDCLIB_status_t * status ) { - /* Registering the character being printed at the end of the function here - already so it will be taken into account when the deepestmost recursion - does the prefix / padding stuff. - */ - ++(status->this); - if ( ( value / status->base ) != 0 ) + char sign = 0; + if ( ! ( status->flags & E_unsigned ) ) { - /* More digits to be done - recurse deeper */ - int2base( value / status->base, status ); - } - else - { - /* We reached the last digit, the deepest point of our recursion, and - only now know how long the number to be printed actually is. Now we - have to do the sign, prefix, width, and precision padding stuff - before printing the numbers while we resurface from the recursion. - */ - /* At worst, we need two prefix characters (hex prefix). */ - char preface[3] = "\0"; - size_t preidx = 0; - if ( ( status->flags & E_alt ) && ( status->base == 16 || status->base == 8 ) ) + intmax_t signval = (intmax_t) value; + bool negative = signval < 0; + value = signval < 0 ? -signval : signval; + + if ( negative ) { - /* Octal / hexadecimal prefix for "%#" conversions */ - preface[ preidx++ ] = '0'; - if ( status->base == 16 ) - { - preface[ preidx++ ] = ( status->flags & E_lower ) ? 'x' : 'X'; - } - } - if ( value < 0 ) + sign = '-'; + } + else if ( status->flags & E_plus ) { - /* Negative sign for negative values - at all times. */ - preface[ preidx++ ] = '-'; + sign = '+'; } - else if ( ! ( status->flags & E_unsigned ) ) + else if (status->flags & E_space ) { - /* plus sign / extra space are only for unsigned conversions */ - if ( status->flags & E_plus ) - { - preface[ preidx++ ] = '+'; - } - else if ( status->flags & E_space ) - { - preface[ preidx++ ] = ' '; - } + sign = ' '; } + } + + // The user could theoretically ask for a silly buffer length here. + // Perhaps after a certain size we should malloc? Or do we refuse to protect + // them from their own stupidity? + size_t bufLen = (status->width > maxIntLen ? status->width : maxIntLen) + 2; + char outbuf[bufLen]; + char * outend = outbuf + bufLen; + int written = 0; + + // Build up our output string - backwards + { + const char * digits = (status->flags & E_lower) ? + _PDCLIB_digits : _PDCLIB_Xdigits; + uintmax_t remaining = value; + if(status->prec != 0 || remaining != 0) do { + uintmax_t digit = remaining % status->base; + remaining /= status->base; + + outend[-++written] = digits[digit]; + } while(remaining != 0); + } + + // Pad field out to the precision specification + while( (long) written < status->prec ) outend[-++written] = '0'; + + // If a field width specified, and zero padding was requested, then pad to + // the field width + unsigned padding = 0; + if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) + { + while( written < (int) status->width ) { - size_t prec_pads = ( status->prec > status->this ) ? ( status->prec - status->this ) : 0; - if ( ! ( status->flags & ( E_minus | E_zero ) ) ) + outend[-++written] = '0'; + padding++; + } + } + + // Prefixes + if ( sign != 0 ) + { + if ( padding == 0 ) written++; + outend[-written] = sign; + } + else if ( status->flags & E_alt ) + { + switch ( status->base ) { - /* Space padding is only done if no zero padding or left alignment - is requested. Leave space for any prefixes determined above. - */ - /* The number of characters to be printed, plus prefixes if any. */ - /* This line contained probably the most stupid, time-wasting bug - I've ever perpetrated. Greetings to Samface, DevL, and all - sceners at Breakpoint 2006. - */ - size_t characters = preidx + ( ( status->this > status->prec ) ? status->this : status->prec ); - if ( status->width > characters ) - { - for ( size_t i = 0; i < status->width - characters; ++i ) - { - DELIVER( ' ' ); - /* - do - { - if ( status->i < status->n ) - { - if ( status->stream != 0 ) - do - { - status->stream->buffer[status->stream->bufidx++] = (char)' ', - if ( ( status->stream->bufidx == status->stream->bufsize ) - || ( ( status->stream->status & 2 ) && (char)' ' == '\n' ) - || ( status->stream->status & 4 ) ) - fflush( status->stream ) - } while (0), - ' '; - else status->s[status->i] = ' '; - } - ++(status->i); - } while ( 0 ); - */ - ++(status->this); - } - } + case 8: + if ( outend[-written] != '0' ) outend[-++written] = '0'; + break; + case 16: + // No prefix if zero + if ( value == 0 ) break; + + written += padding < 2 ? 2 - padding : 0; + outend[-written ] = '0'; + outend[-written + 1] = (status->flags & E_lower) ? 'x' : 'X'; + break; + default: + break; } - /* Now we did the padding, do the prefixes (if any). */ - preidx = 0; - while ( preface[ preidx ] != '\0' ) + } + + // Space padding to field width + if ( ! ( status->flags & ( E_minus | E_zero ) ) ) + { + while( written < (int) status->width ) outend[-++written] = ' '; + } + + // Write output + status->current = written; + while ( written ) + PUT( outend[-written--] ); +} + +static void printstr( const char * str, struct _PDCLIB_status_t * status ) +{ + if ( status->width == 0 || status->flags & E_minus ) + { + // Simple case or left justification + while ( str[status->current] && + ( status->prec < 0 || (long)status->current < status->prec ) ) { - DELIVER( preface[ preidx++ ] ); - ++(status->this); + PUT( str[status->current++] ); } - if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) + + while( status->current < status->width ) { - /* If field is not left aligned, and zero padding is requested, do - so. - */ - while ( status->this < status->width ) - { - DELIVER( '0' ); - ++(status->this); - } + PUT( ' ' ); + status->current++; } - /* Do the precision padding if necessary. */ - for ( size_t i = 0; i < prec_pads; ++i ) + } else { + // Right justification + size_t len = status->prec >= 0 ? strnlen( str, status->prec ) + : strlen( str ); + int padding = status->width - len; + while((long)status->current < padding) { - DELIVER( '0' ); + PUT( ' ' ); + status->current++; } + + for( size_t i = 0; i != len; i++ ) + { + PUT( str[i] ); + status->current++; } } - /* Recursion tail - print the current digit. */ - { - int digit = value % status->base; - if ( digit < 0 ) - { - digit *= -1; - } - if ( status->flags & E_lower ) - { - /* Lowercase letters. Same array used for strto...(). */ - DELIVER( _PDCLIB_digits[ digit ] ); - } - else +} + +static void printchar( char chr, struct _PDCLIB_status_t * status ) +{ + if( ! ( status->flags & E_minus ) ) { - /* Uppercase letters. Array only used here, only 0-F. */ - DELIVER( _PDCLIB_Xdigits[ digit ] ); - } + // Right justification + for( ; status->current + 1 < status->width; status->current++) + { + PUT( ' ' ); + } + PUT( chr ); + status->current++; + } else { + // Left justification + PUT( chr ); + status->current++; + + for( ; status->current < status->width; status->current++) + { + PUT( ' ' ); + } } } @@ -204,15 +229,15 @@ 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 */ status->flags = 0; status->base = 0; - status->this = 0; + status->current = 0; status->width = 0; - status->prec = 0; + status->prec = EOF; /* First come 0..n flags */ do @@ -255,26 +280,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 @@ -297,20 +312,14 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status EOF (negative), there is no need for testing for negative here. */ status->prec = va_arg( status->arg, int ); + ++spec; } else { - char * endptr; - status->prec = (int)strtol( spec, &endptr, 10 ); - if ( spec == endptr ) - { - /* Decimal point but no number - bad conversion specifier. */ - return orig_spec; - } - spec = endptr; + status->prec = (int)strtol( spec, (char**) &spec, 10 ); } /* Having a precision cancels out any zero flag. */ - status->flags ^= E_zero; + status->flags &= ~E_zero; } /* Optional length modifier @@ -402,17 +411,14 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status case 'A': break; case 'c': - /* TODO: Flags, wide chars. */ - DELIVER( va_arg( status->arg, int ) ); + /* TODO: wide chars. */ + printchar( va_arg( status->arg, int ), status ); return ++spec; case 's': - /* TODO: Flags, wide chars. */ + /* TODO: wide chars. */ { char * s = va_arg( status->arg, char * ); - while ( *s != '\0' ) - { - DELIVER( *(s++) ); - } + printstr( s, status ); return ++spec; } case 'p': @@ -460,24 +466,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status value = (uintmax_t)va_arg( status->arg, size_t ); break; } - ++(status->this); - if ( ( value / status->base ) != 0 ) - { - int2base( (intmax_t)(value / status->base), status ); - } - int digit = value % status->base; - if ( digit < 0 ) - { - digit *= -1; - } - if ( status->flags & E_lower ) - { - DELIVER( _PDCLIB_digits[ digit ] ); - } - else - { - DELIVER( _PDCLIB_Xdigits[ digit ] ); - } + int2base( value, status ); } else { @@ -508,13 +497,13 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status } if ( status->flags & E_minus ) { - while ( status->this < status->width ) + while ( status->current < status->width ) { - DELIVER( ' ' ); - ++(status->this); + PUT( ' ' ); + ++(status->current); } } - if ( status->i >= status->n ) + if ( status->i >= status->n && status->n > 0 ) { status->s[status->n - 1] = '\0'; } @@ -522,268 +511,48 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status return ++spec; } +#endif + #ifdef TEST -#include <_PDCLIB_test.h> +#define _PDCLIB_FILEID "_PDCLIB/print.c" +#define _PDCLIB_STRINGIO -#include -#include +#include <_PDCLIB_test.h> -static int testprintf( char * buffer, size_t n, const char * format, ... ) +#ifndef REGTEST +static int testprintf( char * buffer, 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 }; - memset( buffer, '\0', 100 ); + /* Members: base, flags, n, i, current, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status; + status.base = 0; + status.flags = 0; + status.n = 100; + status.i = 0; + status.current = 0; + status.s = buffer; + status.width = 0; + status.prec = 0; + status.stream = NULL; va_start( status.arg, format ); + memset( buffer, '\0', 100 ); 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; } +#endif + +#define TEST_CONVERSION_ONLY int main( void ) { - char buffer[100]; - TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MIN ) == 4 ); - TESTCASE( strcmp( buffer, "-128" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhd", CHAR_MAX ) == 3 ); - TESTCASE( strcmp( buffer, "127" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhd", 0 ) == 1 ); - TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MIN ) == 6 ); - TESTCASE( strcmp( buffer, "-32768" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", SHRT_MAX ) == 5 ); - TESTCASE( strcmp( buffer, "32767" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hd", 0 ) == 1 ); - TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%d", 0 ) == 1 ); - TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", LONG_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", LONG_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%ld", 0l ) == 1 ); - TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MIN ) == 20 ); - TESTCASE( strcmp( buffer, "-9223372036854775808" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", LLONG_MAX ) == 19 ); - TESTCASE( strcmp( buffer, "9223372036854775807" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lld", 0ll ) ); - TESTCASE( strcmp( buffer, "0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhu", UCHAR_MAX ) == 3 ); - TESTCASE( strcmp( buffer, "255" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hhu", (unsigned char)-1 ) == 3 ); - TESTCASE( strcmp( buffer, "255" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hu", USHRT_MAX ) == 5 ); - TESTCASE( strcmp( buffer, "65535" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%hu", (unsigned short)-1 ) == 5 ); - TESTCASE( strcmp( buffer, "65535" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%u", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%u", -1u ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lu", ULONG_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%lu", -1ul ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%llu", ULLONG_MAX ) == 20 ); - TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%llu", -1ull ) == 20 ); - TESTCASE( strcmp( buffer, "18446744073709551615" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%X", UINT_MAX ) == 8 ); - TESTCASE( strcmp( buffer, "FFFFFFFF" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#X", -1u ) == 10 ); - TESTCASE( strcmp( buffer, "0XFFFFFFFF" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%x", UINT_MAX ) == 8 ); - TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#x", -1u ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%o", UINT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "37777777777" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#o", -1u ) == 12 ); - TESTCASE( strcmp( buffer, "037777777777" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+d", 0 ) == 2 ); - TESTCASE( strcmp( buffer, "+0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+u", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+u", -1u ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% d", 0 ) == 2 ); - TESTCASE( strcmp( buffer, " 0" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% u", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "% u", -1u ) == 10 ); - TESTCASE( strcmp( buffer, "4294967295" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%9d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%9d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%10d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%10d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%11d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%11d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%12d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%12d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-9d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-9d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-10d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-10d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-11d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-11d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-12d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-12d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%09d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%09d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%010d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%010d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%011d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%011d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "02147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%012d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, "-02147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%012d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, "002147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-09d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-09d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-010d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-010d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-011d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-011d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-012d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, "-2147483648 " ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%-012d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, "2147483647 " ) == 0 ); - TESTCASE( testprintf( buffer, 8, "%9d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483" ) == 0 ); - TESTCASE( testprintf( buffer, 8, "%9d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-214748" ) == 0 ); - TESTCASE( testprintf( buffer, 9, "%9d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 9, "%9d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%9d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%9d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 9, "%10d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 9, "%10d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%10d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%10d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%10d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%10d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%11d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 10, "%11d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%11d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%11d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 12, "%11d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 12, "%11d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%12d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, " 21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 11, "%12d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, " -21474836" ) == 0 ); - TESTCASE( testprintf( buffer, 12, "%12d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, " 214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 12, "%12d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, " -214748364" ) == 0 ); - TESTCASE( testprintf( buffer, 13, "%12d", INT_MAX ) == 12 ); - TESTCASE( strcmp( buffer, " 2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 13, "%12d", INT_MIN ) == 12 ); - TESTCASE( strcmp( buffer, " -2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%030.20d", INT_MAX ) == 30 ); - TESTCASE( strcmp( buffer, " 00000000002147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%.6x", UINT_MAX ) == 8 ); - TESTCASE( strcmp( buffer, "ffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#6.3x", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#3.6x", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%.6d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%6.3d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%3.6d", INT_MIN ) == 11 ); - TESTCASE( strcmp( buffer, "-2147483648" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#0.6x", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#06.3x", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#03.6x", UINT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "0xffffffff" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#0.6d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#06.3d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#03.6d", INT_MAX ) == 10 ); - TESTCASE( strcmp( buffer, "2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+.6d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+6.3d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%#+3.6d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+0.6d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+06.3d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%+03.6d", INT_MAX ) == 11 ); - TESTCASE( strcmp( buffer, "+2147483647" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%c", 'x' ) == 1 ); - TESTCASE( strcmp( buffer, "x" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%s", "abcdef" ) == 6 ); - TESTCASE( strcmp( buffer, "abcdef" ) == 0 ); - TESTCASE( testprintf( buffer, 100, "%p", (void *)0xdeadbeef ) == 10 ); - TESTCASE( strcmp( buffer, "0xdeadbeef" ) == 0 ); +#ifndef REGTEST + char target[100]; +#include "printf_testcases.h" +#endif return TEST_RESULTS; }