diff --git a/src/stralloc.c b/src/stralloc.c
index 5db09850c1bf613184093ad56193a403c203ffcf..a657ab5d72c154024b54e2f911d761ef0db9d374 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -25,7 +25,7 @@
 #define HUGE HUGE_VAL
 #endif /*!HUGE*/
 
-RCSID("$Id: stralloc.c,v 1.103 2000/10/10 00:02:56 hubbe Exp $");
+RCSID("$Id: stralloc.c,v 1.104 2000/10/10 01:19:03 hubbe Exp $");
 
 #define BEGIN_HASH_SIZE 997
 #define MAX_AVG_LINK_LENGTH 3
@@ -1366,16 +1366,20 @@ PMOD_EXPORT ptrdiff_t string_search(struct pike_string *haystack,
 
   mojt=compile_memsearcher(MKPCHARP_STR(needle),
 			   needle->len,
-			   0x7fffffff,
+			   haystack->len,
 			   needle);
 
   r=mojt.vtab->funcN(mojt.data,
 		     ADD_PCHARP(MKPCHARP_STR(haystack), start),
-		     haystack->len).ptr;
+		     haystack->len - start).ptr;
 
   mojt.vtab->freeme(mojt.data);
 
   if(!r) return -1;
+#ifdef PIKE_DEBUG
+  if(r < haystack || (r-haystack->str)>>haystack->size_shift > haystack->len)
+    fatal("string_search did a bobo!\n");
+#endif
   return (r-haystack->str)>>haystack->size_shift;
 }
 
@@ -1415,6 +1419,7 @@ PMOD_EXPORT struct pike_string *string_slice(struct pike_string *s,
 }
 
 /*** replace function ***/
+typedef char *(* replace_searchfunc)(void *,void *,size_t);
 PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
 				   struct pike_string *del,
 				   struct pike_string *to)
@@ -1423,7 +1428,8 @@ PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
   char *s,*tmp,*end;
   PCHARP r;
   int shift;
-  struct generic_mem_searcher searcher;
+  SearchMojt mojt;
+  replace_searchfunc f;
 
   if(!str->len)
   {
@@ -1452,26 +1458,39 @@ PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
 
   if(del->len == to->len)
   {
-    init_generic_memsearcher(&searcher,
-			     del->str,
+    mojt=compile_memsearcher(MKPCHARP_STR(del),
 			     del->len,
-			     del->size_shift,
 			     str->len,
-			     str->size_shift);
+			     del);
     ret=begin_wide_shared_string(str->len,shift);
+    switch(str->size_shift)
+    {
+      case 0: f=(replace_searchfunc)mojt.vtab->func0; break;
+      case 1: f=(replace_searchfunc)mojt.vtab->func1; break;
+      case 2: f=(replace_searchfunc)mojt.vtab->func2; break;
+#ifdef PIKE_DEBUG
+      default: fatal("Illegal shift.\n");
+#endif
+    }
+
   }else{
     INT32 delimeters=0;
-    init_generic_memsearcher(&searcher,
-			     del->str,
+    mojt=compile_memsearcher(MKPCHARP_STR(del),
 			     del->len,
-			     del->size_shift,
 			     str->len*2,
-			     str->size_shift);
+			     del);
 
-    while((s=generic_memory_search(&searcher,
-				   s,
-				   (end-s)>>str->size_shift,
-				   str->size_shift)))
+    switch(str->size_shift)
+    {
+      case 0: f=(replace_searchfunc)mojt.vtab->func0; break;
+      case 1: f=(replace_searchfunc)mojt.vtab->func1; break;
+      case 2: f=(replace_searchfunc)mojt.vtab->func2; break;
+#ifdef PIKE_DEBUG
+      default: fatal("Illegal shift.\n");
+#endif
+    }
+
+    while((s = f(mojt.data, s, (end-s)>>str->size_shift)))
     {
       delimeters++;
       s+=del->len << str->size_shift;
@@ -1479,6 +1498,7 @@ PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
     
     if(!delimeters)
     {
+      mojt.vtab->freeme(mojt.data);
       add_ref(str);
       return str;
     }
@@ -1488,10 +1508,7 @@ PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
   s=str->str;
   r=MKPCHARP_STR(ret);
 
-  while((tmp=(char *)generic_memory_search(&searcher,
-					   s,
-					   (end-s)>>str->size_shift,
-					   str->size_shift)))
+  while((tmp = f(mojt.data, s, (end-s)>>str->size_shift)))
   {
 #ifdef PIKE_DEBUG
     if(tmp + (del->len << str->size_shift) > end)
@@ -1505,6 +1522,7 @@ PMOD_EXPORT struct pike_string *string_replace(struct pike_string *str,
   }
   generic_memcpy(r,MKPCHARP(s,str->size_shift),(end-s)>>str->size_shift);
 
+  mojt.vtab->freeme(mojt.data);
   return end_shared_string(ret);
 }