Skip to content

Commit

Permalink
Simplify strncat.
Browse files Browse the repository at this point in the history
We rewrite strncat to use strnlen and malloc calls which simplifies code
an is faster as these functions are better optimized than original code.
  • Loading branch information
Ondřej Bílka committed Dec 19, 2014
1 parent 0d4ba8b commit 3eb3879
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 44 deletions.
4 changes: 4 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
47 changes: 3 additions & 44 deletions string/strncat.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@

#include <string.h>

#ifdef _LIBC
# include <memcopy.h>
#endif

#ifndef STRNCAT
# undef strncat
# define STRNCAT strncat
Expand All @@ -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;

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--;
}
size_t ss = __strnlen (s2, n);

if (c != '\0')
*++s1 = '\0';
s1[ss] = '\0';
memcpy (s1, s2, ss);

return s;
}

0 comments on commit 3eb3879

Please sign in to comment.