diff options
-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 |