cvs: php4 /ext/pcre php_pcre.c /ext/standard array.c
| From: | Andrei Zmievski | Date: | Fri, 22 Dec 2000 16:31:43 +0000 |
| Subject: | cvs: php4 /ext/pcre php_pcre.c /ext/standard array.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-3225@lists.php.net to get a copy of this message | ||
andrei Fri Dec 22 08:31:43 2000 EDT
Modified files:
/php4/ext/pcre php_pcre.c
/php4/ext/standard array.c
Log:
(PHP preg_replace) Fix to allow proper escaping of captured subpattern
references in the replacement string.
(PHP array_sum) Check that argument is an array.
Index: php4/ext/pcre/php_pcre.c
diff -u php4/ext/pcre/php_pcre.c:1.76 php4/ext/pcre/php_pcre.c:1.77
--- php4/ext/pcre/php_pcre.c:1.76 Fri Dec 22 04:57:07 2000
+++ php4/ext/pcre/php_pcre.c Fri Dec 22 08:31:42 2000
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_pcre.c,v 1.76 2000/12/22 12:57:07 zeev Exp $ */
+/* $Id: php_pcre.c,v 1.77 2000/12/22 16:31:42 andrei Exp $ */
/*
TODO:
@@ -627,41 +627,47 @@
while (*walk) {
/* If found a backreference.. */
- if (('\\' == *walk || '$' == *walk ) && walk_last != '\\'
&&
- preg_get_backref(walk+1, &backref)) {
- if (backref < count) {
- /* Find the corresponding string match and substitute it
- in instead of the backref */
- match = subject + offsets[backref<<1];
- match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
- if (match_len)
- esc_match = php_addslashes(match, match_len, &esc_match_len, 0);
- else {
- esc_match = match;
+ if ('\\' == *walk || '$' == *walk) {
+ if (walk_last == '\\') {
+ memmove(walk-1, walk, code_len - (walk - code) + 1);
+ walk_last = 0;
+ continue;
+ }
+ if (preg_get_backref(walk+1, &backref)) {
+ if (backref < count) {
+ /* Find the corresponding string match and substitute it
+ in instead of the backref */
+ match = subject + offsets[backref<<1];
+ match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
+ if (match_len)
+ esc_match = php_addslashes(match, match_len, &esc_match_len, 0);
+ else {
+ esc_match = match;
+ esc_match_len = 0;
+ }
+ } else {
+ esc_match = empty_string;
esc_match_len = 0;
+ match_len = 0;
}
- } else {
- esc_match = empty_string;
- esc_match_len = 0;
- match_len = 0;
- }
- sprintf(backref_buf, "%c%d", *walk, backref);
- new_code = php_str_to_str(code, code_len,
- backref_buf, (backref > 9) ? 3 : 2,
- esc_match, esc_match_len, &new_code_len);
-
- /* Adjust the walk pointer */
- walk = new_code + (walk - code) + match_len;
-
- /* Clean up and reassign */
- if (esc_match_len)
- efree(esc_match);
- efree(code);
- code = new_code;
- code_len = new_code_len;
- } else {
- walk++;
+ sprintf(backref_buf, "%c%d", *walk, backref);
+ new_code = php_str_to_str(code, code_len,
+ backref_buf, (backref > 9) ? 3 : 2,
+ esc_match, esc_match_len, &new_code_len);
+
+ /* Adjust the walk pointer */
+ walk = new_code + (walk - code) + match_len;
+
+ /* Clean up and reassign */
+ if (esc_match_len)
+ efree(esc_match);
+ efree(code);
+ code = new_code;
+ code_len = new_code_len;
+ continue;
+ }
}
+ walk++;
walk_last = walk[-1];
}
@@ -779,15 +785,21 @@
walk = replace;
walk_last = 0;
while (walk < replace_end) {
- if (('\\' == *walk || '$' == *walk) && walk_last != '\\'
&&
- preg_get_backref(walk+1, &backref)) {
- if (backref < count)
- new_len += offsets[(backref<<1)+1] - offsets[backref<<1];
- walk += (backref > 9) ? 3 : 2;
- } else {
- new_len++;
- walk++;
+ if ('\\' == *walk || '$' == *walk) {
+ if (walk_last == '\\') {
+ walk++;
+ walk_last = 0;
+ continue;
+ }
+ if (preg_get_backref(walk+1, &backref)) {
+ if (backref < count)
+ new_len += offsets[(backref<<1)+1] - offsets[backref<<1];
+ walk += (backref > 9) ? 3 : 2;
+ continue;
+ }
}
+ new_len++;
+ walk++;
walk_last = walk[-1];
}
}
@@ -816,17 +828,23 @@
walk = replace;
walk_last = 0;
while (walk < replace_end) {
- if (('\\' == *walk || '$' == *walk) && walk_last != '\\'
&&
- preg_get_backref(walk+1, &backref)) {
- if (backref < count) {
- match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
- memcpy(walkbuf, subject + offsets[backref<<1], match_len);
- walkbuf += match_len;
+ if ('\\' == *walk || '$' == *walk) {
+ if (walk_last == '\\') {
+ *(walkbuf-1) = *walk++;
+ walk_last = 0;
+ continue;
+ }
+ if (preg_get_backref(walk+1, &backref)) {
+ if (backref < count) {
+ match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
+ memcpy(walkbuf, subject + offsets[backref<<1], match_len);
+ walkbuf += match_len;
+ }
+ walk += (backref > 9) ? 3 : 2;
+ continue;
}
- walk += (backref > 9) ? 3 : 2;
- } else {
- *walkbuf++ = *walk++;
}
+ *walkbuf++ = *walk++;
walk_last = walk[-1];
}
*walkbuf = '\0';
Index: php4/ext/standard/array.c
diff -u php4/ext/standard/array.c:1.85 php4/ext/standard/array.c:1.86
--- php4/ext/standard/array.c:1.85 Fri Dec 22 04:57:08 2000
+++ php4/ext/standard/array.c Fri Dec 22 08:31:42 2000
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: array.c,v 1.85 2000/12/22 12:57:08 zeev Exp $ */
+/* $Id: array.c,v 1.86 2000/12/22 16:31:42 andrei Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -2774,6 +2774,12 @@
if (argc != 1 || zend_get_parameters_ex(argc, &input) == FAILURE) {
WRONG_PARAM_COUNT;
+ }
+
+ if (Z_TYPE_PP(input) != IS_ARRAY) {
+ php_error(E_WARNING, "The argument to %s() should be an array",
+ get_active_function_name());
+ return;
}
ZVAL_LONG(return_value, 0);