Hi PHP Team, I have made a patch, so PHP can support swapping of arguments to printf (and friends), the way libc do it. This is especialy usefull when doing internationalization (see http://www.gnu.org/manual/gettext/html_mono/gettext.html#SEC17 for example), but it is also usefull when you need to print some argument several times. I hope it's usefull :-) Greetings, Morten -- mortenp "Programs expand to fill the memory available to hold them" --- Parkinson's Law
diff -ur php-4.0.4pl1.orig/ext/standard/formatted_print.c
php-4.0.4pl1/ext/standard/formatted_print.c
--- php-4.0.4pl1.orig/ext/standard/formatted_print.c Fri Apr 6 16:07:49 2001
+++ php-4.0.4pl1/ext/standard/formatted_print.c Fri Apr 6 16:48:02 2001
@@ -391,7 +391,7 @@
{
pval ***args;
int argc, size = 240, inpos = 0, outpos = 0;
- int alignment, width, precision, currarg, adjusting;
+ int alignment, width, precision, currarg, adjusting, argnum, tempnum;
char *format, *result, padding;
argc = ZEND_NUM_ARGS();
@@ -459,17 +459,38 @@
(alignment == ALIGN_LEFT) ?
"left" : "right"));
- /* after modifiers comes width */
+ /* after modifiers comes width or argnum */
if (isdigit((int)format[inpos])) {
- PRINTF_DEBUG(("sprintf: getting width\n"));
- width = php_sprintf_getnumber(format, &inpos);
- adjusting |= ADJ_WIDTH;
+ PRINTF_DEBUG(("sprintf: getting width or
+argnum\n"));
+ tempnum = php_sprintf_getnumber(format,
+&inpos);
+ if (format[inpos] == '$') {
+ argnum = tempnum;
+ inpos++; /* skip the '$' */
+ if (isdigit((int)format[inpos])) {
+ width =
+php_sprintf_getnumber(format, &inpos);
+ adjusting |= ADJ_WIDTH;
+ } else {
+ width = 0;
+ }
+ } else {
+ argnum = currarg++;
+ width = tempnum;
+ adjusting |= ADJ_WIDTH;
+ }
} else {
+ argnum = currarg++;
width = 0;
}
PRINTF_DEBUG(("sprintf: width=%d\n", width));
- /* after width comes precision */
+ if (argnum >= argc) {
+ efree(result);
+ efree(args);
+ php_error(E_WARNING, "%s(): too few
+arguments",get_active_function_name());
+ return NULL;
+ }
+
+ /* after width and argnum comes precision */
if (format[inpos] == '.') {
inpos++;
PRINTF_DEBUG(("sprintf: getting precision\n"));
@@ -495,67 +516,67 @@
/* now we expect to find a type specifier */
switch (format[inpos]) {
case 's':
- convert_to_string_ex(args[currarg]);
+ convert_to_string_ex(args[argnum]);
php_sprintf_appendstring(&result, &outpos,
&size,
-
(*args[currarg])->value.str.val,
+
+ (*args[argnum])->value.str.val,
width, precision, padding,
alignment,
-
(*args[currarg])->value.str.len,
+
+ (*args[argnum])->value.str.len,
0, expprec);
break;
case 'd':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_appendint(&result, &outpos, &size,
-
(*args[currarg])->value.lval,
+
+(*args[argnum])->value.lval,
width, padding, alignment);
break;
case 'e':
case 'f':
/* XXX not done */
- convert_to_double_ex(args[currarg]);
+ convert_to_double_ex(args[argnum]);
php_sprintf_appenddouble(&result, &outpos,
&size,
-
(*args[currarg])->value.dval,
+
+ (*args[argnum])->value.dval,
width, padding, alignment,
precision, adjusting,
format[inpos]);
break;
case 'c':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_appendchar(&result, &outpos, &size,
- (char)
(*args[currarg])->value.lval);
+ (char)
+(*args[argnum])->value.lval);
break;
case 'o':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_append2n(&result, &outpos, &size,
-
(*args[currarg])->value.lval,
+
+(*args[argnum])->value.lval,
width, padding, alignment, 3,
hexchars, expprec);
break;
case 'x':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_append2n(&result, &outpos, &size,
-
(*args[currarg])->value.lval,
+
+(*args[argnum])->value.lval,
width, padding, alignment, 4,
hexchars, expprec);
break;
case 'X':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_append2n(&result, &outpos, &size,
-
(*args[currarg])->value.lval,
+
+(*args[argnum])->value.lval,
width, padding, alignment, 4,
HEXCHARS, expprec);
break;
case 'b':
- convert_to_long_ex(args[currarg]);
+ convert_to_long_ex(args[argnum]);
php_sprintf_append2n(&result, &outpos, &size,
-
(*args[currarg])->value.lval,
+
+(*args[argnum])->value.lval,
width, padding, alignment, 1,
hexchars, expprec);
break;
@@ -567,7 +588,6 @@
default:
break;
}
- currarg++;
inpos++;
}
}
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]
