summaryrefslogtreecommitdiff
path: root/string/stpncpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'string/stpncpy.c')
-rw-r--r--string/stpncpy.c61
1 files changed, 6 insertions, 55 deletions
diff --git a/string/stpncpy.c b/string/stpncpy.c
index eb65a5f46f..0cafc84217 100644
--- a/string/stpncpy.c
+++ b/string/stpncpy.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993-2015 Free Software Foundation, Inc.
+/* Copyright (C) 1993-2016 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -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)