]> granicus.if.org Git - php/commitdiff
Add zend_make_callable() which allows to make zval's callable zval's.
authorMarcus Boerger <helly@php.net>
Sat, 25 Oct 2003 22:58:06 +0000 (22:58 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 25 Oct 2003 22:58:06 +0000 (22:58 +0000)
At the moment this function only converts strings of the form class::method
to an array(class,method).

Zend/zend_API.c
Zend/zend_API.h

index f9a868ddda687bcdf014d9e7fb1d5b0dd9c01a26..a18de9fda793519b6b61a78440d30f5cd2b7841b 100644 (file)
@@ -1573,7 +1573,7 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_
        return 1;
 }
 
-zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callable_name)
+ZEND_API zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callable_name)
 {
        char *lcname;
        zend_bool retval = 0;
@@ -1685,6 +1685,33 @@ zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callabl
 }
 
 
+ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC)
+{
+       char *lcname, *func;
+       zend_bool retval = 0;
+
+       if (zend_is_callable(callable, 0, callable_name)) {
+               return 1;
+       }
+       switch (Z_TYPE_P(callable)) {
+               case IS_STRING:
+                       lcname = zend_str_tolower_dup(Z_STRVAL_P(callable), Z_STRLEN_P(callable));
+
+                       if ((func = strstr(lcname, "::")) != NULL) {
+                               zval_dtor(callable);
+                               array_init(callable);
+                               add_next_index_stringl(callable, lcname, func - lcname, 1);
+                               func += 2;
+                               add_next_index_stringl(callable, func, strlen(func), 1);
+                               retval = 1; 
+                       }
+                       efree(lcname);
+                       break;
+       }
+       return retval;
+}
+
+
 ZEND_API char *zend_get_module_version(char *module_name)
 {
        zend_module_entry *module;
index 0b079bbfb8aba5fcbe2b32e863e8982e642390f5..5ea3c877fec126a186999286f8654cad24c0eb75 100644 (file)
@@ -169,6 +169,7 @@ ZEND_API int zend_disable_class(char *class_name, uint class_name_length TSRMLS_
 
 ZEND_API void zend_wrong_param_count(TSRMLS_D);
 ZEND_API zend_bool zend_is_callable(zval *callable, zend_bool syntax_only, char **callable_name);
+ZEND_API zend_bool zend_make_callable(zval *callable, char **callable_name TSRMLS_DC);
 ZEND_API char *zend_get_module_version(char *module_name);
 ZEND_API int zend_declare_property(zend_class_entry *ce, char *name, int name_length, zval *property, int access_type TSRMLS_DC);
 ZEND_API int zend_declare_property_null(zend_class_entry *ce, char *name, int name_length, int access_type TSRMLS_DC);