Re: [PHP-DEV] Patch to extract()

2002-02-28 Thread Hartmut Holzgraefe

Richard Heyes wrote:
 Anyone interested in this patch?
 
 

not really, i'd use foreach and unset on the array before
extracting, far less obfuscated than the callback approach

or, if the array should not be modifiert:

function callback($value, $key) {
   if(preg_match('/^var/', $key)) {
 $GLOBALS[$key] = $value;
   }
}

array_walk($array,callback);

-- 
Hartmut Holzgraefe  [EMAIL PROTECTED]  http://www.six.de  +49-711-99091-77

Wir stellen für Sie aus auf der CeBIT 2002 und freuen uns
in Halle 6 auf Ihren Besuch am Stand H 18


-- 
PHP Development Mailing List http://www.php.net/
To unsubscribe, visit: http://www.php.net/unsub.php




RE: [PHP-DEV] Patch to extract()

2002-02-27 Thread Richard Heyes

Anyone interested in this patch?

-- 
Richard Heyes
If you have any trouble sounding condescending,
find a Unix user to show you how it's done. - Scott Adams 

 -Original Message-
 From: Richard Heyes [mailto:[EMAIL PROTECTED]]
 Sent: 25 February 2002 16:18
 To: PHP Dev
 Subject: [PHP-DEV] Patch to extract()
 
 
 I've added an extra option extract() to have potential variable 
 names passed
 to a user defined callback function. If this function then returns true,
 it's extracted, if not it's not.
 
 Anyone care to apply/check it?
 
 Eg.:
 
 ?php
 function extract_callback($varname){
   return preg_match('/^var/', $varname);
 }
 
 $var['var_1'] = 1;
 $var['var_2'] = 1;
 $var['blaat'] = 1;
 
 extract($var, EXTR_USER_CALLBACK, 'extract_callback');
 
 printf('var_1: %s br', $var_1);
 printf('var_2: %s br', $var_2);
 printf('blaat: %s br', $blaat);
 ?
 

-- 
PHP Development Mailing List http://www.php.net/
To unsubscribe, visit: http://www.php.net/unsub.php




[PHP-DEV] Patch to extract()

2002-02-25 Thread Richard Heyes

I've added an extra option extract() to have potential variable names passed
to a user defined callback function. If this function then returns true,
it's extracted, if not it's not.

Anyone care to apply/check it?

Eg.:

?php
function extract_callback($varname){
return preg_match('/^var/', $varname);
}

$var['var_1'] = 1;
$var['var_2'] = 1;
$var['blaat'] = 1;

extract($var, EXTR_USER_CALLBACK, 'extract_callback');

printf('var_1: %s br', $var_1);
printf('var_2: %s br', $var_2);
printf('blaat: %s br', $blaat);
?


Index: array.c
===
RCS file: /repository/php4/ext/standard/array.c,v
retrieving revision 1.156
diff -u -u -r1.156 array.c
--- array.c 5 Feb 2002 20:43:48 -   1.156
+++ array.c 25 Feb 2002 16:07:10 -
@@ -59,7 +59,8 @@
 #defineEXTR_PREFIX_INVALID 4
 #defineEXTR_PREFIX_IF_EXISTS   5
 #defineEXTR_IF_EXISTS  6
-
+#defineEXTR_USER_CALLBACK  7
+
 #define SORT_REGULAR   0
 #define SORT_NUMERIC   1
 #defineSORT_STRING 2
@@ -86,7 +87,8 @@
REGISTER_LONG_CONSTANT(EXTR_PREFIX_INVALID, EXTR_PREFIX_INVALID, CONST_CS | 
CONST_PERSISTENT);
REGISTER_LONG_CONSTANT(EXTR_PREFIX_IF_EXISTS, EXTR_PREFIX_IF_EXISTS, 
CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT(EXTR_IF_EXISTS, EXTR_IF_EXISTS, CONST_CS | 
CONST_PERSISTENT);
-   
+   REGISTER_LONG_CONSTANT(EXTR_USER_CALLBACK, EXTR_USER_CALLBACK, CONST_CS | 
+CONST_PERSISTENT);
+
REGISTER_LONG_CONSTANT(SORT_ASC, SORT_ASC, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT(SORT_DESC, SORT_DESC, CONST_CS | CONST_PERSISTENT);
 
@@ -1137,7 +1139,7 @@
 PHP_FUNCTION(extract)
 {
zval **var_array, **z_extract_type, **prefix;
-   zval **entry, *data;
+   zval **entry, *data, *user_callback_retval, **user_callback_args[1], 
+*user_callback_arg;
char *var_name;
smart_str final_name = {0};
ulong num_key;
@@ -1163,6 +1165,11 @@
php_error(E_WARNING, %s() expects a prefix to be 
specified,
  get_active_function_name(TSRMLS_C));
return;
+
+   }else if(extract_type == EXTR_USER_CALLBACK){
+   php_error(E_WARNING, %s() expects a user defined 
+function to be specified,
+ get_active_function_name(TSRMLS_C));
+   return;
}
break;

@@ -1180,7 +1187,7 @@
break;
}

-   if (extract_type  EXTR_OVERWRITE || extract_type  EXTR_IF_EXISTS) {
+   if (extract_type  EXTR_OVERWRITE || extract_type  EXTR_USER_CALLBACK) {
php_error(E_WARNING, Unknown extract type in call to %s(),
  get_active_function_name(TSRMLS_C));
return;
@@ -1248,8 +1255,30 @@
} else
smart_str_appendl(final_name, 
var_name, var_name_len);
}
-   break;
-
+   break;
+
+   case EXTR_USER_CALLBACK:
+   user_callback_arg = emalloc(sizeof(zval));
+   MAKE_STD_ZVAL(user_callback_arg);
+   ZVAL_STRING(user_callback_arg, var_name, 0);
+
+   *(user_callback_args[0]) = user_callback_arg;
+
+   if(call_user_function_ex(EG(function_table), NULL, 
+*prefix, user_callback_retval, 1, user_callback_args, 0, NULL TSRMLS_CC) != SUCCESS){
+   php_error(E_WARNING, Failed to call user 
+function: %s(), Z_STRVAL_PP(prefix));
+   return;
+   }
+   efree(user_callback_arg);
+
+   if(!Z_BVAL_P(user_callback_retval)){
+   
+zend_hash_move_forward_ex(Z_ARRVAL_PP(var_array), pos);
+   continue;
+   }else{
+   smart_str_appendl(final_name, var_name, 
+var_name_len);
+   }
+
+   break;
+
default:
if (!var_exists)
smart_str_appendl(final_name, var_name, 
var_name_len);



-- 
PHP Development Mailing List http://www.php.net/
To unsubscribe, visit: http://www.php.net/unsub.php