From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/pbmsrch.c | 95 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/pbmsrch.c (limited to 'reference/C/CONTRIB/SNIP/pbmsrch.c') diff --git a/reference/C/CONTRIB/SNIP/pbmsrch.c b/reference/C/CONTRIB/SNIP/pbmsrch.c new file mode 100755 index 0000000..ccbf41f --- /dev/null +++ b/reference/C/CONTRIB/SNIP/pbmsrch.c @@ -0,0 +1,95 @@ +/* +** A Pratt-Boyer-Moore string search, written by Jerry Coffin +** sometime or other in 1991. Removed from original program, and +** (incorrectly) rewritten for separate, generic use in early 1992. +** Corrected with help from Thad Smith, late March and early +** April 1992...hopefully it's correct this time. Revised by Bob Stout. +** +** This is hereby placed in the Public Domain by its author. +** +** 10/21/93 rdg Fixed bug found by Jeff Dunlop +*/ + +#include +#include +#include + +static size_t table[UCHAR_MAX]; +static size_t len; +static char *findme; + +/* +** Call this with the string to locate to initialize the table +*/ + +void init_search(const char *string) +{ + size_t i; + + len = strlen(string); + for (i = 0; i <= UCHAR_MAX; i++) /* rdg 10/93 */ + table[i] = len; + for (i = 0; i < len; i++) + table[(unsigned char)string[i]] = len - i - 1; + findme = (char *)string; +} + +/* +** Call this with a buffer to search +*/ + +char *strsearch(const char *string) +{ + register size_t shift; + register size_t pos = len - 1; + char *here; + size_t limit=strlen(string); + + while (pos < limit) + { + while( pos < limit && + (shift = table[(unsigned char)string[pos]]) > 0) + { + pos += shift; + } + if (0 == shift) + { + if (0 == strncmp(findme, + here = (char *)&string[pos-len+1], len)) + { + return(here); + } + else pos++; + } + } + return NULL; +} + +#ifdef TEST + +#include + +void main(void) +{ + char *here; + char *find_strings[] = {"abb", "you", "not", "it", "dad", "yoo", "hoo", + "oo", "oh", "xx", "xx", "x", "x", NULL}; + char *search_strings[] = {"cabbie", "your", "It isn't here", + "But it is here", "hodad", "yoohoo", "yoohoo", + "yoohoo", "yoohoo", "yoohoo", "xx", "x", "."}; + int i; + + for (i = 0; find_strings[i]; i++) + { + init_search(find_strings[i]); + here = strsearch(search_strings[i]); + printf("\"%s\" is%s in \"%s\"", find_strings[i], + here ? "" : " not", search_strings[i]); + if (here) + printf(" [\"%s\"]", here); + putchar('\n'); + } + +} + +#endif -- cgit v1.2.3-54-g00ecf