dmitry Tue, 15 Dec 2009 12:31:32 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=292161
Log:
Fixed pcre_quote() to work with both unicode and binary strings
Changed paths:
U php/php-src/trunk/ext/pcre/php_pcre.c
U php/php-src/trunk/ext/pcre/tests/preg_quote_error1.phpt
Modified: php/php-src/trunk/ext/pcre/php_pcre.c
===================================================================
--- php/php-src/trunk/ext/pcre/php_pcre.c 2009-12-15 12:30:14 UTC (rev
292160)
+++ php/php-src/trunk/ext/pcre/php_pcre.c 2009-12-15 12:31:32 UTC (rev
292161)
@@ -1771,33 +1771,56 @@
Quote regular expression characters plus an optional character */
static PHP_FUNCTION(preg_quote)
{
- int in_str_len;
- char *in_str; /* Input string argument */
- char *in_str_end; /* End of the input string */
- int delim_len = 0;
- char *delim = NULL; /* Additional delimiter argument */
- char *out_str, /* Output string with quoted characters
*/
- *p, /* Iterator for input
string */
- *q, /* Iterator for output
string */
- c; /* Current character */
+ int in_str_len;
+ zstr in_str; /* Input string argument */
+ char *in_str_end; /* End of the input string */
+ zend_uchar in_str_type;
+ int delim_len = 0;
+ zstr delim; /* Additional delimiter
argument */
+ zend_uchar delim_type;
+ char *out_str, /* Output string with quoted characters
*/
+ *p, /* Iterator for input string */
+ *q, /* Iterator for output string */
+ c; /* Current character */
UChar32 delim_char=0; /* Delimiter character to be quoted */
zend_bool quote_delim = 0; /* Whether to quote additional delim char */
/* Get the arguments and check for errors */
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s&|s&", &in_str,
&in_str_len, UG(utf8_conv),
- &delim, &delim_len,
UG(utf8_conv)) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "T|T", &in_str,
&in_str_len, &in_str_type,
+ &delim, &delim_len,
&delim_type) == FAILURE) {
return;
}
- in_str_end = in_str + in_str_len;
+ /* Conver to UTF-8 if necessary */
+ if (in_str_type == IS_UNICODE) {
+ if (zend_unicode_to_string(UG(utf8_conv), &in_str.s,
&in_str_len, in_str.u, in_str_len TSRMLS_CC) == FAILURE) {
+ RETURN_FALSE;
+ }
+ if (delim_len) {
+ if (zend_unicode_to_string(UG(utf8_conv), &delim.s,
&delim_len, delim.u, delim_len TSRMLS_CC) == FAILURE) {
+ RETURN_FALSE;
+ }
+ }
+ }
+ in_str_end = in_str.s + in_str_len;
+
/* Nothing to do if we got an empty string */
- if (in_str == in_str_end) {
- RETURN_EMPTY_UNICODE();
+ if (in_str.s == in_str_end) {
+ if (in_str_type == IS_UNICODE) {
+ RETVAL_EMPTY_UNICODE();
+ efree(in_str.s);
+ if (delim_len) {
+ efree(delim.s);
+ }
+ } else {
+ RETVAL_EMPTY_STRING();
+ }
+ return;
}
- if (delim && *delim) {
- U8_GET((unsigned char*)delim, 0, 0, delim_len, delim_char);
+ if (delim_len) {
+ U8_GET((unsigned char*)delim.s, 0, 0, delim_len, delim_char);
quote_delim = 1;
}
@@ -1809,7 +1832,7 @@
out_str = safe_emalloc(5, in_str_len, 1);
/* Go through the string and quote necessary characters */
- for(p = in_str, q = out_str; p != in_str_end; p++) {
+ for(p = in_str.s, q = out_str; p != in_str_end; p++) {
c = *p;
switch(c) {
case '.':
@@ -1865,7 +1888,15 @@
*q = '\0';
/* Reallocate string and return it */
- RETVAL_UTF8_STRINGL(erealloc(out_str, q - out_str + 1), q - out_str,
ZSTR_AUTOFREE);
+ if (in_str_type == IS_UNICODE) {
+ RETVAL_UTF8_STRINGL(erealloc(out_str, q - out_str + 1), q -
out_str, ZSTR_AUTOFREE);
+ efree(in_str.s);
+ if (delim_len) {
+ efree(delim.s);
+ }
+ } else {
+ RETVAL_STRINGL(erealloc(out_str, q - out_str + 1), q - out_str,
0);
+ }
}
/* }}} */
Modified: php/php-src/trunk/ext/pcre/tests/preg_quote_error1.phpt
===================================================================
--- php/php-src/trunk/ext/pcre/tests/preg_quote_error1.phpt 2009-12-15
12:30:14 UTC (rev 292160)
+++ php/php-src/trunk/ext/pcre/tests/preg_quote_error1.phpt 2009-12-15
12:31:32 UTC (rev 292161)
@@ -28,9 +28,9 @@
Arg value is: Array
-Warning: preg_quote() expects parameter 1 to be binary string, array given in
%spreg_quote_error1.php on line %d
+Warning: preg_quote() expects parameter 1 to be string (Unicode or binary),
array given in %spreg_quote_error1.php on line %d
NULL
-Warning: preg_quote() expects parameter 1 to be binary string, object given in
%spreg_quote_error1.php on line %d
+Warning: preg_quote() expects parameter 1 to be string (Unicode or binary),
object given in %spreg_quote_error1.php on line %d
NULL
Done
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php