dvander@27: /* Safe string copying and concatenation dvander@27: * These routines are originally distributed in two separate files. I have dvander@27: * copied the files verbatim in this single source file, including all comments. dvander@27: * The only change is that the second set of include files is commented out dvander@27: * (there is no need to include the same files twice). dvander@27: */ dvander@27: dvander@27: #include "lstring.h" dvander@27: dvander@27: #if !defined HAVE_SAFESTR dvander@27: dvander@27: /* $OpenBSD: strlcpy.c,v 1.10 2005/08/08 08:05:37 espie Exp $ */ dvander@27: dvander@27: /* dvander@27: * Copyright (c) 1998 Todd C. Miller dvander@27: * dvander@27: * Permission to use, copy, modify, and distribute this software for any dvander@27: * purpose with or without fee is hereby granted, provided that the above dvander@27: * copyright notice and this permission notice appear in all copies. dvander@27: * dvander@27: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES dvander@27: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF dvander@27: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR dvander@27: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES dvander@27: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN dvander@27: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF dvander@27: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. dvander@27: */ dvander@27: dvander@27: /* dvander@27: #include already included through lstring.h dvander@27: */ dvander@27: #include /* for strlen() */ dvander@27: dvander@27: /* dvander@27: * Copy src to string dst of size siz. At most siz-1 characters dvander@27: * will be copied. Always NUL terminates (unless siz == 0). dvander@27: * Returns strlen(src); if retval >= siz, truncation occurred. dvander@27: */ dvander@27: size_t dvander@27: strlcpy(char *dst, const char *src, size_t siz) dvander@27: { dvander@27: char *d = dst; dvander@27: const char *s = src; dvander@27: size_t n = siz; dvander@27: dvander@27: /* Copy as many bytes as will fit */ dvander@27: if (n != 0 && --n != 0) { dvander@27: do { dvander@27: if ((*d++ = *s++) == 0) dvander@27: break; dvander@27: } while (--n != 0); dvander@27: } dvander@27: dvander@27: /* Not enough room in dst, add NUL and traverse rest of src */ dvander@27: if (n == 0) { dvander@27: if (siz != 0) dvander@27: *d = '\0'; /* NUL-terminate dst */ dvander@27: while (*s++) dvander@27: ; dvander@27: } dvander@27: dvander@27: return(s - src - 1); /* count does not include NUL */ dvander@27: } dvander@27: dvander@27: /* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */ dvander@27: dvander@27: /* dvander@27: * Copyright (c) 1998 Todd C. Miller dvander@27: * dvander@27: * Permission to use, copy, modify, and distribute this software for any dvander@27: * purpose with or without fee is hereby granted, provided that the above dvander@27: * copyright notice and this permission notice appear in all copies. dvander@27: * dvander@27: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES dvander@27: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF dvander@27: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR dvander@27: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES dvander@27: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN dvander@27: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF dvander@27: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. dvander@27: */ dvander@27: dvander@27: /* dvander@27: #include already included dvander@27: #include already included dvander@27: */ dvander@27: dvander@27: /* dvander@27: * Appends src to string dst of size siz (unlike strncat, siz is the dvander@27: * full size of dst, not space left). At most siz-1 characters dvander@27: * will be copied. Always NUL terminates (unless siz <= strlen(dst)). dvander@27: * Returns strlen(src) + MIN(siz, strlen(initial dst)). dvander@27: * If retval >= siz, truncation occurred. dvander@27: */ dvander@27: size_t dvander@27: strlcat(char *dst, const char *src, size_t siz) dvander@27: { dvander@27: char *d = dst; dvander@27: const char *s = src; dvander@27: size_t n = siz; dvander@27: size_t dlen; dvander@27: dvander@27: /* Find the end of dst and adjust bytes left but don't go past end */ dvander@27: while (n-- != 0 && *d != '\0') dvander@27: d++; dvander@27: dlen = d - dst; dvander@27: n = siz - dlen; dvander@27: dvander@27: if (n == 0) dvander@27: return(dlen + strlen(s)); dvander@27: while (*s != '\0') { dvander@27: if (n != 1) { dvander@27: *d++ = *s; dvander@27: n--; dvander@27: } dvander@27: s++; dvander@27: } dvander@27: *d = '\0'; dvander@27: dvander@27: return(dlen + (s - src)); /* count does not include NUL */ dvander@27: } dvander@27: dvander@27: #endif /* #if !defined HAVE_SAFESTR */