diff options
| author | Zeev Suraski <zeev@php.net> | 1999-09-03 19:12:07 +0000 |
|---|---|---|
| committer | Zeev Suraski <zeev@php.net> | 1999-09-03 19:12:07 +0000 |
| commit | 3feb4b3bdd7d5b662929c7ec7a26507e28335553 (patch) | |
| tree | 32ac4696e0504721a16e67462e678ca9a8afc760 | |
| parent | c1a4861eb1b4b5c048bf2ca4cc1acc32fd47d227 (diff) | |
| download | php-git-3feb4b3bdd7d5b662929c7ec7a26507e28335553.tar.gz | |
Add new API for resources
| -rw-r--r-- | Zend/zend_list.c | 44 | ||||
| -rw-r--r-- | Zend/zend_list.h | 11 | ||||
| -rw-r--r-- | Zend/zend_modules.h | 6 |
3 files changed, 58 insertions, 3 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 44992abd3e..9f4f05774d 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -18,6 +18,8 @@ */ +/* resource lists */ + #include "zend.h" #include "zend_list.h" #include "zend_API.h" @@ -137,6 +139,48 @@ ZEND_API void *zend_plist_find(int id, int *type) } +ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, char *resource_type_name, int resource_type) +{ + return zend_fetch_resource_ex(passed_id, default_id, resource_type_name, 1, resource_type); +} + + +ZEND_API void *zend_fetch_resource_ex(zval *passed_id, int default_id, char *resource_type_name, int num_resource_types, ...) +{ + int id; + int actual_resource_type; + void *resource; + va_list resource_types; + int i; + + if (default_id==-1) { /* use id */ + if (passed_id->type != IS_RESOURCE) { + zend_error(E_WARNING, "Supplied argument is not a valid %s resource", resource_type_name); + return NULL; + } + id = passed_id->value.lval; + } else { + id = default_id; + } + + resource = zend_list_find(id, &actual_resource_type); + if (!resource) { + zend_error(E_WARNING, "%d is not a valid %s resource", resource_type_name); + return NULL; + } + + va_start(resource_types, num_resource_types); + for (i=0; i<num_resource_types; i++) { + if (actual_resource_type == va_arg(resource_types, int)) { + va_end(resource_types); + return resource; + } + } + va_end(resource_types); + return NULL; +} + + int list_entry_destructor(void *ptr) { list_entry *le = (list_entry *) ptr; diff --git a/Zend/zend_list.h b/Zend/zend_list.h index b7bf03f4ed..c42c3192ad 100644 --- a/Zend/zend_list.h +++ b/Zend/zend_list.h @@ -62,7 +62,18 @@ ZEND_API int zend_list_delete(int id); ZEND_API int zend_plist_delete(int id); ZEND_API void *zend_list_find(int id, int *type); ZEND_API void *zend_plist_find(int id, int *type); +ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, char *resource_type_name, int resource_type); +ZEND_API void *zend_fetch_resource_ex(zval *passed_id, int default_id, char *resource_type_name, int num_resource_types, ...); extern ZEND_API int le_index_ptr; /* list entry type for index pointers */ +#define ZEND_VERIFY_RESOURCE(rsrc) \ + if (!rsrc) { \ + RETURN_FALSE; \ + } + +#define ZEND_FETCH_RESOURCE(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type) \ + rsrc = (rsrc_type) zend_fetch_resource(passed_id, default_id, resource_type_name, resource_type); \ + ZEND_VERIFY_RESOURCE(rsrc); + #endif diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h index b9b9fac787..71f7400cf2 100644 --- a/Zend/zend_modules.h +++ b/Zend/zend_modules.h @@ -56,9 +56,9 @@ struct _zend_module_entry { extern HashTable module_registry; -extern void module_destructor(zend_module_entry *module); -extern int module_registry_cleanup(zend_module_entry *module); -extern int module_registry_request_startup(zend_module_entry *module); +void module_destructor(zend_module_entry *module); +int module_registry_cleanup(zend_module_entry *module); +int module_registry_request_startup(zend_module_entry *module); #define ZEND_MODULE_DTOR (int (*)(void *)) module_destructor #endif |
