Commit | Line | Data |
---|---|---|
5d413e08 | 1 | #ifndef CONFIG_STRLCAT |
199710f5 TK |
2 | /* |
3 | * Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com> | |
4 | * | |
5 | * Permission to use, copy, modify, and distribute this software for any | |
6 | * purpose with or without fee is hereby granted, provided that the above | |
7 | * copyright notice and this permission notice appear in all copies. | |
8 | * | |
9 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
10 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
11 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
12 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
13 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
16 | */ | |
17 | ||
18 | #include <sys/types.h> | |
5ad7be56 | 19 | #include <string.h> |
8604ba2c | 20 | #include "strlcat.h" |
5ad7be56 | 21 | |
199710f5 TK |
22 | /* |
23 | * Appends src to string dst of size dsize (unlike strncat, dsize is the | |
24 | * full size of dst, not space left). At most dsize-1 characters | |
25 | * will be copied. Always NUL terminates (unless dsize <= strlen(dst)). | |
26 | * Returns strlen(src) + MIN(dsize, strlen(initial dst)). | |
27 | * If retval >= dsize, truncation occurred. | |
28 | */ | |
29 | size_t | |
30 | strlcat(char *dst, const char *src, size_t dsize) | |
5ad7be56 | 31 | { |
199710f5 TK |
32 | const char *odst = dst; |
33 | const char *osrc = src; | |
34 | size_t n = dsize; | |
35 | size_t dlen; | |
36 | ||
37 | /* Find the end of dst and adjust bytes left but don't go past end. */ | |
38 | while (n-- != 0 && *dst != '\0') | |
39 | dst++; | |
40 | dlen = dst - odst; | |
41 | n = dsize - dlen; | |
42 | ||
43 | if (n-- == 0) | |
44 | return(dlen + strlen(src)); | |
45 | while (*src != '\0') { | |
46 | if (n != 0) { | |
47 | *dst++ = *src; | |
48 | n--; | |
49 | } | |
50 | src++; | |
51 | } | |
52 | *dst = '\0'; | |
53 | ||
54 | return(dlen + (src - osrc)); /* count does not include NUL */ | |
5ad7be56 | 55 | } |
5d413e08 SW |
56 | |
57 | #endif |