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