From 1f515a4c3030bc60e8330d3bfdbeece1b6cd5823 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Sat, 15 Feb 1997 09:29:20 -0800
Subject: [PATCH] string_replace optimized

Rev: src/ChangeLog:1.76
Rev: src/stralloc.c:1.11
---
 src/ChangeLog  |  5 +++++
 src/stralloc.c | 32 ++++++++++++++++++--------------
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 2ecdb25a65..38f1cb51eb 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+Sat Feb 15 08:30:15 1997  Fredrik Hubinette  <hubbe@cytocin.hubbe.net>
+
+	* stralloc.c (string_replace): optimized replace when to and
+	  from string are the same length.
+
 Thu Feb 13 02:56:13 1997  Niels M�ller  <nisse@infovav.se>
 
 	* operators.c (o_and, o_or, o_xor, o_compl): Added support for
diff --git a/src/stralloc.c b/src/stralloc.c
index 6a721a935c..87ba4a367d 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -505,29 +505,33 @@ struct pike_string *string_replace(struct pike_string *str,
 				     struct pike_string *to)
 {
   struct pike_string *ret;
-  INT32 delimeters;
   char *s,*tmp,*r,*end;
   struct mem_searcher searcher;
 
   s=str->str;
   end=s+str->len;
-  delimeters=0;
 
-  init_memsearch(&searcher, del->str, del->len, str->len * 2);
-
-  while((s=memory_search(&searcher,s,end-s)))
+  if(del->len == to->len)
   {
-    delimeters++;
-    s+=del->len;
-  }
+    init_memsearch(&searcher, del->str, del->len, str->len);
+    ret=begin_shared_string(str->len);
+  }else{
+    INT32 delimeters=0;
+    init_memsearch(&searcher, del->str, del->len, str->len*2);
+    while((s=memory_search(&searcher,s,end-s)))
+    {
+      delimeters++;
+      s+=del->len;
+    }
+    
+    if(!delimeters)
+    {
+      str->refs++;
+      return str;
+    }
 
-  if(!delimeters)
-  {
-    str->refs++;
-    return str;
+    ret=begin_shared_string(str->len + (to->len-del->len)*delimeters);
   }
-
-  ret=begin_shared_string(str->len + (to->len-del->len)*delimeters);
   s=str->str;
   r=ret->str;
 
-- 
GitLab