Use OpenBSD strlcpy() - smdev - suckless mdev | |
git clone git://git.suckless.org/smdev | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit b1b09f7896b6d2f3fca3cc0c74a85d9e2f246bfa | |
parent b221ca33fd0deb80fadcdf9bd06392f9e2480553 | |
Author: sin <[email protected]> | |
Date: Sat, 2 Aug 2014 13:51:52 +0100 | |
Use OpenBSD strlcpy() | |
I don't remember where the previous implementation comes from and | |
therefore I can't provide appropriate credit. | |
Diffstat: | |
M util/strlcpy.c | 49 +++++++++++++++++++++++++----… | |
1 file changed, 40 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/util/strlcpy.c b/util/strlcpy.c | |
@@ -1,16 +1,47 @@ | |
-#include <stdio.h> | |
+/* | |
+ * Copyright (c) 1998 Todd C. Miller <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+ | |
+#include <sys/types.h> | |
#include <string.h> | |
#include "../util.h" | |
+/* | |
+ * Copy src to string dst of size siz. At most siz-1 characters | |
+ * will be copied. Always NUL terminates (unless siz == 0). | |
+ * Returns strlen(src); if retval >= siz, truncation occurred. | |
+ */ | |
size_t | |
-strlcpy(char *dest, const char *src, size_t size) | |
+strlcpy(char *dst, const char *src, size_t siz) | |
{ | |
- size_t ret = strlen(src); | |
- | |
- if (size) { | |
- size_t len = (ret >= size) ? size - 1 : ret; | |
- memcpy(dest, src, len); | |
- dest[len] = '\0'; | |
+ char *d = dst; | |
+ const char *s = src; | |
+ size_t n = siz; | |
+ /* Copy as many bytes as will fit */ | |
+ if (n != 0) { | |
+ while (--n != 0) { | |
+ if ((*d++ = *s++) == '\0') | |
+ break; | |
+ } | |
+ } | |
+ /* Not enough room in dst, add NUL and traverse rest of src */ | |
+ if (n == 0) { | |
+ if (siz != 0) | |
+ *d = '\0'; /* NUL-terminate dst */ | |
+ while (*s++) | |
+ ; | |
} | |
- return ret; | |
+ return(s - src - 1); /* count does not include NUL */ | |
} |