sterling                Fri Oct  4 16:44:19 2002 EDT

  Modified files:              
    /php4/ext/standard  string.c 
  Log:
  have implode use the smart_str_*() functions, this should speed things up 
  quite a bit...
  
  
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.312 php4/ext/standard/string.c:1.313
--- php4/ext/standard/string.c:1.312    Fri Oct  4 13:10:51 2002
+++ php4/ext/standard/string.c  Fri Oct  4 16:44:19 2002
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: string.c,v 1.312 2002/10/04 17:10:51 sander Exp $ */
+/* $Id: string.c,v 1.313 2002/10/04 20:44:19 sterling Exp $ */
 
 /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
 
@@ -818,42 +818,28 @@
  */
 PHPAPI void php_implode(zval *delim, zval *arr, zval *return_value) 
 {
-       zval **tmp;
-       char *tmp_str;
-       int len = 0, count = 0, target = 0;
-       HashPosition pos;
+       zval         **tmp;
+       HashPosition   pos;
+       smart_str      implstr = {0};
+       int            numelems, i = 0;
+
+       numelems = zend_hash_num_elements(Z_ARRVAL_P(arr));
 
-       /* convert everything to strings, and calculate length */
        zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos);
-       while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **) &tmp, &pos) == 
SUCCESS) {
+       while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), 
+                                                                                (void 
+**) &tmp,
+                                                                                &pos) 
+== SUCCESS) {
                convert_to_string_ex(tmp);
-               len += Z_STRLEN_PP(tmp);
-               if (count > 0) {
-                       len += Z_STRLEN_P(delim);
-               }
-
-               count++;
-               zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos);
-       }
 
-       /* do it */
-       tmp_str = (char *) emalloc(len + 1);
-       tmp_str[0] = 0;
-
-       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos);
-       while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **) &tmp, &pos) == 
SUCCESS) {
-               count--;
-               memcpy(tmp_str + target, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
-               target += Z_STRLEN_PP(tmp); 
-               if (count > 0) {
-                       memcpy(tmp_str + target, Z_STRVAL_P(delim), Z_STRLEN_P(delim));
-                       target += Z_STRLEN_P(delim);
+               smart_str_appendl(&implstr, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp));
+               if (++i != numelems) {
+                       smart_str_appendl(&implstr, Z_STRVAL_P(delim), 
+Z_STRLEN_P(delim));
                }
                zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos);
        }
-       tmp_str[len] = 0;
-       
-       RETURN_STRINGL(tmp_str, len, 0);
+       smart_str_0(&implstr);
+
+       RETURN_STRINGL(implstr.c, implstr.len, 0);
 }
 /* }}} */
 



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to