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-1; i++)
table[(unsigned char)string[i]] = len - i - 1;
secondary = table[(unsigned char)string[len-1]];
table[(unsigned char)string[len-1]] = 0;
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+=secondary;
}
}
return NULL;
}
dm9pZCBpbml0X3NlYXJjaChjb25zdCBjaGFyICpzdHJpbmcpCnsKICAgICAgc2l6ZV90IGk7CgogICAgICBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgZm9yIChpID0gMDsgaSA8PSBVQ0hBUl9NQVg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgLyogcmRnIDEwLzkzICovCiAgICAgICAgICAgIHRhYmxlW2ldID0gbGVuOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykKICAgICAgICAgICAgdGFibGVbKHVuc2lnbmVkIGNoYXIpc3RyaW5nW2ldXSA9IGxlbiAtIGkgLSAxOwogICAgICBzZWNvbmRhcnkgPSB0YWJsZVsodW5zaWduZWQgY2hhcilzdHJpbmdbbGVuLTFdXTsKICAgICAgdGFibGVbKHVuc2lnbmVkIGNoYXIpc3RyaW5nW2xlbi0xXV0gPSAwOwogICAgICBmaW5kbWUgPSAoY2hhciAqKXN0cmluZzsKfQoKLyoKKiogIENhbGwgdGhpcyB3aXRoIGEgYnVmZmVyIHRvIHNlYXJjaAoqLwoKY2hhciAqc3Ryc2VhcmNoKGNvbnN0IGNoYXIgKnN0cmluZykKewogICAgICByZWdpc3RlciBzaXplX3Qgc2hpZnQ7CiAgICAgIHJlZ2lzdGVyIHNpemVfdCBwb3MgPSBsZW4gLSAxOwogICAgICBjaGFyICpoZXJlOwogICAgICBzaXplX3QgbGltaXQ9c3RybGVuKHN0cmluZyk7CgogICAgICB3aGlsZSAocG9zIDwgbGltaXQpCiAgICAgIHsKICAgICAgICAgICAgd2hpbGUoIHBvcyA8IGxpbWl0ICYmCiAgICAgICAgICAgICAgICAgIChzaGlmdCA9IHRhYmxlWyh1bnNpZ25lZCBjaGFyKXN0cmluZ1twb3NdXSkgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHBvcyArPSBzaGlmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoMCA9PSBzaGlmdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICBpZiAoMCA9PSBzdHJuY21wKGZpbmRtZSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSA9IChjaGFyICopJnN0cmluZ1twb3MtbGVuKzFdLCBsZW4pKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihoZXJlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlICBwb3MrPXNlY29uZGFyeTsKICAgICAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBOVUxMOwp9