From 928ebb6b55a23972573328e0ca9500d9730249af Mon Sep 17 00:00:00 2001 From: temporal Date: Wed, 16 Jul 2008 02:00:27 +0000 Subject: Fix bytes type setter to work with byte sequences with embedded NULLs. Patch from Alkis Evlogimenos . --- .../protobuf/compiler/cpp/cpp_string_field.cc | 77 +++++++++++++++++----- 1 file changed, 59 insertions(+), 18 deletions(-) (limited to 'src/google/protobuf/compiler/cpp/cpp_string_field.cc') 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:: -- cgit v1.2.3