summaryrefslogtreecommitdiff
path: root/Zend/zend_list.c
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 /Zend/zend_list.c
parentc1a4861eb1b4b5c048bf2ca4cc1acc32fd47d227 (diff)
downloadphp-git-3feb4b3bdd7d5b662929c7ec7a26507e28335553.tar.gz
Add new API for resources
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r--Zend/zend_list.c44
1 files changed, 44 insertions, 0 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;