X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=95fbe9c752e62acd964b2f5c981e3c6e2d7d56da;hb=29387e76cd5cd340fe7d811dc9830931d3d0ec9b;hp=c43d29b12be52f3140e25c27db2006b3a471ae3e;hpb=b0e74395c1c73aeed20d9743ed32174577496a19;p=pdclib diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index c43d29b..95fbe9c 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -23,23 +23,23 @@ /* 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 +#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). @@ -53,7 +53,7 @@ do { \ int character = x; \ if ( status->i < status->n ) { \ if ( status->stream != NULL ) \ - putc( character, status->stream ); \ + putc_unlocked( character, status->stream ); \ else \ status->s[status->i] = character; \ } \ @@ -97,14 +97,14 @@ static void int2base( uintmax_t value, struct _PDCLIB_status_t * status ) size_t bufLen = (status->width > maxIntLen ? status->width : maxIntLen) + 2; char outbuf[bufLen]; char * outend = outbuf + bufLen; - unsigned written = 0; + int written = 0; // Build up our output string - backwards { const char * digits = (status->flags & E_lower) ? _PDCLIB_digits : _PDCLIB_Xdigits; uintmax_t remaining = value; - do { + if(status->prec != 0 || remaining != 0) do { uintmax_t digit = remaining % status->base; remaining /= status->base; @@ -120,7 +120,7 @@ static void int2base( uintmax_t value, struct _PDCLIB_status_t * status ) unsigned padding = 0; if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) { - while( written < status->width ) + while( written < (int) status->width ) { outend[-++written] = '0'; padding++; @@ -156,7 +156,7 @@ static void int2base( uintmax_t value, struct _PDCLIB_status_t * status ) // Space padding to field width if ( ! ( status->flags & ( E_minus | E_zero ) ) ) { - while( written < status->width ) outend[-++written] = ' '; + while( written < (int) status->width ) outend[-++written] = ' '; } // Write output @@ -312,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