aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/text_format.cc
diff options
context:
space:
mode:
authorGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-07-29 01:13:20 +0000
committerGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-07-29 01:13:20 +0000
commit80b1d62bfcea65c59e2160da71dad84b1bd19cef (patch)
tree5423b830c53174fec83a7ea01ff0877e11c1ddb6 /src/google/protobuf/text_format.cc
parentd2fd0638c309113ccae3731a58e30419f522269a (diff)
Submit recent changes from internal branch, including "lite mode" for
C++ and Java. See CHANGES.txt for more details.
Diffstat (limited to 'src/google/protobuf/text_format.cc')
-rw-r--r--src/google/protobuf/text_format.cc64
1 files changed, 48 insertions, 16 deletions
diff --git a/src/google/protobuf/text_format.cc b/src/google/protobuf/text_format.cc
index ae88cdff..cf754024 100644
--- a/src/google/protobuf/text_format.cc
+++ b/src/google/protobuf/text_format.cc
@@ -142,6 +142,16 @@ class TextFormat::Parser::ParserImpl {
}
}
+ bool ParseField(const FieldDescriptor* field, Message* output) {
+ bool suc;
+ if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
+ suc = ConsumeFieldMessage(output, output->GetReflection(), field);
+ } else {
+ suc = ConsumeFieldValue(output, output->GetReflection(), field);
+ }
+ return suc && LookingAtType(io::Tokenizer::TYPE_END);
+ }
+
void ReportError(int line, int col, const string& message) {
had_errors_ = true;
if (error_collector_ == NULL) {
@@ -252,24 +262,9 @@ class TextFormat::Parser::ParserImpl {
// Perform special handling for embedded message types.
if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
- string delimeter;
-
// ':' is optional here.
TryConsume(":");
-
- if (TryConsume("<")) {
- delimeter = ">";
- } else {
- DO(Consume("{"));
- delimeter = "}";
- }
-
- if (field->is_repeated()) {
- DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter));
- } else {
- DO(ConsumeMessage(reflection->MutableMessage(message, field),
- delimeter));
- }
+ DO(ConsumeFieldMessage(message, reflection, field));
} else {
DO(Consume(":"));
DO(ConsumeFieldValue(message, reflection, field));
@@ -278,6 +273,26 @@ class TextFormat::Parser::ParserImpl {
return true;
}
+ bool ConsumeFieldMessage(Message* message,
+ const Reflection* reflection,
+ const FieldDescriptor* field) {
+ string delimeter;
+ if (TryConsume("<")) {
+ delimeter = ">";
+ } else {
+ DO(Consume("{"));
+ delimeter = "}";
+ }
+
+ if (field->is_repeated()) {
+ DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter));
+ } else {
+ DO(ConsumeMessage(reflection->MutableMessage(message, field),
+ delimeter));
+ }
+ return true;
+ }
+
bool ConsumeFieldValue(Message* message,
const Reflection* reflection,
const FieldDescriptor* field) {
@@ -750,6 +765,16 @@ bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* input,
return true;
}
+bool TextFormat::Parser::ParseFieldValueFromString(
+ const string& input,
+ const FieldDescriptor* field,
+ Message* output) {
+ io::ArrayInputStream input_stream(input.data(), input.size());
+ ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_,
+ ParserImpl::ALLOW_SINGULAR_OVERWRITES);
+ return parser.ParseField(field, output);
+}
+
/* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input,
Message* output) {
return Parser().Parse(input, output);
@@ -1008,6 +1033,13 @@ void TextFormat::Printer::PrintFieldValue(
return Printer().PrintFieldValueToString(message, field, index, output);
}
+/* static */ bool TextFormat::ParseFieldValueFromString(
+ const string& input,
+ const FieldDescriptor* field,
+ Message* message) {
+ return Parser().ParseFieldValueFromString(input, field, message);
+}
+
// Prints an integer as hex with a fixed number of digits dependent on the
// integer type.
template<typename IntType>