This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Simplify strncat.
- From: OndÅej BÃlka <neleai at seznam dot cz>
- To: Carlos O'Donell <carlos at redhat dot com>
- Cc: Wilco Dijkstra <wdijkstr at arm dot com>, eggert at cs dot ucla dot edu, libc-alpha at sourceware dot org
- Date: Fri, 19 Dec 2014 23:13:14 +0100
- Subject: Re: [PATCH] Simplify strncat.
- Authentication-results: sourceware.org; auth=none
- References: <000f01d01ad0$17e381d0$47aa8570$ at com> <5493E02D dot 3050108 at redhat dot com>
On Fri, Dec 19, 2014 at 03:22:05AM -0500, Carlos O'Donell wrote:
> On 12/18/2014 09:37 AM, Wilco Dijkstra wrote:
> > OndÅej BÃlka wrote:
> >>> 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?
> >
> > I don't think mempcpy is better, few targets define it (ARM, MIPS, AARCH64
> > don't for example), so it means an extra call and return. Mempcpy is also
> > non-standard and rarely used, so would not be cache resident even if you
> > have an optimized implementation.
> >
> > This has the same advantages as Paul's version (fewer callee-saves):
> >
> > char *
> > STRNCAT (char *s1, const char *s2, size_t n)
> > {
> > char *s;
> > n = strnlen (s2, n);
> > s = s1 + strlen (s1);
> > s[n] = '\0';
> > memcpy (s, s2, n);
> > return s1;
> > }
>
> Agreed.
>
> Cheers,
> Carlos.
>
Ok, as it looks that everybody agrees now I commited that version.