From 6d263ff5a3ec3352bd5e0b1750d38b173d50a1dc Mon Sep 17 00:00:00 2001 From: Yonggang Luo Date: Wed, 30 Mar 2022 06:54:45 +0800 Subject: [PATCH] util: Convert util/u_printf.cpp to util/u_printf.c By doing this to remove the need of C++ runtime when not using llvmpipe Signed-off-by: Yonggang Luo Reviewed-by: Mihai Preda Reviewed-by: Jason Ekstrand Part-of: --- src/gallium/frontends/clover/core/printf.cpp | 4 +- src/util/meson.build | 2 +- src/util/{u_printf.cpp => u_printf.c} | 44 ++++++++++---------- src/util/u_printf.h | 6 --- 4 files changed, 25 insertions(+), 31 deletions(-) rename src/util/{u_printf.cpp => u_printf.c} (78%) diff --git a/src/gallium/frontends/clover/core/printf.cpp b/src/gallium/frontends/clover/core/printf.cpp index bf131c6416c..c6231f19d83 100644 --- a/src/gallium/frontends/clover/core/printf.cpp +++ b/src/gallium/frontends/clover/core/printf.cpp @@ -63,9 +63,9 @@ namespace { size_t fmt_last_pos = 0; size_t fmt_pos = 0; for (int arg_size : fmt.arg_sizes) { - const size_t spec_pos = util_printf_next_spec_pos(format, fmt_pos); + const size_t spec_pos = util_printf_next_spec_pos(format.c_str(), fmt_pos); const size_t cur_tok = format.rfind('%', spec_pos); - const size_t next_spec = util_printf_next_spec_pos(format, spec_pos); + const size_t next_spec = util_printf_next_spec_pos(format.c_str(), spec_pos); const size_t next_tok = next_spec == std::string::npos ? std::string::npos : format.rfind('%', next_spec); diff --git a/src/util/meson.build b/src/util/meson.build index b3c7188bab6..2a1028f0d3a 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -144,7 +144,7 @@ files_mesa_util = files( 'u_debug_memory.c', 'u_cpu_detect.c', 'u_cpu_detect.h', - 'u_printf.cpp', + 'u_printf.c', 'u_printf.h', 'vl_vlc.h', 'vl_rbsp.h', diff --git a/src/util/u_printf.cpp b/src/util/u_printf.c similarity index 78% rename from src/util/u_printf.cpp rename to src/util/u_printf.c index c23265fec96..ff579988adf 100644 --- a/src/util/u_printf.cpp +++ b/src/util/u_printf.c @@ -23,8 +23,10 @@ #include #include +#include + +#include "macros.h" #include "u_printf.h" -#include "util/macros.h" /* Some versions of MinGW are missing _vscprintf's declaration, although they * still provide the symbol in the import library. */ @@ -40,37 +42,35 @@ _CRTIMP int _vscprintf(const char *format, va_list argptr); #endif #endif -size_t util_printf_next_spec_pos(const std::string &s, size_t pos) +size_t util_printf_next_spec_pos(const char *str, size_t pos) { - size_t next_tok, spec_pos; - do { - pos = s.find_first_of('%', pos); + if (str == NULL) + return -1; - if (pos == std::string::npos) + const char *str_found = str + pos; + do { + str_found = strchr(str_found, '%'); + if (str_found == NULL) return -1; - if (s[pos + 1] == '%') { - pos += 2; + ++str_found; + if (*str_found == '%') { + ++str_found; continue; } - next_tok = s.find_first_of('%', pos + 1); - spec_pos = s.find_first_of("cdieEfFgGaAosuxXp", pos + 1); - if (spec_pos != std::string::npos) - if (spec_pos < next_tok) - return spec_pos; - - pos++; + char *spec_pos = strpbrk(str_found, "cdieEfFgGaAosuxXp%"); + if (spec_pos == NULL) { + return -1; + } else if (*spec_pos == '%') { + str_found = spec_pos; + } else { + return spec_pos - str; + } } while (1); } -size_t util_printf_next_spec_pos(const char *str, size_t pos) -{ - return util_printf_next_spec_pos(std::string(str), pos); -} - -size_t -u_printf_length(const char *fmt, va_list untouched_args) +size_t u_printf_length(const char *fmt, va_list untouched_args) { int size; char junk; diff --git a/src/util/u_printf.h b/src/util/u_printf.h index d378b13f78f..63c212e63f3 100644 --- a/src/util/u_printf.h +++ b/src/util/u_printf.h @@ -26,12 +26,6 @@ #include #ifdef __cplusplus - -#include - -/* find next valid printf specifier in a C++ std::string */ -size_t util_printf_next_spec_pos(const std::string &s, size_t pos); - extern "C" { #endif