Skip to content

Commit

Permalink
wcsmbs: optimize wcpncpy
Browse files Browse the repository at this point in the history
This patch rewrites wcpncpy using wcslen, wmemcpy, and wmemset.  This is
similar to the optimization done on stpncpy by 48497ab.

Checked on x86_64-linux-gnu.

        * wcsmbs/wcpncpy.c (__wcpcpy): Rewrite using wcslen, wmemcpy, and
	wmemset.
  • Loading branch information
zatrazz committed Feb 27, 2019
1 parent 7b3fb62 commit 39ef074
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 52 deletions.
3 changes: 3 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
2019-02-27 Adhemerval Zanella <[email protected]>

* wcsmbs/wcpncpy.c (__wcpcpy): Rewrite using wcslen, wmemcpy, and
wmemset.

* sysdeps/m68k/wcpcpy.c: Remove file.
* wcsmbs/wcpcpy.c (__wcpcpy): Rewrite using wcslen and wmemcpy.

Expand Down
57 changes: 5 additions & 52 deletions wcsmbs/wcpncpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,59 +27,12 @@
wchar_t *
__wcpncpy (wchar_t *dest, const wchar_t *src, size_t n)
{
wint_t c;
wchar_t *const s = dest;

if (n >= 4)
{
size_t n4 = n >> 2;

for (;;)
{
c = *src++;
*dest++ = c;
if (c == L'\0')
break;
c = *src++;
*dest++ = c;
if (c == L'\0')
break;
c = *src++;
*dest++ = c;
if (c == L'\0')
break;
c = *src++;
*dest++ = c;
if (c == L'\0')
break;
if (--n4 == 0)
goto last_chars;
}
n -= dest - s;
goto zero_fill;
}

last_chars:
n &= 3;
if (n == 0)
size_t size = __wcsnlen (src, n);
__wmemcpy (dest, src, size);
dest += size;
if (size == n)
return dest;

for (;;)
{
c = *src++;
--n;
*dest++ = c;
if (c == L'\0')
break;
if (n == 0)
return dest;
}

zero_fill:
while (n-- > 0)
dest[n] = L'\0';

return dest - 1;
return wmemset (dest, L'\0', (n - size));
}

#ifndef WCPNCPY
Expand Down

0 comments on commit 39ef074

Please sign in to comment.