pike.git / src / stralloc.c

version» Context lines:

pike.git/src/stralloc.c:18:      #include <errno.h>   #include <float.h>   #include <ctype.h>   #include <math.h>      #ifndef HUGE   #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      /* Experimental dynamic hash length */   #ifndef HASH_PREFIX   static unsigned int HASH_PREFIX=64;   static unsigned int need_more_hash_prefix=0;   #endif   
pike.git/src/stralloc.c:1359:    SearchMojt mojt;    struct generic_mem_searcher s;    char *r;       if(needle->size_shift > haystack->size_shift ||    start + needle->len > haystack->len)    return -1;       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;   }      PMOD_EXPORT struct pike_string *string_slice(struct pike_string *s,    ptrdiff_t start,    ptrdiff_t len)   {   #ifdef PIKE_DEBUG    if(start < 0 || len<0 || start+len>s->len )    {
pike.git/src/stralloc.c:1408:    return make_shared_binary_string1(STR1(s)+start,len);       case 2:    return make_shared_binary_string2(STR2(s)+start,len);    }    fatal("Illegal shift size!\n");    return 0;   }      /*** 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)   {    struct pike_string *ret;    char *s,*tmp,*end;    PCHARP r;    int shift; -  struct generic_mem_searcher searcher; +  SearchMojt mojt; +  replace_searchfunc f;       if(!str->len)    {    add_ref(str);    return str;    }       shift=MAXIMUM(str->size_shift,to->size_shift);       if(!del->len)
pike.git/src/stralloc.c:1445:    low_set_index(ret,pos++,index_shared_string(str,e));    }    return end_shared_string(ret);    }       s=str->str;    end=s+(str->len<<str->size_shift);       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;    }       ret=begin_wide_shared_string(str->len + (to->len-del->len)*delimeters, shift);    }    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)    fatal("generic_memory_search found a match beyond end of string!!!\n");   #endif    generic_memcpy(r,MKPCHARP(s,str->size_shift),(tmp-s)>>str->size_shift);    INC_PCHARP(r,(tmp-s)>>str->size_shift);    pike_string_cpy(r,to);    INC_PCHARP(r,to->len);    s=tmp+(del->len << str->size_shift);    }    generic_memcpy(r,MKPCHARP(s,str->size_shift),(end-s)>>str->size_shift);    -  +  mojt.vtab->freeme(mojt.data);    return end_shared_string(ret);   }      /*** init/exit memory ***/   void init_shared_string_table(void)   {    for(hashprimes_entry=0;hashprimes[hashprimes_entry]<BEGIN_HASH_SIZE;hashprimes_entry++);    htable_size=hashprimes[hashprimes_entry];    base_table=(struct pike_string **)xalloc(sizeof(struct pike_string *)*htable_size);    MEMSET((char *)base_table,0,sizeof(struct pike_string *)*htable_size);