pike.git / src / stralloc.c

version» Context lines:

pike.git/src/stralloc.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: stralloc.c,v 1.220 2008/06/16 21:46:34 mast Exp $ + || $Id: stralloc.c,v 1.221 2008/06/23 16:05:02 mast Exp $   */      #include "global.h"   #include "stralloc.h"   #include "pike_macros.h"   #include "dynamic_buffer.h"   #include "pike_macros.h"   #include "pike_memory.h"   #include "pike_error.h"   #include "gc.h"
pike.git/src/stralloc.c:1845:       mojt=compile_memsearcher(MKPCHARP_STR(needle),    needle->len,    haystack->len,    needle);       r = (char *)mojt.vtab->funcN(mojt.data,    ADD_PCHARP(MKPCHARP_STR(haystack), start),    haystack->len - start).ptr;    -  mojt.vtab->freeme(mojt.data); +  if (mojt.container) free_object (mojt.container);       if(!r) return -1;   #ifdef PIKE_DEBUG    if((r < haystack->str) ||    (r - haystack->str)>>haystack->size_shift > haystack->len)    Pike_fatal("string_search did a bobo!\n");   #endif    return (r-haystack->str)>>haystack->size_shift;   }   
pike.git/src/stralloc.c:1904:   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;    SearchMojt mojt; +  ONERROR mojt_uwp;    replace_searchfunc f = (replace_searchfunc)0;       if(!str->len)    {    add_ref(empty_pike_string);    return empty_pike_string;    }       shift=MAXIMUM(str->size_shift,to->size_shift);   
pike.git/src/stralloc.c:1937:       s=str->str;    end=s+(str->len<<str->size_shift);       if(del->len == to->len)    {    mojt=compile_memsearcher(MKPCHARP_STR(del),    del->len,    str->len,    del); +  SET_ONERROR (mojt_uwp, do_free_object, mojt.container); +     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: Pike_fatal("Illegal shift.\n");   #endif    }       }else{    INT32 delimeters=0;    mojt=compile_memsearcher(MKPCHARP_STR(del),    del->len,    str->len*2,    del); -  +  SET_ONERROR (mojt_uwp, do_free_object, mojt.container);       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: Pike_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); +  CALL_AND_UNSET_ONERROR (mojt_uwp);    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 = f(mojt.data, s, (end-s)>>str->size_shift)))
pike.git/src/stralloc.c:1997:    Pike_fatal("SearchMojt 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); +  CALL_AND_UNSET_ONERROR (mojt_uwp);    return end_shared_string(ret);   }      /*** init/exit memory ***/   void init_shared_string_table(void)   {    init_short_pike_string0_blocks();    init_short_pike_string1_blocks();    init_short_pike_string2_blocks();    for(hashprimes_entry=0;hashprimes[hashprimes_entry]<BEGIN_HASH_SIZE;hashprimes_entry++);