andrei Tue Aug 15 20:38:12 2006 UTC
Modified files:
/php-src unicode-progress.txt
/php-src/ext/standard php_string.h string.c
Log:
Fix some trim() issues.
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.44&r2=1.45&diff_format=u
Index: php-src/unicode-progress.txt
diff -u php-src/unicode-progress.txt:1.44 php-src/unicode-progress.txt:1.45
--- php-src/unicode-progress.txt:1.44 Mon Aug 14 22:00:46 2006
+++ php-src/unicode-progress.txt Tue Aug 15 20:38:12 2006
@@ -42,16 +42,16 @@
sscanf()
Params API. Rest - no idea yet.
- str_replace()
- stri_replace()
- Params API, IS_UNICODE upgrade. Case-folding should be handled
- similar to stristr().
-
str_word_count()
Params API, IS_UNICODE support, using u_isalpha(), etc.
stristr()
- This is the problematic one. There are a few approaches:
+ stripos()
+ strripos()
+ str_replace()
+ stri_replace()
+ substr_compare()
+ These are the problematic ones. There are a few approaches:
1. Case-fold both need and haystack and then do simple search.
@@ -72,15 +72,9 @@
All other approaches bite.
- stripos()
- Review. Probably needs the same approach as stristr().
-
strnatcmp(), strnatcasecmp()
Params API. The rest depends on porting of strnatcmp.c
- strripos()
- Probably needs the same approach as stristr().
-
strrchr()
Needs update so that it doesn't try to find half of a surrogate
pair.
@@ -88,16 +82,12 @@
strtr()
Check on Derick's progress.
- substr_compare()
- IS_UNICODE support, case folding based on the same algorithm as
- stristr().
-
substr_replace()
Params API, test
wordwrap()
- Upgrade, do wordwrapping on glyph level, maybe use additional
- whitespace chars instead of just space.
+ Upgrade, do wordwrapping on codepoint (or glyph ?) level, maybe use
+ additional whitespace chars instead of just space.
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/php_string.h?r1=1.99&r2=1.100&diff_format=u
Index: php-src/ext/standard/php_string.h
diff -u php-src/ext/standard/php_string.h:1.99
php-src/ext/standard/php_string.h:1.100
--- php-src/ext/standard/php_string.h:1.99 Fri Aug 4 18:09:46 2006
+++ php-src/ext/standard/php_string.h Tue Aug 15 20:38:12 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_string.h,v 1.99 2006/08/04 18:09:46 andrei Exp $ */
+/* $Id: php_string.h,v 1.100 2006/08/15 20:38:12 andrei Exp $ */
/* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */
@@ -142,7 +142,7 @@
int needle_len, char *str, int str_len, int *_new_length, int
case_sensitivity, int *replace_count);
PHPAPI char *php_str_to_str(char *haystack, int length, char *needle,
int needle_len, char *str, int str_len, int *_new_length);
-PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zend_uchar
str_type, zval *return_value, int mode TSRMLS_DC);
+PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval
*return_value, int mode TSRMLS_DC);
PHPAPI int php_u_strip_tags(UChar *rbuf, int len, int *stateptr, UChar *allow,
int allow_len TSRMLS_DC);
PHPAPI size_t php_strip_tags(char *rbuf, int len, int *state, char *allow, int
allow_len);
PHPAPI int php_char_to_str_ex(char *str, uint len, char from, char *to, int
to_len, zval *result, int case_sensitivity, int *replace_count);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.579&r2=1.580&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.579 php-src/ext/standard/string.c:1.580
--- php-src/ext/standard/string.c:1.579 Mon Aug 14 22:00:46 2006
+++ php-src/ext/standard/string.c Tue Aug 15 20:38:12 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.579 2006/08/14 22:00:46 andrei Exp $ */
+/* $Id: string.c,v 1.580 2006/08/15 20:38:12 andrei Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -575,7 +575,7 @@
* mode 3 : trim left and right
* what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0')
*/
-PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zend_uchar
str_type, zval *return_value, int mode TSRMLS_DC)
+PHPAPI char *php_trim(char *c, int len, char *what, int what_len, zval
*return_value, int mode TSRMLS_DC)
{
register int i;
int trimmed = 0;
@@ -705,7 +705,7 @@
*/
static UChar *php_u_trim(UChar *c, int len, UChar *what, int what_len, zval
*return_value, int mode TSRMLS_DC)
{
- int32_t i,j;
+ int32_t i, j, k;
UChar ch = 0, wh = 0;
int32_t start = 0, end = len;
@@ -719,8 +719,8 @@
}
if ( mode & 1 ) {
- for ( i = 0 ; i < end ; ) {
- U16_NEXT(c, i, end, ch);
+ for ( i = k = 0 ; i < end ; ) {
+ U16_NEXT(c, k, end, ch);
if ( what ) {
for ( j = 0 ; j < what_len ; ) {
U16_NEXT(what, j, what_len, wh);
@@ -729,16 +729,16 @@
if ( wh != ch ) break;
} else {
if ( u_isWhitespace(ch) == FALSE ) {
- U16_BACK_1(c, 0, i); /* U16_NEXT()
post-increments 'i' */
break;
}
}
+ i = k;
}
start = i;
}
if ( mode & 2 ) {
- for ( i = end ; i > start ; ) {
- U16_PREV(c, 0, i, ch);
+ for ( i = k = end ; i > start ; ) {
+ U16_PREV(c, 0, k, ch);
if ( what ) {
for ( j = 0 ; j < what_len ; ) {
U16_NEXT(what, j, what_len, wh);
@@ -747,10 +747,10 @@
if ( wh != ch ) break;
} else {
if ( u_isWhitespace(ch) == FALSE ) {
- U16_FWD_1(c, i, end); /* U16_PREV()
pre-decrements 'i' */
break;
}
}
+ i = k;
}
end = i;
}
@@ -782,31 +782,26 @@
*/
static void php_do_trim(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
- zval **str, **what;
- int argc = ZEND_NUM_ARGS();
+ zstr str, what = NULL_ZSTR;
+ int str_len, what_len;
+ zend_uchar str_type;
- if (argc < 1 || argc > 2 || zend_get_parameters_ex(argc, &str, &what)
== FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "T|T", &str,
&str_len,
+ &str_type, &what,
&what_len, &str_type) == FAILURE) {
+ return;
}
- convert_to_text_ex(str);
-
- if (argc > 1) {
- if (Z_TYPE_PP(str) != Z_TYPE_PP(what)) {
- zend_error(E_WARNING, "%v() expects parameter 2 to be
string (legacy, Unicode, or binary), %s given",
- get_active_function_name(TSRMLS_C),
- zend_zval_type_name(*what));
- }
- if (Z_TYPE_PP(str) == IS_UNICODE) {
- php_u_trim(Z_USTRVAL_PP(str), Z_USTRLEN_PP(str),
Z_USTRVAL_PP(what), Z_USTRLEN_PP(what), return_value, mode TSRMLS_CC);
+ if (ZEND_NUM_ARGS() > 1) {
+ if (str_type == IS_UNICODE) {
+ php_u_trim(str.u, str_len, what.u, what_len,
return_value, mode TSRMLS_CC);
} else {
- php_trim(Z_STRVAL_PP(str), Z_STRLEN_PP(str),
Z_STRVAL_PP(what), Z_STRLEN_PP(what), Z_TYPE_PP(str), return_value, mode
TSRMLS_CC);
+ php_trim(str.s, str_len, what.s, what_len,
return_value, mode TSRMLS_CC);
}
} else {
- if (Z_TYPE_PP(str) == IS_UNICODE) {
- php_u_trim(Z_USTRVAL_PP(str), Z_USTRLEN_PP(str), NULL,
0, return_value, mode TSRMLS_CC);
+ if (str_type == IS_UNICODE) {
+ php_u_trim(str.u, str_len, NULL, 0, return_value, mode
TSRMLS_CC);
} else {
- php_trim(Z_STRVAL_PP(str), Z_STRLEN_PP(str), NULL, 0,
Z_TYPE_PP(str), return_value, mode TSRMLS_CC);
+ php_trim(str.s, str_len, NULL, 0, return_value, mode
TSRMLS_CC);
}
}
}
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php