1 | #include "lib/str.h" |
2 | #include "config.h" |
3 | |
4 | #if !defined(HAVE_STRLCPY) |
5 | size_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) |
35 | size_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 | |