Date: Tue, 09 Oct 2001 18:27:38 -0700 From: Bakul Shah <bakul@bitblocks.com> To: Mike Barcroft <mike@FreeBSD.org> Cc: freebsd-hackers@FreeBSD.org, audit@freebsd.org Subject: Re: strnstr(3) - New libc function for review Message-ID: <200110100127.VAA22073@rodney.cnchost.com> In-Reply-To: Your message of "Thu, 04 Oct 2001 21:57:06 EDT." <20011004215706.B34530@coffee.q9media.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> I would appreciate comments/reviews of the following new addition to
> libc. It is largely based off the current strstr(3) implementation.
Sorry for not getting to this sooner.
> /*
> * Find the first occurrence of find in s, where the search is limited to the
> * first slen characters of s.
> */
> char *
> strnstr(s, find, slen)
> const char *s;
> const char *find;
> size_t slen;
> {
> char c, sc;
> size_t len;
>
> if ((c = *find++) != '\0') {
> len = strlen(find);
> do {
> do {
> if ((sc = *s++) == '\0' || slen-- < 1)
> return (NULL);
> } while (sc != c);
> if (len > slen)
> return (NULL);
> } while (strncmp(s, find, len) != 0);
> s--;
> }
> return ((char *)s);
> }
Why not pass the length of the pattern as well? Regardless,
why not use simpler code that is easier to prove right?
char*
strnstr(const char *s, size_t slen, const chat *p, size_t plen)
{
while (slen >= plen) {
if (strncmp(s, p, plen) == 0)
return (char*)s;
s++, slen--;
}
return 0;
}
Another reason for passing in both string lengths is to allow
switching to a more efficient algorithm. The above algorithm
runs in slen*plen time. Other more efficient algorithms have
a startup cost that can be hiddne for a fairly moderate value
of slen*plen. So you'd insert something like
if (worth_it_to_run_KMP_algo(splen, plen))
return kmp_strnstr(s, slen, p, plen);
right above the while loop. This makes such functions
useful for much larger strings (e.g. when you have
mmapped in the whole file).
-- bakul
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200110100127.VAA22073>
