X-Git-Url: https://git.datadissipation.net/libcext/blobdiff_plain/d933aef4792c1af2f074bd20c3350d477223e92e..refs/heads/master:/strlcat.h diff --git a/strlcat.h b/strlcat.h index 7895155..f1a035d 100644 --- a/strlcat.h +++ b/strlcat.h @@ -15,24 +15,23 @@ */ /* https://git.datadissipation.net */ -#ifndef STRLCAT_H_ - #define STRLCAT_H_ 1 +#ifndef LCE_STRLCAT_H + #define LCE_STRLCAT_H 1 - #ifndef STRLCAT_INCLUDE_LIBC - #include + #ifdef LCE_STRLCAT_INCLUDE_LIBC #include #include - #endif /* !STRLCAT_INCLUDE_LIBC */ + #endif /* !LCE_STRLCAT_INCLUDE_LIBC */ #ifndef HAVE_STRLCAT #define HAVE_STRLCAT 1 - #define strlcat i_strlcat_ - #define estrlcat i_estrlcat_ -size_t i_strlcat_(char *dst, const char *src, size_t siz); -size_t i_estrlcat_(char *dst, const char *src, size_t siz); + #define strlcat lce_strlcat_ + #define strlcpy lce_strlcpy_ +size_t lce_strlcat_(char *dst, const char *src, size_t siz); +size_t lce_strlcpy_(char *dst, const char *src, size_t siz); #endif /* !HAVE_STRLCAT */ - #ifdef STRLCAT_IMPLEMENTATION + #ifdef LCE_STRLCAT_IMPLEMENTATION /* * 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 @@ -41,7 +40,7 @@ size_t i_estrlcat_(char *dst, const char *src, size_t siz); * If retval >= siz, truncation occurred. */ size_t -i_strlcat_(char *dst, const char *src, size_t siz) +lce_strlcat_(char *dst, const char *src, size_t siz) { char *d = dst; const char *s = src; @@ -65,15 +64,32 @@ i_strlcat_(char *dst, const char *src, size_t siz) return (dlen + (s - src)); /* count does not include NUL */ } +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ size_t -i_estrlcat_(char *dst, const char *src, size_t siz) +lce_strlcpy_(char *dst, const char *src, size_t siz) { - size_t ret; - - if ((ret = i_strlcat_(dst, src, siz)) >= siz) - fprintf(stderr, "strlcat: input string too long\n"); - - return ret; + char *d = dst; + const char *s = src; + size_t n = siz; + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; + } + } + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + return(s - src - 1); /* count does not include NUL */ } - #endif /* STRLCAT_IMPLEMENTATION */ -#endif /* !STRLCAT_H_ */ + #endif /* LCE_STRLCAT_IMPLEMENTATION */ +#endif /* !LCE_STRLCAT_H */