aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--string/stpncpy.c59
2 files changed, 10 insertions, 54 deletions
diff --git a/ChangeLog b/ChangeLog
index da4f3c7..2376021 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-08-19 Wilco Dijkstra <wdijkstr@arm.com>
+
+ * string/stpncpy.c (stpncpy): Improve performance using
+ __strnlen/memcpy/memset.
+
2015-08-19 Andrew Senkevich <andrew.senkevich@intel.com>
[BZ #18796]
diff --git a/string/stpncpy.c b/string/stpncpy.c
index eb65a5f..4c3351b 100644
--- a/string/stpncpy.c
+++ b/string/stpncpy.c
@@ -15,8 +15,6 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-/* This is almost copied from strncpy.c, written by Torbjorn Granlund. */
-
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -41,59 +39,12 @@ weak_alias (__stpncpy, stpncpy)
char *
STPNCPY (char *dest, const char *src, size_t n)
{
- char c;
- char *s = dest;
-
- if (n >= 4)
- {
- size_t n4 = n >> 2;
-
- for (;;)
- {
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- c = *src++;
- *dest++ = c;
- if (c == '\0')
- break;
- if (--n4 == 0)
- goto last_chars;
- }
- n -= dest - s;
- goto zero_fill;
- }
-
- last_chars:
- n &= 3;
- if (n == 0)
+ size_t size = __strnlen (src, n);
+ memcpy (dest, src, size);
+ dest += size;
+ if (size == n)
return dest;
-
- for (;;)
- {
- c = *src++;
- --n;
- *dest++ = c;
- if (c == '\0')
- break;
- if (n == 0)
- return dest;
- }
-
- zero_fill:
- while (n-- > 0)
- dest[n] = '\0';
-
- return dest - 1;
+ return memset (dest, '\0', n - size);
}
#ifdef weak_alias
libc_hidden_def (__stpncpy)