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