]> granicus.if.org Git - php/commitdiff
Add zend_lookup_ns_class() function.
authorAndrei Zmievski <andrei@php.net>
Tue, 8 Apr 2003 17:10:01 +0000 (17:10 +0000)
committerAndrei Zmievski <andrei@php.net>
Tue, 8 Apr 2003 17:10:01 +0000 (17:10 +0000)
Zend/zend_execute.h
Zend/zend_execute_API.c

index 252ea0c97babc7fabb32a1afec21a33e8a81e32f..5420e30a0ce3285b1ed92af795632d4f182c8f8e 100644 (file)
@@ -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);
 
index e87b9570cf9de68a2793fe363c23f6e918a6819d..0890ead5f7d8ea07d0e4dc933855a01e8d1a5047 100644 (file)
@@ -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;