@@ -390,8 +390,8 @@ static char *
390
390
php_formatted_print (int ht , int * len )
391
391
{
392
392
pval * * * args ;
393
- int argc , size = 240 , inpos = 0 , outpos = 0 ;
394
- int alignment , width , precision , currarg , adjusting ;
393
+ int argc , size = 240 , inpos = 0 , outpos = 0 , temppos ;
394
+ int alignment , width , precision , currarg , adjusting , argnum ;
395
395
char * format , * result , padding ;
396
396
397
397
argc = ZEND_NUM_ARGS ();
@@ -437,7 +437,23 @@ php_formatted_print(int ht, int *len)
437
437
PRINTF_DEBUG (("sprintf: first looking at '%c', inpos=%d\n" ,
438
438
format [inpos ], inpos ));
439
439
if (isascii ((int )format [inpos ]) && !isalpha ((int )format [inpos ])) {
440
- /* first look for modifiers */
440
+ /* first look for argnum */
441
+ temppos = inpos ;
442
+ while (isdigit ((int )format [temppos ])) temppos ++ ;
443
+ if (format [temppos ] == '$' ) {
444
+ argnum = php_sprintf_getnumber (format , & inpos );
445
+ inpos ++ ; /* skip the '$' */
446
+ } else {
447
+ argnum = currarg ++ ;
448
+ }
449
+ if (argnum >= argc ) {
450
+ efree (result );
451
+ efree (args );
452
+ php_error (E_WARNING , "%s(): too few arguments" ,get_active_function_name ());
453
+ return NULL ;
454
+ }
455
+
456
+ /* after argnum comes modifiers */
441
457
PRINTF_DEBUG (("sprintf: looking for modifiers\n"
442
458
"sprintf: now looking at '%c', inpos=%d\n" ,
443
459
format [inpos ], inpos ));
@@ -469,7 +485,7 @@ php_formatted_print(int ht, int *len)
469
485
}
470
486
PRINTF_DEBUG (("sprintf: width=%d\n" , width ));
471
487
472
- /* after width comes precision */
488
+ /* after width and argnum comes precision */
473
489
if (format [inpos ] == '.' ) {
474
490
inpos ++ ;
475
491
PRINTF_DEBUG (("sprintf: getting precision\n" ));
@@ -486,6 +502,7 @@ php_formatted_print(int ht, int *len)
486
502
PRINTF_DEBUG (("sprintf: precision=%d\n" , precision ));
487
503
} else {
488
504
width = precision = 0 ;
505
+ argnum = currarg ++ ;
489
506
}
490
507
491
508
if (format [inpos ] == 'l' ) {
@@ -495,67 +512,67 @@ php_formatted_print(int ht, int *len)
495
512
/* now we expect to find a type specifier */
496
513
switch (format [inpos ]) {
497
514
case 's' :
498
- convert_to_string_ex (args [currarg ]);
515
+ convert_to_string_ex (args [argnum ]);
499
516
php_sprintf_appendstring (& result , & outpos , & size ,
500
- (* args [currarg ])-> value .str .val ,
517
+ (* args [argnum ])-> value .str .val ,
501
518
width , precision , padding ,
502
519
alignment ,
503
- (* args [currarg ])-> value .str .len ,
520
+ (* args [argnum ])-> value .str .len ,
504
521
0 , expprec );
505
522
break ;
506
523
507
524
case 'd' :
508
- convert_to_long_ex (args [currarg ]);
525
+ convert_to_long_ex (args [argnum ]);
509
526
php_sprintf_appendint (& result , & outpos , & size ,
510
- (* args [currarg ])-> value .lval ,
527
+ (* args [argnum ])-> value .lval ,
511
528
width , padding , alignment );
512
529
break ;
513
530
514
531
case 'e' :
515
532
case 'f' :
516
533
/* XXX not done */
517
- convert_to_double_ex (args [currarg ]);
534
+ convert_to_double_ex (args [argnum ]);
518
535
php_sprintf_appenddouble (& result , & outpos , & size ,
519
- (* args [currarg ])-> value .dval ,
536
+ (* args [argnum ])-> value .dval ,
520
537
width , padding , alignment ,
521
538
precision , adjusting ,
522
539
format [inpos ]);
523
540
break ;
524
541
525
542
case 'c' :
526
- convert_to_long_ex (args [currarg ]);
543
+ convert_to_long_ex (args [argnum ]);
527
544
php_sprintf_appendchar (& result , & outpos , & size ,
528
- (char ) (* args [currarg ])-> value .lval );
545
+ (char ) (* args [argnum ])-> value .lval );
529
546
break ;
530
547
531
548
case 'o' :
532
- convert_to_long_ex (args [currarg ]);
549
+ convert_to_long_ex (args [argnum ]);
533
550
php_sprintf_append2n (& result , & outpos , & size ,
534
- (* args [currarg ])-> value .lval ,
551
+ (* args [argnum ])-> value .lval ,
535
552
width , padding , alignment , 3 ,
536
553
hexchars , expprec );
537
554
break ;
538
555
539
556
case 'x' :
540
- convert_to_long_ex (args [currarg ]);
557
+ convert_to_long_ex (args [argnum ]);
541
558
php_sprintf_append2n (& result , & outpos , & size ,
542
- (* args [currarg ])-> value .lval ,
559
+ (* args [argnum ])-> value .lval ,
543
560
width , padding , alignment , 4 ,
544
561
hexchars , expprec );
545
562
break ;
546
563
547
564
case 'X' :
548
- convert_to_long_ex (args [currarg ]);
565
+ convert_to_long_ex (args [argnum ]);
549
566
php_sprintf_append2n (& result , & outpos , & size ,
550
- (* args [currarg ])-> value .lval ,
567
+ (* args [argnum ])-> value .lval ,
551
568
width , padding , alignment , 4 ,
552
569
HEXCHARS , expprec );
553
570
break ;
554
571
555
572
case 'b' :
556
- convert_to_long_ex (args [currarg ]);
573
+ convert_to_long_ex (args [argnum ]);
557
574
php_sprintf_append2n (& result , & outpos , & size ,
558
- (* args [currarg ])-> value .lval ,
575
+ (* args [argnum ])-> value .lval ,
559
576
width , padding , alignment , 1 ,
560
577
hexchars , expprec );
561
578
break ;
@@ -567,7 +584,6 @@ php_formatted_print(int ht, int *len)
567
584
default :
568
585
break ;
569
586
}
570
- currarg ++ ;
571
587
inpos ++ ;
572
588
}
573
589
}
0 commit comments