#ifndef STRLCAT_H_
#define STRLCAT_H_ 1
- #ifndef STRLCAT_INCLUDE_LIBC
+ #ifdef STRLCAT_INCLUDE_LIBC
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#ifndef HAVE_STRLCAT
#define HAVE_STRLCAT 1
#define strlcat i_strlcat_
- #define estrlcat i_estrlcat_
+ #define strlcpy i_strlcpy_
size_t i_strlcat_(char *dst, const char *src, size_t siz);
-size_t i_estrlcat_(char *dst, const char *src, size_t siz);
+size_t i_strlcpy_(char *dst, const char *src, size_t siz);
#endif /* !HAVE_STRLCAT */
#ifdef STRLCAT_IMPLEMENTATION
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)
+i_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_ */