diff --git a/src/memory.c b/src/memory.c deleted file mode 100644 index 49dacdd9edc67d0ae96bb65d7eed5ede363c6171..0000000000000000000000000000000000000000 --- a/src/memory.c +++ /dev/null @@ -1,367 +0,0 @@ -/*\ -||| This file a part of Pike, and is copyright by Fredrik Hubinette -||| Pike is distributed as GPL (General Public License) -||| See the files COPYING and DISCLAIMER for more information. -\*/ -#include "global.h" -#include "memory.h" -#include "error.h" -#include "pike_macros.h" - -char *xalloc(SIZE_T size) -{ - char *ret; - if(!size) return 0; - - ret=(char *)malloc(size); - if(ret) return ret; - - error("Out of memory.\n"); - return 0; -} - -void swap(char *a, char *b, INT32 size) -{ - int tmp; - char tmpbuf[1024]; - while(size) - { - tmp=MINIMUM((long)sizeof(tmpbuf), size); - MEMCPY(tmpbuf,a,tmp); - MEMCPY(b,a,tmp); - MEMCPY(b,tmpbuf,tmp); - size-=tmp; - a+=tmp; - b+=tmp; - } -} - -void reverse(char *memory, INT32 nitems, INT32 size) -{ -#define DOSIZE(X,Y) \ - case X: \ - { \ - struct Y { char tt[X]; }; \ - struct Y tmp; \ - struct Y *start=(struct Y *) memory; \ - struct Y *end=start+nitems-1; \ - while(start<end){tmp=*start;*(start++)=*end;*(end--)=tmp;} \ - break; \ - } - - switch(size) - { - DOSIZE(1,TMP1) - DOSIZE(2,TMP2) - DOSIZE(4,TMP4) - DOSIZE(8,TMP8) - default: - { - char *start = (char *) memory; - char *end=start+(nitems-1)*size; - while(start<end) - { - swap(start,end,size); - start+=size; - end-=size; - } - } - } -} - -/* - * This function may NOT change 'order' - * This function is hopefully fast enough... - */ -void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order) -{ - INT32 e; - char *tmp; - tmp=xalloc(size * nitems); -#undef DOSIZE -#define DOSIZE(X,Y) \ - case X: \ - { \ - struct Y { char tt[X]; }; \ - struct Y *from=(struct Y *) memory; \ - struct Y *to=(struct Y *) tmp; \ - for(e=0;e<nitems;e++) to[e]=from[order[e]]; \ - break; \ - } - - - switch(size) - { - DOSIZE(1,TMP1) - DOSIZE(2,TMP2) - DOSIZE(4,TMP4) - DOSIZE(8,TMP8) - DOSIZE(16,TMP16) - - default: - for(e=0;e<nitems;e++) MEMCPY(tmp+e*size, memory+order[e]*size, size); - } - - MEMCPY(memory, tmp, size * nitems); - free(tmp); -} - -unsigned INT32 hashmem(const unsigned char *a,INT32 len,INT32 mlen) -{ - unsigned INT32 ret; - - ret=9248339*len; - if(len<mlen) mlen=len; - switch(mlen&7) - { - case 7: ret^=*(a++); - case 6: ret^=(ret<<4)+*(a++); - case 5: ret^=(ret<<7)+*(a++); - case 4: ret^=(ret<<6)+*(a++); - case 3: ret^=(ret<<3)+*(a++); - case 2: ret^=(ret<<7)+*(a++); - case 1: ret^=(ret<<5)+*(a++); - } - -#ifdef HANDLES_UNALIGNED_MEMORY_ACCESS - { - unsigned int *b; - b=(unsigned int *)a; - - for(mlen>>=3;--mlen>=0;) - { - ret^=(ret<<7)+*(b++); - ret^=(ret>>6)+*(b++); - } - } -#else - for(mlen>>=3;--mlen>=0;) - { - ret^=(ret<<7)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++)); - ret^=(ret>>6)+((((((*(a++)<<3)+*(a++))<<4)+*(a++))<<5)+*(a++)); - } -#endif - return ret; -} - -unsigned INT32 hashstr(const unsigned char *str,INT32 maxn) -{ - unsigned INT32 ret,c; - - ret=str++[0]; - for(; maxn>=0; maxn--) - { - c=str++[0]; - if(!c) break; - ret ^= ( ret << 4 ) + c ; - ret &= 0x7fffffff; - } - - return ret; -} - - -/* - * a quick memory search function. - * Written by Fredrik Hubinette (hubbe@lysator.liu.se) - */ -void init_memsearch(struct mem_searcher *s, - char *needle, - SIZE_T needlelen, - SIZE_T max_haystacklen) -{ - s->needle=needle; - s->needlelen=needlelen; - - switch(needlelen) - { - case 0: s->method=no_search; break; - case 1: s->method=use_memchr; break; - case 2: - case 3: - case 4: - case 5: - case 6: s->method=memchr_and_memcmp; break; - default: - if(max_haystacklen <= needlelen + 64) - { - s->method=memchr_and_memcmp; - }else{ - INT32 tmp, h; - unsigned INT32 hsize, e, max; - unsigned char *q; - struct link *ptr; - - hsize=52+(max_haystacklen >> 7) - (needlelen >> 8); - max =13+(max_haystacklen >> 4) - (needlelen >> 5); - - if(hsize > NELEM(s->set)) - { - hsize=NELEM(s->set); - }else{ - for(e=8;e<hsize;e+=e); - hsize=e; - } - - for(e=0;e<hsize;e++) s->set[e]=0; - hsize--; - - if(max > needlelen) max=needlelen; - max=(max-sizeof(INT32)+1) & -sizeof(INT32); - if(max > MEMSEARCH_LINKS) max=MEMSEARCH_LINKS; - - ptr=& s->links[0]; - - q=(unsigned char *)needle; - -#if BYTEORDER == 4321 - for(tmp=e=0;e<sizeof(INT32)-1;e++) - { - tmp<<=8; - tmp|=*(q++); - } -#endif - - for(e=0;e<max;e++) - { -#if BYTEORDER == 4321 - tmp<<=8; - tmp|=*(q++); -#else - tmp=EXTRACT_INT(q); - q++; -#endif - h=tmp; - h+=h>>7; - h+=h>>17; - h&=hsize; - - ptr->offset=e; - ptr->key=tmp; - ptr->next=s->set[h]; - s->set[h]=ptr; - ptr++; - } - s->hsize=hsize; - s->max=max; - s->method=hubbe_search; - } - } -} - - -char *memory_search(struct mem_searcher *s, - char *haystack, - SIZE_T haystacklen) -{ - if(s->needlelen > haystacklen) return 0; - - switch(s->method) - { - case no_search: - return haystack; - - case use_memchr: - return MEMCHR(haystack,s->needle[0],haystacklen); - - case memchr_and_memcmp: - { - char *end,c,*needle; - SIZE_T needlelen; - - needle=s->needle; - needlelen=s->needlelen; - - end=haystack + haystacklen - needlelen+1; - c=needle[0]; - needle++; - needlelen--; - while((haystack=MEMCHR(haystack,c,end-haystack))) - if(!MEMCMP(++haystack,needle,needlelen)) - return haystack-1; - - return 0; - } - - case hubbe_search: - { - INT32 tmp, h; - char *q, *end; - register struct link *ptr; - - end=haystack+haystacklen; - q=haystack + s->max - sizeof(INT32); - q=(char *)( ((long)q) & -sizeof(INT32)); - for(;q<=end-sizeof(INT32);q+=s->max) - { - h=tmp=*(INT32 *)q; - - h+=h>>7; - h+=h>>17; - h&=s->hsize; - - for(ptr=s->set[h];ptr;ptr=ptr->next) - { - char *where; - - if(ptr->key != tmp) continue; - - where=q-ptr->offset; - if(where<haystack) continue; - if(where+s->needlelen>end) return 0; - - if(!MEMCMP(where,s->needle,s->needlelen)) - return where; - } - } - } - } - return 0; -} - -char *my_memmem(char *needle, - SIZE_T needlelen, - char *haystack, - SIZE_T haystacklen) -{ - struct mem_searcher tmp; - init_memsearch(&tmp, needle, needlelen, haystacklen); - return memory_search(&tmp, haystack, haystacklen); -} - -void memfill(char *to, - INT32 tolen, - char *from, - INT32 fromlen, - INT32 offset) -{ - if(fromlen==1) - { - MEMSET(to, *from, tolen); - } - else if(tolen>0) - { - INT32 tmp=MINIMUM(tolen, fromlen - offset); - MEMCPY(to, from + offset, tmp); - to+=tmp; - tolen-=tmp; - - if(tolen > 0) - { - tmp=MINIMUM(tolen, fromlen); - MEMCPY(to, from, tmp); - from=to; - to+=tmp; - tolen-=tmp; - - while(tolen>0) - { - tmp=MINIMUM(tolen, fromlen); - MEMCPY(to, from, MINIMUM(tolen, fromlen)); - fromlen+=tmp; - tolen-=tmp; - to+=tmp; - } - } - } -} diff --git a/src/memory.h b/src/memory.h deleted file mode 100644 index e53a9fe6ef9d676fa3f6634ceed07be7f49ab81f..0000000000000000000000000000000000000000 --- a/src/memory.h +++ /dev/null @@ -1,61 +0,0 @@ -/*\ -||| This file a part of Pike, and is copyright by Fredrik Hubinette -||| Pike is distributed as GPL (General Public License) -||| See the files COPYING and DISCLAIMER for more information. -\*/ -#ifndef MEMORY_H -#define MEMORY_H - -#include "global.h" - -#define MEMSEARCH_LINKS 512 - -struct link -{ - struct link *next; - INT32 key, offset; -}; - -enum methods { - no_search, - use_memchr, - memchr_and_memcmp, - hubbe_search -}; - -struct mem_searcher -{ - enum methods method; - char *needle; - SIZE_T needlelen; - unsigned INT32 hsize, max; - struct link links[MEMSEARCH_LINKS]; - struct link *set[MEMSEARCH_LINKS]; -}; - -/* Prototypes begin here */ -char *xalloc(SIZE_T size); -void swap(char *a, char *b, INT32 size); -void reverse(char *memory, INT32 nitems, INT32 size); -void reorder(char *memory, INT32 nitems, INT32 size,INT32 *order); -unsigned INT32 hashmem(const unsigned char *a,INT32 len,INT32 mlen); -unsigned INT32 hashstr(const unsigned char *str,INT32 maxn); -void init_memsearch(struct mem_searcher *s, - char *needle, - SIZE_T needlelen, - SIZE_T max_haystacklen); -char *memory_search(struct mem_searcher *s, - char *haystack, - SIZE_T haystacklen); -char *my_memmem(char *needle, - SIZE_T needlelen, - char *haystack, - SIZE_T haystacklen); -void memfill(char *to, - INT32 tolen, - char *from, - INT32 fromlen, - INT32 offset); -/* Prototypes end here */ - -#endif