Annotation of mandoc/compat_strlcpy.c, Revision 1.6
1.6 ! schwarze 1: /* $Id: compat_strlcpy.c,v 1.5 2020/06/15 01:37:15 schwarze Exp $ */
! 2: /* $OpenBSD: strlcpy.c,v 1.16 2019/01/25 00:19:25 millert Exp $ */
1.1 kristaps 3:
4: /*
1.6 ! schwarze 5: * Copyright (c) 1998, 2015 Todd C. Miller <millert@openbsd.org>
1.1 kristaps 6: *
7: * Permission to use, copy, modify, and distribute this software for any
8: * purpose with or without fee is hereby granted, provided that the above
9: * copyright notice and this permission notice appear in all copies.
10: *
11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18: */
1.5 schwarze 19: #include "config.h"
1.1 kristaps 20:
21: #include <sys/types.h>
22: #include <string.h>
23:
24: /*
1.6 ! schwarze 25: * Copy string src to buffer dst of size dsize. At most dsize-1
! 26: * chars will be copied. Always NUL terminates (unless dsize == 0).
! 27: * Returns strlen(src); if retval >= dsize, truncation occurred.
1.1 kristaps 28: */
29: size_t
1.6 ! schwarze 30: strlcpy(char *dst, const char *src, size_t dsize)
1.1 kristaps 31: {
1.6 ! schwarze 32: const char *osrc = src;
! 33: size_t nleft = dsize;
! 34:
! 35: /* Copy as many bytes as will fit. */
! 36: if (nleft != 0) {
! 37: while (--nleft != 0) {
! 38: if ((*dst++ = *src++) == '\0')
1.1 kristaps 39: break;
40: }
41: }
42:
1.6 ! schwarze 43: /* Not enough room in dst, add NUL and traverse rest of src. */
! 44: if (nleft == 0) {
! 45: if (dsize != 0)
! 46: *dst = '\0'; /* NUL-terminate dst */
! 47: while (*src++)
1.1 kristaps 48: ;
49: }
50:
1.6 ! schwarze 51: return(src - osrc - 1); /* count does not include NUL */
1.1 kristaps 52: }
CVSweb