In what case is this useful? I'm kind of worried that so many functions are
popping up in PHP which accept arrays as parameters. It's much slower than
passing the arguments in a regular way. How often do people dynamically
build formats *and* then dynamically build an array of arguments?
Andi
At 07:44 PM 8/7/2001 +0000, Andrei Zmievski wrote:
>andrei Tue Aug 7 15:44:46 2001 EDT
>
> Modified files:
> /php4/ext/standard basic_functions.c formatted_print.c php_string.h
> Log:
>
> @- Added vprintf() and vsprintf() functions that allow passing all
> arguments
> @ after format as an array. (Andrei)
>
>
>
>Index: php4/ext/standard/basic_functions.c
>diff -u php4/ext/standard/basic_functions.c:1.379
>php4/ext/standard/basic_functions.c:1.380
>--- php4/ext/standard/basic_functions.c:1.379 Mon Aug 6 09:36:08 2001
>+++ php4/ext/standard/basic_functions.c Tue Aug 7 15:44:44 2001
>@@ -17,7 +17,7 @@
> +----------------------------------------------------------------------+
> */
>
>-/* $Id: basic_functions.c,v 1.379 2001/08/06 13:36:08 thies Exp $ */
>+/* $Id: basic_functions.c,v 1.380 2001/08/07 19:44:44 andrei Exp $ */
>
> #include "php.h"
> #include "php_main.h"
>@@ -208,6 +208,8 @@
> PHP_FALIAS(strchr, strstr,
> NULL)
> PHP_NAMED_FE(sprintf, PHP_FN(user_sprintf), NULL)
> PHP_NAMED_FE(printf, PHP_FN(user_printf), NULL)
>+ PHP_FE(vprintf,
> NULL)
>+ PHP_FE(vsprintf,
> NULL)
> PHP_FE(sscanf,
> third_and_rest_force_ref)
> PHP_FE(fscanf,
> third_and_rest_force_ref)
> PHP_FE(parse_url,
> NULL)
>Index: php4/ext/standard/formatted_print.c
>diff -u php4/ext/standard/formatted_print.c:1.38
>php4/ext/standard/formatted_print.c:1.39
>--- php4/ext/standard/formatted_print.c:1.38 Mon Jul 30 04:24:36 2001
>+++ php4/ext/standard/formatted_print.c Tue Aug 7 15:44:45 2001
>@@ -16,7 +16,7 @@
> +----------------------------------------------------------------------+
> */
>
>-/* $Id: formatted_print.c,v 1.38 2001/07/30 08:24:36 zeev Exp $ */
>+/* $Id: formatted_print.c,v 1.39 2001/08/07 19:44:45 andrei Exp $ */
>
> #include <math.h> /* modf() */
> #include "php.h"
>@@ -408,23 +408,40 @@
> *
> */
> static char *
>-php_formatted_print(int ht, int *len TSRMLS_DC)
>+php_formatted_print(int ht, int *len, int use_array TSRMLS_DC)
> {
>- pval ***args;
>+ zval ***args, **z_format, **array;
> int argc, size = 240, inpos = 0, outpos = 0, temppos;
> int alignment, width, precision, currarg, adjusting, argnum;
> char *format, *result, padding;
>
> argc = ZEND_NUM_ARGS();
>
>- if (argc < 1) {
>- WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
>- }
>- args = (pval ***)emalloc(argc * sizeof(pval *));
>+ if (use_array) {
>+ int i = 1;
>+
>+ if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(argc,
>&z_format, &array) == FAILURE) {
>+ WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
>+ }
>+ SEPARATE_ZVAL(array);
>+ convert_to_array_ex(array);
>+ argc = 1 + zend_hash_num_elements(Z_ARRVAL_PP(array));
>+ args = (zval ***)emalloc(argc * sizeof(zval *));
>+ args[0] = z_format;
>+ for (zend_hash_internal_pointer_reset(Z_ARRVAL_PP(array));
>+ zend_hash_get_current_data(Z_ARRVAL_PP(array),
>(void **)&args[i++]) == SUCCESS;
>+ zend_hash_move_forward(Z_ARRVAL_PP(array)));
>+ } else {
>+ if (argc < 1) {
>+ WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
>+ }
>+
>+ args = (zval ***)emalloc(argc * sizeof(zval *));
>
>- if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
>- efree(args);
>- WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
>+ if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
>+ efree(args);
>+ WRONG_PARAM_COUNT_WITH_RETVAL(NULL);
>+ }
> }
> convert_to_string_ex(args[0]);
> format = (*args[0])->value.str.val;
>@@ -632,7 +649,22 @@
> char *result;
> int len;
>
>- if ((result=php_formatted_print(ht, &len TSRMLS_CC))==NULL) {
>+ if ((result=php_formatted_print(ht, &len, 0 TSRMLS_CC))==NULL) {
>+ RETURN_FALSE;
>+ }
>+ RETVAL_STRINGL(result,len,1);
>+ efree(result);
>+}
>+/* }}} */
>+
>+/* {{{ proto string vsprintf(string format, array args)
>+ Return a formatted string */
>+PHP_FUNCTION(vsprintf)
>+{
>+ char *result;
>+ int len;
>+
>+ if ((result=php_formatted_print(ht, &len, 1 TSRMLS_CC))==NULL) {
> RETURN_FALSE;
> }
> RETVAL_STRINGL(result,len,1);
>@@ -647,7 +679,22 @@
> char *result;
> int len;
>
>- if ((result=php_formatted_print(ht, &len TSRMLS_CC))==NULL) {
>+ if ((result=php_formatted_print(ht, &len, 0 TSRMLS_CC))==NULL) {
>+ RETURN_FALSE;
>+ }
>+ PHPWRITE(result,len);
>+ efree(result);
>+}
>+/* }}} */
>+
>+/* {{{ proto int printf(string format, array args)
>+ Output a formatted string */
>+PHP_FUNCTION(vprintf)
>+{
>+ char *result;
>+ int len;
>+
>+ if ((result=php_formatted_print(ht, &len, 1 TSRMLS_CC))==NULL) {
> RETURN_FALSE;
> }
> PHPWRITE(result,len);
>Index: php4/ext/standard/php_string.h
>diff -u php4/ext/standard/php_string.h:1.47
>php4/ext/standard/php_string.h:1.48
>--- php4/ext/standard/php_string.h:1.47 Sun Aug 5 23:50:51 2001
>+++ php4/ext/standard/php_string.h Tue Aug 7 15:44:45 2001
>@@ -17,7 +17,7 @@
> +----------------------------------------------------------------------+
> */
>
>-/* $Id: php_string.h,v 1.47 2001/08/06 03:50:51 sas Exp $ */
>+/* $Id: php_string.h,v 1.48 2001/08/07 19:44:45 andrei Exp $ */
>
> /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
>
>@@ -57,6 +57,8 @@
> PHP_FUNCTION(hebrevc);
> PHP_FUNCTION(user_sprintf);
> PHP_FUNCTION(user_printf);
>+PHP_FUNCTION(vprintf);
>+PHP_FUNCTION(vsprintf);
> PHP_FUNCTION(addcslashes);
> PHP_FUNCTION(addslashes);
> PHP_FUNCTION(stripcslashes);
>
>
>
>--
>PHP CVS 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]
--
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]