Simplify strncat.
diff mbox

Message ID 20141217165103.GB26604@domone
State New
Headers show

Commit Message

Ondřej Bílka Dec. 17, 2014, 4:51 p.m. UTC
On Tue, Dec 16, 2014 at 12:50:38PM -0800, Paul Eggert wrote:
> Thanks, this is much better than worrying about how to pacify GCC.
> The code could be made a bit shorter and clearer with mempcpy, and
> there's no longer any need to distinguish between s and s1, so I
> suggest the following minor rewrite, which shrinks the code size by
> another 26 bytes (16%) on my x86-64 platform.
> 
> char *
> STRNCAT (char *s1, const char *s2, size_t n)
> {
>   char *s1_end = mempcpy (s1 + strlen (s1), s2, __strnlen (s2, n));
>   *s1_end = '\0';
>   return s1;
> }
That looks better (with minor fix s/mempcpy/__mempcpy/), anybody objects
using this instead?

	* string/strncat.c (STRNCAT): Simplify implementation.

Comments

Paul Eggert Dec. 17, 2014, 5:48 p.m. UTC | #1
On 12/17/2014 08:51 AM, Ondřej Bílka wrote:
> That looks better (with minor fix s/mempcpy/__mempcpy/)

Yes, thanks for catching that.  It looks good.

Patch
diff mbox

diff --git a/string/strncat.c b/string/strncat.c
index 6d29114..325c5eb 100644
--- a/string/strncat.c
+++ b/string/strncat.c
@@ -17,10 +17,6 @@ 
 
 #include <string.h>
 
-#ifdef _LIBC
-# include <memcopy.h>
-#endif
-
 #ifndef STRNCAT
 # undef strncat
 # define STRNCAT  strncat
@@ -29,52 +25,7 @@ 
 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--;
-    }
-
-  if (c != '\0')
-    *++s1 = '\0';
-
-  return s;
+  char *s1_end = __mempcpy (s1 + strlen (s1), s2, __strnlen (s2, n));
+  *s1_end = '\0';
+  return s1;
 }