[srm-cvs] CVS Update: - Make the conversion routines distinguish between non-associative and

From: <d.rethans[@]jdimedia.nl>
Date: Wed Mar 19 2003 - 04:56:05 CET

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