diff options
author | Dmitry Stogov <dmitry@zend.com> | 2014-05-28 12:15:16 +0400 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2014-05-28 12:15:16 +0400 |
commit | e598aab273e265539e362f44469582fea968cfe4 (patch) | |
tree | 96cbb5d223541e89fe57d9c5c30e741f2725f678 /ext/soap/php_encoding.c | |
parent | 066ea2204e225f061ae86a02dfad8ca480eaeffb (diff) | |
download | php-git-e598aab273e265539e362f44469582fea968cfe4.tar.gz |
Use new zend_hash API
Diffstat (limited to 'ext/soap/php_encoding.c')
-rw-r--r-- | ext/soap/php_encoding.c | 159 |
1 files changed, 72 insertions, 87 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 4d339173bc..c35cae2d33 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -369,7 +369,7 @@ static zend_bool soap_check_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) return 0; } -static zend_bool soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) +static void soap_add_xml_ref(zval *data, xmlNodePtr node TSRMLS_DC) { if (SOAP_GLOBAL(ref_map)) { zend_hash_index_update(SOAP_GLOBAL(ref_map), (ulong)node, data); @@ -1820,7 +1820,6 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo { xmlNodePtr xmlParam; HashTable *prop = NULL; - int i; sdlTypePtr sdlType = type->sdl_type; if (!data || Z_TYPE_P(data) == IS_NULL) { @@ -1973,29 +1972,15 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo return xmlParam; } if (prop != NULL) { - i = zend_hash_num_elements(prop); - zend_hash_internal_pointer_reset(prop); - - for (;i > 0;i--) { - xmlNodePtr property; - zval *zprop; - zend_string *str_key; - ulong index; - int key_type; - - key_type = zend_hash_get_current_key_ex(prop, &str_key, &index, FALSE, &prop->nInternalPointer); - zprop = zend_hash_get_current_data(prop); - if (Z_TYPE_P(zprop) == IS_INDIRECT) { - zprop = Z_INDIRECT_P(zprop); - if (Z_TYPE_P(zprop) == IS_UNDEF) { - zend_hash_move_forward(prop); - continue; - } - } + zval *zprop; + zend_string *str_key; + xmlNodePtr property; - property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC); + ZEND_HASH_FOREACH_STR_KEY_VAL_IND(prop, str_key, zprop) { - if (key_type == HASH_KEY_IS_STRING) { + property = master_to_xml(get_conversion(Z_TYPE_P(zprop)), zprop, style, xmlParam TSRMLS_CC); + + if (str_key) { const char *prop_name; if (Z_TYPE_P(data) == IS_OBJECT) { @@ -2009,8 +1994,7 @@ static xmlNodePtr to_xml_object(encodeTypePtr type, zval *data, int style, xmlNo xmlNodeSetName(property, BAD_CAST(prop_name)); } } - zend_hash_move_forward(prop); - } + } ZEND_HASH_FOREACH_END(); } if (style == SOAP_ENCODED) { set_ns_and_type(xmlParam, type); @@ -2141,29 +2125,40 @@ static void add_xml_array_elements(xmlNodePtr xmlParam, int style TSRMLS_DC) { - int j; + int j = 0; + zval *zdata; + xmlNodePtr xparam; if (data && Z_TYPE_P(data) == IS_ARRAY) { - zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); - for (j=0; j<dims[0]; j++) { - zval *zdata; + ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(data), zdata) { + if (j >= dims[0]) { + break; + } + if (dimension == 1) { + if (enc == NULL) { + xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC); + } else { + xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC); + } - if ((zdata = zend_hash_get_current_data(Z_ARRVAL_P(data))) == NULL) { - zdata = NULL; + if (type) { + xmlNodeSetName(xparam, BAD_CAST(type->name)); + } else if (style == SOAP_LITERAL && enc && enc->details.type_str) { + xmlNodeSetName(xparam, BAD_CAST(enc->details.type_str)); + xmlSetNs(xparam, ns); + } else { + xmlNodeSetName(xparam, BAD_CAST("item")); + } + } else { + add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC); } - if (dimension == 1) { - xmlNodePtr xparam; + j++; + } ZEND_HASH_FOREACH_END(); - if (zdata) { - if (enc == NULL) { - xparam = master_to_xml(get_conversion(Z_TYPE_P(zdata)), zdata, style, xmlParam TSRMLS_CC); - } else { - xparam = master_to_xml(enc, zdata, style, xmlParam TSRMLS_CC); - } - } else { - xparam = xmlNewNode(NULL, BAD_CAST("BOGUS")); - xmlAddChild(xmlParam, xparam); - } + if (dimension == 1) { + while (j < dims[0]) { + xparam = xmlNewNode(NULL, BAD_CAST("BOGUS")); + xmlAddChild(xmlParam, xparam); if (type) { xmlNodeSetName(xparam, BAD_CAST(type->name)); @@ -2173,15 +2168,15 @@ static void add_xml_array_elements(xmlNodePtr xmlParam, } else { xmlNodeSetName(xparam, BAD_CAST("item")); } - } else { - if (zdata) { - add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, zdata, style TSRMLS_CC); - } else { - add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC); - } + + j++; } - zend_hash_move_forward(Z_ARRVAL_P(data)); - } + } else { + while (j < dims[0]) { + add_xml_array_elements(xmlParam, type, enc, ns, dimension-1, dims+1, NULL, style TSRMLS_CC); + j++; + } + } } else { for (j=0; j<dims[0]; j++) { if (dimension == 1) { @@ -2342,8 +2337,9 @@ iterator_done: for (i = 1; i < dimension; i++) { if (el != NULL && Z_TYPE_P(el) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(el)) > 0) { - zend_hash_internal_pointer_reset(Z_ARRVAL_P(el)); - el = zend_hash_get_current_data(Z_ARRVAL_P(el)); + ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(el), el) { + break; + } ZEND_HASH_FOREACH_END(); if (Z_TYPE_P(el) == IS_ARRAY) { dims[i] = zend_hash_num_elements(Z_ARRVAL_P(el)); } else { @@ -2692,29 +2688,25 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data TSRMLS /* Map encode/decode */ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodePtr parent TSRMLS_DC) { + zval *temp_data; + zend_string *key_val; + ulong int_val; xmlNodePtr xmlParam; - int i; + xmlNodePtr xparam, item; + xmlNodePtr key; xmlParam = xmlNewNode(NULL, BAD_CAST("BOGUS")); xmlAddChild(parent, xmlParam); FIND_ZVAL_NULL(data, xmlParam, style); if (Z_TYPE_P(data) == IS_ARRAY) { - i = zend_hash_num_elements(Z_ARRVAL_P(data)); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(data)); - for (;i > 0;i--) { - xmlNodePtr xparam, item; - xmlNodePtr key; - zval *temp_data; - zend_string *key_val; - ulong int_val; - - temp_data = zend_hash_get_current_data(Z_ARRVAL_P(data)); + ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(data), int_val, key_val, temp_data) { + item = xmlNewNode(NULL, BAD_CAST("item")); xmlAddChild(xmlParam, item); key = xmlNewNode(NULL, BAD_CAST("key")); xmlAddChild(item,key); - if (zend_hash_get_current_key(Z_ARRVAL_P(data), &key_val, &int_val, FALSE) == HASH_KEY_IS_STRING) { + if (key_val) { if (style == SOAP_ENCODED) { set_xsi_type(key, "xsd:string"); } @@ -2734,9 +2726,7 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP xparam = master_to_xml(get_conversion(Z_TYPE_P(temp_data)), temp_data, style, item TSRMLS_CC); xmlNodeSetName(xparam, BAD_CAST("value")); - - zend_hash_move_forward(Z_ARRVAL_P(data)); - } + } ZEND_HASH_FOREACH_END(); } if (style == SOAP_ENCODED) { set_ns_and_type(xmlParam, type); @@ -3509,26 +3499,23 @@ encodePtr get_conversion(int encode) static int is_map(zval *array) { - int i, count = zend_hash_num_elements(Z_ARRVAL_P(array)); - - zend_hash_internal_pointer_reset(Z_ARRVAL_P(array)); - for (i = 0; i < count; i++) { - zend_string *_str_index; - ulong num_index; + ulong index; + zend_string *key; + int i = 0; - if (zend_hash_get_current_key(Z_ARRVAL_P(array), &_str_index, &num_index, 0) == HASH_KEY_IS_STRING || - num_index != i) { + ZEND_HASH_FOREACH_KEY(Z_ARRVAL_P(array), index, key) { + if (key || index != i) { return TRUE; } - zend_hash_move_forward(Z_ARRVAL_P(array)); - } + i++; + } ZEND_HASH_FOREACH_END(); return FALSE; } static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TSRMLS_DC) { HashTable *ht; - int i, count, cur_type, prev_type, different; + int i, cur_type, prev_type, different; zval *tmp; char *prev_stype = NULL, *cur_stype = NULL, *prev_ns = NULL, *cur_ns = NULL; @@ -3537,15 +3524,12 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS return get_conversion(XSD_ANYTYPE); } + i = 0; different = FALSE; cur_type = prev_type = 0; ht = HASH_OF(array); - count = zend_hash_num_elements(ht); - - zend_hash_internal_pointer_reset(ht); - for (i = 0;i < count;i++) { - tmp = zend_hash_get_current_data(ht); + ZEND_HASH_FOREACH_VAL_IND(ht, tmp) { if (Z_TYPE_P(tmp) == IS_OBJECT && Z_OBJCE_P(tmp) == soap_var_class_entry) { zval *ztype; @@ -3591,10 +3575,10 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS prev_type = cur_type; prev_stype = cur_stype; prev_ns = cur_ns; - zend_hash_move_forward(ht); - } + i++; + } ZEND_HASH_FOREACH_END(); - if (different || count == 0) { + if (different || i == 0) { smart_str_appendl(type, "xsd:anyType", sizeof("xsd:anyType")-1); return get_conversion(XSD_ANYTYPE); } else { @@ -3625,6 +3609,7 @@ static encodePtr get_array_type(xmlNodePtr node, zval *array, smart_str *type TS return enc; } } + return NULL; } static void get_type_str(xmlNodePtr node, const char* ns, const char* type, smart_str* ret) |