X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=draft.c;h=5282fc1aed23e74cde4a40542ca1977e30371d81;hb=f0663ca307f848fb5d1901999daefe9f46bcee18;hp=46982da0ae16acdc030a64ed35d548515e9257aa;hpb=19275809ce10f2cd4915fbcdecbff3979f0c0bba;p=pdclib.old diff --git a/draft.c b/draft.c index 46982da..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,7 +169,6 @@ int main( void ) test( SIZE_MAX, "%+0.6d", INT_MAX ); test( SIZE_MAX, "%+06.3d", INT_MAX ); test( SIZE_MAX, "%+03.6d", INT_MAX ); - puts( "- Multiple outputs -\n" ); test( SIZE_MAX, "- %d", INT_MAX ); test( SIZE_MAX, "- %d %% %d", INT_MAX, INT_MIN ); return 0; @@ -192,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 ) @@ -227,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'; @@ -268,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); } } } @@ -282,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 ) { @@ -290,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' ); @@ -324,7 +312,8 @@ const char * parse_out( const char * spec, struct status_t * status ) const char * orig_spec = spec; if ( *(++spec) == '%' ) { - return spec; + DELIVER( *spec ); + return ++spec; } /* Initializing status structure */ status->flags = 0;