pollita         Mon Feb 23 15:35:00 2004 EDT

  Modified files:              
    /php-src/ext/standard       string.c 
  Log:
  Make today's changes work w/ str_ireplace() as well.
  
http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.410&r2=1.411&ty=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.410 php-src/ext/standard/string.c:1.411
--- php-src/ext/standard/string.c:1.410 Mon Feb 23 15:13:14 2004
+++ php-src/ext/standard/string.c       Mon Feb 23 15:34:59 2004
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: string.c,v 1.410 2004/02/23 20:13:14 pollita Exp $ */
+/* $Id: string.c,v 1.411 2004/02/23 20:34:59 pollita Exp $ */
 
 /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
 
@@ -2966,7 +2966,7 @@
        char *new_str;
 
        if (needle_len < length) {
-               char *end, *haystack_dup, *needle_dup;
+               char *end, *haystack_dup = NULL, *needle_dup = NULL;
                char *e, *s, *p, *r;
 
                if (needle_len == str_len) {
@@ -3002,14 +3002,33 @@
                                new_str = emalloc(length + 1);
                        } else {
                                int count = 0;
-                               char *o = haystack, *endp = haystack + length;
+                               char *o, *n, *endp;
 
-                               while ((o = php_memnstr(o, needle, needle_len, endp))) 
{
+                               if (case_sensitivity) {
+                                       o = haystack;
+                                       n = needle;
+                               } else {
+                                       haystack_dup = estrndup(haystack, length);
+                                       needle_dup = estrndup(needle, needle_len);
+                                       php_strtolower(haystack_dup, length);
+                                       php_strtolower(needle_dup, needle_len);
+                                       o = haystack_dup;
+                                       n = needle_dup;
+                               }
+                               endp = o + length;
+
+                               while ((o = php_memnstr(o, n, needle_len, endp))) {
                                        o += needle_len;
                                        count++;
                                }
                                if (count == 0) {
                                        /* Needle doesn't occur, shortcircuit the 
actual replacement. */
+                                       if (haystack_dup) {
+                                               efree(haystack_dup);
+                                       }
+                                       if (needle_dup) {
+                                               efree(needle_dup);
+                                       }
                                        new_str = estrndup(haystack, length);
                                        if (_new_length) {
                                                *_new_length = length;
@@ -3039,11 +3058,6 @@
                                        e += end - p;
                                }
                        } else {
-                               haystack_dup = estrndup(haystack, length);
-                               needle_dup = estrndup(needle, needle_len);
-                               php_strtolower(haystack_dup, length);
-                               php_strtolower(needle_dup, needle_len);
-
                                end = haystack_dup + length;
 
                                for (p = haystack_dup; (r = php_memnstr(p, needle_dup, 
needle_len, end)); p = r + needle_len) {
@@ -3060,7 +3074,12 @@
                                        memcpy(e, haystack + (p - haystack_dup), end - 
p);
                                        e += end - p;
                                }
+                       }
+
+                       if (haystack_dup) {
                                efree(haystack_dup);
+                       }
+                       if (needle_dup) {
                                efree(needle_dup);
                        }
 

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to