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 | 17 +++++++++++++++++ src/util/ralloc.h | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+)
diff --git a/src/util/ralloc.c b/src/util/ralloc.c index 821ee72fe8..b2b0315e65 100644 --- a/src/util/ralloc.c +++ b/src/util/ralloc.c @@ -396,20 +396,37 @@ 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, size_t existing_length, const char *str, + size_t n) +{ + char *both; + assert(dest != NULL && *dest != NULL); + + both = resize(*dest, existing_length + n + 1); + if (unlikely(both == NULL)) + return false; + + memcpy(both + existing_length, str, n); + both[existing_length + n] = '\0'; + + *dest = both; +} + 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..f2d3d3671e 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, size_t existing_length, const char *str, + size_t n); + +/** * 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.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev