Hi Roland, Please be more carefull with your patches. Compile PHP with --enable-debug and run "make test" and "make utest" before and after patch to see that you don't break something.
Now I fixed all (I hope) implode() bugs that you introduced. Dmitry. > -----Original Message----- > From: Rolland Santimano [mailto:[EMAIL PROTECTED] > Sent: Wednesday, August 17, 2005 11:14 AM > To: php-cvs@lists.php.net > Subject: [PHP-CVS] cvs: php-src /ext/standard string.c > > > 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 > > -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php