void JSONFormatter::print_quoted_string(std::string_view s)
{
- m_ss << '\"' << json_stream_escaper(s.data()) << '\"';
+ m_ss << '\"' << json_stream_escaper(s) << '\"';
}
void JSONFormatter::print_name(const char *name)
[this](char c) { return this->to_lower_underscore(c); });
print_spaces();
- m_ss << "<" << e << ">" << xml_stream_escaper(s.data()) << "</" << e << ">";
+ m_ss << "<" << e << ">" << xml_stream_escaper(s) << "</" << e << ">";
if (m_pretty)
m_ss << "\n";
}
std::string attrs_str;
get_attrs_str(&attrs, attrs_str);
print_spaces();
- m_ss << "<" << e << attrs_str << ">" << xml_stream_escaper(s.data()) << "</" << e << ">";
+ m_ss << "<" << e << attrs_str << ">" << xml_stream_escaper(s) << "</" << e << ">";
if (m_pretty)
m_ss << "\n";
}
void XMLFormatter::dump_format_va(const char* name, const char *ns, bool quoted, const char *fmt, va_list ap)
{
char buf[LARGE_SIZE];
- vsnprintf(buf, LARGE_SIZE, fmt, ap);
+ size_t len = vsnprintf(buf, LARGE_SIZE, fmt, ap);
std::string e(name);
std::transform(e.begin(), e.end(), e.begin(),
[this](char c) { return this->to_lower_underscore(c); });
if (ns) {
m_ss << "<" << e << " xmlns=\"" << ns << "\">" << buf << "</" << e << ">";
} else {
- m_ss << "<" << e << ">" << xml_stream_escaper(buf) << "</" << e << ">";
+ m_ss << "<" << e << ">" << xml_stream_escaper(std::string_view(buf, len)) << "</" << e << ">";
}
if (m_pretty)
void HTMLFormatter::dump_string(const char *name, std::string_view s)
{
- dump_template(name, xml_stream_escaper(s.data()));
+ dump_template(name, xml_stream_escaper(s));
}
void HTMLFormatter::dump_string_with_attrs(const char *name, std::string_view s, const FormatterAttrs& attrs)
std::string attrs_str;
get_attrs_str(&attrs, attrs_str);
print_spaces();
- m_ss << "<li>" << e << ": " << xml_stream_escaper(s.data()) << attrs_str << "</li>";
+ m_ss << "<li>" << e << ": " << xml_stream_escaper(s) << attrs_str << "</li>";
if (m_pretty)
m_ss << "\n";
}
void HTMLFormatter::dump_format_va(const char* name, const char *ns, bool quoted, const char *fmt, va_list ap)
{
char buf[LARGE_SIZE];
- vsnprintf(buf, LARGE_SIZE, fmt, ap);
+ size_t len = vsnprintf(buf, LARGE_SIZE, fmt, ap);
std::string e(name);
print_spaces();
if (ns) {
- m_ss << "<li xmlns=\"" << ns << "\">" << e << ": " << xml_stream_escaper(buf) << "</li>";
+ m_ss << "<li xmlns=\"" << ns << "\">" << e << ": "
+ << xml_stream_escaper(std::string_view(buf, len)) << "</li>";
} else {
- m_ss << "<li>" << e << ": " << xml_stream_escaper(buf) << "</li>";
+ m_ss << "<li>" << e << ": "
+ << xml_stream_escaper(std::string_view(buf, len)) << "</li>";
}
if (m_pretty)
struct xml_stream_escaper {
boost::string_view str;
- xml_stream_escaper(boost::string_view str) : str(str) {}
+ xml_stream_escaper(std::string_view str) : str(str.data(), str.size()) {}
};
std::ostream& operator<<(std::ostream& out, const xml_stream_escaper& e);
struct json_stream_escaper {
boost::string_view str;
- json_stream_escaper(boost::string_view str) : str(str) {}
+ json_stream_escaper(std::string_view str) : str(str.data(), str.size()) {}
};
std::ostream& operator<<(std::ostream& out, const json_stream_escaper& e);
ASSERT_EQ(escape_xml_stream("<\xe6\xb1\x89\xe5\xad\x97>\n"), "<\xe6\xb1\x89\xe5\xad\x97>\n");
}
-static std::string escape_json_attrs(const char *str)
+static std::string escape_json_attrs(const char *str, size_t src_len = 0)
{
- int src_len = strlen(str);
+ if (!src_len)
+ src_len = strlen(str);
int len = escape_json_attr_len(str, src_len);
char out[len];
escape_json_attr(str, src_len, out);
return out;
}
-static std::string escape_json_stream(const char *str)
+static std::string escape_json_stream(const char *str, size_t src_len = 0)
{
+ if (!src_len)
+ src_len = strlen(str);
std::stringstream ss;
- ss << json_stream_escaper(str);
+ ss << json_stream_escaper(std::string_view(str, src_len));
return ss.str();
}
TEST(EscapeJson, ControlChars) {
ASSERT_EQ(escape_json_attrs("\x01\x02\x03"), "\\u0001\\u0002\\u0003");
ASSERT_EQ(escape_json_stream("\x01\x02\x03"), "\\u0001\\u0002\\u0003");
+ ASSERT_EQ(escape_json_stream("\x00\x02\x03", 3), "\\u0000\\u0002\\u0003");
+
+ // json can't print binary data!
+ ASSERT_EQ(escape_json_stream("\x00\x7f\xff", 3), "\\u0000\\u007f\xff");
ASSERT_EQ(escape_json_attrs("abc\x7f"), "abc\\u007f");
ASSERT_EQ(escape_json_stream("abc\x7f"), "abc\\u007f");