diff options
Diffstat (limited to 'portable')
-rw-r--r-- | portable/strlcat.c | 42 | ||||
-rw-r--r-- | portable/strlcpy.c | 40 |
2 files changed, 82 insertions, 0 deletions
diff --git a/portable/strlcat.c b/portable/strlcat.c new file mode 100644 index 0000000..971a348 --- /dev/null +++ b/portable/strlcat.c @@ -0,0 +1,42 @@ +/* $Id$ + * + * Replacement for a missing strlcat. + * + * Provides the same functionality as the *BSD function strlcat, originally + * developed by Todd Miller and Theo de Raadt. strlcat works similarly to + * strncat, except simpler. The result is always nul-terminated even if the + * source string is longer than the space remaining in the destination string, + * and the total space required is returned. The third argument is the total + * space available in the destination buffer, not just the amount of space + * remaining. + * + * Written by Russ Allbery <rra@stanford.edu> + * This work is hereby placed in the public domain by its author. + */ + +#include <config.h> +#include <system.h> + +/* + * If we're running the test suite, rename strlcat to avoid conflicts with + * the system version. + */ +#if TESTING +# define strlcat test_strlcat +size_t test_strlcat(char *, const char *, size_t); +#endif + +size_t +strlcat(char *dst, const char *src, size_t size) +{ + size_t used, length, copy; + + used = strlen(dst); + length = strlen(src); + if (size > 0 && used < size - 1) { + copy = (length >= size - used) ? size - used - 1 : length; + memcpy(dst + used, src, copy); + dst[used + copy] = '\0'; + } + return used + length; +} diff --git a/portable/strlcpy.c b/portable/strlcpy.c new file mode 100644 index 0000000..1dd49a3 --- /dev/null +++ b/portable/strlcpy.c @@ -0,0 +1,40 @@ +/* $Id$ + * + * Replacement for a missing strlcpy. + * + * Provides the same functionality as the *BSD function strlcpy, originally + * developed by Todd Miller and Theo de Raadt. strlcpy works similarly to + * strncpy, except saner and simpler. The result is always nul-terminated + * even if the source string is longer than the destination string, and the + * total space required is returned. The destination string is not nul-filled + * like strncpy does, just nul-terminated. + * + * Written by Russ Allbery <rra@stanford.edu> + * This work is hereby placed in the public domain by its author. + */ + +#include <config.h> +#include <system.h> + +/* + * If we're running the test suite, rename strlcpy to avoid conflicts with + * the system version. + */ +#if TESTING +# define strlcpy test_strlcpy +size_t test_strlcpy(char *, const char *, size_t); +#endif + +size_t +strlcpy(char *dst, const char *src, size_t size) +{ + size_t length, copy; + + length = strlen(src); + if (size > 0) { + copy = (length >= size) ? size - 1 : length; + memcpy(dst, src, copy); + dst[copy] = '\0'; + } + return length; +} |