diff options
Diffstat (limited to 'string')
-rw-r--r-- | string/strncpy.c | 59 |
1 files changed, 5 insertions, 54 deletions
diff --git a/string/strncpy.c b/string/strncpy.c index 37af5aaad0..d464bbb5a6 100644 --- a/string/strncpy.c +++ b/string/strncpy.c @@ -16,68 +16,19 @@ <http://www.gnu.org/licenses/>. */ #include <string.h> -#include <memcopy.h> #undef strncpy #ifndef STRNCPY -#define STRNCPY strncpy + #define STRNCPY strncpy #endif char * STRNCPY (char *s1, const char *s2, size_t n) { - char c; - char *s = s1; - - --s1; - - if (n >= 4) - { - size_t n4 = n >> 2; - - for (;;) - { - c = *s2++; - *++s1 = c; - if (c == '\0') - break; - c = *s2++; - *++s1 = c; - if (c == '\0') - break; - c = *s2++; - *++s1 = c; - if (c == '\0') - break; - c = *s2++; - *++s1 = c; - if (c == '\0') - break; - if (--n4 == 0) - goto last_chars; - } - s1++; - n = n - (s1 - s); - memset (s1, '\0', n); - return s; - } - - last_chars: - n &= 3; - if (n == 0) - return s; - - do - { - c = *s2++; - *++s1 = c; - if (--n == 0) - return s; - } - while (c != '\0'); - - memset (s1 + 1, '\0', n); - return s; + size_t size = __strnlen (s2, n); + if (size != n) + memset (s1 + size, '\0', n - size); + return memcpy (s1, s2, size); } libc_hidden_builtin_def (strncpy) |