summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-09-03 19:12:07 +0000
committerZeev Suraski <zeev@php.net>1999-09-03 19:12:07 +0000
commit3feb4b3bdd7d5b662929c7ec7a26507e28335553 (patch)
tree32ac4696e0504721a16e67462e678ca9a8afc760
parentc1a4861eb1b4b5c048bf2ca4cc1acc32fd47d227 (diff)
downloadphp-git-3feb4b3bdd7d5b662929c7ec7a26507e28335553.tar.gz
Add new API for resources
-rw-r--r--Zend/zend_list.c44
-rw-r--r--Zend/zend_list.h11
-rw-r--r--Zend/zend_modules.h6
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