On 1/6/25 11:14, Rasmus Villemoes wrote:
> On Mon, Jan 06 2025, Jerome Forissier <jerome.foriss...@linaro.org> wrote:
> 
>>> + *
>>> + * Return: pointer to the first occurrence or NULL
>>>   */
>>> -char * strstr(const char * s1,const char * s2)
>>> +char *strnstr(const char *s1, const char *s2, size_t len)
>>>  {
>>> -   int l1, l2;
>>> +   size_t l1, l2;
>>>  
>>> +   l1 = strnlen(s1, len);
>>>     l2 = strlen(s2);
>>> -   if (!l2)
>>> -           return (char *) s1;
>>> -   l1 = strlen(s1);
>>> -   while (l1 >= l2) {
>>> -           l1--;
>>> -           if (!memcmp(s1,s2,l2))
>>> +
>>> +   for (; l1 >= l2; --l1, ++s1) {
>>> +           if (!memcmp(s1, s2, l2))
>>>                     return (char *) s1;
>>> -           s1++;
>>>     }
>>> +
>>>     return NULL;
>>>  }
>>>  #endif
>>
>> This won't return s1 when s2 == NULL, will it?
> 
> Why should it? That's a broken caller. You can't call str* functions
> with NULL pointers. It's ok for s2 to point at an empty string, in which
> case l2 is 0, so the very first memcmp() is guaranteed to succeed and
> yes, this will return s1 in that case.

Sorry I read the strncmp() man page too quickly and mistook empty string
for NULL :-/

> 
> As passing "" as s2 is likely quite rare, the current short-circuiting
> of that case is pointless.

Agreed.
 
>> Why not use a known good implementation such as [1]?
>>
>> [1] 
>> https://github.com/freebsd/freebsd-src/blob/main/lib/libc/string/strnstr.c
> 
> Licensing?

Isn't BSD compatible with GPL?


> Also, that's quite unreadable, so please don't.

OK.

> Rasmus

-- 
Jerome

Reply via email to