ohav chochmah wrote:
> Why not reuse memccpy (in glibc)? as in 'memccpy(to, from, '\0', size)'.
> Not only for sake of reusing, but memccpy is highly optimized for
> ia64, and may be optimized for other arches in the future.
Thanks for the suggestion, but that returns NULL
when it finds no NUL byte in the first SIZE bytes of FROM.
I could implement stzncpy in terms of that function instead
of open-coding the loop:
diff --git a/src/system.h b/src/system.h
index 6907603..10b04b2 100644
--- a/src/system.h
+++ b/src/system.h
@@ -633,11 +633,13 @@ The following directory is part of the cycle:\n %s\n"), \
static inline char *
stzncpy (char *dest, char const *src, size_t len)
{
- char const *src_end = src + len;
- while (src < src_end && *src)
- *dest++ = *src++;
- *dest = 0;
- return dest;
+ char *p = memccpy (dest, src, 0, len);
+ if (p == NULL)
+ {
+ p = dest + len;
+ *p = 0;
+ }
+ return p;
}
#ifndef ARRAY_CARDINALITY
but (for portability) that would require a gnulib module for memccpy.
Such a module would be welcome regardless, but here it seems like
it's not worth the complication, since the few uses of stzncpy are not
performance sensitive.