rolland Wed Aug 17 03:14:14 2005 EDT Modified files: /php-src/ext/standard string.c Log: Updated implode() impl as per Andrei's comments [http://news.php.net/php.cvs/33457] http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.457&r2=1.458&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.457 php-src/ext/standard/string.c:1.458 --- php-src/ext/standard/string.c:1.457 Tue Aug 16 16:22:33 2005 +++ php-src/ext/standard/string.c Wed Aug 17 03:14:12 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.457 2005/08/16 20:22:33 helly Exp $ */ +/* $Id: string.c,v 1.458 2005/08/17 07:14:12 rolland Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -1144,14 +1144,11 @@ PHPAPI void php_implode(zval *delim, zval *arr, zval *retval) { zend_uchar return_type; - int numelems, i; + int numelems, i=0; HashPosition pos; zval **tmp; TSRMLS_FETCH(); - if (Z_TYPE_P(delim) != IS_UNICODE && Z_TYPE_P(delim) != IS_BINARY) { - convert_to_string_ex(&delim); - } Z_TYPE_P(retval) = return_type = Z_TYPE_P(delim); /* ... to start off */ /* Setup return value */ @@ -1169,18 +1166,14 @@ } zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(arr), &pos); - for (i = 1 ; i <= numelems ; i++) { - if (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **)&tmp, &pos) != SUCCESS) { - /* Shouldn't happen ? */ - return; - } - zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); + while (zend_hash_get_current_data_ex(Z_ARRVAL_P(arr), (void **)&tmp, &pos) == SUCCESS) { if (Z_TYPE_PP(tmp) != return_type) { /* Convert to common type, if possible */ if (return_type == IS_UNICODE) { if (Z_TYPE_PP(tmp) == IS_BINARY) { /* ERROR */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mixed string types"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Cannot mix binary strings with other string types"); efree(Z_USTRVAL_P(retval)); ZVAL_FALSE(retval); return; @@ -1191,7 +1184,8 @@ } else if (return_type == IS_BINARY) { if (Z_TYPE_PP(tmp) == IS_UNICODE || Z_TYPE_PP(tmp) == IS_STRING) { /* ERROR */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mixed string types"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Cannot mix binary strings with other string types"); efree(Z_BINVAL_P(retval)); ZVAL_FALSE(retval); return; @@ -1207,7 +1201,8 @@ Z_TYPE_P(retval) = return_type = IS_UNICODE; } else if (Z_TYPE_PP(tmp) == IS_BINARY) { /* ERROR */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Mixed string types"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, + "Cannot mix binary strings with other string types"); efree(Z_STRVAL_P(retval)); ZVAL_FALSE(retval); return; @@ -1222,30 +1217,30 @@ if (return_type == IS_UNICODE) { Z_USTRVAL_P(retval) = eurealloc(Z_USTRVAL_P(retval), Z_USTRLEN_P(retval)+Z_USTRLEN_PP(tmp)); - memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), - Z_USTRVAL_PP(tmp), Z_USTRLEN_PP(tmp)*sizeof(UChar)); + memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_PP(tmp), + UBYTES(Z_USTRLEN_PP(tmp))); Z_USTRLEN_P(retval) += Z_USTRLEN_PP(tmp); - if (i < numelems) { /* Append delim */ + if (++i < numelems) { /* Append delim */ Z_USTRVAL_P(retval) = eurealloc(Z_USTRVAL_P(retval), Z_USTRLEN_P(retval)+Z_USTRLEN_P(delim)); - memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), - Z_USTRVAL_P(delim), Z_USTRLEN_P(delim)*sizeof(UChar)); + memcpy(Z_USTRVAL_P(retval)+Z_USTRLEN_P(retval), Z_USTRVAL_P(delim), + UBYTES(Z_USTRLEN_P(delim))); Z_USTRLEN_P(retval) += Z_USTRLEN_P(delim); } } else { Z_STRVAL_P(retval) = (char *)erealloc(Z_STRVAL_P(retval), Z_STRLEN_P(retval)+Z_STRLEN_PP(tmp)); - memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), - Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); Z_STRLEN_P(retval) += Z_STRLEN_PP(tmp); - if (i < numelems) { /* Append delim */ + if (++i < numelems) { /* Append delim */ Z_STRVAL_P(retval) = (char *)erealloc(Z_STRVAL_P(retval), Z_STRLEN_P(retval)+Z_STRLEN_P(delim)); - memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), - Z_STRVAL_P(delim), Z_STRLEN_P(delim)); + memcpy(Z_STRVAL_P(retval)+Z_STRLEN_P(retval), Z_STRVAL_P(delim), Z_STRLEN_P(delim)); Z_STRLEN_P(retval) += Z_STRLEN_P(delim); } } + + zend_hash_move_forward_ex(Z_ARRVAL_P(arr), &pos); } return; @@ -1272,10 +1267,14 @@ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument to implode must be an array."); RETURN_FALSE; } else { - MAKE_STD_ZVAL(delim); - ZVAL_STRINGL(delim, "", sizeof("")-1, 0); SEPARATE_ZVAL(arg1); arr = *arg1; + MAKE_STD_ZVAL(delim); + if (UG(unicode)) { + ZVAL_UNICODEL(delim, USTR_MAKE(""), sizeof("")-1, 0); + } else { + ZVAL_STRINGL(delim, "", sizeof("")-1, 0); + } } } else { if (Z_TYPE_PP(arg1) == IS_ARRAY) { @@ -1291,6 +1290,9 @@ RETURN_FALSE; } SEPARATE_ZVAL(&delim); + if (Z_TYPE_P(delim) != IS_BINARY) { + convert_to_text_ex(&delim); + } } php_implode(delim, arr, return_value);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php