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