On (08/21/18 18:50), Sergey Senozhatsky wrote: > > > int strcpy_trim(char *dst, size_t dstsize, const char *src, size_t > > srcsize) - copy (potentially not '\0'-terminated) src to dst, trimming > > leading and trailing whitespace. dstsize must be positive, and dst is > > guaranteed to be '\0'-terminated. Returns the length of the string now > > in dst, or -EOVERFLOW if some none-whitespace character was chopped. > > > > would cover all use cases? >
Something like below? Not tested, since we are still in "is this what we want" phase. Returning the length of dst/-EOVERFLOW is a bit inconvenient, because "the length" forces us to have size_t return, which is unsigned. This one returns a number of non-NULL bytes, which were copied to dst, or 0. --- size_t strcpy_trim(char *dst, size_t dstsz, const char *src, size_t srcsz) { const char *end; size_t ret = 0; size_t len = 0; if (!dstsz || !srcsz) goto out; end = src + srcsz - 1; while (end >= src && isspace(*end)) end--; end++; while (src < end && isspace(*src)) src++; len = (src >= end) ? 0 : end - src; if (!len) goto out; ret = len; if (len >= dstsz) len = dstsz - 1; memcpy(dst, src, len); out: dst[len] = '\0'; return ret == len ? ret : -EOVERFLOW; }