summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/SNIP/pbmsrch.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/SNIP/pbmsrch.c')
-rwxr-xr-xreference/C/CONTRIB/SNIP/pbmsrch.c95
1 files changed, 95 insertions, 0 deletions
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 <stddef.h>
+#include <string.h>
+#include <limits.h>
+
+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 <stdio.h>
+
+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