aboutsummaryrefslogtreecommitdiff
path: root/absl/strings/internal/str_format/constexpr_parser.h
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2023-12-05 14:15:15 -0800
committerCopybara-Service <copybara-worker@google.com>2023-12-05 14:15:57 -0800
commit5dc2cc1a6a992e09d9cf930cdce7984640e2b7e0 (patch)
treea02601dddbd8a5ccbe63fdc5fee787d37cf103ed /absl/strings/internal/str_format/constexpr_parser.h
parent3e6ecec7d3c9c504c9951b34230b22527758e0cd (diff)
downloadabseil-5dc2cc1a6a992e09d9cf930cdce7984640e2b7e0.tar.gz
abseil-5dc2cc1a6a992e09d9cf930cdce7984640e2b7e0.tar.bz2
abseil-5dc2cc1a6a992e09d9cf930cdce7984640e2b7e0.zip
Adds support for wchar_t/wchar_t*/std::wstring{_view} arguments to StrFormat().
This converts to UTF-8 regardless of locale. PiperOrigin-RevId: 588186076 Change-Id: I2c9598279b413d460e13ad65da2ba421c0b40b83
Diffstat (limited to 'absl/strings/internal/str_format/constexpr_parser.h')
-rw-r--r--absl/strings/internal/str_format/constexpr_parser.h11
1 files changed, 8 insertions, 3 deletions
diff --git a/absl/strings/internal/str_format/constexpr_parser.h b/absl/strings/internal/str_format/constexpr_parser.h
index b70a16e4..8f593870 100644
--- a/absl/strings/internal/str_format/constexpr_parser.h
+++ b/absl/strings/internal/str_format/constexpr_parser.h
@@ -17,17 +17,18 @@
#include <cassert>
#include <cstdint>
+#include <cstdio>
#include <limits>
+#include "absl/base/config.h"
#include "absl/base/const_init.h"
+#include "absl/base/optimization.h"
#include "absl/strings/internal/str_format/extension.h"
namespace absl {
ABSL_NAMESPACE_BEGIN
namespace str_format_internal {
-enum class LengthMod : std::uint8_t { h, hh, l, ll, L, j, z, t, q, none };
-
// The analyzed properties of a single specified conversion.
struct UnboundConversion {
// This is a user defined default constructor on purpose to skip the
@@ -306,7 +307,6 @@ constexpr const char* ConsumeConversion(const char* pos, const char* const end,
if (ABSL_PREDICT_FALSE(!tag.is_length())) return nullptr;
// It is a length modifier.
- using str_format_internal::LengthMod;
LengthMod length_mod = tag.as_length();
ABSL_FORMAT_PARSER_INTERNAL_GET_CHAR();
if (c == 'h' && length_mod == LengthMod::h) {
@@ -322,6 +322,11 @@ constexpr const char* ConsumeConversion(const char* pos, const char* const end,
if (ABSL_PREDICT_FALSE(c == 'v')) return nullptr;
if (ABSL_PREDICT_FALSE(!tag.is_conv())) return nullptr;
+
+ // `wchar_t` args are marked non-basic so `Bind()` will copy the length mod.
+ if (conv->length_mod == LengthMod::l && c == 'c') {
+ conv->flags = conv->flags | Flags::kNonBasic;
+ }
}
#undef ABSL_FORMAT_PARSER_INTERNAL_GET_CHAR