[Mesa-dev] [PATCH 1/7] ralloc: add a new printing helper ralloc_sprint_rewrite_tail
Marek Olšák
maraeo at gmail.com
Sun Jan 1 00:34:26 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
This one is much faster when you don't need vsprintf.
---
src/util/ralloc.c | 25 +++++++++++++++++++++++++
src/util/ralloc.h | 24 ++++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/src/util/ralloc.c b/src/util/ralloc.c
index 980e4e4..7976ca6 100644
--- a/src/util/ralloc.c
+++ b/src/util/ralloc.c
@@ -522,20 +522,45 @@ ralloc_vasprintf_rewrite_tail(char **str, size_t *start, const char *fmt,
ptr = resize(*str, *start + new_length + 1);
if (unlikely(ptr == NULL))
return false;
vsnprintf(ptr + *start, new_length + 1, fmt, args);
*str = ptr;
*start += new_length;
return true;
}
+bool
+ralloc_sprint_rewrite_tail(char **str, size_t *start, const char *text,
+ unsigned text_length)
+{
+ char *ptr;
+
+ assert(str != NULL);
+
+ if (unlikely(*str == NULL)) {
+ /* Assuming a NULL context is probably bad, but it's expected behavior. */
+ *str = ralloc_strdup(NULL, text);
+ *start = strlen(*str);
+ return true;
+ }
+
+ ptr = resize(*str, *start + text_length + 1);
+ if (unlikely(ptr == NULL))
+ return false;
+
+ memcpy(ptr + *start, text, text_length + 1); /* also copy '\0' */
+ *str = ptr;
+ *start += text_length;
+ return true;
+}
+
/***************************************************************************
* Linear allocator for short-lived allocations.
***************************************************************************
*
* The allocator consists of a parent node (2K buffer), which requires
* a ralloc parent, and child nodes (allocations). Child nodes can't be freed
* directly, because the parent doesn't track them. You have to release
* the parent node in order to release all its children.
*
* The allocator uses a fixed-sized buffer with a monotonically increasing
diff --git a/src/util/ralloc.h b/src/util/ralloc.h
index 3e2d342..6c31a6d 100644
--- a/src/util/ralloc.h
+++ b/src/util/ralloc.h
@@ -401,20 +401,44 @@ bool ralloc_asprintf_append (char **str, const char *fmt, ...)
* \sa ralloc_strcat
*
* \p str will be updated to the new pointer unless allocation fails.
*
* \return True unless allocation failed.
*/
bool ralloc_vasprintf_append(char **str, const char *fmt, va_list args);
/// @}
/**
+ * Rewrite the tail of an existing string, starting at a given index.
+ *
+ * Overwrites the contents of *str starting at \p start with "text",
+ * including a new null-terminator. Allocates more memory as necessary.
+ *
+ * This can be used to append formatted text when the length of the existing
+ * string is already known, saving a strlen() call.
+ *
+ * \sa ralloc_asprintf_rewrite_tail
+ *
+ * \param str The string to be updated.
+ * \param start The index to start appending new data at.
+ * \param text The input string terminated by zero.
+ * \param text_length The length of the input string.
+ *
+ * \p str will be updated to the new pointer unless allocation fails.
+ * \p start will be increased by the length of the newly formatted text.
+ *
+ * \return True unless allocation failed.
+ */
+bool ralloc_sprint_rewrite_tail(char **str, size_t *start, const char *text,
+ unsigned text_length);
+
+/**
* Declare C++ new and delete operators which use ralloc.
*
* Placing this macro in the body of a class makes it possible to do:
*
* TYPE *var = new(mem_ctx) TYPE(...);
* delete var;
*
* which is more idiomatic in C++ than calling ralloc.
*/
#define DECLARE_ALLOC_CXX_OPERATORS_TEMPLATE(TYPE, ALLOC_FUNC) \
--
2.7.4
More information about the mesa-dev
mailing list