util/ralloc: add ralloc_str_append() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Wed, 9 Aug 2017 03:34:08 +0000 (13:34 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 11 Aug 2017 00:43:31 +0000 (10:43 +1000)
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 <thomashelland90@gmail.com>
src/util/ralloc.c
src/util/ralloc.h

index 821ee72fe8d2dfdf67d560284c6efc14e30ecee9..bf46439df4ea5fe9268ecd8d7ef397ed55f8a5d8 100644 (file)
@@ -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, ...)
 {
index 7d90651966174e6242565dcea1cc8b39af5e953c..05ae8f8407c766089e22d7adbe473103f6ae531d 100644 (file)
@@ -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.
  *