Date: Wed Mar 19 04:56:02 CET 2003
User: Derick Rethans
Directory: php_srm
Log Message:
[0.25]
- Make the conversion routines distinguish between non-associative and
associative arrays.
Modified files:
php_srm/srm_util.c (version: 1.16)
[FILE: /php_srm/srm_util.c]
--- php_srm/srm_util.c:1.15 Sat Jan 18 21:39:31 2003 GMT
+++ php_srm/srm_util.c Wed Mar 19 02:56:01 2003 GMT
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: cvstemp,v 1.15 2003/01/18 22:39:31 derick Exp $ */
+/* $Id: cvstemp,v 1.16 2003/03/19 03:56:01 derick Exp $ */
#include "php.h"
#include <srm_client.h>
@@ -28,8 +28,10 @@
{
srm_value *tmp;
HashTable *myht;
- int i;
- SRM_HASH(tmp_list)
+ int num_elem, i;
+ int is_hash = 0;
+ SRM_LIST(tmp_list)
+ SRM_HASH(tmp_hash)
TSRMLS_FETCH();
tmp = srm_value_init();
@@ -58,17 +60,35 @@
case IS_ARRAY:
case IS_OBJECT:
myht = HASH_OF(value);
- i = zend_hash_num_elements(myht);
+ num_elem = zend_hash_num_elements(myht);
- /* Init LIST here */
- SRM_HASH_INIT(tmp_list, i);
-
- if (i > 0) {
+ if (num_elem == 0) {
+ SRM_LIST_INIT(tmp_list);
+ } else {
HashPosition pos;
char *key;
zval **data;
ulong index;
+ /* First loop is to scan if we have a list or a hash */
+ zend_hash_internal_pointer_reset_ex(myht, &pos);
+
+ for (;; zend_hash_move_forward_ex(myht, &pos)) {
+ if ((i = zend_hash_get_current_key_ex(myht, &key, NULL, &index, 0, &pos)) == HASH_KEY_NON_EXISTANT) {
+ break;
+ }
+ if (i == HASH_KEY_IS_STRING) {
+ is_hash = 1;
+ break;
+ }
+ }
+ if (is_hash) {
+ SRM_HASH_INIT(tmp_hash, num_elem);
+ } else {
+ SRM_LIST_INIT(tmp_list);
+ }
+
+ /* Reset and loop to add the stuff */
zend_hash_internal_pointer_reset_ex(myht, &pos);
for (;; zend_hash_move_forward_ex(myht, &pos)) {
@@ -78,25 +98,35 @@
if (zend_hash_get_current_data_ex(myht, (void **) (&data), &pos) != SUCCESS || !data) {
continue;
}
- switch (i) {
- case HASH_KEY_IS_LONG:
- SRM_HASH_ADD_SVAL_BY_IDX (tmp_list, index, zval_to_srmval (*data));
- break;
- case HASH_KEY_IS_STRING:
- SRM_HASH_ADD_SVAL (tmp_list, key, strlen(key), zval_to_srmval (*data));
- break;
+ if (is_hash) {
+ switch (i) {
+ case HASH_KEY_IS_LONG:
+ SRM_HASH_ADD_SVAL_BY_IDX(tmp_hash, index, zval_to_srmval (*data));
+ break;
+ case HASH_KEY_IS_STRING:
+ SRM_HASH_ADD_SVAL(tmp_hash, key, strlen(key), zval_to_srmval (*data));
+ break;
+ }
+ } else {
+ SRM_LIST_ADD_SVAL(tmp_list, zval_to_srmval(*data));
}
}
}
if (value->type == IS_ARRAY) {
- VALP_SET_HASH(tmp);
+ if (is_hash) {
+ VALP_SET_HASH(tmp);
+ SRMVALP_HASH(tmp) = tmp_hash_hash;
+ } else {
+ VALP_SET_LIST(tmp);
+ SRMVALP_LIST(tmp) = tmp_list_ll;
+ }
} else if (value->type == IS_OBJECT) {
VALP_SET_OBJECT(tmp);
+ SRMVALP_HASH(tmp) = tmp_hash_hash;
}
- SRMVALP_HASH(tmp) = tmp_list_hash;
break;
default:
- php_error (E_WARNING, "zval_to_srmval() : problem determinating type");
+ php_error(E_WARNING, "zval_to_srmval() : problem determinating type");
}
return tmp;
Received on Wed Mar 19 04:56:11 2003
This archive was generated by hypermail 2.1.8 : Tue Jan 06 2009 - 10:00:04 CET