1 | /*␊ |
2 | * strlcpy.c␊ |
3 | */␊ |
4 | ␊ |
5 | /* Use OpenBSD heritage source -- Chucko 2014-01-06 */␊ |
6 | ␊ |
7 | /*-␊ |
8 | * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>␊ |
9 | *␊ |
10 | * Permission to use, copy, modify, and distribute this software for any␊ |
11 | * purpose with or without fee is hereby granted, provided that the above␊ |
12 | * copyright notice and this permission notice appear in all copies.␊ |
13 | *␊ |
14 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES␊ |
15 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF␊ |
16 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR␊ |
17 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES␊ |
18 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN␊ |
19 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF␊ |
20 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.␊ |
21 | */␊ |
22 | ␊ |
23 | #include <string.h>␊ |
24 | #include <klibc/compiler.h>␊ |
25 | ␊ |
26 | /*␊ |
27 | * Copy src to string dst of size siz. At most siz-1 characters␊ |
28 | * will be copied. Always NUL terminates (unless siz == 0).␊ |
29 | * Returns strlen(src); if retval >= siz, truncation occurred.␊ |
30 | */␊ |
31 | size_t␊ |
32 | strlcpy(char * __restrict dst, const char * __restrict src, size_t siz)␊ |
33 | {␊ |
34 | char *d = dst;␊ |
35 | const char *s = src;␊ |
36 | size_t n = siz;␊ |
37 | ␊ |
38 | /* Copy as many bytes as will fit */␊ |
39 | if (n != 0) {␊ |
40 | while (--n != 0) {␊ |
41 | if ((*d++ = *s++) == '\0')␊ |
42 | break;␊ |
43 | }␊ |
44 | }␊ |
45 | ␊ |
46 | /* Not enough room in dst, add NUL and traverse rest of src */␊ |
47 | if (n == 0) {␊ |
48 | if (siz != 0)␊ |
49 | *d = '\0'; /* NUL-terminate dst */␊ |
50 | while (*s++)␊ |
51 | ;␊ |
52 | }␊ |
53 | ␊ |
54 | return(s - src - 1); /* count does not include NUL */␊ |
55 | }␊ |
56 | |