[PATCH 1/2] Import strnstr.c from FreeBSD.
Sichen Zhao
1473996754@qq.com
Sat Aug 26 12:31:00 GMT 2017
> On 08/25/2017 01:07 PM, Eric Blake wrote:
>> This is a poor algorithm (O(n^2) because it is is calling an O(n)
>> strncmp() over every byte of haystack). It also calls strlen() instead
>> of strnlen(), which (when the needle is bigger than the haystack, and
>> therefore the function must return NULL) is wasted effort.
>>
>> Instead of copying the poor BSD implementation, why not just open-code
>> it yourself to take advantage of our O(n) memmem(), which has already
>> been optimized to take advantage of a better algorithm that is not
>> quadratic?
>>
>> char *
>> strnstr(const char *haystack, const char *needle, size_t haystack_len)
>> {
>> size_t needle_len = strnlen(needle, slen);
>> if (needle_len < slen || !needle[needle_len])
>> return memmem(haystack, haystack_len, needle, needle_len);
>> return NULL;
>> }
> Hmm, I guess you also have to double-check that there is no NUL byte in
> haystack prior to the result returned by memmem(). But that is still O(n):
>
> char *
> strnstr(const char *haystack, const char *needle, size_t haystack_len)
> {
> size_t needle_len = strnlen(needle, slen);
> if (needle_len < slen || !needle[needle_len]) {
> char *x = memmem(haystack, haystack_len, needle, needle_len);
> if (x && !memchr(haystack, 0, x - haystack))
> return x;
> }
> return NULL;
> }
Ok, So just modify the strnstr like that, right?
More information about the Newlib
mailing list