aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/cpp/cpp_string_field.cc
diff options
context:
space:
mode:
authorGravatar temporal <temporal@630680e5-0e50-0410-840e-4b1c322b438d>2008-07-16 02:00:27 +0000
committerGravatar temporal <temporal@630680e5-0e50-0410-840e-4b1c322b438d>2008-07-16 02:00:27 +0000
commit928ebb6b55a23972573328e0ca9500d9730249af (patch)
treeeb3790f12e31b919f63fc22b5bc5cc0d9f963ce5 /src/google/protobuf/compiler/cpp/cpp_string_field.cc
parent40ee551715c3a784ea6132dbf604b0e665ca2def (diff)
Fix bytes type setter to work with byte sequences with embedded NULLs.
Patch from Alkis Evlogimenos <alkis@evlogimenos.com>.
Diffstat (limited to 'src/google/protobuf/compiler/cpp/cpp_string_field.cc')
-rw-r--r--src/google/protobuf/compiler/cpp/cpp_string_field.cc77
1 files changed, 59 insertions, 18 deletions
diff --git a/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
index de59ac87..e74eb432 100644
--- a/src/google/protobuf/compiler/cpp/cpp_string_field.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_string_field.cc
@@ -96,8 +96,14 @@ GenerateAccessorDeclarations(io::Printer* printer) const {
printer->Print(variables_,
"inline const ::std::string& $name$() const;\n"
- "inline void set_$name$(const ::std::string& value);\n"
- "inline void set_$name$(const char* value);\n");
+ "inline void set_$name$(const ::std::string& value);\n");
+ if (descriptor_->type() == FieldDescriptor::TYPE_BYTES) {
+ printer->Print(variables_,
+ "inline void set_$name$(const char* value, size_t size);\n");
+ } else {
+ printer->Print(variables_,
+ "inline void set_$name$(const char* value);\n");
+ }
printer->Print(variables_,
"inline ::std::string* mutable_$name$();\n");
@@ -121,14 +127,28 @@ GenerateInlineAccessorDefinitions(io::Printer* printer) const {
" $name$_ = new ::std::string;\n"
" }\n"
" $name$_->assign(value);\n"
- "}\n"
- "inline void $classname$::set_$name$(const char* value) {\n"
- " _set_bit($index$);\n"
- " if ($name$_ == &_default_$name$_) {\n"
- " $name$_ = new ::std::string;\n"
- " }\n"
- " $name$_->assign(value);\n"
"}\n");
+
+ if (descriptor_->type() == FieldDescriptor::TYPE_BYTES) {
+ printer->Print(variables_,
+ "inline void $classname$::set_$name$(const char* value, size_t size) {\n"
+ " _set_bit($index$);\n"
+ " if ($name$_ == &_default_$name$_) {\n"
+ " $name$_ = new ::std::string;\n"
+ " }\n"
+ " $name$_->assign(value, size);\n"
+ "}\n");
+ } else {
+ printer->Print(variables_,
+ "inline void $classname$::set_$name$(const char* value) {\n"
+ " _set_bit($index$);\n"
+ " if ($name$_ == &_default_$name$_) {\n"
+ " $name$_ = new ::std::string;\n"
+ " }\n"
+ " $name$_->assign(value);\n"
+ "}\n");
+ }
+
printer->Print(variables_,
"inline ::std::string* $classname$::mutable_$name$() {\n"
" _set_bit($index$);\n"
@@ -245,10 +265,18 @@ GenerateAccessorDeclarations(io::Printer* printer) const {
"inline const ::std::string& $name$(int index) const;\n"
"inline ::std::string* mutable_$name$(int index);\n"
"inline void set_$name$(int index, const ::std::string& value);\n"
- "inline void set_$name$(int index, const char* value);\n"
"inline ::std::string* add_$name$();\n"
- "inline void add_$name$(const ::std::string& value);\n"
- "inline void add_$name$(const char* value);\n");
+ "inline void add_$name$(const ::std::string& value);\n");
+
+ if (descriptor_->type() == FieldDescriptor::TYPE_BYTES) {
+ printer->Print(variables_,
+ "inline void set_$name$(int index, const char* value, size_t size);\n"
+ "inline void add_$name$(const char* value, size_t size);\n");
+ } else {
+ printer->Print(variables_,
+ "inline void set_$name$(int index, const char* value);\n"
+ "inline void add_$name$(const char* value);\n");
+ }
if (descriptor_->options().has_ctype()) {
printer->Outdent();
@@ -277,18 +305,31 @@ GenerateInlineAccessorDefinitions(io::Printer* printer) const {
"inline void $classname$::set_$name$(int index, const ::std::string& value) {\n"
" $name$_.Mutable(index)->assign(value);\n"
"}\n"
- "inline void $classname$::set_$name$(int index, const char* value) {\n"
- " $name$_.Mutable(index)->assign(value);\n"
- "}\n"
"inline ::std::string* $classname$::add_$name$() {\n"
" return $name$_.Add();\n"
"}\n"
"inline void $classname$::add_$name$(const ::std::string& value) {\n"
" $name$_.Add()->assign(value);\n"
- "}\n"
- "inline void $classname$::add_$name$(const char* value) {\n"
- " $name$_.Add()->assign(value);\n"
"}\n");
+
+ if (descriptor_->type() == FieldDescriptor::TYPE_BYTES) {
+ printer->Print(variables_,
+ "inline void "
+ "$classname$::set_$name$(int index, const char* value, size_t size) {\n"
+ " $name$_.Mutable(index)->assign(value, size);\n"
+ "}\n"
+ "inline void $classname$::add_$name$(const char* value, size_t size) {\n"
+ " $name$_.Add()->assign(value, size);\n"
+ "}\n");
+ } else {
+ printer->Print(variables_,
+ "inline void $classname$::set_$name$(int index, const char* value) {\n"
+ " $name$_.Mutable(index)->assign(value);\n"
+ "}\n"
+ "inline void $classname$::add_$name$(const char* value) {\n"
+ " $name$_.Add()->assign(value);\n"
+ "}\n");
+ }
}
void RepeatedStringFieldGenerator::