int main( void )
{
- puts( "- Signed min / max -\n" );
test( SIZE_MAX, "%hhd", CHAR_MIN );
test( SIZE_MAX, "%hhd", CHAR_MAX );
test( SIZE_MAX, "%hhd", 0 );
test( SIZE_MAX, "%lld", LLONG_MIN );
test( SIZE_MAX, "%lld", LLONG_MAX );
test( SIZE_MAX, "%lld", 0ll );
- puts( "- Unsigned min / max -\n" );
test( SIZE_MAX, "%hhu", UCHAR_MAX );
test( SIZE_MAX, "%hhu", (unsigned char)-1 );
test( SIZE_MAX, "%hu", USHRT_MAX );
test( SIZE_MAX, "%lu", -1ul );
test( SIZE_MAX, "%llu", ULLONG_MAX );
test( SIZE_MAX, "%llu", -1ull );
- puts( "- Hex and Octal, normal and alternative, upper and lowercase -\n" );
test( SIZE_MAX, "%X", UINT_MAX );
test( SIZE_MAX, "%#X", -1u );
test( SIZE_MAX, "%x", UINT_MAX );
test( SIZE_MAX, "%#x", -1u );
test( SIZE_MAX, "%o", UINT_MAX );
test( SIZE_MAX, "%#o", -1u );
- puts( "- Plus flag -\n" );
test( SIZE_MAX, "%+d", INT_MIN );
test( SIZE_MAX, "%+d", INT_MAX );
test( SIZE_MAX, "%+d", 0 );
test( SIZE_MAX, "%+u", UINT_MAX );
test( SIZE_MAX, "%+u", -1u );
- puts( "- Space flag -\n" );
test( SIZE_MAX, "% d", INT_MIN );
test( SIZE_MAX, "% d", INT_MAX );
test( SIZE_MAX, "% d", 0 );
test( SIZE_MAX, "% u", UINT_MAX );
test( SIZE_MAX, "% u", -1u );
- puts( "- Field width -\n" );
test( SIZE_MAX, "%9d", INT_MIN );
test( SIZE_MAX, "%9d", INT_MAX );
test( SIZE_MAX, "%10d", INT_MIN );
test( SIZE_MAX, "%11d", INT_MAX );
test( SIZE_MAX, "%12d", INT_MIN );
test( SIZE_MAX, "%12d", INT_MAX );
- puts( "- Field width (left bound) -\n" );
test( SIZE_MAX, "%-9d", INT_MIN );
test( SIZE_MAX, "%-9d", INT_MAX );
test( SIZE_MAX, "%-10d", INT_MIN );
test( SIZE_MAX, "%-11d", INT_MAX );
test( SIZE_MAX, "%-12d", INT_MIN );
test( SIZE_MAX, "%-12d", INT_MAX );
- puts( "- Field width, zero padding -\n");
test( SIZE_MAX, "%09d", INT_MIN );
test( SIZE_MAX, "%09d", INT_MAX );
test( SIZE_MAX, "%010d", INT_MIN );
test( SIZE_MAX, "%011d", INT_MAX );
test( SIZE_MAX, "%012d", INT_MIN );
test( SIZE_MAX, "%012d", INT_MAX );
- puts( "- Field width, zero padding (left bound) -\n" );
test( SIZE_MAX, "%-09d", INT_MIN );
test( SIZE_MAX, "%-09d", INT_MAX );
test( SIZE_MAX, "%-010d", INT_MIN );
test( SIZE_MAX, "%-011d", INT_MAX );
test( SIZE_MAX, "%-012d", INT_MIN );
test( SIZE_MAX, "%-012d", INT_MAX );
- puts( "- Limited n -\n" );
test( 8, "%9d", INT_MAX );
test( 8, "%9d", INT_MIN );
test( 9, "%9d", INT_MAX );
test( 12, "%12d", INT_MIN );
test( 13, "%12d", INT_MAX );
test( 13, "%12d", INT_MIN );
- puts( "- Precision -\n" );
test( SIZE_MAX, "%030.20d", INT_MAX );
test( SIZE_MAX, "%.6x", UINT_MAX );
test( SIZE_MAX, "%#6.3x", UINT_MAX );
test( SIZE_MAX, "%+0.6d", INT_MAX );
test( SIZE_MAX, "%+06.3d", INT_MAX );
test( SIZE_MAX, "%+03.6d", INT_MAX );
+ test( SIZE_MAX, "- %d", INT_MAX );
+ test( SIZE_MAX, "- %d %% %d", INT_MAX, INT_MIN );
return 0;
}
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
- TODO: Overruns.
*/
#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 )
if ( ( status->flags & E_alt ) && ( status->base == 16 || status->base == 8 ) )
{
/* Octal / hexadecimal prefix for "%#" conversions */
- preface[ preidx++ ] = '0'; /* TODO: For octal, standard states "extend the precision" */
+ preface[ preidx++ ] = '0';
if ( status->base == 16 )
{
preface[ preidx++ ] = ( status->flags & E_lower ) ? 'x' : 'X';
for ( int i = 0; i < status->width - characters; ++i )
{
DELIVER( ' ' );
- ++(status->this); /* TODO: Probably have to do something so I still know how many zeroes are required, later. */
+ ++(status->this);
}
}
}
if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) )
{
/* If field is not left aligned, and zero padding is requested, do
- so. TODO: This should include precision handling (probably).
+ so.
*/
while ( status->this < status->width )
{
++(status->this);
}
}
+ /* Do the precision padding if necessary. */
for ( int i = 0; i < prec_pads; ++i )
{
DELIVER( '0' );
if ( *(++spec) == '%' )
{
DELIVER( *spec );
- return spec;
+ return ++spec;
}
/* Initializing status structure */
status->flags = 0;