about summary refs log tree commit diff
path: root/string/strncat.c
diff options
context:
space:
mode:
authorOndřej Bílka <neleai@seznam.cz>2014-12-19 23:09:40 +0100
committerOndřej Bílka <neleai@seznam.cz>2014-12-19 23:09:40 +0100
commit3eb38795dbbbd8160012050de4dfef200a21f2bf (patch)
tree3baf6d14d95902ed16f5045085b1d41fc9e74051 /string/strncat.c
parent0d4ba8be9cd4cebcc2418c72c22a12fc9baf2c85 (diff)
downloadglibc-3eb38795dbbbd8160012050de4dfef200a21f2bf.tar.gz
glibc-3eb38795dbbbd8160012050de4dfef200a21f2bf.tar.xz
glibc-3eb38795dbbbd8160012050de4dfef200a21f2bf.zip
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.
Diffstat (limited to 'string/strncat.c')
-rw-r--r--string/strncat.c47
1 files changed, 3 insertions, 44 deletions
diff --git a/string/strncat.c b/string/strncat.c
index 6d29114d38..0de9a01fde 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,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;
 }