Changeset View
Changeset View
Standalone View
Standalone View
sys/libkern/strlcat.c
Show All 40 Lines | |||||
/* | /* | ||||
* Appends src to string dst of size siz (unlike strncat, siz is the | * Appends src to string dst of size siz (unlike strncat, siz is the | ||||
* full size of dst, not space left). At most siz-1 characters | * full size of dst, not space left). At most siz-1 characters | ||||
* will be copied. Always NUL terminates (unless siz <= strlen(dst)). | * will be copied. Always NUL terminates (unless siz <= strlen(dst)). | ||||
* Returns strlen(src) + MIN(siz, strlen(initial dst)). | * Returns strlen(src) + MIN(siz, strlen(initial dst)). | ||||
* If retval >= siz, truncation occurred. | * If retval >= siz, truncation occurred. | ||||
*/ | */ | ||||
size_t | size_t | ||||
strlcat(char *dst, const char *src, size_t siz) | strlcat(char * __restrict dst, const char * __restrict src, size_t siz) | ||||
{ | { | ||||
char *d = dst; | char *d = dst; | ||||
const char *s = src; | const char *s = src; | ||||
size_t n = siz; | size_t n = siz; | ||||
size_t dlen; | |||||
/* Find the end of dst and adjust bytes left but don't go past end */ | /* Find the end of dst and adjust bytes left but don't go past end */ | ||||
while (n-- != 0 && *d != '\0') | for (;; ++d, --n) { | ||||
d++; | |||||
dlen = d - dst; | |||||
n = siz - dlen; | |||||
if (n == 0) | if (n == 0) | ||||
return(dlen + strlen(s)); | return (siz + strlen(s)); | ||||
if (*d == '\0') | |||||
break; | |||||
} | |||||
const size_t dlen = siz - n; | |||||
jrtc27: Old code was clearer | |||||
Done Inline Actionsstyle(9) violation jrtc27: style(9) violation | |||||
while (*s != '\0') { | while (*s != '\0') { | ||||
if (n != 1) { | if (n != 1) { | ||||
*d++ = *s; | *d++ = *s; | ||||
n--; | n--; | ||||
} | } | ||||
s++; | s++; | ||||
} | } | ||||
*d = '\0'; | *d = '\0'; | ||||
return(dlen + (s - src)); /* count does not include NUL */ | return (dlen + (s - src)); /* count does not include NUL */ | ||||
} | } |
Old code was clearer