9b1f032000-10-09Fredrik Hübinette (Hubbe) #ifndef PIKE_SEARCH_H #define PIKE_SEARCH_H #define MEMSEARCH_LINKS 512 #define BMLEN 768 #define CHARS 256 #define TUNAFISH #define generic_mem_searcher pike_mem_searcher struct hubbe_search_link { struct hubbe_search_link *next; INT32 key, offset; }; struct hubbe_searcher { struct object *o; /* must be first */ void *needle; ptrdiff_t needlelen; unsigned INT32 hsize, max; struct hubbe_search_link links[MEMSEARCH_LINKS]; struct hubbe_search_link *set[MEMSEARCH_LINKS]; }; struct boyer_moore_hubbe_searcher { struct object *o; /* must be first */ void *needle; ptrdiff_t needlelen; ptrdiff_t plen; ptrdiff_t d1[CHARS+1]; ptrdiff_t d2[BMLEN]; }; struct SearchMojtS; #define FNORD(N,C) \ typedef C (* PIKE_CONCAT(SearchMojtFunc,N) )(void*, C, size_t) FNORD(0,p_wchar0 *); FNORD(1,p_wchar1 *); FNORD(2,p_wchar2 *); FNORD(N,PCHARP); struct SearchMojtVtable { SearchMojtFunc0 func0; SearchMojtFunc1 func1; SearchMojtFunc2 func2; SearchMojtFuncN funcN; void (*freeme)(void *); }; typedef struct SearchMojt { struct SearchMojtVtable *vtab; void *data; } SearchMojt; struct pike_mem_searcher { SearchMojt mojt; struct pike_string *s; /* search string */ union memsearcher_data { struct hubbe_searcher hubbe; struct boyer_moore_hubbe_searcher bm; } data; }; /* Prototypes begin here */ PMOD_EXPORT void pike_init_memsearch(struct pike_mem_searcher *s, PCHARP needle, ptrdiff_t needlelen, ptrdiff_t max_haystacklen); SearchMojt compile_memsearcher(PCHARP needle, ptrdiff_t needlelen, int max_haystacklen, struct pike_string *hashkey); SearchMojt simple_compile_memsearcher(struct pike_string *str); char *my_memmem(char *needle, size_t needlelen, char *haystack, size_t haystacklen); void init_generic_memsearcher(struct generic_mem_searcher *s, void *needle, size_t needlelen, char needle_shift, size_t estimated_haystack, char haystack_shift); void *generic_memory_search(struct generic_mem_searcher *s, void *haystack, size_t haystacklen, char haystack_shift); void init_pike_searching(void); void exit_pike_searching(void); /* Prototypes end here */ #endif