From d299bcfdad959a3a0adf1683605b15a1c3b3ab66 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 28 Apr 2014 16:28:51 -0700 Subject: [PATCH] Replace our broken wcswcs with the working upstream one. Change-Id: I2952684df5674d10f0564d92c2cd42597725c0e3 --- libc/Android.mk | 3 +- libc/bionic/wchar.cpp | 6 -- .../lib/libc/string/wcsstr.c | 75 ++++++++++--------- .../upstream-openbsd/lib/libc/string/wcswcs.c | 5 ++ tests/wchar_test.cpp | 15 ++++ 5 files changed, 63 insertions(+), 41 deletions(-) rename libc/{upstream-freebsd => upstream-openbsd}/lib/libc/string/wcsstr.c (52%) create mode 100644 libc/upstream-openbsd/lib/libc/string/wcswcs.c diff --git a/libc/Android.mk b/libc/Android.mk index 5cadba169..90b0d4e3c 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -246,7 +246,6 @@ libc_upstream_freebsd_src_files := \ upstream-freebsd/lib/libc/string/wcsnlen.c \ upstream-freebsd/lib/libc/string/wcspbrk.c \ upstream-freebsd/lib/libc/string/wcsspn.c \ - upstream-freebsd/lib/libc/string/wcsstr.c \ upstream-freebsd/lib/libc/string/wcstok.c \ upstream-freebsd/lib/libc/string/wmemchr.c \ upstream-freebsd/lib/libc/string/wmemcpy.c \ @@ -419,6 +418,8 @@ libc_upstream_openbsd_src_files := \ upstream-openbsd/lib/libc/string/strstr.c \ upstream-openbsd/lib/libc/string/strtok.c \ upstream-openbsd/lib/libc/string/wcslcpy.c \ + upstream-openbsd/lib/libc/string/wcsstr.c \ + upstream-openbsd/lib/libc/string/wcswcs.c \ upstream-openbsd/lib/libc/string/wcswidth.c \ libc_arch_static_src_files := \ diff --git a/libc/bionic/wchar.cpp b/libc/bionic/wchar.cpp index 021d14b47..f921aa037 100644 --- a/libc/bionic/wchar.cpp +++ b/libc/bionic/wchar.cpp @@ -296,12 +296,6 @@ unsigned long int wcstoul(const wchar_t* nptr, wchar_t** endptr, int base) { return strtoul(reinterpret_cast(nptr), reinterpret_cast(endptr), base); } -wchar_t* wcswcs(const wchar_t* ws1, const wchar_t* ws2) { - const char* s1 = reinterpret_cast(ws1); - const char* s2 = reinterpret_cast(ws2); - return reinterpret_cast(strstr(s1, s2)); -} - int wctob(wint_t c) { return c; } diff --git a/libc/upstream-freebsd/lib/libc/string/wcsstr.c b/libc/upstream-openbsd/lib/libc/string/wcsstr.c similarity index 52% rename from libc/upstream-freebsd/lib/libc/string/wcsstr.c rename to libc/upstream-openbsd/lib/libc/string/wcsstr.c index ce598a698..669e34028 100644 --- a/libc/upstream-freebsd/lib/libc/string/wcsstr.c +++ b/libc/upstream-openbsd/lib/libc/string/wcsstr.c @@ -1,9 +1,9 @@ +/* $OpenBSD: wcsstr.c,v 1.3 2005/08/08 08:05:37 espie Exp $ */ +/* $NetBSD: wcsstr.c,v 1.3 2003/03/05 20:18:17 tshiozak Exp $ */ + /*- - * 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. + * Copyright (c)1999 Citrus Project, + * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -13,14 +13,11 @@ * 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 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR 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) @@ -28,36 +25,46 @@ * 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. + * + * citrus Id: wcsstr.c,v 1.2 2000/12/21 05:07:25 itojun Exp */ -#if 0 -#if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)strstr.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ -#endif -#include -__FBSDID("$FreeBSD$"); - #include -/* - * Find the first occurrence of find in s. - */ wchar_t * -wcsstr(const wchar_t * __restrict s, const wchar_t * __restrict find) +#ifdef WCSWCS +wcswcs(const wchar_t *big, const wchar_t *little) +#else +wcsstr(const wchar_t *big, const wchar_t *little) +#endif { - wchar_t c, sc; - size_t len; + const wchar_t *p; + const wchar_t *q; + const wchar_t *r; - if ((c = *find++) != L'\0') { - len = wcslen(find); - do { - do { - if ((sc = *s++) == L'\0') - return (NULL); - } while (sc != c); - } while (wcsncmp(s, find, len) != 0); - s--; + if (!*little) { + /* LINTED interface specification */ + return (wchar_t *)big; } - return ((wchar_t *)s); + if (wcslen(big) < wcslen(little)) + return NULL; + + p = big; + q = little; + while (*p) { + q = little; + r = p; + while (*q) { + if (*r != *q) + break; + q++; + r++; + } + if (!*q) { + /* LINTED interface specification */ + return (wchar_t *)p; + } + p++; + } + return NULL; } diff --git a/libc/upstream-openbsd/lib/libc/string/wcswcs.c b/libc/upstream-openbsd/lib/libc/string/wcswcs.c new file mode 100644 index 000000000..bd3560554 --- /dev/null +++ b/libc/upstream-openbsd/lib/libc/string/wcswcs.c @@ -0,0 +1,5 @@ +/* $OpenBSD: wcswcs.c,v 1.1 2005/04/13 16:35:58 espie Exp $ */ +/* $NetBSD: wcswcs.c,v 1.1 2003/03/05 20:18:17 tshiozak Exp $ */ + +#define WCSWCS +#include "wcsstr.c" diff --git a/tests/wchar_test.cpp b/tests/wchar_test.cpp index be451c1b4..eff845a0e 100644 --- a/tests/wchar_test.cpp +++ b/tests/wchar_test.cpp @@ -159,3 +159,18 @@ TEST(wchar, wcstombs_wcrtombs) { TEST(wchar, limits) { ASSERT_LT(WCHAR_MIN, WCHAR_MAX); } + +TEST(wchar, wcsstr_wcswcs) { + const wchar_t* haystack = L"matches hello world, not the second hello world"; + const wchar_t* empty_needle = L""; + const wchar_t* good_needle = L"ll"; + const wchar_t* bad_needle = L"wort"; + + ASSERT_EQ(haystack, wcsstr(haystack, empty_needle)); + ASSERT_EQ(&haystack[10], wcsstr(haystack, good_needle)); + ASSERT_EQ(NULL, wcsstr(haystack, bad_needle)); + + ASSERT_EQ(haystack, wcswcs(haystack, empty_needle)); + ASSERT_EQ(&haystack[10], wcswcs(haystack, good_needle)); + ASSERT_EQ(NULL, wcswcs(haystack, bad_needle)); +}