Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lib: Introduce strnstr()

It differs strstr() in that it limits the length to be searched
in the first string.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4B4E8743.6030805@cn.fujitsu.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

authored by

Li Zefan and committed by
Steven Rostedt
d5f1fb53 a3291c14

+30 -2
+4 -1
include/linux/string.h
··· 72 72 } 73 73 74 74 #ifndef __HAVE_ARCH_STRSTR 75 - extern char * strstr(const char *,const char *); 75 + extern char * strstr(const char *, const char *); 76 + #endif 77 + #ifndef __HAVE_ARCH_STRNSTR 78 + extern char * strnstr(const char *, const char *, size_t); 76 79 #endif 77 80 #ifndef __HAVE_ARCH_STRLEN 78 81 extern __kernel_size_t strlen(const char *);
+26 -1
lib/string.c
··· 667 667 */ 668 668 char *strstr(const char *s1, const char *s2) 669 669 { 670 - int l1, l2; 670 + size_t l1, l2; 671 671 672 672 l2 = strlen(s2); 673 673 if (!l2) ··· 682 682 return NULL; 683 683 } 684 684 EXPORT_SYMBOL(strstr); 685 + #endif 686 + 687 + #ifndef __HAVE_ARCH_STRNSTR 688 + /** 689 + * strnstr - Find the first substring in a length-limited string 690 + * @s1: The string to be searched 691 + * @s2: The string to search for 692 + * @len: the maximum number of characters to search 693 + */ 694 + char *strnstr(const char *s1, const char *s2, size_t len) 695 + { 696 + size_t l1 = len, l2; 697 + 698 + l2 = strlen(s2); 699 + if (!l2) 700 + return (char *)s1; 701 + while (l1 >= l2) { 702 + l1--; 703 + if (!memcmp(s1, s2, l2)) 704 + return (char *)s1; 705 + s1++; 706 + } 707 + return NULL; 708 + } 709 + EXPORT_SYMBOL(strnstr); 685 710 #endif 686 711 687 712 #ifndef __HAVE_ARCH_MEMCHR