rolland Wed Sep 28 05:22:14 2005 EDT Modified files: /php-src/ext/standard php_string.h string.c Log: - Unicode impl of {add,strip}slashes()
http://cvs.php.net/diff.php/php-src/ext/standard/php_string.h?r1=1.89&r2=1.90&ty=u Index: php-src/ext/standard/php_string.h diff -u php-src/ext/standard/php_string.h:1.89 php-src/ext/standard/php_string.h:1.90 --- php-src/ext/standard/php_string.h:1.89 Tue Aug 16 02:02:55 2005 +++ php-src/ext/standard/php_string.h Wed Sep 28 05:22:08 2005 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_string.h,v 1.89 2005/08/16 06:02:55 rolland Exp $ */ +/* $Id: php_string.h,v 1.90 2005/09/28 09:22:08 rolland Exp $ */ /* Synced with php 3.0 revision 1.43 1999-06-16 [ssb] */ @@ -120,10 +120,13 @@ PHPAPI UChar *php_u_strtoupper(UChar **s, int32_t *len, const char *locale); PHPAPI UChar *php_u_strtolower(UChar **s, int32_t *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, int32_t length, int32_t *new_length, int freeit TSRMLS_DC); +PHPAPI UChar *php_u_addslashes_ex(UChar *str, int32_t length, int32_t *new_length, int freeit, int ignore_sybase TSRMLS_DC); PHPAPI char *php_addslashes(char *str, int length, int *new_length, int freeit TSRMLS_DC); PHPAPI char *php_addslashes_ex(char *str, int length, int *new_length, int freeit, int ignore_sybase TSRMLS_DC); PHPAPI char *php_addcslashes(char *str, int length, int *new_length, int freeit, char *what, int wlength TSRMLS_DC); PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC); +PHPAPI void php_u_stripslashes(UChar *str, int32_t *len TSRMLS_DC); PHPAPI void php_stripcslashes(char *str, int *len); PHPAPI void php_basename(char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len TSRMLS_DC); PHPAPI size_t php_dirname(char *str, size_t len); http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.483&r2=1.484&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.483 php-src/ext/standard/string.c:1.484 --- php-src/ext/standard/string.c:1.483 Mon Sep 26 19:08:10 2005 +++ php-src/ext/standard/string.c Wed Sep 28 05:22:08 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.483 2005/09/26 23:08:10 iliaa Exp $ */ +/* $Id: string.c,v 1.484 2005/09/28 09:22:08 rolland Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -3427,6 +3427,66 @@ } /* }}} */ +/* {{{ php_u_stripslashes + * + * be careful, this edits the string in-place */ +PHPAPI void php_u_stripslashes(UChar *str, int32_t *len TSRMLS_DC) +{ + int32_t tmp_len = 0, i = 0; + UChar32 ch1, ch2; + + ch1 = -1; ch2 = -1; + if (PG(magic_quotes_sybase)) { + while (i < *len) { + U16_NEXT(str, i, *len, ch1); + if (ch1 == '\'') { + tmp_len += zend_codepoint_to_uchar(ch1, str+tmp_len); + if (i < *len) { + U16_NEXT(str, i, *len, ch2); + if (ch2 != '\'') { + tmp_len += zend_codepoint_to_uchar(ch2, str+tmp_len); + } + } + } else if (ch1 == '\\') { + if (i < *len) { + U16_NEXT(str, i, *len, ch2); + if (ch2 == '0') { + tmp_len += zend_codepoint_to_uchar('\0', str+tmp_len); + } else { + tmp_len += zend_codepoint_to_uchar(ch1, str+tmp_len); + tmp_len += zend_codepoint_to_uchar(ch2, str+tmp_len); + } + } else { + tmp_len += zend_codepoint_to_uchar(ch1, str+tmp_len); + } + } else { + tmp_len += zend_codepoint_to_uchar(ch1, str+tmp_len); + } + } + } else { + while (i < *len) { + U16_NEXT(str, i, *len, ch1); + if (ch1 == '\\') { + if (i < *len) { + U16_NEXT(str, i, *len, ch2); + if (ch2 == '0') { + tmp_len += zend_codepoint_to_uchar('\0', str+tmp_len); + } else { + tmp_len += zend_codepoint_to_uchar(ch2, str+tmp_len); + } + } + } else { + tmp_len += zend_codepoint_to_uchar(ch1, str+tmp_len); + } + } + } + *(str+tmp_len) = 0; + str = eurealloc(str, tmp_len+1); + *len = tmp_len; + return; +} +/* }}} */ + /* {{{ php_stripslashes * * be careful, this edits the string in-place */ @@ -3531,20 +3591,35 @@ PHP_FUNCTION(addslashes) { zval **str; + void *tmp = NULL; + int32_t tmp_len = 0; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(str); + convert_to_text_ex(str); - if (Z_STRLEN_PP(str) == 0) { + if (Z_TYPE_PP(str) == IS_UNICODE && Z_USTRLEN_PP(str) == 0) { + RETURN_EMPTY_UNICODE(); + } else if (Z_TYPE_PP(str) == IS_BINARY && Z_BINLEN_PP(str) == 0) { + RETURN_EMPTY_BINARY(); + } else if (Z_TYPE_PP(str) == IS_STRING && Z_STRLEN_PP(str) == 0) { RETURN_EMPTY_STRING(); } - RETURN_STRING(php_addslashes(Z_STRVAL_PP(str), - Z_STRLEN_PP(str), - &Z_STRLEN_P(return_value), 0 - TSRMLS_CC), 0); + if (Z_TYPE_PP(str) == IS_UNICODE) { + tmp = (UChar *)php_u_addslashes(Z_USTRVAL_PP(str), Z_USTRLEN_PP(str), + &tmp_len, 0 TSRMLS_CC); + RETURN_UNICODEL((UChar *)tmp, tmp_len, 0); + } else { + tmp = (char *)php_addslashes(Z_STRVAL_PP(str), Z_STRLEN_PP(str), + &tmp_len, 0 TSRMLS_CC); + if (Z_TYPE_PP(str) == IS_BINARY) { + RETURN_BINARYL((char *)tmp, tmp_len, 0); + } else { + RETURN_STRINGL((char *)tmp, tmp_len, 0); + } + } } /* }}} */ @@ -3573,10 +3648,19 @@ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(str); + convert_to_text_ex(str); - ZVAL_STRINGL(return_value, Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1); - php_stripslashes(Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value) TSRMLS_CC); + if (Z_TYPE_PP(str) == IS_UNICODE) { + ZVAL_UNICODEL(return_value, Z_USTRVAL_PP(str), Z_USTRLEN_PP(str), 1); + php_u_stripslashes(Z_USTRVAL_P(return_value), &Z_USTRLEN_P(return_value) TSRMLS_CC); + } else { + if (Z_TYPE_PP(str) == IS_BINARY) { + ZVAL_BINARYL(return_value, Z_BINVAL_PP(str), Z_BINLEN_PP(str), 1); + } else { + ZVAL_STRINGL(return_value, Z_STRVAL_PP(str), Z_STRLEN_PP(str), 1); + } + php_stripslashes(Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value) TSRMLS_CC); + } } /* }}} */ @@ -3718,6 +3802,77 @@ } /* }}} */ +/* {{{ php_u_addslashes + */ +PHPAPI UChar *php_u_addslashes(UChar *str, int32_t length, int32_t *new_length, int should_free TSRMLS_DC) +{ + return php_u_addslashes_ex(str, length, new_length, should_free, 0 TSRMLS_CC); +} + +/* {{{ php_u_addslashes_ex + */ +PHPAPI UChar *php_u_addslashes_ex(UChar *str, int32_t length, int32_t *new_length, int should_free, int ignore_sybase TSRMLS_DC) +{ + UChar *buf; + int32_t buf_len = 0, i = 0; + UChar32 ch; + + if (!new_length) { + new_length = &buf_len; + } + if (!str) { + *new_length = 0; + return str; + } + + buf = eumalloc(length * 2); + if (!ignore_sybase && PG(magic_quotes_sybase)) { + while (i < length) { + U16_NEXT(str, i, length, ch); + switch (ch) { + case '\0': + buf_len += zend_codepoint_to_uchar('\\', buf+buf_len); + buf_len += zend_codepoint_to_uchar('0', buf+buf_len); + break; + case '\'': + buf_len += zend_codepoint_to_uchar('\'', buf+buf_len); + buf_len += zend_codepoint_to_uchar('\'', buf+buf_len); + break; + default: + buf_len += zend_codepoint_to_uchar(ch, buf+buf_len); + break; + } + } + } else { + while (i < length) { + U16_NEXT(str, i, length, ch); + switch (ch) { + case '\0': + buf_len += zend_codepoint_to_uchar('\\', buf+buf_len); + buf_len += zend_codepoint_to_uchar('0', buf+buf_len); + break; + case '\'': + case '\"': + case '\\': + buf_len += zend_codepoint_to_uchar('\\', buf+buf_len); + /* break is missing *intentionally* */ + default: + buf_len += zend_codepoint_to_uchar(ch, buf+buf_len); + break; + } + } + } + *(buf+buf_len) = 0; + + if (should_free) { + STR_FREE(str); + } + buf = eurealloc(buf, buf_len+1); + *new_length = buf_len; + return buf; +} +/* }}} */ + /* {{{ php_addslashes */ PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_free TSRMLS_DC)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php