1#include "lib/str.h"
2#include "config.h"
3
4#if !defined(HAVE_STRLCPY)
5size_t strlcpy(char *dst, const char *src, size_t siz) {
6 char *d = dst;
7 const char *s = src;
8 size_t n = siz;
9
10 // Copy as many bytes as will fit
11 if (n != 0) {
12 while (--n != 0) {
13 if ((*d++ = *s++) == '\0') {
14 break;
15 }
16 }
17 }
18
19 // Not enough room in dst, add NUL and traverse rest of src
20 if (n == 0) {
21 if (siz != 0) {
22 // NUL-terminate dst
23 *d = '\0';
24 }
25 while (*s++)
26 ;
27 }
28
29 // count does not include NUL
30 return (s - src - 1);
31}
32#endif
33
34#if !defined(HAVE_STRLCAT)
35size_t strlcat(char *dst, const char *src, size_t siz) {
36 char *d = dst;
37 const char *s = src;
38 size_t n = siz;
39 size_t dlen;
40
41 // Find the end of dst and adjust bytes left but don't go past end
42 while (n-- != 0 && *d != '\0') {
43 d++;
44 }
45 dlen = d - dst;
46 n = siz - dlen;
47
48 if (n == 0) {
49 return(dlen + strlen(s));
50 }
51 while (*s != '\0') {
52 if (n != 1) {
53 *d++ = *s;
54 n--;
55 }
56 s++;
57 }
58 *d = '\0';
59
60 // count does not include NUL
61 return (dlen + (s - src));
62}
63#endif
64