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.
---
 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 821ee72fe8..bf46439df4 100644
--- a/src/util/ralloc.c
+++ b/src/util/ralloc.c
@@ -396,20 +396,39 @@ ralloc_strcat(char **dest, const char *str)
 {
    return cat(dest, str, strlen(str));
 }
 
 bool
 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, ...)
 {
    char *ptr;
    va_list args;
    va_start(args, fmt);
    ptr = ralloc_vasprintf(ctx, fmt, args);
    va_end(args);
    return ptr;
 }
diff --git a/src/util/ralloc.h b/src/util/ralloc.h
index 7d90651966..05ae8f8407 100644
--- a/src/util/ralloc.h
+++ b/src/util/ralloc.h
@@ -286,20 +286,38 @@ bool ralloc_strcat(char **dest, const char *str);
  * new pointer unless allocation fails.
  *
  * The result will always be null-terminated; \p str does not need to be null
  * terminated if it is longer than \p n.
  *
  * \return True unless allocation failed.
  */
 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.
  *
  * This is analogous to \c sprintf, but allocates enough space (using \p ctx
  * as the context) for the resulting string.
  *
  * \return The newly allocated string.
  */
 char *ralloc_asprintf (const void *ctx, const char *fmt, ...) PRINTFLIKE(2, 3) 
MALLOCLIKE;
 
 /**
-- 
2.13.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to