From patchwork Wed Dec 17 16:51:03 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ondrej Bilka X-Patchwork-Id: 4303 Received: (qmail 15667 invoked by alias); 17 Dec 2014 16:52:25 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 15657 invoked by uid 89); 17 Dec 2014 16:52:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.7 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, SPF_NEUTRAL autolearn=no version=3.3.2 X-HELO: popelka.ms.mff.cuni.cz Date: Wed, 17 Dec 2014 17:51:03 +0100 From: =?utf-8?B?T25kxZllaiBCw61sa2E=?= To: Paul Eggert Cc: libc-alpha@sourceware.org Subject: Re: [PATCH] Simplify strncat. Message-ID: <20141217165103.GB26604@domone> References: <20141216202438.GA5612@domone> <54909B1E.9040201@cs.ucla.edu> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <54909B1E.9040201@cs.ucla.edu> User-Agent: Mutt/1.5.20 (2009-06-14) 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. 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 -#ifdef _LIBC -# include -#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; }