|
@@ -728,6 +728,16 @@ bool TextFormat::Parser::MergeFromString(const string& input,
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* static */ bool TextFormat::PrintUnknownFieldsToString(
|
|
|
|
+ const UnknownFieldSet& unknown_fields,
|
|
|
|
+ string* output) {
|
|
|
|
+ GOOGLE_DCHECK(output) << "output specified is NULL";
|
|
|
|
+
|
|
|
|
+ output->clear();
|
|
|
|
+ io::StringOutputStream output_stream(output);
|
|
|
|
+ return PrintUnknownFields(unknown_fields, &output_stream);
|
|
|
|
+}
|
|
|
|
+
|
|
/* static */ bool TextFormat::Print(const Message& message,
|
|
/* static */ bool TextFormat::Print(const Message& message,
|
|
io::ZeroCopyOutputStream* output) {
|
|
io::ZeroCopyOutputStream* output) {
|
|
TextGenerator generator(output);
|
|
TextGenerator generator(output);
|
|
@@ -738,6 +748,17 @@ bool TextFormat::Parser::MergeFromString(const string& input,
|
|
return !generator.failed();
|
|
return !generator.failed();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* static */ bool TextFormat::PrintUnknownFields(
|
|
|
|
+ const UnknownFieldSet& unknown_fields,
|
|
|
|
+ io::ZeroCopyOutputStream* output) {
|
|
|
|
+ TextGenerator generator(output);
|
|
|
|
+
|
|
|
|
+ PrintUnknownFields(unknown_fields, generator);
|
|
|
|
+
|
|
|
|
+ // Output false if the generator failed internally.
|
|
|
|
+ return !generator.failed();
|
|
|
|
+}
|
|
|
|
+
|
|
/* static */ void TextFormat::Print(const Descriptor* descriptor,
|
|
/* static */ void TextFormat::Print(const Descriptor* descriptor,
|
|
const Message::Reflection* message,
|
|
const Message::Reflection* message,
|
|
TextGenerator& generator) {
|
|
TextGenerator& generator) {
|
|
@@ -922,9 +943,23 @@ static string PaddedHex(IntType value) {
|
|
}
|
|
}
|
|
for (int j = 0; j < field.length_delimited_size(); j++) {
|
|
for (int j = 0; j < field.length_delimited_size(); j++) {
|
|
generator.Print(field_number);
|
|
generator.Print(field_number);
|
|
- generator.Print(": \"");
|
|
|
|
- generator.Print(CEscape(field.length_delimited(j)));
|
|
|
|
- generator.Print("\"\n");
|
|
|
|
|
|
+ const string& value = field.length_delimited(j);
|
|
|
|
+ UnknownFieldSet embedded_unknown_fields;
|
|
|
|
+ if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) {
|
|
|
|
+ // This field is parseable as a Message.
|
|
|
|
+ // So it is probably an embedded message.
|
|
|
|
+ generator.Print(" {\n");
|
|
|
|
+ generator.Indent();
|
|
|
|
+ PrintUnknownFields(embedded_unknown_fields, generator);
|
|
|
|
+ generator.Outdent();
|
|
|
|
+ generator.Print("}\n");
|
|
|
|
+ } else {
|
|
|
|
+ // This field is not parseable as a Message.
|
|
|
|
+ // So it is probably just a plain string.
|
|
|
|
+ generator.Print(": \"");
|
|
|
|
+ generator.Print(CEscape(value));
|
|
|
|
+ generator.Print("\"\n");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
for (int j = 0; j < field.group_size(); j++) {
|
|
for (int j = 0; j < field.group_size(); j++) {
|
|
generator.Print(field_number);
|
|
generator.Print(field_number);
|