diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2019-09-03 17:07:58 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2019-09-03 17:11:12 -0400 |
commit | f7f1e3cfa25cf95e15bac30e6934d5a534ceca08 (patch) | |
tree | c5a15638ad3f26909114495bb43dcb62cf999ebd | |
parent | 325b37b290dda53392a22c7f2ef802f581e4232d (diff) | |
download | bfs-f7f1e3cfa25cf95e15bac30e6934d5a534ceca08.tar.xz |
dstring: New dstrndup() function
-rw-r--r-- | dstring.c | 10 | ||||
-rw-r--r-- | dstring.h | 10 |
2 files changed, 19 insertions, 1 deletions
@@ -49,7 +49,10 @@ static char *dstralloc_impl(size_t capacity, size_t length, const char *data) { header->capacity = capacity; header->length = length; - return memcpy(header->data, data, length + 1); + + memcpy(header->data, data, length); + header->data[length] = '\0'; + return header->data; } char *dstralloc(size_t capacity) { @@ -61,6 +64,11 @@ char *dstrdup(const char *str) { return dstralloc_impl(len, len, str); } +char *dstrndup(const char *str, size_t n) { + size_t len = strnlen(str, n); + return dstralloc_impl(len, len, str); +} + size_t dstrlen(const char *dstr) { return dstrheader(dstr)->length; } @@ -41,6 +41,16 @@ char *dstralloc(size_t capacity); char *dstrdup(const char *str); /** + * Create a length-limited dynamic copy of a string. + * + * @param str + * The string to copy. + * @param n + * The maximum number of characters to copy from str. + */ +char *dstrndup(const char *str, size_t n); + +/** * Get a dynamic string's length. * * @param dstr |