67 #include <google/protobuf/port_def.inc>
76 return (
str.length() >= 2 &&
str[0] ==
'0' &&
77 (
str[1] ==
'x' ||
str[1] ==
'X'));
81 return (
str.length() >= 2 &&
str[0] ==
'0' &&
82 (
str[1] >=
'0' &&
str[1] <
'8'));
107 if (debug_string.size() > 0 && debug_string[debug_string.size() - 1] ==
' ') {
108 debug_string.resize(debug_string.size() - 1);
135 for (NestedMap::iterator
it = nested_.begin();
it != nested_.end(); ++
it) {
149 std::vector<TextFormat::ParseInfoTree*>* trees = &nested_[
field];
151 trees->push_back(instance);
156 if (
field ==
nullptr) {
161 GOOGLE_LOG(DFATAL) <<
"Index must be in range of repeated field values. "
162 <<
"Field: " <<
field->name();
163 }
else if (!
field->is_repeated() &&
index != -1) {
164 GOOGLE_LOG(DFATAL) <<
"Index must be -1 for singular fields."
165 <<
"Field: " <<
field->name();
176 const std::vector<TextFormat::ParseLocation>* locations =
178 if (locations ==
nullptr ||
index >= locations->size()) {
182 return (*locations)[
index];
192 const std::vector<TextFormat::ParseInfoTree*>* trees =
194 if (trees ==
nullptr ||
index >= trees->size()) {
198 return (*trees)[
index];
223 return message.GetDescriptor()->file()->pool()->FindMessageTypeByName(
name);
237 #define DO(STATEMENT) \
250 ALLOW_SINGULAR_OVERWRITES = 0,
251 FORBID_SINGULAR_OVERWRITES = 1,
259 bool allow_case_insensitive_field,
bool allow_unknown_field,
260 bool allow_unknown_extension,
bool allow_unknown_enum,
261 bool allow_field_number,
bool allow_relaxed_whitespace,
262 bool allow_partial,
int recursion_limit)
265 parse_info_tree_(parse_info_tree),
266 tokenizer_error_collector_(this),
267 tokenizer_(input_stream, &tokenizer_error_collector_),
268 root_message_type_(root_message_type),
269 singular_overwrite_policy_(singular_overwrite_policy),
270 allow_case_insensitive_field_(allow_case_insensitive_field),
271 allow_unknown_field_(allow_unknown_field),
272 allow_unknown_extension_(allow_unknown_extension),
273 allow_unknown_enum_(allow_unknown_enum),
274 allow_field_number_(allow_field_number),
275 allow_partial_(allow_partial),
276 recursion_limit_(recursion_limit),
280 tokenizer_.set_allow_f_after_float(
true);
285 if (allow_relaxed_whitespace) {
286 tokenizer_.set_require_space_after_number(
false);
287 tokenizer_.set_allow_multiline_strings(
true);
325 << root_message_type_->full_name() <<
": " << (line + 1)
326 <<
":" << (col + 1) <<
": " <<
message;
329 << root_message_type_->full_name() <<
": " <<
message;
340 << root_message_type_->full_name() <<
": " << (line + 1)
341 <<
":" << (col + 1) <<
": " <<
message;
344 << root_message_type_->full_name() <<
": " <<
message;
357 ReportError(tokenizer_.current().line, tokenizer_.current().column,
364 ReportWarning(tokenizer_.current().line, tokenizer_.current().column,
372 while (!LookingAt(
">") && !LookingAt(
"}")) {
377 DO(Consume(delimiter));
383 if (TryConsume(
"<")) {
400 bool reserved_field =
false;
402 int start_line = tokenizer_.current().line;
403 int start_column = tokenizer_.current().column;
411 DO(ConsumeAnyTypeUrl(&full_type_name, &
prefix));
416 finder_ ? finder_->FindAnyType(*
message,
prefix, full_type_name)
417 : DefaultFinderFindAnyType(*
message,
prefix, full_type_name);
418 if (value_descriptor ==
nullptr) {
419 ReportError(
"Could not find type \"" +
prefix + full_type_name +
420 "\" stored in google.protobuf.Any.");
423 DO(ConsumeAnyValue(value_descriptor, &serialized_value));
424 if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
430 ReportError(
"Non-repeated Any specified multiple times.");
439 if (TryConsume(
"[")) {
441 DO(ConsumeFullTypeName(&field_name));
444 field = finder_ ? finder_->FindExtension(
message, field_name)
445 : DefaultFinderFindExtension(
message, field_name);
447 if (
field ==
nullptr) {
448 if (!allow_unknown_field_ && !allow_unknown_extension_) {
449 ReportError(
"Extension \"" + field_name +
450 "\" is not defined or "
451 "is not an extension of \"" +
455 ReportWarning(
"Ignoring extension \"" + field_name +
456 "\" which is not defined or is not an extension of \"" +
461 DO(ConsumeIdentifier(&field_name));
464 if (allow_field_number_ &&
466 if (
descriptor->IsExtensionNumber(field_number)) {
468 ? finder_->FindExtensionByNumber(
descriptor, field_number)
469 : DefaultFinderFindExtensionByNumber(
descriptor,
471 }
else if (
descriptor->IsReservedNumber(field_number)) {
472 reserved_field =
true;
481 if (
field ==
nullptr) {
486 if (
field !=
nullptr &&
493 field->message_type()->name() != field_name) {
497 if (
field ==
nullptr && allow_case_insensitive_field_) {
503 if (
field ==
nullptr) {
504 reserved_field =
descriptor->IsReservedName(field_name);
508 if (
field ==
nullptr && !reserved_field) {
509 if (!allow_unknown_field_) {
510 ReportError(
"Message type \"" +
descriptor->full_name() +
511 "\" has no field named \"" + field_name +
"\".");
514 ReportWarning(
"Message type \"" +
descriptor->full_name() +
515 "\" has no field named \"" + field_name +
"\".");
521 if (
field ==
nullptr) {
522 GOOGLE_CHECK(allow_unknown_field_ || allow_unknown_extension_ || reserved_field);
530 if (TryConsume(
":") && !LookingAt(
"{") && !LookingAt(
"<")) {
531 return SkipFieldValue();
533 return SkipFieldMessage();
537 if (singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) {
540 ReportError(
"Non-repeated field \"" + field_name +
541 "\" is specified multiple times.");
550 ReportError(
"Field \"" + field_name +
551 "\" is specified along with "
553 other_field->
name() +
554 "\", another member "
556 oneof->
name() +
"\".");
564 bool consumed_semicolon = TryConsume(
":");
565 if (consumed_semicolon &&
field->options().weak() &&
569 DO(ConsumeString(&tmp));
571 finder_ ? finder_->FindExtensionFactory(
field) :
nullptr;
574 goto label_skip_parsing;
581 if (
field->is_repeated() && TryConsume(
"[")) {
583 if (!TryConsume(
"]")) {
592 if (TryConsume(
"]")) {
606 TryConsume(
";") || TryConsume(
",");
608 if (
field->options().deprecated()) {
609 ReportWarning(
"text format contains deprecated field \"" + field_name +
615 if (parse_info_tree_ !=
nullptr) {
625 if (TryConsume(
"[")) {
627 DO(ConsumeTypeUrlOrFullTypeName());
631 DO(ConsumeIdentifier(&field_name));
640 if (TryConsume(
":") && !LookingAt(
"{") && !LookingAt(
"<")) {
641 DO(SkipFieldValue());
643 DO(SkipFieldMessage());
647 TryConsume(
";") || TryConsume(
",");
653 if (--recursion_limit_ < 0) {
654 ReportError(
"Message is too deep");
660 if (parent !=
nullptr) {
665 DO(ConsumeMessageDelimiter(&delimiter));
667 finder_ ? finder_->FindExtensionFactory(
field) :
nullptr;
668 if (
field->is_repeated()) {
679 parse_info_tree_ = parent;
687 DO(ConsumeMessageDelimiter(&delimiter));
688 while (!LookingAt(
">") && !LookingAt(
"}")) {
691 DO(Consume(delimiter));
700 #define SET_FIELD(CPPTYPE, VALUE) \
701 if (field->is_repeated()) { \
702 reflection->Add##CPPTYPE(message, field, VALUE); \
704 reflection->Set##CPPTYPE(message, field, VALUE); \
707 switch (
field->cpp_type()) {
760 DO(ConsumeUnsignedInteger(&
value, 1));
770 ReportError(
"Invalid value for boolean field \"" +
field->name() +
771 "\". Value: \"" +
value +
"\".");
789 }
else if (LookingAt(
"-") ||
793 enum_value =
enum_type->FindValueByNumber(int_value);
795 ReportError(
"Expected integer or identifier, got: " +
796 tokenizer_.current().text);
800 if (enum_value ==
nullptr) {
805 }
else if (!allow_unknown_enum_) {
806 ReportError(
"Unknown enumeration value of \"" +
value +
809 field->name() +
"\".");
812 ReportWarning(
"Unknown enumeration value of \"" +
value +
815 field->name() +
"\".");
842 if (TryConsume(
"[")) {
844 if (!LookingAt(
"{") && !LookingAt(
"<")) {
845 DO(SkipFieldValue());
847 DO(SkipFieldMessage());
849 if (TryConsume(
"]")) {
877 bool has_minus = TryConsume(
"-");
882 ReportError(
"Cannot skip field value, unexpected token: " + text);
895 text !=
"infinity" && text !=
"nan") {
896 ReportError(
"Invalid float number: " + text);
906 return tokenizer_.current().text == text;
911 return tokenizer_.current().type == token_type;
918 *identifier = tokenizer_.current().text;
925 if ((allow_field_number_ || allow_unknown_field_ ||
926 allow_unknown_extension_) &&
928 *identifier = tokenizer_.current().text;
933 ReportError(
"Expected identifier, got: " + tokenizer_.current().text);
939 DO(ConsumeIdentifier(
name));
940 while (TryConsume(
".")) {
942 DO(ConsumeIdentifier(&part));
951 DO(ConsumeIdentifier(&discarded));
952 while (TryConsume(
".") || TryConsume(
"/")) {
953 DO(ConsumeIdentifier(&discarded));
962 ReportError(
"Expected string, got: " + tokenizer_.current().text);
980 ReportError(
"Expected integer, got: " + tokenizer_.current().text);
986 ReportError(
"Integer out of range (" + tokenizer_.current().text +
")");
1000 bool negative =
false;
1002 if (TryConsume(
"-")) {
1011 DO(ConsumeUnsignedInteger(&unsigned_value, max_value));
1017 *
value = -
static_cast<int64>(unsigned_value);
1030 ReportError(
"Expected integer, got: " + tokenizer_.current().text);
1034 const std::string& text = tokenizer_.current().text;
1035 if (IsHexNumber(text) || IsOctNumber(text)) {
1036 ReportError(
"Expect a decimal number, got: " + text);
1042 *
value =
static_cast<double>(uint64_value);
1058 bool negative =
false;
1060 if (TryConsume(
"-")) {
1078 if (text ==
"inf" ||
1079 text ==
"infinity") {
1080 *
value = std::numeric_limits<double>::infinity();
1082 }
else if (text ==
"nan") {
1083 *
value = std::numeric_limits<double>::quiet_NaN();
1086 ReportError(
"Expected double, got: " + text);
1090 ReportError(
"Expected double, got: " + tokenizer_.current().text);
1107 while (TryConsume(
".")) {
1109 DO(ConsumeIdentifier(&
url));
1114 DO(ConsumeFullTypeName(full_type_name));
1125 if (value_prototype ==
nullptr) {
1128 std::unique_ptr<Message>
value(value_prototype->
New());
1130 DO(ConsumeMessageDelimiter(&sub_delimiter));
1131 DO(ConsumeMessage(
value.get(), sub_delimiter));
1133 if (allow_partial_) {
1134 value->AppendPartialToString(serialized_value);
1136 if (!
value->IsInitialized()) {
1138 "Value of type \"" + value_descriptor->
full_name() +
1139 "\" stored in google.protobuf.Any has missing required fields");
1142 value->AppendToString(serialized_value);
1151 const std::string& current_value = tokenizer_.current().text;
1153 if (current_value !=
value) {
1154 ReportError(
"Expected \"" +
value +
"\", found \"" + current_value +
1167 if (tokenizer_.current().text ==
value) {
1217 class TextFormat::Printer::TextGenerator
1221 int initial_indent_level)
1225 at_start_of_line_(
true),
1227 indent_level_(initial_indent_level),
1228 initial_indent_level_(initial_indent_level) {}
1233 if (!failed_ && buffer_size_ > 0) {
1234 output_->BackUp(buffer_size_);
1246 if (indent_level_ == 0 || indent_level_ < initial_indent_level_) {
1247 GOOGLE_LOG(DFATAL) <<
" Outdent() without matching Indent().";
1256 if (indent_level_ > 0) {
1258 for (
size_t i = 0;
i <
size;
i++) {
1259 if (text[
i] ==
'\n') {
1262 Write(text + pos,
i - pos + 1);
1267 at_start_of_line_ =
true;
1274 if (
size > 0 && text[
size - 1] ==
'\n') {
1275 at_start_of_line_ =
true;
1289 if (failed_)
return;
1290 if (
size == 0)
return;
1292 if (at_start_of_line_) {
1294 at_start_of_line_ =
false;
1296 if (failed_)
return;
1299 while (
size > buffer_size_) {
1302 if (buffer_size_ > 0) {
1304 data += buffer_size_;
1305 size -= buffer_size_;
1307 void* void_buffer =
nullptr;
1308 failed_ = !
output_->Next(&void_buffer, &buffer_size_);
1309 if (failed_)
return;
1310 buffer_ =
reinterpret_cast<char*
>(void_buffer);
1316 buffer_size_ -=
size;
1320 if (indent_level_ == 0) {
1324 int size = 2 * indent_level_;
1326 while (
size > buffer_size_) {
1329 if (buffer_size_ > 0) {
1330 memset(
buffer_,
' ', buffer_size_);
1332 size -= buffer_size_;
1334 failed_ = !
output_->Next(&void_buffer, &buffer_size_);
1335 if (failed_)
return;
1336 buffer_ =
reinterpret_cast<char*
>(void_buffer);
1342 buffer_size_ -=
size;
1385 parse_info_tree_(nullptr),
1386 allow_partial_(
false),
1387 allow_case_insensitive_field_(
false),
1388 allow_unknown_field_(
false),
1389 allow_unknown_extension_(
false),
1390 allow_unknown_enum_(
false),
1391 allow_field_number_(
false),
1392 allow_relaxed_whitespace_(
false),
1393 allow_singular_overwrites_(
false),
1394 recursion_limit_(
std::numeric_limits<int>::max()) {}
1402 if (
input.size() > INT_MAX) {
1406 " bytes",
" > ", INT_MAX,
" bytes."));
1419 allow_singular_overwrites_ ? ParserImpl::ALLOW_SINGULAR_OVERWRITES
1420 : ParserImpl::FORBID_SINGULAR_OVERWRITES;
1423 parse_info_tree_, overwrites_policy,
1424 allow_case_insensitive_field_, allow_unknown_field_,
1425 allow_unknown_extension_, allow_unknown_enum_,
1426 allow_field_number_, allow_relaxed_whitespace_,
1427 allow_partial_, recursion_limit_);
1442 parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1443 allow_case_insensitive_field_, allow_unknown_field_,
1444 allow_unknown_extension_, allow_unknown_enum_,
1445 allow_field_number_, allow_relaxed_whitespace_,
1446 allow_partial_, recursion_limit_);
1462 if (!allow_partial_ && !
output->IsInitialized()) {
1463 std::vector<std::string> missing_fields;
1464 output->FindInitializationErrors(&missing_fields);
1466 "Message missing required fields: " +
1467 Join(missing_fields,
", "));
1479 parse_info_tree_, ParserImpl::ALLOW_SINGULAR_OVERWRITES,
1480 allow_case_insensitive_field_, allow_unknown_field_,
1481 allow_unknown_extension_, allow_unknown_enum_, allow_field_number_,
1482 allow_relaxed_whitespace_, allow_partial_, recursion_limit_);
1518 void Print(
const char* text,
size_t size)
override {
1526 #else // !LANG_CXX11
1528 #endif // LANG_CXX11
1539 TextFormat::FieldValuePrinter::FieldValuePrinter() {}
1540 TextFormat::FieldValuePrinter::~FieldValuePrinter() {}
1543 #define FORWARD_IMPL(fn, ...) \
1544 StringBaseTextGenerator generator; \
1545 delegate_.fn(__VA_ARGS__, &generator); \
1546 return std::move(generator).Consume()
1547 #else // !LANG_CXX11
1548 #define FORWARD_IMPL(fn, ...) \
1549 StringBaseTextGenerator generator; \
1550 delegate_.fn(__VA_ARGS__, &generator); \
1551 return generator.Get()
1552 #endif // LANG_CXX11
1554 std::string TextFormat::FieldValuePrinter::PrintBool(
bool val)
const {
1569 std::string TextFormat::FieldValuePrinter::PrintFloat(
float val)
const {
1572 std::string TextFormat::FieldValuePrinter::PrintDouble(
double val)
const {
1575 std::string TextFormat::FieldValuePrinter::PrintString(
1579 std::string TextFormat::FieldValuePrinter::PrintBytes(
1581 return PrintString(
val);
1583 std::string TextFormat::FieldValuePrinter::PrintEnum(
1587 std::string TextFormat::FieldValuePrinter::PrintFieldName(
1588 const Message&
message,
const Reflection* reflection,
1592 std::string TextFormat::FieldValuePrinter::PrintMessageStart(
1593 const Message&
message,
int field_index,
int field_count,
1594 bool single_line_mode)
const {
1598 std::string TextFormat::FieldValuePrinter::PrintMessageEnd(
1599 const Message&
message,
int field_index,
int field_count,
1600 bool single_line_mode)
const {
1653 PrintString(
val, generator);
1664 if (
field->is_extension()) {
1678 if (single_line_mode) {
1687 if (single_line_mode) {
1699 explicit FieldValuePrinterWrapper(
1700 const TextFormat::FieldValuePrinter* delegate)
1703 void SetDelegate(
const TextFormat::FieldValuePrinter* delegate) {
1707 void PrintBool(
bool val,
1708 TextFormat::BaseTextGenerator* generator)
const override {
1712 TextFormat::BaseTextGenerator* generator)
const override {
1716 TextFormat::BaseTextGenerator* generator)
const override {
1720 TextFormat::BaseTextGenerator* generator)
const override {
1724 TextFormat::BaseTextGenerator* generator)
const override {
1727 void PrintFloat(
float val,
1728 TextFormat::BaseTextGenerator* generator)
const override {
1731 void PrintDouble(
double val,
1732 TextFormat::BaseTextGenerator* generator)
const override {
1736 TextFormat::BaseTextGenerator* generator)
const override {
1740 TextFormat::BaseTextGenerator* generator)
const override {
1744 TextFormat::BaseTextGenerator* generator)
const override {
1747 void PrintFieldName(
const Message&
message,
int field_index,
int field_count,
1748 const Reflection* reflection,
1750 TextFormat::BaseTextGenerator* generator)
const override {
1751 generator->PrintString(
1754 void PrintFieldName(
const Message&
message,
const Reflection* reflection,
1756 TextFormat::BaseTextGenerator* generator)
const override {
1757 generator->PrintString(
1760 void PrintMessageStart(
1761 const Message&
message,
int field_index,
int field_count,
1762 bool single_line_mode,
1763 TextFormat::BaseTextGenerator* generator)
const override {
1764 generator->PrintString(
delegate_->PrintMessageStart(
1765 message, field_index, field_count, single_line_mode));
1767 void PrintMessageEnd(
1768 const Message&
message,
int field_index,
int field_count,
1769 bool single_line_mode,
1770 TextFormat::BaseTextGenerator* generator)
const override {
1771 generator->PrintString(
delegate_->PrintMessageEnd(
1772 message, field_index, field_count, single_line_mode));
1776 std::unique_ptr<const TextFormat::FieldValuePrinter>
delegate_;
1780 class FastFieldValuePrinterUtf8Escaping
1781 :
public TextFormat::FastFieldValuePrinter {
1784 TextFormat::BaseTextGenerator* generator)
const override {
1785 generator->PrintLiteral(
"\"");
1787 generator->PrintLiteral(
"\"");
1790 TextFormat::BaseTextGenerator* generator)
const override {
1798 : initial_indent_level_(0),
1799 single_line_mode_(
false),
1800 use_field_number_(
false),
1801 use_short_repeated_primitives_(
false),
1802 hide_unknown_fields_(
false),
1803 print_message_fields_in_index_order_(
false),
1805 truncate_string_field_longer_than_(0
LL),
1816 SetDefaultFieldValuePrinter(as_utf8 ?
new FastFieldValuePrinterUtf8Escaping()
1821 const FieldValuePrinter* printer) {
1822 default_field_value_printer_.reset(
new FieldValuePrinterWrapper(printer));
1827 default_field_value_printer_.reset(printer);
1832 if (
field ==
nullptr || printer ==
nullptr) {
1835 FieldValuePrinterWrapper*
const wrapper =
1836 new FieldValuePrinterWrapper(
nullptr);
1837 if (custom_printers_.insert(std::make_pair(
field, wrapper)).second) {
1838 wrapper->SetDelegate(printer);
1848 return field !=
nullptr && printer !=
nullptr &&
1849 custom_printers_.insert(std::make_pair(
field, printer)).second;
1854 return descriptor !=
nullptr && printer !=
nullptr &&
1855 custom_message_printers_.insert(std::make_pair(
descriptor, printer))
1880 TextGenerator generator(
output, initial_indent_level_);
1885 return !generator.failed();
1891 TextGenerator generator(
output, initial_indent_level_);
1896 return !generator.failed();
1902 struct FieldIndexSorter {
1907 }
else if (
left->is_extension()) {
1920 TextGenerator* generator)
const {
1940 finder_ ? finder_->FindAnyType(
message, url_prefix, full_type_name)
1941 : DefaultFinderFindAnyType(
message, url_prefix, full_type_name);
1942 if (value_descriptor ==
nullptr) {
1947 std::unique_ptr<Message> value_message(
1950 if (!value_message->ParseFromString(serialized_value)) {
1954 generator->PrintLiteral(
"[");
1956 generator->PrintLiteral(
"]");
1958 custom_printers_, value_field, default_field_value_printer_.get());
1960 generator->Indent();
1961 Print(*value_message, generator);
1962 generator->Outdent();
1968 TextGenerator* generator)
const {
1983 auto itr = custom_message_printers_.find(
descriptor);
1984 if (itr != custom_message_printers_.end()) {
1985 itr->second->Print(
message, single_line_mode_, generator);
1989 PrintAny(
message, generator)) {
1992 std::vector<const FieldDescriptor*>
fields;
2000 if (print_message_fields_in_index_order_) {
2001 std::sort(
fields.begin(),
fields.end(), FieldIndexSorter());
2003 for (
int i = 0;
i <
fields.size();
i++) {
2006 if (!hide_unknown_fields_) {
2019 TextGenerator generator(&output_stream, initial_indent_level_);
2030 const Reflection* reflection =
a->GetReflection();
2031 switch (field_->cpp_type()) {
2034 bool second = reflection->
GetBool(*
b, field_);
2035 return first < second;
2040 return first < second;
2045 return first < second;
2050 return first < second;
2055 return first < second;
2060 return first < second;
2063 GOOGLE_LOG(DFATAL) <<
"Invalid key for map field.";
2079 std::vector<const Message*>* sorted_map_field);
2087 bool MapFieldPrinterHelper::SortMap(
2090 std::vector<const Message*>* sorted_map_field) {
2091 bool need_release =
false;
2094 if (
base.IsRepeatedFieldValid()) {
2097 for (
int i = 0;
i < map_field.
size(); ++
i) {
2098 sorted_map_field->push_back(
2110 Message* map_entry_message = prototype->
New();
2111 CopyKey(iter.GetKey(), map_entry_message, map_entry_desc->
field(0));
2112 CopyValue(iter.GetValueRef(), map_entry_message,
2113 map_entry_desc->
field(1));
2114 sorted_map_field->push_back(map_entry_message);
2116 need_release =
true;
2120 std::stable_sort(sorted_map_field->begin(), sorted_map_field->end(),
2122 return need_release;
2201 TextGenerator* generator)
const {
2202 if (use_short_repeated_primitives_ &&
field->is_repeated() &&
2205 PrintShortRepeatedField(
message, reflection,
field, generator);
2211 if (
field->is_repeated()) {
2214 field->containing_type()->options().map_entry()) {
2219 std::vector<const Message*> sorted_map_field;
2220 bool need_release =
false;
2221 bool is_map =
field->is_map();
2224 message, reflection,
field, &factory, &sorted_map_field);
2227 for (
int j = 0; j <
count; ++j) {
2228 const int field_index =
field->is_repeated() ? j : -1;
2234 custom_printers_,
field, default_field_value_printer_.get());
2236 field->is_repeated()
2237 ? (is_map ? *sorted_map_field[j]
2241 single_line_mode_, generator);
2242 generator->Indent();
2243 Print(sub_message, generator);
2244 generator->Outdent();
2246 single_line_mode_, generator);
2248 generator->PrintLiteral(
": ");
2251 if (single_line_mode_) {
2252 generator->PrintLiteral(
" ");
2254 generator->PrintLiteral(
"\n");
2260 for (
int j = 0; j < sorted_map_field.size(); ++j) {
2261 delete sorted_map_field[j];
2273 generator->PrintLiteral(
": [");
2274 for (
int i = 0;
i <
size;
i++) {
2275 if (
i > 0) generator->PrintLiteral(
", ");
2278 if (single_line_mode_) {
2279 generator->PrintLiteral(
"] ");
2281 generator->PrintLiteral(
"]\n");
2286 int field_index,
int field_count,
2289 TextGenerator* generator)
const {
2292 if (use_field_number_) {
2298 custom_printers_,
field, default_field_value_printer_.get());
2307 TextGenerator* generator)
const {
2309 <<
"Index must be -1 for non-repeated fields";
2312 custom_printers_,
field, default_field_value_printer_.get());
2314 switch (
field->cpp_type()) {
2315 #define OUTPUT_FIELD(CPPTYPE, METHOD) \
2316 case FieldDescriptor::CPPTYPE_##CPPTYPE: \
2317 printer->Print##METHOD( \
2318 field->is_repeated() \
2319 ? reflection->GetRepeated##METHOD(message, field, index) \
2320 : reflection->Get##METHOD(message, field), \
2336 field->is_repeated()
2342 if (truncate_string_field_longer_than_ > 0 &&
2343 truncate_string_field_longer_than_ <
value.size()) {
2344 truncated_value =
value.substr(0, truncate_string_field_longer_than_) +
2345 "...<truncated>...";
2346 value_to_print = &truncated_value;
2352 printer->
PrintBytes(*value_to_print, generator);
2359 field->is_repeated()
2363 field->enum_type()->FindValueByNumber(enum_value);
2364 if (enum_desc !=
nullptr) {
2365 printer->
PrintEnum(enum_value, enum_desc->
name(), generator);
2420 const UnknownFieldSet& unknown_fields, TextGenerator* generator)
const {
2425 switch (
field.type()) {
2427 generator->PrintString(field_number);
2428 generator->PrintLiteral(
": ");
2430 if (single_line_mode_) {
2431 generator->PrintLiteral(
" ");
2433 generator->PrintLiteral(
"\n");
2437 generator->PrintString(field_number);
2438 generator->PrintLiteral(
": 0x");
2439 generator->PrintString(
2441 if (single_line_mode_) {
2442 generator->PrintLiteral(
" ");
2444 generator->PrintLiteral(
"\n");
2449 generator->PrintString(field_number);
2450 generator->PrintLiteral(
": 0x");
2451 generator->PrintString(
2453 if (single_line_mode_) {
2454 generator->PrintLiteral(
" ");
2456 generator->PrintLiteral(
"\n");
2461 generator->PrintString(field_number);
2467 if (single_line_mode_) {
2468 generator->PrintLiteral(
" { ");
2470 generator->PrintLiteral(
" {\n");
2471 generator->Indent();
2474 if (single_line_mode_) {
2475 generator->PrintLiteral(
"} ");
2477 generator->Outdent();
2478 generator->PrintLiteral(
"}\n");
2483 generator->PrintLiteral(
": \"");
2485 if (single_line_mode_) {
2486 generator->PrintLiteral(
"\" ");
2488 generator->PrintLiteral(
"\"\n");
2494 generator->PrintString(field_number);
2495 if (single_line_mode_) {
2496 generator->PrintLiteral(
" { ");
2498 generator->PrintLiteral(
" {\n");
2499 generator->Indent();
2502 if (single_line_mode_) {
2503 generator->PrintLiteral(
"} ");
2505 generator->Outdent();
2506 generator->PrintLiteral(
"}\n");