From 26f4657c3f075045527c4568e8cbbaaa5d0b08e4 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Wed, 9 Aug 2017 13:34:08 +1000 Subject: [PATCH] util/ralloc: add ralloc_str_append() helper This function differs from ralloc_strcat() and ralloc_strncat() in that it does not do any strlen() calls which can become costly on large strings. Reviewed-by: Thomas Helland --- src/util/ralloc.c | 19 +++++++++++++++++++ src/util/ralloc.h | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/util/ralloc.c b/src/util/ralloc.c index 821ee72fe8d..bf46439df4e 100644 --- a/src/util/ralloc.c +++ b/src/util/ralloc.c @@ -403,6 +403,25 @@ ralloc_strncat(char **dest, const char *str, size_t n) return cat(dest, str, strnlen(str, n)); } +bool +ralloc_str_append(char **dest, const char *str, + size_t existing_length, size_t str_size) +{ + char *both; + assert(dest != NULL && *dest != NULL); + + both = resize(*dest, existing_length + str_size + 1); + if (unlikely(both == NULL)) + return false; + + memcpy(both + existing_length, str, str_size); + both[existing_length + str_size] = '\0'; + + *dest = both; + + return true; +} + char * ralloc_asprintf(const void *ctx, const char *fmt, ...) { diff --git a/src/util/ralloc.h b/src/util/ralloc.h index 7d906519661..05ae8f8407c 100644 --- a/src/util/ralloc.h +++ b/src/util/ralloc.h @@ -292,6 +292,24 @@ bool ralloc_strcat(char **dest, const char *str); */ bool ralloc_strncat(char **dest, const char *str, size_t n); +/** + * Concatenate two strings, allocating the necessary space. + * + * This appends \p n bytes of \p str to \p *dest, using ralloc_resize + * to expand \p *dest to the appropriate size. \p dest will be updated to the + * new pointer unless allocation fails. + * + * The result will always be null-terminated. + * + * This function differs from ralloc_strcat() and ralloc_strncat() in that it + * does not do any strlen() calls which can become costly on large strings. + * + * \return True unless allocation failed. + */ +bool +ralloc_str_append(char **dest, const char *str, + size_t existing_length, size_t str_size); + /** * Print to a string. * -- 2.30.2