35 #include <google/protobuf/text_format.h>
47 #include <google/protobuf/stubs/stringprintf.h>
48 #include <google/protobuf/any.h>
49 #include <google/protobuf/descriptor.pb.h>
50 #include <google/protobuf/io/coded_stream.h>
51 #include <google/protobuf/io/tokenizer.h>
52 #include <google/protobuf/io/zero_copy_stream.h>
53 #include <google/protobuf/io/zero_copy_stream_impl.h>
54 #include <google/protobuf/descriptor.h>
55 #include <google/protobuf/dynamic_message.h>
56 #include <google/protobuf/map_field.h>
57 #include <google/protobuf/message.h>
58 #include <google/protobuf/repeated_field.h>
59 #include <google/protobuf/unknown_field_set.h>
60 #include <google/protobuf/wire_format_lite.h>
61 #include <google/protobuf/stubs/strutil.h>
62 #include <google/protobuf/io/strtod.h>
63 #include <google/protobuf/stubs/map_util.h>
64 #include <google/protobuf/stubs/stl_util.h>
67 #include <google/protobuf/port_def.inc>
69 #define DEBUG_STRING_SILENT_MARKER "\t "
77 return (
str.length() >= 2 &&
str[0] ==
'0' &&
78 (
str[1] ==
'x' ||
str[1] ==
'X'));
82 return (
str.length() >= 2 &&
str[0] ==
'0' &&
83 (
str[1] >=
'0' &&
str[1] <
'8'));
99 std::memory_order_relaxed));
110 printer.SetSingleLineMode(
true);
111 printer.SetExpandAny(
true);
113 std::memory_order_relaxed));
115 printer.PrintToString(*
this, &debug_string);
117 if (!debug_string.empty() && debug_string[debug_string.size() - 1] ==
' ') {
118 debug_string.resize(debug_string.size() - 1);
128 printer.SetUseUtf8StringEscaping(
true);
129 printer.SetExpandAny(
true);
131 std::memory_order_relaxed));
133 printer.PrintToString(*
this, &debug_string);
151 auto& vec = nested_[
field];
153 return vec.back().get();
157 if (
field ==
nullptr) {
162 GOOGLE_LOG(DFATAL) <<
"Index must be in range of repeated field values. "
163 <<
"Field: " <<
field->name();
164 }
else if (!
field->is_repeated() &&
index != -1) {
165 GOOGLE_LOG(DFATAL) <<
"Index must be -1 for singular fields."
166 <<
"Field: " <<
field->name();
177 const std::vector<TextFormat::ParseLocationRange>* locations =
179 if (locations ==
nullptr ||
184 return (*locations)[
index];
195 if (
it == nested_.end() ||
index >=
static_cast<int64_t>(
it->second.size())) {
199 return it->second[
index].get();
224 return message.GetDescriptor()->file()->pool()->FindMessageTypeByName(
name);
238 #define DO(STATEMENT) \
244 class TextFormat::Parser::ParserImpl {
251 ALLOW_SINGULAR_OVERWRITES = 0,
252 FORBID_SINGULAR_OVERWRITES = 1,
260 bool allow_case_insensitive_field,
bool allow_unknown_field,
261 bool allow_unknown_extension,
bool allow_unknown_enum,
262 bool allow_field_number,
bool allow_relaxed_whitespace,
263 bool allow_partial,
int recursion_limit)
266 parse_info_tree_(parse_info_tree),
267 tokenizer_error_collector_(this),
268 tokenizer_(input_stream, &tokenizer_error_collector_),
269 root_message_type_(root_message_type),
270 singular_overwrite_policy_(singular_overwrite_policy),
271 allow_case_insensitive_field_(allow_case_insensitive_field),
272 allow_unknown_field_(allow_unknown_field),
273 allow_unknown_extension_(allow_unknown_extension),
274 allow_unknown_enum_(allow_unknown_enum),
275 allow_field_number_(allow_field_number),
276 allow_partial_(allow_partial),
277 initial_recursion_limit_(recursion_limit),
278 recursion_limit_(recursion_limit),
282 tokenizer_.set_allow_f_after_float(
true);
287 if (allow_relaxed_whitespace) {
288 tokenizer_.set_require_space_after_number(
false);
289 tokenizer_.set_allow_multiline_strings(
true);
308 GOOGLE_DCHECK(had_errors_ || recursion_limit_ == initial_recursion_limit_)
309 <<
"Recursion limit at end of parse should be "
310 << initial_recursion_limit_ <<
", but was " << recursion_limit_
311 <<
". Difference of " << initial_recursion_limit_ - recursion_limit_
312 <<
" stack frames not accounted for stack unwind.";
336 << root_message_type_->full_name() <<
": " << (
line + 1)
337 <<
":" << (col + 1) <<
": " <<
message;
340 << root_message_type_->full_name() <<
": " <<
message;
351 << root_message_type_->full_name() <<
": " << (
line + 1)
352 <<
":" << (col + 1) <<
": " <<
message;
355 << root_message_type_->full_name() <<
": " <<
message;
374 ReportError(tokenizer_.current().line, tokenizer_.current().column,
381 ReportWarning(tokenizer_.current().line, tokenizer_.current().column,
389 while (!LookingAt(
">") && !LookingAt(
"}")) {
400 if (TryConsume(
"<")) {
417 bool reserved_field =
false;
419 int start_line = tokenizer_.current().line;
420 int start_column = tokenizer_.current().column;
428 DO(ConsumeAnyTypeUrl(&full_type_name, &
prefix));
431 DO(ConsumeBeforeWhitespace(
"]"));
432 TryConsumeWhitespace(prefix_and_full_type_name,
"Any");
434 TryConsumeBeforeWhitespace(
":");
435 TryConsumeWhitespace(prefix_and_full_type_name,
"Any");
438 finder_ ? finder_->FindAnyType(*
message,
prefix, full_type_name)
439 : DefaultFinderFindAnyType(*
message,
prefix, full_type_name);
440 if (value_descriptor ==
nullptr) {
441 ReportError(
"Could not find type \"" + prefix_and_full_type_name +
442 "\" stored in google.protobuf.Any.");
445 DO(ConsumeAnyValue(value_descriptor, &serialized_value));
446 if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
452 ReportError(
"Non-repeated Any specified multiple times.");
457 prefix_and_full_type_name);
461 if (TryConsume(
"[")) {
463 DO(ConsumeFullTypeName(&field_name));
464 DO(ConsumeBeforeWhitespace(
"]"));
465 TryConsumeWhitespace(
message->GetTypeName(),
"Extension");
467 field = finder_ ? finder_->FindExtension(
message, field_name)
468 : DefaultFinderFindExtension(
message, field_name);
470 if (
field ==
nullptr) {
471 if (!allow_unknown_field_ && !allow_unknown_extension_) {
473 "\" is not defined or "
474 "is not an extension of \"" +
478 ReportWarning(
"Ignoring extension \"" + field_name +
479 "\" which is not defined or is not an extension of \"" +
484 DO(ConsumeIdentifierBeforeWhitespace(&field_name));
485 TryConsumeWhitespace(
message->GetTypeName(),
"Normal");
488 if (allow_field_number_ &&
safe_strto32(field_name, &field_number)) {
489 if (
descriptor->IsExtensionNumber(field_number)) {
491 ? finder_->FindExtensionByNumber(
descriptor, field_number)
492 : DefaultFinderFindExtensionByNumber(
descriptor,
494 }
else if (
descriptor->IsReservedNumber(field_number)) {
495 reserved_field =
true;
504 if (
field ==
nullptr) {
509 if (
field !=
nullptr &&
516 field->message_type()->name() != field_name) {
520 if (
field ==
nullptr && allow_case_insensitive_field_) {
526 if (
field ==
nullptr) {
527 reserved_field =
descriptor->IsReservedName(field_name);
531 if (
field ==
nullptr && !reserved_field) {
532 if (!allow_unknown_field_) {
534 "\" has no field named \"" + field_name +
"\".");
537 ReportWarning(
"Message type \"" +
descriptor->full_name() +
538 "\" has no field named \"" + field_name +
"\".");
544 if (
field ==
nullptr) {
545 GOOGLE_CHECK(allow_unknown_field_ || allow_unknown_extension_ || reserved_field);
553 if (TryConsumeBeforeWhitespace(
":")) {
554 TryConsumeWhitespace(
message->GetTypeName(),
"Unknown/Reserved");
555 if (!LookingAt(
"{") && !LookingAt(
"<")) {
556 return SkipFieldValue();
559 return SkipFieldMessage();
562 if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
566 "\" is specified multiple times.");
576 "\" is specified along with "
578 other_field->
name() +
579 "\", another member "
581 oneof->
name() +
"\".");
589 bool consumed_semicolon = TryConsumeBeforeWhitespace(
":");
590 TryConsumeWhitespace(
message->GetTypeName(),
"Normal");
591 if (consumed_semicolon &&
field->options().weak() &&
595 DO(ConsumeString(&
tmp));
597 finder_ ? finder_->FindExtensionFactory(
field) :
nullptr;
600 goto label_skip_parsing;
604 DO(ConsumeBeforeWhitespace(
":"));
605 TryConsumeWhitespace(
message->GetTypeName(),
"Normal");
608 if (
field->is_repeated() && TryConsume(
"[")) {
610 if (!TryConsume(
"]")) {
619 if (TryConsume(
"]")) {
633 TryConsume(
";") || TryConsume(
",");
635 if (
field->options().deprecated()) {
636 ReportWarning(
"text format contains deprecated field \"" + field_name +
642 if (parse_info_tree_ !=
nullptr) {
643 int end_line = tokenizer_.previous().line;
644 int end_column = tokenizer_.previous().end_column;
656 if (TryConsume(
"[")) {
658 DO(ConsumeTypeUrlOrFullTypeName());
659 DO(ConsumeBeforeWhitespace(
"]"));
662 DO(ConsumeIdentifierBeforeWhitespace(&field_name));
664 TryConsumeWhitespace(
"Unknown/Reserved",
"n/a");
672 if (TryConsumeBeforeWhitespace(
":")) {
673 TryConsumeWhitespace(
"Unknown/Reserved",
"n/a");
674 if (!LookingAt(
"{") && !LookingAt(
"<")) {
675 DO(SkipFieldValue());
677 DO(SkipFieldMessage());
680 DO(SkipFieldMessage());
684 TryConsume(
";") || TryConsume(
",");
690 if (--recursion_limit_ < 0) {
692 StrCat(
"Message is too deep, the parser exceeded the "
693 "configured recursion limit of ",
694 initial_recursion_limit_,
"."));
700 if (parent !=
nullptr) {
705 DO(ConsumeMessageDelimiter(&delimiter));
707 finder_ ? finder_->FindExtensionFactory(
field) :
nullptr;
708 if (
field->is_repeated()) {
719 parse_info_tree_ = parent;
726 if (--recursion_limit_ < 0) {
728 StrCat(
"Message is too deep, the parser exceeded the "
729 "configured recursion limit of ",
730 initial_recursion_limit_,
"."));
735 DO(ConsumeMessageDelimiter(&delimiter));
736 while (!LookingAt(
">") && !LookingAt(
"}")) {
750 #define SET_FIELD(CPPTYPE, VALUE) \
751 if (field->is_repeated()) { \
752 reflection->Add##CPPTYPE(message, field, VALUE); \
754 reflection->Set##CPPTYPE(message, field, VALUE); \
757 switch (
field->cpp_type()) {
810 DO(ConsumeUnsignedInteger(&
value, 1));
821 "\". Value: \"" +
value +
"\".");
839 }
else if (LookingAt(
"-") ||
843 enum_value =
enum_type->FindValueByNumber(int_value);
845 ReportError(
"Expected integer or identifier, got: " +
846 tokenizer_.current().text);
850 if (enum_value ==
nullptr) {
855 }
else if (!allow_unknown_enum_) {
859 field->name() +
"\".");
862 ReportWarning(
"Unknown enumeration value of \"" +
value +
865 field->name() +
"\".");
886 if (--recursion_limit_ < 0) {
888 StrCat(
"Message is too deep, the parser exceeded the "
889 "configured recursion limit of ",
890 initial_recursion_limit_,
"."));
901 if (TryConsume(
"[")) {
903 if (!LookingAt(
"{") && !LookingAt(
"<")) {
904 DO(SkipFieldValue());
906 DO(SkipFieldMessage());
908 if (TryConsume(
"]")) {
937 bool has_minus = TryConsume(
"-");
956 text !=
"infinity" &&
text !=
"nan") {
969 return tokenizer_.current().text ==
text;
974 return tokenizer_.current().type == token_type;
981 *identifier = tokenizer_.current().text;
988 if ((allow_field_number_ || allow_unknown_field_ ||
989 allow_unknown_extension_) &&
991 *identifier = tokenizer_.current().text;
996 ReportError(
"Expected identifier, got: " + tokenizer_.current().text);
1003 tokenizer_.set_report_whitespace(
true);
1004 bool result = ConsumeIdentifier(identifier);
1005 tokenizer_.set_report_whitespace(
false);
1011 DO(ConsumeIdentifier(
name));
1012 while (TryConsume(
".")) {
1014 DO(ConsumeIdentifier(&part));
1023 DO(ConsumeIdentifier(&discarded));
1024 while (TryConsume(
".") || TryConsume(
"/")) {
1025 DO(ConsumeIdentifier(&discarded));
1034 ReportError(
"Expected string, got: " + tokenizer_.current().text);
1052 ReportError(
"Expected integer, got: " + tokenizer_.current().text);
1058 ReportError(
"Integer out of range (" + tokenizer_.current().text +
")");
1074 if (TryConsume(
"-")) {
1083 DO(ConsumeUnsignedInteger(&unsigned_value, max_value));
1102 ReportError(
"Expected integer, got: " + tokenizer_.current().text);
1107 if (IsHexNumber(
text) || IsOctNumber(
text)) {
1114 *
value =
static_cast<double>(uint64_value);
1132 if (TryConsume(
"-")) {
1150 if (
text ==
"inf" ||
1151 text ==
"infinity") {
1152 *
value = std::numeric_limits<double>::infinity();
1154 }
else if (
text ==
"nan") {
1155 *
value = std::numeric_limits<double>::quiet_NaN();
1162 ReportError(
"Expected double, got: " + tokenizer_.current().text);
1179 while (TryConsume(
".")) {
1181 DO(ConsumeIdentifier(&
url));
1186 DO(ConsumeFullTypeName(full_type_name));
1197 if (value_prototype ==
nullptr) {
1200 std::unique_ptr<Message>
value(value_prototype->
New());
1202 DO(ConsumeMessageDelimiter(&sub_delimiter));
1203 DO(ConsumeMessage(
value.get(), sub_delimiter));
1205 if (allow_partial_) {
1206 value->AppendPartialToString(serialized_value);
1208 if (!
value->IsInitialized()) {
1210 "Value of type \"" + value_descriptor->
full_name() +
1211 "\" stored in google.protobuf.Any has missing required fields");
1214 value->AppendToString(serialized_value);
1223 const std::string& current_value = tokenizer_.current().text;
1225 if (current_value !=
value) {
1240 tokenizer_.set_report_whitespace(
true);
1242 tokenizer_.set_report_whitespace(
false);
1249 if (tokenizer_.current().text ==
value) {
1261 tokenizer_.set_report_whitespace(
true);
1263 tokenizer_.set_report_whitespace(
false);
1302 ParserErrorCollector tokenizer_error_collector_;
1305 SingularOverwritePolicy singular_overwrite_policy_;
1306 const bool allow_case_insensitive_field_;
1307 const bool allow_unknown_field_;
1308 const bool allow_unknown_extension_;
1309 const bool allow_unknown_enum_;
1310 const bool allow_field_number_;
1311 const bool allow_partial_;
1313 int recursion_limit_;
1320 class TextFormat::Printer::TextGenerator
1324 int initial_indent_level)
1328 at_start_of_line_(
true),
1330 insert_silent_marker_(
false),
1331 indent_level_(initial_indent_level),
1332 initial_indent_level_(initial_indent_level) {}
1335 bool insert_silent_marker,
int initial_indent_level)
1339 at_start_of_line_(
true),
1341 insert_silent_marker_(insert_silent_marker),
1342 indent_level_(initial_indent_level),
1343 initial_indent_level_(initial_indent_level) {}
1348 if (!failed_ && buffer_size_ > 0) {
1349 output_->BackUp(buffer_size_);
1361 if (indent_level_ == 0 || indent_level_ < initial_indent_level_) {
1362 GOOGLE_LOG(DFATAL) <<
" Outdent() without matching Indent().";
1370 return 2 * indent_level_;
1375 if (indent_level_ > 0) {
1377 for (
size_t i = 0;
i <
size;
i++) {
1378 if (
text[
i] ==
'\n') {
1386 at_start_of_line_ =
true;
1394 at_start_of_line_ =
true;
1406 if (ConsumeInsertSilentMarker()) {
1414 if (ConsumeInsertSilentMarker()) {
1424 if (failed_)
return;
1425 if (
size == 0)
return;
1427 if (at_start_of_line_) {
1429 at_start_of_line_ =
false;
1431 if (failed_)
return;
1434 while (
static_cast<int64_t>(
size) > buffer_size_) {
1437 if (buffer_size_ > 0) {
1439 data += buffer_size_;
1440 size -= buffer_size_;
1442 void* void_buffer =
nullptr;
1443 failed_ = !
output_->Next(&void_buffer, &buffer_size_);
1444 if (failed_)
return;
1445 buffer_ =
reinterpret_cast<char*
>(void_buffer);
1451 buffer_size_ -=
size;
1455 if (indent_level_ == 0) {
1459 int size = GetCurrentIndentationSize();
1461 while (
size > buffer_size_) {
1464 if (buffer_size_ > 0) {
1467 size -= buffer_size_;
1469 failed_ = !
output_->Next(&void_buffer, &buffer_size_);
1470 if (failed_)
return;
1471 buffer_ =
reinterpret_cast<char*
>(void_buffer);
1477 buffer_size_ -=
size;
1484 if (insert_silent_marker_) {
1485 insert_silent_marker_ =
false;
1494 bool at_start_of_line_;
1501 int initial_indent_level_;
1511 int ,
bool single_line_mode,
1515 TextGenerator* text_generator =
static_cast<TextGenerator*
>(generator);
1516 if (single_line_mode) {
1517 text_generator->PrintMaybeWithMarker(
" ",
"{ ");
1519 text_generator->PrintMaybeWithMarker(
" ",
"{\n");
1571 parse_info_tree_(nullptr),
1572 allow_partial_(
false),
1573 allow_case_insensitive_field_(
false),
1574 allow_unknown_field_(
false),
1575 allow_unknown_extension_(
false),
1576 allow_unknown_enum_(
false),
1577 allow_field_number_(
false),
1578 allow_relaxed_whitespace_(
false),
1579 allow_singular_overwrites_(
false),
1580 recursion_limit_(
std::numeric_limits<
int>::
max()) {}
1586 bool CheckParseInputSize(StringPiece
input,
1587 io::ErrorCollector* error_collector) {
1588 if (
input.size() > INT_MAX) {
1589 error_collector->AddError(
1592 "Input size too large: ",
static_cast<int64_t>(
input.size()),
1593 " bytes",
" > ", INT_MAX,
" bytes."));
1605 ParserImpl::SingularOverwritePolicy overwrites_policy =
1606 allow_singular_overwrites_ ? ParserImpl::ALLOW_SINGULAR_OVERWRITES
1607 : ParserImpl::FORBID_SINGULAR_OVERWRITES;
1610 parse_info_tree_, overwrites_policy,
1611 allow_case_insensitive_field_, allow_unknown_field_,
1612 allow_unknown_extension_, allow_unknown_enum_,
1613 allow_field_number_, allow_relaxed_whitespace_,
1614 allow_partial_, recursion_limit_);
1621 io::ArrayInputStream input_stream(
input.data(),
input.size());
1628 parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1629 allow_case_insensitive_field_, allow_unknown_field_,
1630 allow_unknown_extension_, allow_unknown_enum_,
1631 allow_field_number_, allow_relaxed_whitespace_,
1632 allow_partial_, recursion_limit_);
1639 io::ArrayInputStream input_stream(
input.data(),
input.size());
1646 ParserImpl* parser_impl) {
1647 if (!parser_impl->Parse(
output))
return false;
1648 if (!allow_partial_ && !
output->IsInitialized()) {
1649 std::vector<std::string> missing_fields;
1650 output->FindInitializationErrors(&missing_fields);
1651 parser_impl->ReportError(-1, 0,
1652 "Message missing required fields: " +
1653 Join(missing_fields,
", "));
1662 io::ArrayInputStream input_stream(
input.data(),
input.size());
1665 parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1666 allow_case_insensitive_field_, allow_unknown_field_,
1667 allow_unknown_extension_, allow_unknown_enum_, allow_field_number_,
1668 allow_relaxed_whitespace_, allow_partial_, recursion_limit_);
1702 class StringBaseTextGenerator :
public TextFormat::BaseTextGenerator {
1712 #else // !LANG_CXX11
1714 #endif // LANG_CXX11
1729 #define FORWARD_IMPL(fn, ...) \
1730 StringBaseTextGenerator generator; \
1731 delegate_.fn(__VA_ARGS__, &generator); \
1732 return std::move(generator).Consume()
1733 #else // !LANG_CXX11
1734 #define FORWARD_IMPL(fn, ...) \
1735 StringBaseTextGenerator generator; \
1736 delegate_.fn(__VA_ARGS__, &generator); \
1737 return generator.Get()
1738 #endif // LANG_CXX11
1780 bool single_line_mode)
const {
1786 bool single_line_mode)
const {
1795 bool val, BaseTextGenerator* generator)
const {
1797 generator->PrintLiteral(
"true");
1799 generator->PrintLiteral(
"false");
1803 int32_t val, BaseTextGenerator* generator)
const {
1804 generator->PrintString(
StrCat(val));
1807 uint32_t val, BaseTextGenerator* generator)
const {
1808 generator->PrintString(
StrCat(val));
1811 int64_t val, BaseTextGenerator* generator)
const {
1812 generator->PrintString(
StrCat(val));
1815 uint64_t val, BaseTextGenerator* generator)
const {
1816 generator->PrintString(
StrCat(val));
1819 float val, BaseTextGenerator* generator)
const {
1823 double val, BaseTextGenerator* generator)
const {
1828 BaseTextGenerator* generator)
const {
1829 generator->PrintString(
name);
1833 const std::string& val, BaseTextGenerator* generator)
const {
1834 generator->PrintLiteral(
"\"");
1835 generator->PrintString(
CEscape(val));
1836 generator->PrintLiteral(
"\"");
1839 const std::string& val, BaseTextGenerator* generator)
const {
1845 BaseTextGenerator* generator)
const {
1849 const Message& ,
const Reflection* ,
1851 if (
field->is_extension()) {
1852 generator->PrintLiteral(
"[");
1853 generator->PrintString(
field->PrintableNameForExtension());
1854 generator->PrintLiteral(
"]");
1857 generator->PrintString(
field->message_type()->name());
1859 generator->PrintString(
field->name());
1864 bool single_line_mode, BaseTextGenerator* generator)
const {
1865 if (single_line_mode) {
1866 generator->PrintLiteral(
" { ");
1868 generator->PrintLiteral(
" {\n");
1879 if (single_line_mode) {
1889 class FieldValuePrinterWrapper :
public TextFormat::FastFieldValuePrinter {
1891 explicit FieldValuePrinterWrapper(
1892 const TextFormat::FieldValuePrinter* delegate)
1895 void SetDelegate(
const TextFormat::FieldValuePrinter* delegate) {
1899 void PrintBool(
bool val,
1900 TextFormat::BaseTextGenerator* generator)
const override {
1901 generator->PrintString(
delegate_->PrintBool(val));
1904 TextFormat::BaseTextGenerator* generator)
const override {
1905 generator->PrintString(
delegate_->PrintInt32(val));
1908 TextFormat::BaseTextGenerator* generator)
const override {
1909 generator->PrintString(
delegate_->PrintUInt32(val));
1912 TextFormat::BaseTextGenerator* generator)
const override {
1913 generator->PrintString(
delegate_->PrintInt64(val));
1916 TextFormat::BaseTextGenerator* generator)
const override {
1917 generator->PrintString(
delegate_->PrintUInt64(val));
1919 void PrintFloat(
float val,
1920 TextFormat::BaseTextGenerator* generator)
const override {
1921 generator->PrintString(
delegate_->PrintFloat(val));
1923 void PrintDouble(
double val,
1924 TextFormat::BaseTextGenerator* generator)
const override {
1925 generator->PrintString(
delegate_->PrintDouble(val));
1928 TextFormat::BaseTextGenerator* generator)
const override {
1929 generator->PrintString(
delegate_->PrintString(val));
1932 TextFormat::BaseTextGenerator* generator)
const override {
1933 generator->PrintString(
delegate_->PrintBytes(val));
1936 TextFormat::BaseTextGenerator* generator)
const override {
1940 int ,
const Reflection* reflection,
1942 TextFormat::BaseTextGenerator* generator)
const override {
1943 generator->PrintString(
1948 TextFormat::BaseTextGenerator* generator)
const override {
1949 generator->PrintString(
1952 void PrintMessageStart(
1954 bool single_line_mode,
1955 TextFormat::BaseTextGenerator* generator)
const override {
1956 generator->PrintString(
delegate_->PrintMessageStart(
1957 message, field_index, field_count, single_line_mode));
1959 void PrintMessageEnd(
1961 bool single_line_mode,
1962 TextFormat::BaseTextGenerator* generator)
const override {
1963 generator->PrintString(
delegate_->PrintMessageEnd(
1964 message, field_index, field_count, single_line_mode));
1968 std::unique_ptr<const TextFormat::FieldValuePrinter>
delegate_;
1974 "DO NOT PARSE: fields may be stripped and missing.\n";
1987 SetUseUtf8StringEscaping(
false);
1990 void TextFormat::Printer::SetUseUtf8StringEscaping(
bool as_utf8) {
1991 SetDefaultFieldValuePrinter(as_utf8 ?
new FastFieldValuePrinterUtf8Escaping()
1992 :
new DebugStringFieldValuePrinter());
1995 void TextFormat::Printer::SetDefaultFieldValuePrinter(
1996 const FieldValuePrinter* printer) {
1997 default_field_value_printer_.reset(
new FieldValuePrinterWrapper(printer));
2000 void TextFormat::Printer::SetDefaultFieldValuePrinter(
2001 const FastFieldValuePrinter* printer) {
2002 default_field_value_printer_.reset(printer);
2005 bool TextFormat::Printer::RegisterFieldValuePrinter(
2007 if (
field ==
nullptr || printer ==
nullptr) {
2010 std::unique_ptr<FieldValuePrinterWrapper>
wrapper(
2011 new FieldValuePrinterWrapper(
nullptr));
2012 auto pair = custom_printers_.insert(std::make_pair(
field,
nullptr));
2014 wrapper->SetDelegate(printer);
2022 bool TextFormat::Printer::RegisterFieldValuePrinter(
2024 if (
field ==
nullptr || printer ==
nullptr) {
2027 auto pair = custom_printers_.insert(std::make_pair(
field,
nullptr));
2029 pair.first->second.reset(printer);
2036 bool TextFormat::Printer::RegisterMessagePrinter(
2038 if (
descriptor ==
nullptr || printer ==
nullptr) {
2042 custom_message_printers_.insert(std::make_pair(
descriptor,
nullptr));
2044 pair.first->second.reset(printer);
2061 bool TextFormat::Printer::PrintUnknownFieldsToString(
2067 return PrintUnknownFields(unknown_fields, &output_stream);
2072 TextGenerator generator(
output, insert_silent_marker_, initial_indent_level_);
2077 return !generator.failed();
2084 bool TextFormat::Printer::PrintUnknownFields(
2087 TextGenerator generator(
output, initial_indent_level_);
2092 return !generator.failed();
2098 struct FieldIndexSorter {
2101 if (left->is_extension() && right->is_extension()) {
2102 return left->number() < right->number();
2103 }
else if (left->is_extension()) {
2105 }
else if (right->is_extension()) {
2108 return left->index() < right->index();
2116 TextGenerator* generator)
const {
2124 const Reflection* reflection =
message.GetReflection();
2136 finder_ ? finder_->FindAnyType(
message, url_prefix, full_type_name)
2137 : DefaultFinderFindAnyType(
message, url_prefix, full_type_name);
2138 if (value_descriptor ==
nullptr) {
2144 std::unique_ptr<Message> value_message(
2145 factory.GetPrototype(value_descriptor)->New());
2147 if (!value_message->ParseFromString(serialized_value)) {
2151 generator->PrintLiteral(
"[");
2153 generator->PrintLiteral(
"]");
2154 const FastFieldValuePrinter* printer = GetFieldPrinter(value_field);
2155 printer->PrintMessageStart(
message, -1, 0, single_line_mode_, generator);
2156 generator->Indent();
2157 Print(*value_message, generator);
2158 generator->Outdent();
2159 printer->PrintMessageEnd(
message, -1, 0, single_line_mode_, generator);
2164 TextGenerator* generator)
const {
2165 const Reflection* reflection =
message.GetReflection();
2172 io::ArrayInputStream
input(serialized.data(), serialized.size());
2173 unknown_fields.ParseFromZeroCopyStream(&
input);
2179 auto itr = custom_message_printers_.find(
descriptor);
2180 if (itr != custom_message_printers_.end()) {
2181 itr->second->Print(
message, single_line_mode_, generator);
2185 PrintAny(
message, generator)) {
2188 std::vector<const FieldDescriptor*>
fields;
2194 if (reflection->IsMessageStripped(
message.GetDescriptor())) {
2195 generator->Print(kDoNotParse, std::strlen(kDoNotParse));
2199 if (print_message_fields_in_index_order_) {
2200 std::sort(
fields.begin(),
fields.end(), FieldIndexSorter());
2205 if (!hide_unknown_fields_) {
2206 PrintUnknownFields(reflection->GetUnknownFields(
message), generator,
2211 void TextFormat::Printer::PrintFieldValueToString(
const Message&
message,
2219 TextGenerator generator(&output_stream, initial_indent_level_);
2224 class MapEntryMessageComparator {
2230 const Reflection* reflection =
a->GetReflection();
2231 switch (field_->cpp_type()) {
2232 case FieldDescriptor::CPPTYPE_BOOL: {
2237 case FieldDescriptor::CPPTYPE_INT32: {
2242 case FieldDescriptor::CPPTYPE_INT64: {
2247 case FieldDescriptor::CPPTYPE_UINT32: {
2252 case FieldDescriptor::CPPTYPE_UINT64: {
2257 case FieldDescriptor::CPPTYPE_STRING: {
2263 GOOGLE_LOG(DFATAL) <<
"Invalid key for map field.";
2273 class MapFieldPrinterHelper {
2277 static bool SortMap(
const Message&
message,
const Reflection* reflection,
2279 std::vector<const Message*>* sorted_map_field);
2287 bool MapFieldPrinterHelper::SortMap(
2290 std::vector<const Message*>* sorted_map_field) {
2291 bool need_release =
false;
2294 if (
base.IsRepeatedFieldValid()) {
2297 for (
int i = 0;
i < map_field.
size(); ++
i) {
2298 sorted_map_field->push_back(
2311 Message* map_entry_message = prototype->
New();
2312 CopyKey(
iter.GetKey(), map_entry_message, map_entry_desc->
field(0));
2313 CopyValue(
iter.GetValueRef(), map_entry_message,
2314 map_entry_desc->
field(1));
2315 sorted_map_field->push_back(map_entry_message);
2317 need_release =
true;
2321 std::stable_sort(sorted_map_field->begin(), sorted_map_field->end(),
2323 return need_release;
2330 case FieldDescriptor::CPPTYPE_DOUBLE:
2331 case FieldDescriptor::CPPTYPE_FLOAT:
2332 case FieldDescriptor::CPPTYPE_ENUM:
2333 case FieldDescriptor::CPPTYPE_MESSAGE:
2336 case FieldDescriptor::CPPTYPE_STRING:
2339 case FieldDescriptor::CPPTYPE_INT64:
2342 case FieldDescriptor::CPPTYPE_INT32:
2345 case FieldDescriptor::CPPTYPE_UINT64:
2348 case FieldDescriptor::CPPTYPE_UINT32:
2351 case FieldDescriptor::CPPTYPE_BOOL:
2357 void MapFieldPrinterHelper::CopyValue(
const MapValueRef&
value,
2360 const Reflection* reflection =
message->GetReflection();
2361 switch (field_desc->cpp_type()) {
2362 case FieldDescriptor::CPPTYPE_DOUBLE:
2363 reflection->SetDouble(
message, field_desc,
value.GetDoubleValue());
2365 case FieldDescriptor::CPPTYPE_FLOAT:
2366 reflection->SetFloat(
message, field_desc,
value.GetFloatValue());
2368 case FieldDescriptor::CPPTYPE_ENUM:
2369 reflection->SetEnumValue(
message, field_desc,
value.GetEnumValue());
2371 case FieldDescriptor::CPPTYPE_MESSAGE: {
2373 sub_message->CopyFrom(
value.GetMessageValue());
2374 reflection->SetAllocatedMessage(
message, sub_message, field_desc);
2377 case FieldDescriptor::CPPTYPE_STRING:
2378 reflection->SetString(
message, field_desc,
value.GetStringValue());
2380 case FieldDescriptor::CPPTYPE_INT64:
2381 reflection->SetInt64(
message, field_desc,
value.GetInt64Value());
2383 case FieldDescriptor::CPPTYPE_INT32:
2384 reflection->SetInt32(
message, field_desc,
value.GetInt32Value());
2386 case FieldDescriptor::CPPTYPE_UINT64:
2387 reflection->SetUInt64(
message, field_desc,
value.GetUInt64Value());
2389 case FieldDescriptor::CPPTYPE_UINT32:
2390 reflection->SetUInt32(
message, field_desc,
value.GetUInt32Value());
2392 case FieldDescriptor::CPPTYPE_BOOL:
2393 reflection->SetBool(
message, field_desc,
value.GetBoolValue());
2400 const Reflection* reflection,
2402 TextGenerator* generator)
const {
2403 if (use_short_repeated_primitives_ &&
field->is_repeated() &&
2404 field->cpp_type() != FieldDescriptor::CPPTYPE_STRING &&
2405 field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
2406 PrintShortRepeatedField(
message, reflection,
field, generator);
2412 if (
field->is_repeated()) {
2415 field->containing_type()->options().map_entry()) {
2419 std::vector<const Message*> sorted_map_field;
2420 bool need_release =
false;
2421 bool is_map =
field->is_map();
2423 need_release = internal::MapFieldPrinterHelper::SortMap(
2427 for (
int j = 0;
j <
count; ++
j) {
2428 const int field_index =
field->is_repeated() ?
j : -1;
2432 if (
field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2433 const FastFieldValuePrinter* printer = GetFieldPrinter(
field);
2435 field->is_repeated()
2436 ? (is_map ? *sorted_map_field[
j]
2439 printer->PrintMessageStart(sub_message, field_index,
count,
2440 single_line_mode_, generator);
2441 generator->Indent();
2442 if (!printer->PrintMessageContent(sub_message, field_index,
count,
2443 single_line_mode_, generator)) {
2444 Print(sub_message, generator);
2446 generator->Outdent();
2447 printer->PrintMessageEnd(sub_message, field_index,
count,
2448 single_line_mode_, generator);
2450 generator->PrintMaybeWithMarker(
": ");
2453 if (single_line_mode_) {
2454 generator->PrintLiteral(
" ");
2456 generator->PrintLiteral(
"\n");
2462 for (
const Message* message_to_delete : sorted_map_field) {
2463 delete message_to_delete;
2468 void TextFormat::Printer::PrintShortRepeatedField(
2475 generator->PrintMaybeWithMarker(
": ",
"[");
2476 for (
int i = 0;
i <
size;
i++) {
2477 if (
i > 0) generator->PrintLiteral(
", ");
2480 if (single_line_mode_) {
2481 generator->PrintLiteral(
"] ");
2483 generator->PrintLiteral(
"]\n");
2488 int field_index,
int field_count,
2489 const Reflection* reflection,
2491 TextGenerator* generator)
const {
2494 if (use_field_number_) {
2499 const FastFieldValuePrinter* printer = GetFieldPrinter(
field);
2500 printer->PrintFieldName(
message, field_index, field_count, reflection,
field,
2505 const Reflection* reflection,
2508 TextGenerator* generator)
const {
2510 <<
"Index must be -1 for non-repeated fields";
2512 const FastFieldValuePrinter* printer = GetFieldPrinter(
field);
2514 switch (
field->cpp_type()) {
2515 #define OUTPUT_FIELD(CPPTYPE, METHOD) \
2516 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
2517 printer->Print##METHOD( \
2518 field->is_repeated() \
2519 ? reflection->GetRepeated##METHOD(message, field, index) \
2520 : reflection->Get##METHOD(message, field), \
2533 case FieldDescriptor::CPPTYPE_STRING: {
2536 field->is_repeated()
2542 if (truncate_string_field_longer_than_ > 0 &&
2543 static_cast<size_t>(truncate_string_field_longer_than_) <
2545 truncated_value =
value.substr(0, truncate_string_field_longer_than_) +
2546 "...<truncated>...";
2547 value_to_print = &truncated_value;
2549 if (
field->type() == FieldDescriptor::TYPE_STRING) {
2550 printer->PrintString(*value_to_print, generator);
2553 printer->PrintBytes(*value_to_print, generator);
2558 case FieldDescriptor::CPPTYPE_ENUM: {
2560 field->is_repeated()
2564 field->enum_type()->FindValueByNumber(enum_value);
2565 if (enum_desc !=
nullptr) {
2566 printer->PrintEnum(enum_value, enum_desc->
name(), generator);
2574 printer->PrintEnum(enum_value,
StrCat(enum_value), generator);
2579 case FieldDescriptor::CPPTYPE_MESSAGE:
2593 bool TextFormat::PrintUnknownFields(
2595 return Printer().PrintUnknownFields(unknown_fields,
output);
2603 bool TextFormat::PrintUnknownFieldsToString(
2605 return Printer().PrintUnknownFieldsToString(unknown_fields,
output);
2608 void TextFormat::PrintFieldValueToString(
2614 bool TextFormat::ParseFieldValueFromString(
2619 void TextFormat::Printer::PrintUnknownFields(
2621 int recursion_budget)
const {
2626 switch (
field.type()) {
2627 case UnknownField::TYPE_VARINT:
2628 generator->PrintString(field_number);
2629 generator->PrintMaybeWithMarker(
": ");
2631 if (single_line_mode_) {
2632 generator->PrintLiteral(
" ");
2634 generator->PrintLiteral(
"\n");
2637 case UnknownField::TYPE_FIXED32: {
2638 generator->PrintString(field_number);
2639 generator->PrintMaybeWithMarker(
": ",
"0x");
2640 generator->PrintString(
2642 if (single_line_mode_) {
2643 generator->PrintLiteral(
" ");
2645 generator->PrintLiteral(
"\n");
2649 case UnknownField::TYPE_FIXED64: {
2650 generator->PrintString(field_number);
2651 generator->PrintMaybeWithMarker(
": ",
"0x");
2652 generator->PrintString(
2654 if (single_line_mode_) {
2655 generator->PrintLiteral(
" ");
2657 generator->PrintLiteral(
"\n");
2661 case UnknownField::TYPE_LENGTH_DELIMITED: {
2662 generator->PrintString(field_number);
2671 if (!
value.empty() && recursion_budget > 0 &&
2675 if (single_line_mode_) {
2676 generator->PrintMaybeWithMarker(
" ",
"{ ");
2678 generator->PrintMaybeWithMarker(
" ",
"{\n");
2679 generator->Indent();
2681 PrintUnknownFields(embedded_unknown_fields, generator,
2682 recursion_budget - 1);
2683 if (single_line_mode_) {
2684 generator->PrintLiteral(
"} ");
2686 generator->Outdent();
2687 generator->PrintLiteral(
"}\n");
2692 generator->PrintMaybeWithMarker(
": ",
"\"");
2694 if (single_line_mode_) {
2695 generator->PrintLiteral(
"\" ");
2697 generator->PrintLiteral(
"\"\n");
2702 case UnknownField::TYPE_GROUP:
2703 generator->PrintString(field_number);
2704 if (single_line_mode_) {
2705 generator->PrintMaybeWithMarker(
" ",
"{ ");
2707 generator->PrintMaybeWithMarker(
" ",
"{\n");
2708 generator->Indent();
2713 PrintUnknownFields(
field.group(), generator, recursion_budget - 1);
2714 if (single_line_mode_) {
2715 generator->PrintLiteral(
"} ");
2717 generator->Outdent();
2718 generator->PrintLiteral(
"}\n");
2728 #include <google/protobuf/port_undef.inc>