mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 14:30:06 +00:00
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:
parent
0d4ba8be9c
commit
3eb38795db
@ -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>
|
2014-12-19 David S. Miller <davem@davemloft.net>
|
||||||
|
|
||||||
* sysdeps/sparc/sparc32/soft-fp/q_neg.c (_Q_neg): Use a union to
|
* sysdeps/sparc/sparc32/soft-fp/q_neg.c (_Q_neg): Use a union to
|
||||||
|
@ -17,10 +17,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef _LIBC
|
|
||||||
# include <memcopy.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef STRNCAT
|
#ifndef STRNCAT
|
||||||
# undef strncat
|
# undef strncat
|
||||||
# define STRNCAT strncat
|
# define STRNCAT strncat
|
||||||
@ -29,52 +25,15 @@
|
|||||||
char *
|
char *
|
||||||
STRNCAT (char *s1, const char *s2, size_t n)
|
STRNCAT (char *s1, const char *s2, size_t n)
|
||||||
{
|
{
|
||||||
char c;
|
|
||||||
char *s = s1;
|
char *s = s1;
|
||||||
|
|
||||||
/* Find the end of S1. */
|
/* Find the end of S1. */
|
||||||
s1 += strlen (s1);
|
s1 += strlen (s1);
|
||||||
|
|
||||||
/* Make S1 point before next character, so we can increment
|
size_t ss = __strnlen (s2, n);
|
||||||
it while memory is read (wins on pipelined cpus). */
|
|
||||||
s1 -= 1;
|
|
||||||
|
|
||||||
if (n >= 4)
|
s1[ss] = '\0';
|
||||||
{
|
memcpy (s1, s2, ss);
|
||||||
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';
|
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user