Branch: Tag:

2000-10-10

2000-10-10 01:19:03 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

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);   }