cvs: php-src /ext/standard string.c
| From: | Rolland Santimano | Date: | Wed, 28 Sep 2005 14:58:37 +0000 |
| Subject: | cvs: php-src /ext/standard string.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-34175@lists.php.net to get a copy of this message | ||
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);