rolland Wed Sep 28 10:58:37 2005 EDT
Modified files:
/php-src/ext/standard string.c
Log:
- Updated substr_replace() to use:
- zend_get_unified_string_type()/convert_to_explicit_type() for type
conversion
- u_countChar32() for counting codepoints
http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.484&r2=1.485&ty=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.484 php-src/ext/standard/string.c:1.485
--- php-src/ext/standard/string.c:1.484 Wed Sep 28 05:22:08 2005
+++ php-src/ext/standard/string.c Wed Sep 28 10:58:31 2005
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.484 2005/09/28 09:22:08 rolland Exp $ */
+/* $Id: string.c,v 1.485 2005/09/28 14:58:31 rolland Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -2553,44 +2553,14 @@
/* }}} */
-/* {{{ php_unify_string_types
- */
-PHPAPI void php_unify_string_types(zval **p, zval **q TSRMLS_DC)
-{
- if (p == NULL || q == NULL) {
- return;
- }
-
- if (Z_TYPE_PP(p) == IS_UNICODE) {
- if (Z_TYPE_PP(q) == IS_BINARY) {
- convert_to_binary_ex(p);
- } else {
- convert_to_unicode_ex(q);
- }
- } else if (Z_TYPE_PP(p) == IS_BINARY) {
- convert_to_binary_ex(q);
- } else {
- if (Z_TYPE_PP(q) == IS_BINARY) {
- convert_to_binary_ex(p);
- } else {
- convert_to_string_ex(q);
- }
- }
-}
-/* {{{ */
-
/* {{{ php_adjust_limits
*/
PHPAPI void php_adjust_limits(zval **str, int32_t *f, int32_t *l)
{
- int32_t i, str_codepts;
+ int32_t str_codepts;
if (Z_TYPE_PP(str) == IS_UNICODE) {
- i = 0; str_codepts = 0;
- while (i < Z_USTRLEN_PP(str)) {
- U16_FWD_1(Z_USTRVAL_PP(str), i, Z_USTRLEN_PP(str));
- str_codepts++;
- }
+ str_codepts = u_countChar32(Z_USTRVAL_PP(str),
Z_USTRLEN_PP(str));
} else {
str_codepts = Z_STRLEN_PP(str);
}
@@ -2688,7 +2658,7 @@
HashPosition pos_str, pos_from, pos_repl, pos_len;
zval **tmp_str = NULL, **tmp_from = NULL, **tmp_repl = NULL, **tmp_len=
NULL;
-
+ zend_uchar str_type;
if (argc < 3 || argc > 4 || zend_get_parameters_ex(argc, &str, &repl,
&from, &len) == FAILURE) {
WRONG_PARAM_COUNT;
@@ -2747,8 +2717,16 @@
tmp_repl = repl;
}
- if (tmp_repl && Z_TYPE_PP(str) != Z_TYPE_PP(tmp_repl))
- php_unify_string_types(str, tmp_repl TSRMLS_CC);
+ if (tmp_repl && Z_TYPE_PP(str) != Z_TYPE_PP(tmp_repl)) {
+ str_type = zend_get_unified_string_type(2
TSRMLS_CC, Z_TYPE_PP(str), Z_TYPE_PP(tmp_repl));
+ if (str_type == (zend_uchar)-1) {
+ convert_to_explicit_type(str,
IS_BINARY);
+ convert_to_explicit_type(tmp_repl,
IS_BINARY);
+ } else {
+ convert_to_explicit_type(str, str_type);
+ convert_to_explicit_type(tmp_repl,
str_type);
+ }
+ }
php_adjust_limits(str, &f, &l);
result_len = php_do_substr_replace(&result, str,
tmp_repl, f, l TSRMLS_CC);
@@ -2820,8 +2798,16 @@
tmp_repl = repl;
}
- if (tmp_repl && Z_TYPE_PP(tmp_str) !=
Z_TYPE_PP(tmp_repl))
- php_unify_string_types(tmp_str, tmp_repl
TSRMLS_CC);
+ if (tmp_repl && Z_TYPE_PP(tmp_str) !=
Z_TYPE_PP(tmp_repl)) {
+ str_type = zend_get_unified_string_type(2
TSRMLS_CC, Z_TYPE_PP(tmp_str), Z_TYPE_PP(tmp_repl));
+ if (str_type == (zend_uchar)-1) {
+ convert_to_explicit_type(tmp_str,
IS_BINARY);
+ convert_to_explicit_type(tmp_repl,
IS_BINARY);
+ } else {
+ convert_to_explicit_type(tmp_str,
str_type);
+ convert_to_explicit_type(tmp_repl,
str_type);
+ }
+ }
php_adjust_limits(tmp_str, &f, &l);
result_len = php_do_substr_replace(&result, tmp_str,
tmp_repl, f, l TSRMLS_CC);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php