2017-08-30 11:03:57 +08:00
|
|
|
/*
|
|
|
|
FUNCTION
|
|
|
|
<<strnstr>>---find string segment
|
|
|
|
|
|
|
|
INDEX
|
|
|
|
strnstr
|
|
|
|
|
2017-11-30 16:20:06 +08:00
|
|
|
SYNOPSIS
|
2017-08-30 11:03:57 +08:00
|
|
|
#include <string.h>
|
|
|
|
size_t strnstr(const char *<[s1]>, const char *<[s2]>, size_t <[n]>);
|
|
|
|
|
|
|
|
DESCRIPTION
|
|
|
|
Locates the first occurrence in the string pointed to by <[s1]> of
|
|
|
|
the sequence of limited to the <[n]> characters in the string
|
|
|
|
pointed to by <[s2]>
|
|
|
|
|
|
|
|
RETURNS
|
|
|
|
Returns a pointer to the located string segment, or a null
|
|
|
|
pointer if the string <[s2]> is not found. If <[s2]> points to
|
|
|
|
a string with zero length, <[s1]> is returned.
|
|
|
|
|
|
|
|
|
|
|
|
PORTABILITY
|
2017-09-13 20:31:01 +08:00
|
|
|
<<strnstr>> is a BSD extension.
|
2017-08-30 11:03:57 +08:00
|
|
|
|
|
|
|
<<strnstr>> requires no supporting OS subroutines.
|
|
|
|
|
|
|
|
QUICKREF
|
2017-09-13 20:31:01 +08:00
|
|
|
strnstr pure
|
2017-08-30 11:03:57 +08:00
|
|
|
|
|
|
|
*/
|
|
|
|
|
2017-09-13 20:31:01 +08:00
|
|
|
#define _GNU_SOURCE
|
2017-08-25 15:35:38 +08:00
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Find the first occurrence of find in s, where the search is limited to the
|
|
|
|
* first slen characters of s.
|
|
|
|
*/
|
|
|
|
char *
|
2017-08-30 11:03:56 +08:00
|
|
|
strnstr(const char *haystack, const char *needle, size_t haystack_len)
|
2017-08-25 15:35:38 +08:00
|
|
|
{
|
2017-08-30 11:03:56 +08:00
|
|
|
size_t needle_len = strnlen(needle, haystack_len);
|
2017-08-25 15:35:38 +08:00
|
|
|
|
2017-08-30 11:03:56 +08:00
|
|
|
if (needle_len < haystack_len || !needle[needle_len]) {
|
|
|
|
char *x = memmem(haystack, haystack_len, needle, needle_len);
|
|
|
|
if (x && !memchr(haystack, 0, x - haystack))
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
return NULL;
|
2017-08-25 15:35:38 +08:00
|
|
|
}
|