Module: Mesa
Branch: main
Commit: 751e919c33542c324f90915f4f7545290c5c78ed
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=751e919c33542c324f90915f4f7545290c5c78ed

Author: Lionel Landwerlin <[email protected]>
Date:   Thu Oct 19 15:49:22 2023 +0300

util/u_printf: add a u_printf_ptr() variant

Taking an array of pointer to u_printf_info.

Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: Karol Herbst <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26505>

---

 src/util/u_printf.c | 22 +++++++++++++++++++---
 src/util/u_printf.h |  3 +++
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/src/util/u_printf.c b/src/util/u_printf.c
index c9c8053f2c9..10ea682d6ad 100644
--- a/src/util/u_printf.c
+++ b/src/util/u_printf.c
@@ -99,8 +99,11 @@ size_t u_printf_length(const char *fmt, va_list 
untouched_args)
    return size;
 }
 
-void u_printf(FILE *out, const char *buffer, size_t buffer_size,
-              const u_printf_info *info, unsigned info_size)
+static void
+u_printf_impl(FILE *out, const char *buffer, size_t buffer_size,
+              const u_printf_info *info,
+              const u_printf_info **info_ptr,
+              unsigned info_size)
 {
    for (size_t buf_pos = 0; buf_pos < buffer_size;) {
       uint32_t fmt_idx = *(uint32_t*)&buffer[buf_pos];
@@ -113,7 +116,8 @@ void u_printf(FILE *out, const char *buffer, size_t 
buffer_size,
       if (fmt_idx >= info_size)
          return;
 
-      const u_printf_info *fmt = &info[fmt_idx];
+      const u_printf_info *fmt = info != NULL ?
+         &info[fmt_idx] : info_ptr[fmt_idx];
       const char *format = fmt->strings;
       buf_pos += sizeof(fmt_idx);
 
@@ -232,3 +236,15 @@ void u_printf(FILE *out, const char *buffer, size_t 
buffer_size,
       fprintf(out, "%s", format);
    }
 }
+
+void u_printf(FILE *out, const char *buffer, size_t buffer_size,
+              const u_printf_info *info, unsigned info_size)
+{
+   u_printf_impl(out, buffer, buffer_size, info, NULL, info_size);
+}
+
+void u_printf_ptr(FILE *out, const char *buffer, size_t buffer_size,
+                  const u_printf_info **info, unsigned info_size)
+{
+   u_printf_impl(out, buffer, buffer_size, NULL, info, info_size);
+}
diff --git a/src/util/u_printf.h b/src/util/u_printf.h
index d0f6b4dabf8..b1b5a0d2299 100644
--- a/src/util/u_printf.h
+++ b/src/util/u_printf.h
@@ -49,6 +49,9 @@ size_t u_printf_length(const char *fmt, va_list 
untouched_args);
 void u_printf(FILE *out, const char *buffer, size_t buffer_size,
               const u_printf_info*, unsigned info_size);
 
+void u_printf_ptr(FILE *out, const char *buffer, size_t buffer_size,
+                  const u_printf_info **info, unsigned info_size);
+
 #ifdef __cplusplus
 }
 #endif

Reply via email to