diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2010-01-14 10:53:55 +0800 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2010-01-14 22:38:09 -0500 |
commit | d5f1fb53353edc38da326445267c1df0c9676df2 (patch) | |
tree | 42def644ebd0d343f2eba9e625f4b9b1ea8a36f0 /lib | |
parent | a3291c14ecf0a995e30d993b7f2cae031de98727 (diff) | |
download | lwn-d5f1fb53353edc38da326445267c1df0c9676df2.tar.gz lwn-d5f1fb53353edc38da326445267c1df0c9676df2.zip |
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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/string.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/lib/string.c b/lib/string.c index 9f75b4ec50b8..a1cdcfcc42d0 100644 --- a/lib/string.c +++ b/lib/string.c @@ -667,7 +667,7 @@ EXPORT_SYMBOL(memscan); */ char *strstr(const char *s1, const char *s2) { - int l1, l2; + size_t l1, l2; l2 = strlen(s2); if (!l2) @@ -684,6 +684,31 @@ char *strstr(const char *s1, const char *s2) EXPORT_SYMBOL(strstr); #endif +#ifndef __HAVE_ARCH_STRNSTR +/** + * strnstr - Find the first substring in a length-limited string + * @s1: The string to be searched + * @s2: The string to search for + * @len: the maximum number of characters to search + */ +char *strnstr(const char *s1, const char *s2, size_t len) +{ + size_t l1 = len, l2; + + l2 = strlen(s2); + if (!l2) + return (char *)s1; + while (l1 >= l2) { + l1--; + if (!memcmp(s1, s2, l2)) + return (char *)s1; + s1++; + } + return NULL; +} +EXPORT_SYMBOL(strnstr); +#endif + #ifndef __HAVE_ARCH_MEMCHR /** * memchr - Find a character in an area of memory. |