@@ -24,22 +24,15 @@
 # define TEST_NAME "wcpcpy"
 #endif /* WIDE */
 #include "bench-string.h"
-#ifndef WIDE
-# define SIMPLE_STPCPY simple_stpcpy
-#else
-# define SIMPLE_STPCPY simple_wcpcpy
-#endif /* WIDE */
-
-CHAR *SIMPLE_STPCPY (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STPCPY, 0)
-IMPL (STPCPY, 1)
Â
 CHAR *
-SIMPLE_STPCPY (CHAR *dst, const CHAR *src)
+generic_stpcpy (CHAR *dst, const CHAR *src)
 {
-Â while ((*dst++ = *src++) != '\0');
-Â return dst - 1;
+Â size_t len = STRLEN (src);
+Â return (CHAR*)MEMCPY (dst, src, len + 1) + len;
 }
Â
+IMPL (STPCPY, 1)
+IMPL (generic_stpcpy, 0)
+
 #include "bench-strcpy.c"
@@ -24,47 +24,19 @@
 # define TEST_NAME "wcpncpy"
 #endif /* WIDE */
 #include "bench-string.h"
-#ifndef WIDE
-# define SIMPLE_STPNCPY simple_stpncpy
-# define STUPID_STPNCPY stupid_stpncpy
-#else
-# define SIMPLE_STPNCPY simple_wcpncpy
-# define STUPID_STPNCPY stupid_wcpncpy
-#endif /* WIDE */
-
-CHAR *SIMPLE_STPNCPY (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STPNCPY (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STPNCPY, 0)
-IMPL (SIMPLE_STPNCPY, 0)
-IMPL (STPNCPY, 1)
-
-CHAR *
-SIMPLE_STPNCPY (CHAR *dst, const CHAR *src, size_t n)
-{
-Â while (n--)
-Â Â Â if ((*dst++ = *src++) == '\0')
-Â Â Â Â Â {
-Â Â Â Â Â Â size_t i;
-
-Â Â Â Â Â Â for (i = 0; i < n; ++i)
-Â Â Â Â Â Â Â Â dst[i] = '\0';
-Â Â Â Â Â Â return dst - 1;
-Â Â Â Â Â }
-Â return dst;
-}
Â
 CHAR *
-STUPID_STPNCPY (CHAR *dst, const CHAR *src, size_t n)
+generic_stpncpy (CHAR *dst, const CHAR *src, size_t n)
 {
  size_t nc = STRNLEN (src, n);
-Â size_t i;
-
-Â for (i = 0; i < nc; ++i)
-Â Â Â dst[i] = src[i];
-Â for (; i < n; ++i)
-Â Â Â dst[i] = '\0';
-Â return dst + nc;
+Â MEMCPY (dst, src, nc);
+Â dst += nc;
+Â if (nc == n)
+Â Â Â return dst;
+Â return MEMSET (dst, 0, n - nc);
 }
Â
+IMPL (STPNCPY, 1)
+IMPL (generic_stpncpy, 0)
+
 #include "bench-strncpy.c"
@@ -28,31 +28,25 @@
Â
 #ifndef WIDE
 # define sfmt "s"
-# define SIMPLE_STRCAT simple_strcat
 # define SMALL_CHAR 127
 #else
 # define sfmt "ls"
-# define SIMPLE_STRCAT simple_wcscat
 # define SMALL_CHAR 1273
 #endif /* WIDE */
Â
Â
 typedef CHAR *(*proto_t) (CHAR *, const CHAR *);
-CHAR *SIMPLE_STRCAT (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STRCAT, 0)
-IMPL (STRCAT, 1)
Â
 CHAR *
-SIMPLE_STRCAT (CHAR *dst, const CHAR *src)
+generic_strcat (CHAR *dst, const CHAR *src)
 {
-Â CHAR *ret = dst;
-Â while (*dst++ != '\0');
-Â --dst;
-Â while ((*dst++ = *src++) != '\0');
-Â return ret;
+Â STRCPY (dst + STRLEN (dst), src);
+Â return dst;
 }
Â
+IMPL (STRCAT, 1)
+IMPL (generic_strcat, 0)
+
 static void
 do_one_test (impl_t *impl, CHAR *dst, const CHAR *src)
 {
@@ -34,25 +34,17 @@
 # else
 # define TEST_NAME "wcscpy"
 # endif
-# include "bench-string.h"
-# ifndef WIDE
-#Â define SIMPLE_STRCPY simple_strcpy
-# else
-#Â define SIMPLE_STRCPY simple_wcscpy
-# endif
-
-CHAR *SIMPLE_STRCPY (CHAR *, const CHAR *);
-
-IMPL (SIMPLE_STRCPY, 0)
-IMPL (STRCPY, 1)
+#include "bench-string.h"
Â
 CHAR *
-SIMPLE_STRCPY (CHAR *dst, const CHAR *src)
+generic_strcpy (CHAR *dst, const CHAR *src)
 {
-Â CHAR *ret = dst;
-Â while ((*dst++ = *src++) != '\0');
-Â return ret;
+Â return MEMCPY (dst, src, STRLEN (src) + 1);
 }
+
+IMPL (STRCPY, 1)
+IMPL (generic_strcpy, 0)
+
 #endif
Â
 typedef CHAR *(*proto_t) (CHAR *, const CHAR *);
@@ -27,35 +27,26 @@
 #define BIG_CHAR MAX_CHAR
Â
 #ifndef WIDE
-# define SIMPLE_STRNCAT simple_strncat
-# define STUPID_STRNCAT stupid_strncat
 # define SMALL_CHAR 127
 #else
-# define SIMPLE_STRNCAT simple_wcsncat
-# define STUPID_STRNCAT stupid_wcsncat
 # define SMALL_CHAR 1273
 #endif /* WIDE */
Â
 typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STRNCAT (CHAR *, const CHAR *, size_t);
-CHAR *SIMPLE_STRNCAT (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STRNCAT, 0)
-IMPL (STRNCAT, 2)
Â
 CHAR *
-STUPID_STRNCAT (CHAR *dst, const CHAR *src, size_t n)
+generic_strncat (CHAR *dst, const CHAR *src, size_t n)
 {
-Â CHAR *ret = dst;
-Â while (*dst++ != '\0');
-Â --dst;
-Â while (n--)
-Â Â Â if ((*dst++ = *src++) == '\0')
-Â Â Â Â Â return ret;
-Â *dst = '\0';
-Â return ret;
+Â CHAR *end = dst + STRLEN (dst);
+Â n = STRNLEN (src, n);
+Â end[n] = 0;
+Â MEMCPY (end, src, n);
+Â return dst;
 }
Â
+IMPL (STRNCAT, 2)
+IMPL (generic_strncat, 0)
+
 static void
 do_one_test (impl_t *impl, CHAR *dst, const CHAR *src, size_t n)
 {
@@ -33,47 +33,19 @@
 # define TEST_NAME "wcsncpy"
 # endif /* WIDE */
 # include "bench-string.h"
-# ifndef WIDE
-#Â define SIMPLE_STRNCPY simple_strncpy
-#Â define STUPID_STRNCPY stupid_strncpy
-# else
-#Â define SIMPLE_STRNCPY simple_wcsncpy
-#Â define STUPID_STRNCPY stupid_wcsncpy
-# endif /* WIDE */
-
-CHAR *SIMPLE_STRNCPY (CHAR *, const CHAR *, size_t);
-CHAR *STUPID_STRNCPY (CHAR *, const CHAR *, size_t);
-
-IMPL (STUPID_STRNCPY, 0)
-IMPL (SIMPLE_STRNCPY, 0)
-IMPL (STRNCPY, 1)
Â
 CHAR *
-SIMPLE_STRNCPY (CHAR *dst, const CHAR *src, size_t n)
+generic_strncpy (CHAR *dst, const CHAR *src, size_t n)
 {
-Â CHAR *ret = dst;
-Â while (n--)
-Â Â Â if ((*dst++ = *src++) == '\0')
-Â Â Â Â Â {
-Â Â Â Â Â Â while (n--)
-Â Â Â Â Â Â Â Â *dst++ = '\0';
-Â Â Â Â Â Â return ret;
-Â Â Â Â Â }
-Â return ret;
+Â size_t nc = STRNLEN (src, n);
+Â if (nc != n)
+Â Â Â MEMSET (dst + nc, 0, n - nc);
+Â return MEMCPY (dst, src, nc);
 }
Â
-CHAR *
-STUPID_STRNCPY (CHAR *dst, const CHAR *src, size_t n)
-{
-Â size_t nc = STRNLEN (src, n);
-Â size_t i;
+IMPL (STRNCPY, 1)
+IMPL (generic_strncpy, 0)
Â
-Â for (i = 0; i < nc; ++i)
-Â Â Â dst[i] = src[i];
-Â for (; i < n; ++i)
-Â Â Â dst[i] = '\0';
-Â return dst;
-}
 #endif /* !STRNCPY_RESULT */
Â
 typedef CHAR *(*proto_t) (CHAR *, const CHAR *, size_t);
@@ -28,27 +28,24 @@
Â
 #ifndef WIDE
 # define MIDDLE_CHAR 127
-# define SIMPLE_STRNLEN simple_strnlen
 #else
 # define MIDDLE_CHAR 1121
-# define SIMPLE_STRNLEN simple_wcsnlen
 #endif /* WIDE */
Â
 typedef size_t (*proto_t) (const CHAR *, size_t);
-size_t SIMPLE_STRNLEN (const CHAR *, size_t);
-
-IMPL (SIMPLE_STRNLEN, 0)
-IMPL (STRNLEN, 1)
+size_t generic_strnlen (const CHAR *, size_t);
Â
 size_t
-SIMPLE_STRNLEN (const CHAR *s, size_t maxlen)
+memchr_strnlen (const CHAR *s, size_t maxlen)
 {
-Â size_t i;
-
-Â for (i = 0; i < maxlen && s[i]; ++i);
-Â return i;
+Â const CHAR *s1 = MEMCHR (s, 0, maxlen);
+Â return (s1 == NULL) ? maxlen : s1 - s;
 }
Â
+IMPL (STRNLEN, 1)
+IMPL (memchr_strnlen, 0)
+IMPL (generic_strnlen, 0)
+
 static void
 do_one_test (impl_t *impl, const CHAR *s, size_t maxlen, size_t exp_len)
 {
@@ -146,3 +143,13 @@ test_main (void)
 }
Â
 #include <support/test-driver.c>
+
+#define libc_hidden_def(X)
+#ifndef WIDE
+# undef STRNLEN
+# define STRNLEN generic_strnlen
+# include <string/strnlen.c>
+#else
+# define WCSNLEN generic_strnlen
+# include <wcsmbs/wcsnlen.c>
+#endif