From 0d1460409742121246a16486af13eab5ccf1316d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Mon, 9 Oct 2000 18:20:37 -0700 Subject: [PATCH] explode now uses search expression sharing Rev: src/array.c:1.90 --- src/array.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/array.c b/src/array.c index b3eb29fe77..6deeab47d5 100644 --- a/src/array.c +++ b/src/array.c @@ -23,7 +23,7 @@ #include "stuff.h" #include "bignum.h" -RCSID("$Id: array.c,v 1.89 2000/09/30 15:58:30 mast Exp $"); +RCSID("$Id: array.c,v 1.90 2000/10/10 01:20:37 hubbe Exp $"); PMOD_EXPORT struct array empty_array= { @@ -1555,6 +1555,8 @@ PMOD_EXPORT struct array *append_array(struct array *a, struct svalue *s) return a; } +typedef char *(* explode_searchfunc)(void *,void *,size_t); + PMOD_EXPORT struct array *explode(struct pike_string *str, struct pike_string *del) { @@ -1577,25 +1579,31 @@ PMOD_EXPORT struct array *explode(struct pike_string *str, ITEM(ret)[e].u.string=string_slice(str,e,1); } }else{ - struct generic_mem_searcher searcher; + SearchMojt mojt; + explode_searchfunc f; s=str->str; end=s+(str->len << str->size_shift); ret=allocate_array(10); ret->size=0; - - init_generic_memsearcher(&searcher, - del->str, + + mojt=compile_memsearcher(MKPCHARP_STR(del), del->len, - (char)del->size_shift, str->len, - (char)str->size_shift); - - while((tmp=(char *)generic_memory_search(&searcher, - s, - (end-s)>>str->size_shift, - (char)str->size_shift))) + del); + + switch(str->size_shift) + { + case 0: f=(explode_searchfunc)mojt.vtab->func0; break; + case 1: f=(explode_searchfunc)mojt.vtab->func1; break; + case 2: f=(explode_searchfunc)mojt.vtab->func2; break; +#ifdef PIKE_DEBUG + default: fatal("Illegal shift.\n"); +#endif + } + + while((tmp = f(mojt.data, s, (end-s)>> str->size_shift))) { if(ret->size == ret->malloced_size) { @@ -1626,6 +1634,7 @@ PMOD_EXPORT struct array *explode(struct pike_string *str, ITEM(ret)[ret->size].type=T_STRING; ret->size++; + mojt.vtab->freeme(mojt.data); } ret->type_field=BIT_STRING; return ret; -- GitLab