diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2008-01-27 11:37:44 +0100 |
---|---|---|
committer | Tobias Klauser <tklauser@xenon.tklauser.home> | 2008-01-27 11:37:44 +0100 |
commit | 7e0f021a9aec35fd8e6725e87e3313b101d26f5e (patch) | |
tree | b1cacc4b24393f517aeb4610e9e1021f954307a8 /reference/C/CONTRIB/SNIP/pbmsrch.c |
Initial import (2.0.2-6)2.0.2-6
Diffstat (limited to 'reference/C/CONTRIB/SNIP/pbmsrch.c')
-rwxr-xr-x | reference/C/CONTRIB/SNIP/pbmsrch.c | 95 |
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
|