I'm fine with all of the changes you mentioned, Ralph, with one
caveat... can we document them all in a header file or the source
code so we know which ones we should use under which circumstances?
Absolutely. I'd group the alternatives together, they'd each have their
own description, like trunccpy()'s existing one, and then have an
introductory comment beforehand if needed.
/* trunccpy copies at most size-1 chars from non-NULL src to non-NULL,
* non-overlapping, dst, and ensures dst is NUL terminated. If size is
* zero then it aborts as dst cannot be NUL terminated.
* It's to be used when truncation is intended and correct, e.g.
* reporting a possibly very long external string back to the user. One
* of its advantages over strncpy(3) is it doesn't pad in the common
* case of no truncation. */
trunccpy(char *dst, const char *src, size_t size)