-
+ 3DBE10940903E705BE537C9B135EEF6733629EE3DE129C4052E95FA7983EA19416633362AD747BCF9BE6CCDC8A0083BA538508AFCC05A04D716F8AEE752C3863bitcoin/src/strlcpy.h(0 . 0)(1 . 86)
20958 /*
20959  * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
20960  *
20961  * Permission to use, copy, modify, and distribute this software for any
20962  * purpose with or without fee is hereby granted, provided that the above
20963  * copyright notice and this permission notice appear in all copies.
20964  *
20965  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
20966  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20967  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
20968  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20969  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20970  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20971  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20972  */
20973 #ifndef BITCOIN_STRLCPY_H
20974 #define BITCOIN_STRLCPY_H
20975 /*
20976  * Copy src to string dst of size siz.  At most siz-1 characters
20977  * will be copied.  Always NUL terminates (unless siz == 0).
20978  * Returns strlen(src); if retval >= siz, truncation occurred.
20979  */
20980 inline size_t strlcpy(char *dst, const char *src, size_t siz)
20981 {
20982     char *d = dst;
20983     const char *s = src;
20984     size_t n = siz;
20985 
20986     /* Copy as many bytes as will fit */
20987     if (n != 0)
20988     {
20989         while (--n != 0)
20990         {
20991             if ((*d++ = *s++) == '\0')
20992                 break;
20993         }
20994     }
20995 
20996     /* Not enough room in dst, add NUL and traverse rest of src */
20997     if (n == 0)
20998     {
20999         if (siz != 0)
21000             *d = '\0';  /* NUL-terminate dst */
21001         while (*s++)
21002             ;
21003     }
21004 
21005     return(s - src - 1); /* count does not include NUL */
21006 }
21007 
21008 /*
21009  * Appends src to string dst of size siz (unlike strncat, siz is the
21010  * full size of dst, not space left).  At most siz-1 characters
21011  * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
21012  * Returns strlen(src) + MIN(siz, strlen(initial dst)).
21013  * If retval >= siz, truncation occurred.
21014  */
21015 inline size_t strlcat(char *dst, const char *src, size_t siz)
21016 {
21017     char *d = dst;
21018     const char *s = src;
21019     size_t n = siz;
21020     size_t dlen;
21021 
21022     /* Find the end of dst and adjust bytes left but don't go past end */
21023     while (n-- != 0 && *d != '\0')
21024         d++;
21025     dlen = d - dst;
21026     n = siz - dlen;
21027 
21028     if (n == 0)
21029         return(dlen + strlen(s));
21030     while (*s != '\0')
21031     {
21032         if (n != 1)
21033         {
21034             *d++ = *s;
21035             n--;
21036         }
21037         s++;
21038     }
21039     *d = '\0';
21040 
21041     return(dlen + (s - src)); /* count does not include NUL */
21042 }
21043 #endif