X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;fp=functions%2F_PDCLIB%2Fprint.c;h=6db55e85a27307ef8211091f2891148f69c0ed3f;hp=3ddf11daad8d7188e027222bd594d319cc876b08;hb=2f13296a39de23e7ea4cdda37f13ff214147c6be;hpb=2f2fa4783d94d90a7bd261d070c2b5d8b790d78a diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index 3ddf11d..6db55e8 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -159,6 +159,12 @@ static void intformat( intmax_t value, struct _PDCLIB_status_t * status ) */ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) { + /* Special case: zero value, zero precision -- no output (but padding) */ + if ( status->current == 0 && value == 0 && status->prec == 0 ) + { + intformat( value, status ); + return; + } /* 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. @@ -505,28 +511,39 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status puts( "UNSUPPORTED PRINTF FLAG COMBINATION" ); return NULL; } - ++(status->current); - if ( ( value / status->base ) != 0 ) - { - /* Get value to "safe" levels re. uintmax_t. */ - int2base( (intmax_t)(value / status->base), status ); - } - else - { - intformat( (intmax_t)value, status ); - } - int digit = value % status->base; - if ( digit < 0 ) - { - digit *= -1; - } - if ( status->flags & E_lower ) + /* Special case: zero value, zero precision: No output, just padding */ + if ( value == 0 && status->prec == 0 ) { - PUT( _PDCLIB_digits[ digit ] ); + int2base( 0, status ); } else { - PUT( _PDCLIB_Xdigits[ digit ] ); + /* To make the call to int2base (using intmax_t) safe for + uintmax_t values > INTMAX_MAX, we basically to the first + "recursion" level of int2base right here. + */ + ++(status->current); + if ( ( value / status->base ) != 0 ) + { + int2base( (intmax_t)(value / status->base), status ); + } + else + { + intformat( (intmax_t)value, status ); + } + int digit = value % status->base; + if ( digit < 0 ) + { + digit *= -1; + } + if ( status->flags & E_lower ) + { + PUT( _PDCLIB_digits[ digit ] ); + } + else + { + PUT( _PDCLIB_Xdigits[ digit ] ); + } } } else @@ -596,7 +613,7 @@ static int testprintf( char * buffer, const char * format, ... ) status.current = 0; status.s = buffer; status.width = 0; - status.prec = 0; + status.prec = EOF; status.stream = NULL; va_start( status.arg, format ); memset( buffer, '\0', 100 );