diff options
author | Sichen Zhao <1473996754@qq.com> | 2017-08-30 06:03:56 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2017-08-30 16:08:58 +0300 |
commit | f22054c94d3f77ba834d55123ffa9fe4aef6f93c (patch) | |
tree | 00c6c70268015451d6dde9ec9076d3c2f4db15ba /newlib/libc/string | |
parent | cdbec10e7914748792371512d4485a9d868fe549 (diff) |
Modify strnstr.c.
Diffstat (limited to 'newlib/libc/string')
-rw-r--r-- | newlib/libc/string/strnstr.c | 65 |
1 files changed, 10 insertions, 55 deletions
diff --git a/newlib/libc/string/strnstr.c b/newlib/libc/string/strnstr.c index da5e5bdcb..05d86ee20 100644 --- a/newlib/libc/string/strnstr.c +++ b/newlib/libc/string/strnstr.c @@ -1,42 +1,5 @@ -/*- - * Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org> - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Torek. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strstr.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -#include <sys/cdefs.h> -__FBSDID("$FreeBSD: head/lib/libc/string/strnstr.c 251069 2013-05-28 20:57:40Z emaste $"); - +#undef __STRICT_ANSI__ +#include <_ansi.h> #include <string.h> /* @@ -44,22 +7,14 @@ __FBSDID("$FreeBSD: head/lib/libc/string/strnstr.c 251069 2013-05-28 20:57:40Z e * first slen characters of s. */ char * -strnstr(const char *s, const char *find, size_t slen) +strnstr(const char *haystack, const char *needle, size_t haystack_len) { - char c, sc; - size_t len; + size_t needle_len = strnlen(needle, haystack_len); - if ((c = *find++) != '\0') { - len = strlen(find); - do { - do { - if (slen-- < 1 || (sc = *s++) == '\0') - return (NULL); - } while (sc != c); - if (len > slen) - return (NULL); - } while (strncmp(s, find, len) != 0); - s--; - } - return ((char *)s); + 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; } |