home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Devil's Doorknob BBS Capture (1996-2003)
/
devilsdoorknobbbscapture1996-2003.iso
/
Dloads
/
PROGRAMM
/
SNIP0492.ZIP
/
PBMSRCH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-12
|
3KB
|
94 lines
/*
** A Pratt-Boyer-Moore string search, written by Jerry Coffin
** sometime or other in 1991. Removed from original program, and
** (incorrectly) rewritten for seperate, 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.
*/
#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++)
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