diff options
| author | Andrei Zmievski <andrei@php.net> | 2003-04-08 17:10:01 +0000 |
|---|---|---|
| committer | Andrei Zmievski <andrei@php.net> | 2003-04-08 17:10:01 +0000 |
| commit | 3b47a64269ed8bcf165d1826b543d91f4efb6f68 (patch) | |
| tree | dd156fdde634b09e684f02669d9f5def2607ea2a /Zend/zend_execute_API.c | |
| parent | 2154cddd0ec3d68274dac88c420f52c3c000698b (diff) | |
| download | php-git-3b47a64269ed8bcf165d1826b543d91f4efb6f68.tar.gz | |
Add zend_lookup_ns_class() function.
Diffstat (limited to 'Zend/zend_execute_API.c')
| -rw-r--r-- | Zend/zend_execute_API.c | 34 |
1 files changed, 34 insertions, 0 deletions
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; |
