#include <stdio.h> /* * 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. */ int strlcpy(char *dst, const char *src, int siz) { register char *d = dst; register const char *s = src; register size_t n = siz; /* Copy as many bytes as will fit */ if (n != 0 && --n != 0) { do { if ((*d++ = *s++) == 0) break; } while (--n != 0); } /* 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 */ } int main() { char buf[5]; char *s[] = {"abc", "abcd", "abcde", "abcdef"}; int i, len, size = sizeof(buf); for (i = 0; i < 5; i++) { buf[i] = '#'; } printf("size = %d\n", size); for (i = 0; i < 4; i++) { len = strlcpy(buf, s[i], size); printf("src = %s, len = %d, buf = %s", s[i], len, buf); if (size <= len) { printf(", truncation occurred\n"); } else { printf("\n"); } } return 0; }