X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=src%2Fphp_http_options.c;h=d4be512a7e1e9584cdace1a12429054fee90e471;hp=59b9c5f9fb6daa6fb66d6a23890f93f6f109bc29;hb=57e944b102006abfa4005337b0ac5901425f4289;hpb=bdd6edb59194cda9e5fcb393c48ab4230fceb32a diff --git a/src/php_http_options.c b/src/php_http_options.c index 59b9c5f..d4be512 100644 --- a/src/php_http_options.c +++ b/src/php_http_options.c @@ -12,6 +12,16 @@ #include "php_http_api.h" +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) { @@ -21,18 +31,19 @@ php_http_options_t *php_http_options_init(php_http_options_t *registry, zend_boo } registry->persistent = persistent; - zend_hash_init(®istry->options, 0, NULL, (dtor_func_t) zend_hash_destroy, persistent); + zend_hash_init(®istry->options, 0, NULL, php_http_options_hash_dtor, persistent); return registry; } 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, ®istry->options, opt) { + ZEND_HASH_FOREACH_VAL(®istry->options, entry) + { + opt = Z_PTR_P(entry); if (!(val = registry->getter(opt, options, userdata))) { val = &opt->defval; } @@ -44,6 +55,8 @@ ZEND_RESULT_CODE php_http_options_apply(php_http_options_t *registry, HashTable return FAILURE; } } + ZEND_HASH_FOREACH_END(); + return SUCCESS; } @@ -63,7 +76,7 @@ void php_http_options_free(php_http_options_t **registry) 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_option_t *php_http_option_register(php_http_options_t *registry, const 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_option_t *php_http_option_register(php_http_options_t *registry, const break; } - zend_hash_quick_update(®istry->options, opt.name.s, opt.name.l, opt.name.h, (void *) &opt, sizeof(opt), (void *) &dst); - return dst; + return zend_hash_update_mem(®istry->options, opt.name, &opt, sizeof(opt)); } 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;