Merge branch 'master' into phpng
[m6w6/ext-http] / php_http_options.c
index 07a5d7bb28f1ffa1dc7b982ce2bfd73086378837..d4be512a7e1e9584cdace1a12429054fee90e471 100644 (file)
@@ -6,13 +6,23 @@
     | modification, are permitted provided that the conditions mentioned |
     | in the accompanying LICENSE file are met.                          |
     +--------------------------------------------------------------------+
-    | Copyright (c) 2004-2013, Michael Wallner <mike@php.net>            |
+    | Copyright (c) 2004-2014, Michael Wallner <mike@php.net>            |
     +--------------------------------------------------------------------+
 */
 
 #include "php_http_api.h"
 
-PHP_HTTP_API php_http_options_t *php_http_options_init(php_http_options_t *registry, zend_bool persistent)
+static void php_http_options_hash_dtor(zval *pData)
+{
+       php_http_option_t *opt = Z_PTR_P(pData);
+
+       zval_ptr_dtor(&opt->defval);
+       zend_hash_destroy(&opt->suboptions.options);
+       zend_string_release(opt->name);
+       pefree(opt, opt->persistent);
+}
+
+php_http_options_t *php_http_options_init(php_http_options_t *registry, zend_bool persistent)
 {
        if (!registry) {
                registry = pecalloc(1, sizeof(*registry), persistent);
@@ -21,18 +31,19 @@ PHP_HTTP_API php_http_options_t *php_http_options_init(php_http_options_t *regis
        }
 
        registry->persistent = persistent;
-       zend_hash_init(&registry->options, 0, NULL, (dtor_func_t) zend_hash_destroy, persistent);
+       zend_hash_init(&registry->options, 0, NULL, php_http_options_hash_dtor, persistent);
 
        return registry;
 }
 
-PHP_HTTP_API STATUS php_http_options_apply(php_http_options_t *registry, HashTable *options, void *userdata)
+ZEND_RESULT_CODE php_http_options_apply(php_http_options_t *registry, HashTable *options, void *userdata)
 {
-       HashPosition pos;
-       zval *val;
+       zval *entry, *val;
        php_http_option_t *opt;
 
-       FOREACH_HASH_VAL(pos, &registry->options, opt) {
+       ZEND_HASH_FOREACH_VAL(&registry->options, entry)
+       {
+               opt = Z_PTR_P(entry);
                if (!(val = registry->getter(opt, options, userdata))) {
                        val = &opt->defval;
                }
@@ -44,15 +55,17 @@ PHP_HTTP_API STATUS php_http_options_apply(php_http_options_t *registry, HashTab
                        return FAILURE;
                }
        }
+       ZEND_HASH_FOREACH_END();
+
        return SUCCESS;
 }
 
-PHP_HTTP_API void php_http_options_dtor(php_http_options_t *registry)
+void php_http_options_dtor(php_http_options_t *registry)
 {
        zend_hash_destroy(&registry->options);
 }
 
-PHP_HTTP_API void php_http_options_free(php_http_options_t **registry)
+void php_http_options_free(php_http_options_t **registry)
 {
        if (*registry) {
                php_http_options_dtor(*registry);
@@ -61,9 +74,9 @@ PHP_HTTP_API void php_http_options_free(php_http_options_t **registry)
        }
 }
 
-PHP_HTTP_API php_http_option_t *php_http_option_register(php_http_options_t *registry, const char *name_str, size_t name_len, ulong option, zend_uchar type)
+php_http_option_t *php_http_option_register(php_http_options_t *registry, const char *name_str, size_t name_len, ulong option, zend_uchar type)
 {
-       php_http_option_t opt, *dst = NULL;
+       php_http_option_t opt;
 
        memset(&opt, 0, sizeof(opt));
 
@@ -71,22 +84,22 @@ PHP_HTTP_API php_http_option_t *php_http_option_register(php_http_options_t *reg
        opt.suboptions.getter = registry->getter;
        opt.suboptions.setter = registry->setter;
 
-       opt.name.h = zend_hash_func(opt.name.s = name_str, opt.name.l = name_len + 1);
+       opt.persistent = registry->persistent;
+       opt.name = zend_string_init(name_str, name_len, registry->persistent);
        opt.type = type;
        opt.option = option;
 
-       INIT_ZVAL(opt.defval);
        switch ((opt.type = type)) {
-       case IS_BOOL:
-               ZVAL_BOOL(&opt.defval, 0);
+       case IS_TRUE:
+               ZVAL_TRUE(&opt.defval);
                break;
 
-       case IS_LONG:
-               ZVAL_LONG(&opt.defval, 0);
+       case IS_FALSE:
+               ZVAL_FALSE(&opt.defval);
                break;
 
-       case IS_STRING:
-               ZVAL_STRINGL(&opt.defval, NULL, 0, 0);
+       case IS_LONG:
+               ZVAL_LONG(&opt.defval, 0);
                break;
 
        case IS_DOUBLE:
@@ -98,18 +111,13 @@ PHP_HTTP_API php_http_option_t *php_http_option_register(php_http_options_t *reg
                break;
        }
 
-       zend_hash_quick_update(&registry->options, opt.name.s, opt.name.l, opt.name.h, (void *) &opt, sizeof(opt), (void *) &dst);
-       return dst;
+       return zend_hash_update_mem(&registry->options, opt.name, &opt, sizeof(opt));
 }
 
-PHP_HTTP_API zval *php_http_option_get(php_http_option_t *opt, HashTable *options, void *userdata)
+zval *php_http_option_get(php_http_option_t *opt, HashTable *options, void *userdata)
 {
        if (options) {
-               zval **zoption;
-
-               if (SUCCESS == zend_hash_quick_find(options, opt->name.s, opt->name.l, opt->name.h, (void *) &zoption)) {
-                       return *zoption;
-               }
+               return zend_hash_find(options, opt->name);
        }
 
        return NULL;