Morten Poulsen <[EMAIL PROTECTED]> said:
> i'll fix it and send a new patch, sorry..

Allright, here is the new patch. Sorry about all the fuzz.

Greetings,
Morten

-- 
mortenp

Thus spake the master programmer: "Let the programmers be many and the
managers few -- then all will be productive."
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 18:19:38 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"));
@@ -486,6 +507,7 @@
                                PRINTF_DEBUG(("sprintf: precision=%d\n", precision));
                        } else {
                                width = precision = 0;
+                               argnum = currarg++;
                        }
 
                        if (format[inpos] == 'l') {
@@ -495,67 +517,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 +589,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]

Reply via email to