diff --git a/src/ChangeLog b/src/ChangeLog index 2ecdb25a6556a0ed0696e4b080ec43074e567707..38f1cb51ebd4843d805daeaf67b479fe5456741f 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 6a721a935c194d7476d3e40f8a71244cf7ac2087..87ba4a367dfa8143a7c9ddf29bd0816590a77426 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;