pike.git/
src/
stralloc.c
Branch:
Tag:
Non-build tags
All tags
No tags
2000-10-10
2000-10-10 01:19:03 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
5d5423b3c966a990d0282d002ae25f7a685b591c (
59
lines) (+
39
/-
20
)
[
Show
|
Annotate
]
Branch:
7.9
bugfix
Rev: src/stralloc.c:1.104
25:
#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:
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:
} /*** 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:
char *s,*tmp,*end; PCHARP r; int shift;
-
struct
generic
_
mem_searcher
searcher
;
+
SearchMojt
mojt;
+
replace
_
searchfunc
f
;
if(!str->len) {
1452:
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; } if(!delimeters) {
-
+
mojt.vtab->freeme(mojt.data);
add_ref(str); return str; }
1488:
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:
} generic_memcpy(r,MKPCHARP(s,str->size_shift),(end-s)>>str->size_shift);
+
mojt.vtab->freeme(mojt.data);
return end_shared_string(ret); }