cvs: php3 / ChangeLog /functions formatted_print.c

From: Date: Fri, 14 Jul 2000 15:39:51 +0000
Subject: cvs: php3 / ChangeLog /functions formatted_print.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-754@lists.php.net to get a copy of this message
coar Fri Jul 14 08:39:51 2000 EDT Modified files: /php3 ChangeLog /php3/functions formatted_print.c Log: printf wasn't working with %s formats that specified a zero precision (e.g., "%4.0s", "%-12.0s"); _php3_sprintf_appendstring() couldn't tell the difference between an explict 0 and a missing precision. Now fixed.. hopefully without any repercussions for any other formats. Some minor formatting changes in this patch too, alas.. All of my testing for this has shown now-correct behaviour, but additional testing, particularly for non-%s formats, wouldn't be amiss. Index: php3/ChangeLog diff -u php3/ChangeLog:1.843 php3/ChangeLog:1.844 --- php3/ChangeLog:1.843 Fri Jul 14 08:35:05 2000 +++ php3/ChangeLog Fri Jul 14 08:39:50 2000 @@ -2,6 +2,8 @@ ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?, 200x, Version 3.0.17 +- Fixed incorrect handling of 0-precision strings (e.g., %4.0s) + in printf (Ken Coar) - You can now call Ora_Error() without prameters to get the reason for a failed connection attemp. (Kirill Maximov) - Fixed crash in OCIFetchStatement() when trying to read after Index: php3/functions/formatted_print.c diff -u php3/functions/formatted_print.c:1.53 php3/functions/formatted_print.c:1.54 --- php3/functions/formatted_print.c:1.53 Fri Dec 31 20:31:15 1999 +++ php3/functions/formatted_print.c Fri Jul 14 08:39:51 2000 @@ -27,7 +27,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: formatted_print.c,v 1.53 2000/01/01 04:31:15 sas Exp $ */ +/* $Id: formatted_print.c,v 1.54 2000/07/14 15:39:51 coar Exp $ */ #include "php.h" #include "internal_functions.h" @@ -161,18 +161,20 @@ inline static void _php3_sprintf_appendstring(char **buffer, int *pos, int *size, char *add, int min_width, int max_width, char padding, - int alignment, int len, int sign) + int alignment, int len, int sign, int expprec) { - register int npad = min_width - MIN(len,(max_width?max_width:len)); + register int npad; - if (npad<0) { - npad=0; + npad = min_width - MIN(len, (expprec ? max_width : len)); + + if (npad < 0) { + npad = 0; } - + PRINTF_DEBUG(("sprintf: appendstring(%x, %d, %d, \"%s\", %d, '%c', %d)\n", *buffer, *pos, *size, add, min_width, padding, alignment)); - if (max_width == 0) { - max_width = MAX(min_width,len); + if ((max_width == 0) && (! expprec)) { + max_width = MAX(min_width, len); } if ((*pos + max_width) >= *size) { while ((*pos + max_width) >= *size) { @@ -182,14 +184,17 @@ *buffer = erealloc(*buffer, *size); } if (alignment == ALIGN_RIGHT) { - if (sign && padding=='0') { (*buffer)[(*pos)++] = '-'; add++; } + if (sign && padding == '0') { + (*buffer)[(*pos)++] = '-'; + add++; + } while (npad-- > 0) { (*buffer)[(*pos)++] = padding; } } PRINTF_DEBUG(("sprintf: appending \"%s\"\n", add)); strncpy(&(*buffer)[*pos], add, max_width); - *pos += MIN(max_width,len); + *pos += MIN(max_width, len); if (alignment == ALIGN_LEFT) { while (npad--) { (*buffer)[(*pos)++] = padding; @@ -200,7 +205,7 @@ inline static void _php3_sprintf_appendint(char **buffer, int *pos, int *size, int number, - int width, char padding, int alignment) + int width, char padding, int alignment, int expprec) { char numbuf[NUM_BUF_SIZE]; register unsigned int magn, nmagn, i = NUM_BUF_SIZE - 1, neg = 0; @@ -232,7 +237,8 @@ PRINTF_DEBUG(("sprintf: appending %d as \"%s\", i=%d\n", number, &numbuf[i], i)); _php3_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0, - padding, alignment, (NUM_BUF_SIZE - 1) - i, neg); + padding, alignment, (NUM_BUF_SIZE - 1) - i, + neg, expprec); } @@ -241,7 +247,7 @@ int *size, double number, int width, char padding, int alignment, int precision, - int adjust, char fmt) + int adjust, char fmt, int expprec) { char numbuf[NUM_BUF_SIZE]; char *cvt; @@ -293,14 +299,14 @@ width += (precision + 1); } _php3_sprintf_appendstring(buffer, pos, size, numbuf, width, 0, padding, - alignment, i, sign); + alignment, i, sign, expprec); } inline static void _php3_sprintf_append2n(char **buffer, int *pos, int *size, int number, int width, char padding, int alignment, int n, - char *chartable) + char *chartable, int expprec) { char numbuf[NUM_BUF_SIZE]; register unsigned int num, i = NUM_BUF_SIZE - 1, neg = 0; @@ -330,7 +336,8 @@ numbuf[--i] = '-'; } _php3_sprintf_appendstring(buffer, pos, size, &numbuf[i], width, 0, - padding, alignment, (NUM_BUF_SIZE - 1) - i, neg); + padding, alignment, (NUM_BUF_SIZE - 1) - i, + neg, expprec); } @@ -399,6 +406,8 @@ currarg = 1; while (format[inpos]) { + int expprec = 0; + PRINTF_DEBUG(("sprintf: format[%d]='%c'\n", inpos, format[inpos])); PRINTF_DEBUG(("sprintf: outpos=%d\n", outpos)); if (format[inpos] != '%') { @@ -461,6 +470,7 @@ if (isdigit((int)format[inpos])) { precision = _php3_sprintf_getnumber(format, &inpos); adjusting |= ADJ_PRECISION; + expprec = 1; } else { precision = 0; } @@ -484,14 +494,16 @@ args[currarg]->value.str.val, width, precision, padding, alignment, - args[currarg]->value.str.len,0); + args[currarg]->value.str.len, 0, + expprec); break; case 'd': convert_to_long(args[currarg]); _php3_sprintf_appendint(&result, &outpos, &size, args[currarg]->value.lval, - width, padding, alignment); + width, padding, alignment, + expprec); break; case 'e': @@ -502,7 +514,7 @@ args[currarg]->value.dval, width, padding, alignment, precision, adjusting, - format[inpos]); + format[inpos], expprec); break; case 'c': @@ -516,7 +528,7 @@ _php3_sprintf_append2n(&result, &outpos, &size, args[currarg]->value.lval, width, padding, alignment, 3, - hexchars); + hexchars, expprec); break; case 'x': @@ -524,7 +536,7 @@ _php3_sprintf_append2n(&result, &outpos, &size, args[currarg]->value.lval, width, padding, alignment, 4, - hexchars); + hexchars, expprec); break; case 'X': @@ -532,7 +544,7 @@ _php3_sprintf_append2n(&result, &outpos, &size, args[currarg]->value.lval, width, padding, alignment, 4, - HEXCHARS); + HEXCHARS, expprec); break; case 'b': @@ -540,7 +552,7 @@ _php3_sprintf_append2n(&result, &outpos, &size, args[currarg]->value.lval, width, padding, alignment, 1, - hexchars); + hexchars, expprec); break; case '%':

« previous php.cvs (#754) next »