[BACK]Return to compat_strlcpy.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

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