From: Andrei Zmievski Date: Tue, 8 Apr 2003 17:10:01 +0000 (+0000) Subject: Add zend_lookup_ns_class() function. X-Git-Tag: RELEASE_0_5~92 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b47a64269ed8bcf165d1826b543d91f4efb6f68;p=php Add zend_lookup_ns_class() function. --- diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 252ea0c97b..5420e30a0c 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -68,6 +68,7 @@ static inline void safe_free_zval_ptr(zval *p) } } ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry ***ce TSRMLS_DC); +ZEND_API int zend_lookup_ns_class(char *name, int name_length, zend_class_entry ***ce TSRMLS_DC); ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSRMLS_DC); void zend_switch_namespace(zend_namespace *ns TSRMLS_DC); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e87b9570cf..0890ead5f7 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -765,6 +765,40 @@ ZEND_API int zend_lookup_class(char *name, int name_length, zend_class_entry *** return zend_hash_find(EG(class_table), name, name_length + 1, (void **) ce); } +ZEND_API int zend_lookup_ns_class(char *name, int name_length, zend_class_entry ***ce TSRMLS_DC) +{ + char *ns_name; + char *class_name; + char *name_end = name + name_length; + int ns_name_length; + zend_namespace **ns; + + /* handle simple class name case */ + if ((class_name = zend_memnstr(name, "::", sizeof("::")-1, name_end)) == NULL) { + return zend_lookup_class(name, name_length, ce TSRMLS_CC); + } + /* handle ::C case */ + if (class_name == name) { + return zend_lookup_class(name + sizeof("::")-1, name_length - sizeof("::")+1, ce TSRMLS_CC); + } + + ns_name_length = class_name - name; + class_name += sizeof("::")-1; + if (class_name == name_end) { + return FAILURE; + } + ns_name = zend_strndup(name, ns_name_length); + + if (zend_hash_find(&EG(global_namespace_ptr)->class_table, ns_name, ns_name_length+1, (void **)&ns) == SUCCESS && + zend_hash_find(&(*ns)->class_table, class_name, name_end - class_name + 1, (void **)ce) == SUCCESS) { + free(ns_name); + return SUCCESS; + } + + free(ns_name); + return FAILURE; +} + ZEND_API int zend_eval_string(char *str, zval *retval_ptr, char *string_name TSRMLS_DC) { zval pv;