X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=c36b00978ec7d7fd627087f117538472aaa4571c;hb=393020b6e48719d27699dea6b29e53025bbd5123;hp=fdf398245a460aac1c99512369314a26872c33eb;hpb=6e4032b4d356021eeee8ca50cc9a0b78039fb92a;p=pdclib diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index fdf3982..c36b009 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -15,6 +15,7 @@ /* Using an integer's bits as flags for both the conversion flags and length modifiers. */ +/* FIXME: one too many flags to work on a 16-bit machine */ #define E_minus 1<<0 #define E_plus 1<<1 #define E_alt 1<<2 @@ -39,8 +40,18 @@ 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 + FIXME: ref. fputs() for a better way to buffer handling */ -#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 ) +#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 ) /* This function recursively converts a given integer value to a character stream. The conversion is done under the control of a given status struct @@ -113,9 +124,29 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) size_t characters = preidx + ( ( status->this > status->prec ) ? status->this : status->prec ); if ( status->width > characters ) { - for ( int i = 0; i < status->width - characters; ++i ) + for ( size_t i = 0; i < status->width - characters; ++i ) { DELIVER( ' ' ); + /* + do + { + if ( status->i < status->n ) + { + if ( status->stream != 0 ) + do + { + status->stream->buffer[status->stream->bufidx++] = (char)' ', + if ( ( status->stream->bufidx == status->stream->bufsize ) + || ( ( status->stream->status & 2 ) && (char)' ' == '\n' ) + || ( status->stream->status & 4 ) ) + fflush( status->stream ) + } while (0), + ' '; + else status->s[status->i] = ' '; + } + ++(status->i); + } while ( 0 ); + */ ++(status->this); } } @@ -139,7 +170,7 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) } } /* Do the precision padding if necessary. */ - for ( int i = 0; i < prec_pads; ++i ) + for ( size_t i = 0; i < prec_pads; ++i ) { DELIVER( '0' ); } @@ -222,12 +253,26 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status if ( *spec == '*' ) { /* Retrieve width value from argument stack */ +#if 1 + int width = va_arg( status->arg, int ); + if ( width < 0 ) + { + status->flags |= E_minus; + status->width = width * -1; /* FIXME: Should be abs( width ) */ + } + else + { + status->width = width; + } +#else + /* FIXME: Old version - with unsigned status->width, condition <0 is never true */ if ( ( status->width = va_arg( status->arg, int ) ) < 0 ) { /* Negative value is '-' flag plus absolute value */ status->flags |= E_minus; status->width *= -1; } +#endif ++spec; } else @@ -484,9 +529,18 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status static int testprintf( char * buffer, size_t n, const char * format, ... ) { /* Members: base, flags, n, i, this, s, width, prec, stream, arg */ - struct _PDCLIB_status_t status = { 0, 0, n, 0, 0, buffer, 0, 0, NULL, NULL }; - memset( buffer, '\0', 100 ); + struct _PDCLIB_status_t status; + status.base = 0; + status.flags = 0; + status.n = n; + status.i = 0; + status.this = 0; + status.s = buffer; + status.width = 0; + status.prec = 0; + status.stream = NULL; va_start( status.arg, format ); + memset( buffer, '\0', 100 ); if ( *(_PDCLIB_print( format, &status )) != '\0' ) { printf( "_PDCLIB_print() did not return end-of-specifier on '%s'.\n", format );