Simplify strncat.

We rewrite strncat to use strnlen and malloc calls which simplifies code
an is faster as these functions are better optimized than original code.
This commit is contained in:
Ondřej Bílka 2014-12-19 23:09:40 +01:00
parent 0d4ba8be9c
commit 3eb38795db
2 changed files with 7 additions and 44 deletions

View File

@ -1,3 +1,7 @@
2014-12-19 Ondřej Bílka <neleai@seznam.cz>
* string/strncat.c (STRNCAT): Simplify implementation.
2014-12-19 David S. Miller <davem@davemloft.net>
* sysdeps/sparc/sparc32/soft-fp/q_neg.c (_Q_neg): Use a union to

View File

@ -17,10 +17,6 @@
#include <string.h>
#ifdef _LIBC
# include <memcopy.h>
#endif
#ifndef STRNCAT
# undef strncat
# define STRNCAT strncat
@ -29,52 +25,15 @@
char *
STRNCAT (char *s1, const char *s2, size_t n)
{
char c;
char *s = s1;
/* Find the end of S1. */
s1 += strlen (s1);
/* Make S1 point before next character, so we can increment
it while memory is read (wins on pipelined cpus). */
s1 -= 1;
size_t ss = __strnlen (s2, n);
if (n >= 4)
{
size_t n4 = n >> 2;
do
{
c = *s2++;
*++s1 = c;
if (c == '\0')
return s;
c = *s2++;
*++s1 = c;
if (c == '\0')
return s;
c = *s2++;
*++s1 = c;
if (c == '\0')
return s;
c = *s2++;
*++s1 = c;
if (c == '\0')
return s;
} while (--n4 > 0);
n &= 3;
}
while (n > 0)
{
c = *s2++;
*++s1 = c;
if (c == '\0')
return s;
n--;
}
if (c != '\0')
*++s1 = '\0';
s1[ss] = '\0';
memcpy (s1, s2, ss);
return s;
}