X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=functions%2F_PDCLIB%2Fprint.c;h=76297147450d6636b7e7a2133be700febd723425;hb=55cf35957bf8dec0a489ba758c02c83303a5eb50;hp=0ac327220234d628f76893252f703b673bbea137;hpb=f408c1fd633015089d2a0fc6bc31c9f61eeae0a9;p=pdclib diff --git a/functions/_PDCLIB/print.c b/functions/_PDCLIB/print.c index 0ac3272..7629714 100644 --- a/functions/_PDCLIB/print.c +++ b/functions/_PDCLIB/print.c @@ -15,7 +15,9 @@ /* 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 */ +/* 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 @@ -40,17 +42,14 @@ 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: ref. fputs() for a better way to buffer handling */ #define DELIVER( x ) \ do { \ if ( status->i < status->n ) { \ - if ( status->stream != NULL ) { \ - status->stream->buffer[status->stream->bufidx++] = x; \ - if ( ( status->stream->bufidx == status->stream->bufsize ) \ - || ( ( status->stream->status & _IOLBF ) && ( x == '\n' ) ) \ - || ( status->stream->status & _IONBF ) ) \ - fflush( status->stream ); \ - } else \ + if ( status->stream != NULL ) \ + putc( x, status->stream ); \ + else \ status->s[status->i] = x; \ } \ ++(status->i); \ @@ -70,7 +69,7 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) already so it will be taken into account when the deepestmost recursion does the prefix / padding stuff. */ - ++(status->this); + ++(status->current); if ( ( value / status->base ) != 0 ) { /* More digits to be done - recurse deeper */ @@ -113,7 +112,7 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) } } { - size_t prec_pads = ( status->prec > status->this ) ? ( status->prec - status->this ) : 0; + size_t prec_pads = ( status->prec > status->current ) ? ( status->prec - status->current ) : 0; if ( ! ( status->flags & ( E_minus | E_zero ) ) ) { /* Space padding is only done if no zero padding or left alignment @@ -124,7 +123,7 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) I've ever perpetrated. Greetings to Samface, DevL, and all sceners at Breakpoint 2006. */ - size_t characters = preidx + ( ( status->this > status->prec ) ? status->this : status->prec ); + size_t characters = preidx + ( ( status->current > status->prec ) ? status->current : status->prec ); if ( status->width > characters ) { for ( size_t i = 0; i < status->width - characters; ++i ) @@ -150,7 +149,7 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) ++(status->i); } while ( 0 ); */ - ++(status->this); + ++(status->current); } } } @@ -159,17 +158,17 @@ static void int2base( intmax_t value, struct _PDCLIB_status_t * status ) while ( preface[ preidx ] != '\0' ) { DELIVER( preface[ preidx++ ] ); - ++(status->this); + ++(status->current); } if ( ( ! ( status->flags & E_minus ) ) && ( status->flags & E_zero ) ) { /* If field is not left aligned, and zero padding is requested, do so. */ - while ( status->this < status->width ) + while ( status->current < status->width ) { DELIVER( '0' ); - ++(status->this); + ++(status->current); } } /* Do the precision padding if necessary. */ @@ -211,7 +210,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status /* Initializing status structure */ status->flags = 0; status->base = 0; - status->this = 0; + status->current = 0; status->width = 0; status->prec = 0; @@ -256,26 +255,16 @@ 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 ) */ + status->width = 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 @@ -461,7 +450,7 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status value = (uintmax_t)va_arg( status->arg, size_t ); break; } - ++(status->this); + ++(status->current); if ( ( value / status->base ) != 0 ) { int2base( (intmax_t)(value / status->base), status ); @@ -509,10 +498,10 @@ const char * _PDCLIB_print( const char * spec, struct _PDCLIB_status_t * status } if ( status->flags & E_minus ) { - while ( status->this < status->width ) + while ( status->current < status->width ) { DELIVER( ' ' ); - ++(status->this); + ++(status->current); } } if ( status->i >= status->n ) @@ -531,14 +520,23 @@ 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 ); + /* Members: base, flags, n, i, current, s, width, prec, stream, arg */ + struct _PDCLIB_status_t status; + status.base = 0; + status.flags = 0; + status.n = n; + status.i = 0; + status.current = 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 ); - ++rc; + ++TEST_RESULTS; } va_end( status.arg ); return status.i;