
On 1/6/25 11:14, Rasmus Villemoes wrote:
On Mon, Jan 06 2025, Jerome Forissier jerome.forissier@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