Skip to content

Commit

Permalink
Add sprintf overload for wide strings
Browse files Browse the repository at this point in the history
and fix an issue in formatting user-defined objects.
Thanks to @ScottLangham
  • Loading branch information
vitaut committed Sep 18, 2015
1 parent 79d8f59 commit ef710de
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 5 deletions.
3 changes: 2 additions & 1 deletion format.cc
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,8 @@ class PrintfArgFormatter :

void visit_custom(Arg::CustomValue c) {
BasicFormatter<Char> formatter(ArgList(), this->writer());
const char *format = "}";
const Char format_str[] = {'}', 0};
const Char *format = format_str;
c.format(&formatter, c.value, &format);
}
};
Expand Down
7 changes: 7 additions & 0 deletions format.h
Original file line number Diff line number Diff line change
Expand Up @@ -2706,6 +2706,12 @@ inline std::string sprintf(CStringRef format, ArgList args) {
return w.str();
}

inline std::wstring sprintf(WCStringRef format, ArgList args) {
WMemoryWriter w;
printf(w, format, args);
return w.str();
}

/**
\rst
Prints formatted data to the file *f*.
Expand Down Expand Up @@ -2994,6 +3000,7 @@ FMT_VARIADIC(void, print, std::FILE *, CStringRef)
FMT_VARIADIC(void, print, std::ostream &, CStringRef)
FMT_VARIADIC(void, print_colored, Color, CStringRef)
FMT_VARIADIC(std::string, sprintf, CStringRef)
FMT_VARIADIC_W(std::wstring, sprintf, WCStringRef)
FMT_VARIADIC(int, printf, CStringRef)
FMT_VARIADIC(int, fprintf, std::FILE *, CStringRef)
}
Expand Down
4 changes: 4 additions & 0 deletions test/printf-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -456,3 +456,7 @@ TEST(PrintfTest, PrintfError) {
EXPECT_LT(result, 0);
}
#endif

TEST(PrintfTest, WideString) {
EXPECT_EQ(L"abc", fmt::sprintf(L"%s", TestWString(L"abc")));
}
18 changes: 14 additions & 4 deletions test/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,25 @@ inline FILE *safe_fopen(const char *filename, const char *mode) {
#endif
}

class TestString {
template <typename Char>
class BasicTestString {
private:
std::string value_;
std::basic_string<Char> value_;

static const Char EMPTY[];

public:
explicit TestString(const char *value = "") : value_(value) {}
explicit BasicTestString(const Char *value = EMPTY) : value_(value) {}

friend std::ostream &operator<<(std::ostream &os, const TestString &s) {
friend std::basic_ostream<Char> &operator<<(
std::basic_ostream<Char> &os, const BasicTestString &s) {
os << s.value_;
return os;
}
};

template <typename Char>
const Char BasicTestString<Char>::EMPTY[] = {0};

typedef BasicTestString<char> TestString;
typedef BasicTestString<wchar_t> TestWString;

0 comments on commit ef710de

Please sign in to comment.