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]