cvs: php3 / ChangeLog /functions formatted_print.c
| From: | Ken Coar | 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 '%':