]> granicus.if.org Git - php/commitdiff
Add new API for resources
authorZeev Suraski <zeev@php.net>
Fri, 3 Sep 1999 19:12:07 +0000 (19:12 +0000)
committerZeev Suraski <zeev@php.net>
Fri, 3 Sep 1999 19:12:07 +0000 (19:12 +0000)
Zend/zend_list.c
Zend/zend_list.h
Zend/zend_modules.h

index 44992abd3e026934463500d0bfad60e9fec457ae..9f4f05774d531e6bf3454f3e9b0d134504ff948d 100644 (file)
@@ -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;
index b7bf03f4ed329a05a077059e8c0382df21e01529..c42c3192ad0cdb40ebc6b0528c5d0656a3a103b8 100644 (file)
@@ -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
index b9b9fac7878321afdef05db64d5a6d5f854e1e7f..71f7400cf26988f1c5b18e54948298016aa6d765 100644 (file)
@@ -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