mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-08 14:20:07 +00:00
wcsmbs: optimize wcsncat
This patch rewrites wcsncat using wcslen, wcsnlen, and wmemcpy. This is similar to the optimization done on strncat by3eb38795db
ande80514b5a8
. Checked on x86_64-linux-gnu. * wcsmbs/wcsncat.c (wcsncat): Rewrite using wcslen, wcsnlen, and wmemcpy.
This commit is contained in:
parent
4d8015639a
commit
ddf21ec79f
@ -1,5 +1,8 @@
|
||||
2019-02-27 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
|
||||
* wcsmbs/wcsncat.c (wcsncat): Rewrite using wcslen, wcsnlen, and
|
||||
wmemcpy.
|
||||
|
||||
* wcsmbs/wcscpy.c (__wcpcpy): Rewrite using wcslen and wmemcpy.
|
||||
|
||||
* include/wchar.h (__wcscpy): New prototype.
|
||||
|
@ -26,54 +26,15 @@
|
||||
wchar_t *
|
||||
WCSNCAT (wchar_t *dest, const wchar_t *src, size_t n)
|
||||
{
|
||||
wchar_t c;
|
||||
wchar_t * const s = dest;
|
||||
wchar_t *ret = dest;
|
||||
|
||||
/* Find the end of DEST. */
|
||||
do
|
||||
c = *dest++;
|
||||
while (c != L'\0');
|
||||
/* Find the end of dest. */
|
||||
dest += __wcslen (dest);
|
||||
|
||||
/* Make DEST point before next character, so we can increment
|
||||
it while memory is read (wins on pipelined cpus). */
|
||||
dest -= 2;
|
||||
size_t ds = __wcsnlen (src, n);
|
||||
|
||||
if (n >= 4)
|
||||
{
|
||||
size_t n4 = n >> 2;
|
||||
do
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
} while (--n4 > 0);
|
||||
n &= 3;
|
||||
}
|
||||
dest[ds] = L'\0';
|
||||
__wmemcpy (dest, src, ds);
|
||||
|
||||
while (n > 0)
|
||||
{
|
||||
c = *src++;
|
||||
*++dest = c;
|
||||
if (c == L'\0')
|
||||
return s;
|
||||
n--;
|
||||
}
|
||||
|
||||
if (c != L'\0')
|
||||
*++dest = L'\0';
|
||||
|
||||
return s;
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user