X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=draft.c;h=5282fc1aed23e74cde4a40542ca1977e30371d81;hb=f0663ca307f848fb5d1901999daefe9f46bcee18;hp=bf3eaeebc4b3b5069ed5578bac48a8acbd6b8859;hpb=62f90e77d2c676722c2306de338ddfc4bf705212;p=pdclib.old diff --git a/draft.c b/draft.c index bf3eaee..5282fc1 100644 --- a/draft.c +++ b/draft.c @@ -53,7 +53,6 @@ int _PDCLIB_sprintf( char * buffer, size_t n, const char * format, va_list ap ); 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 ); @@ -69,7 +68,6 @@ int main( void ) 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 ); @@ -80,26 +78,22 @@ int main( void ) 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 ); @@ -108,7 +102,6 @@ int main( void ) 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 ); @@ -117,7 +110,6 @@ int main( void ) 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 ); @@ -126,7 +118,6 @@ int main( void ) 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 ); @@ -135,7 +126,6 @@ int main( void ) 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 ); @@ -160,7 +150,6 @@ int main( void ) 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 ); @@ -180,6 +169,8 @@ int main( void ) 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; } @@ -189,7 +180,6 @@ int main( void ) 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 ) @@ -224,7 +214,7 @@ static void int2base( intmax_t value, struct status_t * status ) 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'; @@ -265,7 +255,7 @@ static void int2base( intmax_t value, struct status_t * status ) 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); } } } @@ -279,7 +269,7 @@ static void int2base( intmax_t value, struct status_t * status ) 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 ) { @@ -287,6 +277,7 @@ static void int2base( intmax_t value, struct status_t * status ) ++(status->this); } } + /* Do the precision padding if necessary. */ for ( int i = 0; i < prec_pads; ++i ) { DELIVER( '0' ); @@ -322,7 +313,7 @@ const char * parse_out( const char * spec, struct status_t * status ) if ( *(++spec) == '%' ) { DELIVER( *spec ); - return spec; + return ++spec; } /* Initializing status structure */ status->flags = 0;