Annotation of mandoc/compat_strlcat.c, Revision 1.6
1.6 ! schwarze 1: /* $Id: compat_strlcat.c,v 1.5 2020/06/15 01:37:15 schwarze Exp $ */
! 2: /* $OpenBSD: strlcat.c,v 1.19 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: * Appends src to string dst of size dsize (unlike strncat, dsize is the
! 26: * full size of dst, not space left). At most dsize-1 characters
! 27: * will be copied. Always NUL terminates (unless dsize <= strlen(dst)).
! 28: * Returns strlen(src) + MIN(dsize, strlen(initial dst)).
! 29: * If retval >= dsize, truncation occurred.
1.1 kristaps 30: */
31: size_t
1.6 ! schwarze 32: strlcat(char *dst, const char *src, size_t dsize)
1.1 kristaps 33: {
1.6 ! schwarze 34: const char *odst = dst;
! 35: const char *osrc = src;
! 36: size_t n = dsize;
1.1 kristaps 37: size_t dlen;
38:
1.6 ! schwarze 39: /* Find the end of dst and adjust bytes left but don't go past end. */
! 40: while (n-- != 0 && *dst != '\0')
! 41: dst++;
! 42: dlen = dst - odst;
! 43: n = dsize - dlen;
! 44:
! 45: if (n-- == 0)
! 46: return(dlen + strlen(src));
! 47: while (*src != '\0') {
! 48: if (n != 0) {
! 49: *dst++ = *src;
1.1 kristaps 50: n--;
51: }
1.6 ! schwarze 52: src++;
1.1 kristaps 53: }
1.6 ! schwarze 54: *dst = '\0';
1.1 kristaps 55:
1.6 ! schwarze 56: return(dlen + (src - osrc)); /* count does not include NUL */
1.1 kristaps 57: }
CVSweb