andrei Thu Aug 3 23:09:29 2006 UTC Modified files: /php-src unicode-progress.txt unicode-todo.txt /php-src/ext/standard array.c php_string.h string.c Log: - Adjusted php_u_strtoupper/php_u_strtolower/php_u_strtotitle API to be more sane. - Upgrade strtoupper(), strtolower(), strtotitle() to use params API.
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.35&r2=1.36&diff_format=u Index: php-src/unicode-progress.txt diff -u php-src/unicode-progress.txt:1.35 php-src/unicode-progress.txt:1.36 --- php-src/unicode-progress.txt:1.35 Thu Aug 3 21:46:16 2006 +++ php-src/unicode-progress.txt Thu Aug 3 23:09:29 2006 @@ -123,9 +123,6 @@ strrev() Params API - strtoupper(), strtolower(), strtotitle() - Params API - strtr() Check on Derick's progress. @@ -226,6 +223,8 @@ strspn() strstr() strtok() + strtolower() + strtoupper() substr() substr_count() substr_replace() http://cvs.php.net/viewvc.cgi/php-src/unicode-todo.txt?r1=1.21&r2=1.22&diff_format=u Index: php-src/unicode-todo.txt diff -u php-src/unicode-todo.txt:1.21 php-src/unicode-todo.txt:1.22 --- php-src/unicode-todo.txt:1.21 Wed Aug 2 19:54:48 2006 +++ php-src/unicode-todo.txt Thu Aug 3 23:09:29 2006 @@ -43,3 +43,5 @@ * UG(unicode) is turned off during MINIT() currently. We need to figure out a way to avoid turning it off. + +* USTR_MAKE("") should be EMPTY_STR http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.379&r2=1.380&diff_format=u Index: php-src/ext/standard/array.c diff -u php-src/ext/standard/array.c:1.379 php-src/ext/standard/array.c:1.380 --- php-src/ext/standard/array.c:1.379 Wed Aug 2 07:54:41 2006 +++ php-src/ext/standard/array.c Thu Aug 3 23:09:29 2006 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: array.c,v 1.379 2006/08/02 07:54:41 dmitry Exp $ */ +/* $Id: array.c,v 1.380 2006/08/03 23:09:29 andrei Exp $ */ #include "php.h" #include "php_ini.h" @@ -2827,12 +2827,11 @@ efree(new_key.s); break; case HASH_KEY_IS_UNICODE: - new_key.u = eustrndup(string_key.u, str_key_len - 1); str_len = str_key_len - 1; if (change_to_upper) - new_key.u = php_u_strtoupper(&new_key.u, &str_len, UG(default_locale)); + new_key.u = php_u_strtoupper(string_key.u, &str_len, UG(default_locale)); else - new_key.u = php_u_strtolower(&new_key.u, &str_len, UG(default_locale)); + new_key.u = php_u_strtolower(string_key.u, &str_len, UG(default_locale)); zend_u_hash_update(Z_ARRVAL_P(return_value), IS_UNICODE, new_key, str_len+1, entry, sizeof(entry), NULL); efree(new_key.u); break; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/php_string.h?r1=1.97&r2=1.98&diff_format=u Index: php-src/ext/standard/php_string.h diff -u php-src/ext/standard/php_string.h:1.97 php-src/ext/standard/php_string.h:1.98 --- php-src/ext/standard/php_string.h:1.97 Wed Mar 22 10:20:20 2006 +++ php-src/ext/standard/php_string.h Thu Aug 3 23:09:29 2006 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_string.h,v 1.97 2006/03/22 10:20:20 derick Exp $ */ +/* $Id: php_string.h,v 1.98 2006/08/03 23:09:29 andrei Exp $ */ /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */ @@ -118,8 +118,8 @@ PHPAPI char *php_strtoupper(char *s, size_t len); PHPAPI char *php_strtolower(char *s, size_t len); -PHPAPI UChar *php_u_strtoupper(UChar **s, int *len, const char *locale); -PHPAPI UChar *php_u_strtolower(UChar **s, int *len, const char *locale); +PHPAPI UChar *php_u_strtoupper(UChar *s, int *len, const char *locale); +PHPAPI UChar *php_u_strtolower(UChar *s, int *len, const char *locale); PHPAPI char *php_strtr(char *str, int len, char *str_from, char *str_to, int trlen); PHPAPI UChar *php_u_addslashes(UChar *str, int length, int *new_length, int freeit TSRMLS_DC); PHPAPI UChar *php_u_addslashes_ex(UChar *str, int length, int *new_length, int freeit, int ignore_sybase TSRMLS_DC); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.559&r2=1.560&diff_format=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.559 php-src/ext/standard/string.c:1.560 --- php-src/ext/standard/string.c:1.559 Thu Aug 3 21:46:16 2006 +++ php-src/ext/standard/string.c Thu Aug 3 23:09:29 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.559 2006/08/03 21:46:16 andrei Exp $ */ +/* $Id: string.c,v 1.560 2006/08/03 23:09:29 andrei Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -1489,7 +1489,7 @@ /* {{{ php_u_strtoupper */ -PHPAPI UChar* php_u_strtoupper(UChar **s, int *len, const char* locale) +PHPAPI UChar* php_u_strtoupper(UChar *s, int *len, const char* locale) { UChar *dest = NULL; int dest_len; @@ -1499,22 +1499,20 @@ while (1) { status = U_ZERO_ERROR; dest = eurealloc(dest, dest_len+1); - dest_len = u_strToUpper(dest, dest_len, *s, *len, locale, &status); + dest_len = u_strToUpper(dest, dest_len, s, *len, locale, &status); if (status != U_BUFFER_OVERFLOW_ERROR) { break; } } if (U_SUCCESS(status)) { - efree(*s); dest[dest_len] = 0; - *s = dest; *len = dest_len; + return dest; } else { efree(dest); + return NULL; } - - return *s; } /* }}} */ @@ -1522,19 +1520,23 @@ Makes a string uppercase */ PHP_FUNCTION(strtoupper) { - zval **arg; + zstr str; + int str_len; + zend_uchar str_type; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg)) { - WRONG_PARAM_COUNT; - } - if (Z_TYPE_PP(arg) != IS_STRING && Z_TYPE_PP(arg) != IS_UNICODE) { - convert_to_text_ex(arg); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) { + return; } - RETVAL_ZVAL(*arg, 1, 0); - if (Z_TYPE_P(return_value) == IS_UNICODE) { - php_u_strtoupper(&Z_USTRVAL_P(return_value), &Z_USTRLEN_P(return_value), UG(default_locale)); + if (str_type == IS_UNICODE) { + UChar *result; + if ((result = php_u_strtoupper(str.u, &str_len, UG(default_locale)))) { + RETURN_UNICODEL(result, str_len, 0); + } else { + RETURN_EMPTY_UNICODE(); + } } else { + RETVAL_STRINGL(str.s, str_len, 1); php_strtoupper(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value)); } } @@ -1542,7 +1544,7 @@ /* {{{ php_u_strtolower */ -PHPAPI UChar *php_u_strtolower(UChar **s, int *len, const char* locale) +PHPAPI UChar *php_u_strtolower(UChar *s, int *len, const char* locale) { UChar *dest = NULL; int dest_len; @@ -1552,21 +1554,20 @@ while (1) { status = U_ZERO_ERROR; dest = eurealloc(dest, dest_len+1); - dest_len = u_strToLower(dest, dest_len, *s, *len, locale, &status); + dest_len = u_strToLower(dest, dest_len, s, *len, locale, &status); if (status != U_BUFFER_OVERFLOW_ERROR) { break; } } if (U_SUCCESS(status)) { - efree(*s); dest[dest_len] = 0; - *s = dest; *len = dest_len; + return dest; } else { efree(dest); + return NULL; } - return *s; } /* }}} */ @@ -1591,19 +1592,23 @@ Makes a string lowercase */ PHP_FUNCTION(strtolower) { - zval **str; + zstr str; + int str_len; + zend_uchar str_type; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str)) { - WRONG_PARAM_COUNT; - } - if (Z_TYPE_PP(str) != IS_STRING && Z_TYPE_PP(str) != IS_UNICODE) { - convert_to_text_ex(str); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) { + return; } - RETVAL_ZVAL(*str, 1, 0); - if (Z_TYPE_P(return_value) == IS_UNICODE) { - php_u_strtolower(&Z_USTRVAL_P(return_value), &Z_USTRLEN_P(return_value), UG(default_locale)); + if (str_type == IS_UNICODE) { + UChar *result; + if ((result = php_u_strtolower(str.u, &str_len, UG(default_locale)))) { + RETURN_UNICODEL(result, str_len, 0); + } else { + RETURN_EMPTY_UNICODE(); + } } else { + RETVAL_STRINGL(str.s, str_len, 1); php_strtolower(Z_STRVAL_P(return_value), Z_STRLEN_P(return_value)); } } @@ -1620,7 +1625,7 @@ /* {{{ php_u_strtotitle */ -PHPAPI UChar* php_u_strtotitle(UChar **s, int32_t *len, const char* locale) +PHPAPI UChar* php_u_strtotitle(UChar *s, int32_t *len, const char* locale) { UChar *dest = NULL; int32_t dest_len; @@ -1628,11 +1633,11 @@ UBreakIterator *brkiter; dest_len = *len; - brkiter = ubrk_open(UBRK_WORD, locale, *s, *len, &status); + brkiter = ubrk_open(UBRK_WORD, locale, s, *len, &status); while (1) { status = U_ZERO_ERROR; dest = eurealloc(dest, dest_len+1); - dest_len = u_strToTitle(dest, dest_len, *s, *len, NULL, locale, &status); + dest_len = u_strToTitle(dest, dest_len, s, *len, NULL, locale, &status); if (status != U_BUFFER_OVERFLOW_ERROR) { break; } @@ -1640,15 +1645,13 @@ ubrk_close(brkiter); if (U_SUCCESS(status)) { - efree(*s); dest[dest_len] = 0; - *s = dest; *len = dest_len; + return dest; } else { efree(dest); + return NULL; } - - return *s; } /* }}} */ @@ -1657,26 +1660,29 @@ Makes a string titlecase */ PHP_FUNCTION(strtotitle) { - zval **str; + zstr str; + int str_len; + zend_uchar str_type; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str)) { - WRONG_PARAM_COUNT; - } - if (Z_TYPE_PP(str) != IS_STRING && Z_TYPE_PP(str) != IS_UNICODE) { - convert_to_text_ex(str); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) { + return; } - if (Z_TYPE_PP(str) == IS_UNICODE && !Z_USTRLEN_PP(str)) { + if (str_type == IS_UNICODE && str_len == 0) { RETURN_EMPTY_UNICODE(); - } else if (!Z_STRLEN_PP(str)) { + } else if (str_len == 0) { RETURN_EMPTY_STRING(); } - if (Z_TYPE_PP(str) == IS_UNICODE) { - RETVAL_ZVAL(*str, 1, 0); - php_u_strtotitle(&Z_USTRVAL_P(return_value), &Z_USTRLEN_P(return_value), UG(default_locale)); + if (str_type == IS_UNICODE) { + UChar *result; + if ((result = php_u_strtotitle(str.u, &str_len, UG(default_locale)))) { + RETURN_UNICODEL(result, str_len, 0); + } else { + RETURN_EMPTY_UNICODE(); + } } else { - ZVAL_STRINGL(return_value, Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1); + RETVAL_STRINGL(str.s, str_len, 1); php_ucwords(return_value); } } @@ -2460,10 +2466,8 @@ } needle_len = Z_UNILEN_P(needle); if (Z_TYPE_P(haystack) == IS_UNICODE) { - haystack_dup = eustrndup(Z_USTRVAL_P(haystack), haystack_len); - php_u_strtolower((UChar **)&haystack_dup, &haystack_len, UG(default_locale)); - needle_dup = eustrndup(Z_USTRVAL_P(needle), needle_len); - php_u_strtolower((UChar **)&needle_dup, &needle_len, UG(default_locale)); + haystack_dup = php_u_strtolower(Z_USTRVAL_P(haystack), &haystack_len, UG(default_locale)); + needle_dup = php_u_strtolower(Z_USTRVAL_P(needle), &needle_len, UG(default_locale)); found = zend_u_memnstr((UChar *)haystack_dup + offset, (UChar *)needle_dup, needle_len, (UChar *)haystack_dup + haystack_len); @@ -2508,8 +2512,7 @@ u_needle_char[needle_len++] = U16_TRAIL(ch); u_needle_char[needle_len] = 0; } - haystack_dup = eustrndup(Z_USTRVAL_P(haystack), haystack_len); - php_u_strtolower((UChar **)&haystack_dup, &haystack_len, UG(default_locale)); + haystack_dup = php_u_strtolower(haystack_dup, &haystack_len, UG(default_locale)); found = zend_u_memnstr((UChar *)haystack_dup + offset, (UChar *)u_needle_char, needle_len, (UChar *)haystack_dup + haystack_len); @@ -3923,26 +3926,24 @@ Reverse a string */ PHP_FUNCTION(strrev) { - zval **str; + zstr str; + int str_len; + zend_uchar str_type; char *s, *e, *n = NULL, *p; int32_t i, x1, x2; UChar32 ch; UChar *u_s, *u_n = NULL, *u_p; - if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &str) == FAILURE) { - WRONG_PARAM_COUNT; - } - - if (Z_TYPE_PP(str) != IS_UNICODE && Z_TYPE_PP(str) != IS_STRING) { - convert_to_text_ex(str); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) { + return; } - if (Z_TYPE_PP(str) == IS_UNICODE) { - u_n = eumalloc(Z_USTRLEN_PP(str)+1); + if (str_type == IS_UNICODE) { + u_n = eumalloc(str_len+1); u_p = u_n; - u_s = Z_USTRVAL_PP(str); + u_s = str.u; - i = Z_USTRLEN_PP(str); + i = str_len; while (i > 0) { U16_PREV(u_s, 0, i, ch); if (u_getCombiningClass(ch) == 0) { @@ -3954,17 +3955,17 @@ } while (u_getCombiningClass(ch) != 0); x1 = i; while (x1 <= x2) { - U16_NEXT(u_s, x1, Z_USTRLEN_PP(str), ch); + U16_NEXT(u_s, x1, str_len, ch); u_p += zend_codepoint_to_uchar(ch, u_p); } } } *u_p = 0; } else { - n = emalloc(Z_STRLEN_PP(str)+1); + n = emalloc(str_len+1); p = n; - s = Z_STRVAL_PP(str); - e = s + Z_STRLEN_PP(str); + s = str.s; + e = s + str_len; while (--e >= s) { *(p++) = *e; @@ -3972,10 +3973,10 @@ *p = '\0'; } - if (Z_TYPE_PP(str) == IS_UNICODE) { - RETVAL_UNICODEL(u_n, Z_USTRLEN_PP(str), 0); + if (str_type == IS_UNICODE) { + RETVAL_UNICODEL(u_n, str_len, 0); } else { - RETVAL_STRINGL(n, Z_STRLEN_PP(str), 0); + RETVAL_STRINGL(n, str_len, 0); } } /* }}} */ @@ -5603,8 +5604,7 @@ buf = eustrndup(rbuf, len); rp = rbuf; if (allow_len != 0) { - allow = eustrndup(allow, allow_len); - php_u_strtolower(&allow, &allow_len, UG(default_locale)); + allow = php_u_strtolower(allow, &allow_len, UG(default_locale)); tbuf = eumalloc(PHP_TAG_BUF_SIZE+1); tp = tbuf; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php