From e5dd88b0e9bc77be349ce58d2068318608a2d181 Mon Sep 17 00:00:00 2001 From: Jin S Date: Sun, 26 Nov 2023 21:17:25 -0500 Subject: [PATCH] add generic and native path format spec --- include/fmt/std.h | 5 +++++ test/std-test.cc | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/fmt/std.h b/include/fmt/std.h index 82380546..c9805acb 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -141,7 +141,12 @@ template struct formatter { auto format(const std::filesystem::path& p, FormatContext& ctx) const { auto specs = specs_; auto path_type = path_type_; + # ifdef _WIN32 + auto path_string = (path_type == 'n') ? p.native() : p.generic_wstring(); + # else auto path_string = (path_type == 'n') ? p.native() : p.generic_string(); + # endif + detail::handle_dynamic_spec(specs.width, width_ref_, ctx); if (!debug_) { diff --git a/test/std-test.cc b/test/std-test.cc index dc1073b5..7a81aaf9 100644 --- a/test/std-test.cc +++ b/test/std-test.cc @@ -25,15 +25,20 @@ TEST(std_test, path) { EXPECT_EQ(fmt::format("{}", path("foo\"bar")), "foo\"bar"); EXPECT_EQ(fmt::format("{:?}", path("foo\"bar")), "\"foo\\\"bar\""); + + EXPECT_EQ(fmt::format("{:n}", path("/usr/bin")), "/usr/bin"); + EXPECT_EQ(fmt::format("{:g}", path("/usr/bin")), "/usr/bin"); +# ifdef _WIN32 + EXPECT_EQ(fmt::format("{:n}", path("C:\\foo")), "C:\\foo"); + EXPECT_EQ(fmt::format("{:g}", path("C:\\foo")), "C:/foo"); -# ifdef _WIN32 EXPECT_EQ(fmt::format("{}", path( L"\x0428\x0447\x0443\x0447\x044B\x043D\x0448" L"\x0447\x044B\x043D\x0430")), "Шчучыншчына"); EXPECT_EQ(fmt::format("{}", path(L"\xd800")), "�"); EXPECT_EQ(fmt::format("{:?}", path(L"\xd800")), "\"\\ud800\""); -# endif +# endif } // Test ambiguity problem described in #2954.