aboutsummaryrefslogtreecommitdiffstats
path: root/Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc')
-rw-r--r--Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc227
1 files changed, 227 insertions, 0 deletions
diff --git a/Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc b/Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc
new file mode 100644
index 000000000..9fa56ef0e
--- /dev/null
+++ b/Software/External Repositories/Protobuf/protobuf-c-master/protoc-c/c_field.cc
@@ -0,0 +1,227 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: kenton@google.com (Kenton Varda)
+// Based on original Protocol Buffers design by
+// Sanjay Ghemawat, Jeff Dean, and others.
+
+// Copyright (c) 2008-2013, Dave Benson. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Modified to implement C code by Dave Benson.
+
+#include <protoc-c/c_field.h>
+#include <protoc-c/c_primitive_field.h>
+#include <protoc-c/c_string_field.h>
+#include <protoc-c/c_bytes_field.h>
+#include <protoc-c/c_enum_field.h>
+#include <protoc-c/c_message_field.h>
+#include <protoc-c/c_helpers.h>
+#include <google/protobuf/descriptor.pb.h>
+#include <google/protobuf/stubs/common.h>
+#include <google/protobuf/io/printer.h>
+
+namespace google {
+namespace protobuf {
+namespace compiler {
+namespace c {
+
+FieldGenerator::~FieldGenerator()
+{
+}
+static bool is_packable_type(FieldDescriptor::Type type)
+{
+ return type == FieldDescriptor::TYPE_DOUBLE
+ || type == FieldDescriptor::TYPE_FLOAT
+ || type == FieldDescriptor::TYPE_INT64
+ || type == FieldDescriptor::TYPE_UINT64
+ || type == FieldDescriptor::TYPE_INT32
+ || type == FieldDescriptor::TYPE_FIXED64
+ || type == FieldDescriptor::TYPE_FIXED32
+ || type == FieldDescriptor::TYPE_BOOL
+ || type == FieldDescriptor::TYPE_UINT32
+ || type == FieldDescriptor::TYPE_ENUM
+ || type == FieldDescriptor::TYPE_SFIXED32
+ || type == FieldDescriptor::TYPE_SFIXED64
+ || type == FieldDescriptor::TYPE_SINT32
+ || type == FieldDescriptor::TYPE_SINT64;
+ //TYPE_BYTES
+ //TYPE_STRING
+ //TYPE_GROUP
+ //TYPE_MESSAGE
+}
+
+void FieldGenerator::GenerateDescriptorInitializerGeneric(io::Printer* printer,
+ bool optional_uses_has,
+ const string &type_macro,
+ const string &descriptor_addr) const
+{
+ std::map<string, string> variables;
+ variables["TYPE"] = type_macro;
+ variables["classname"] = FullNameToC(FieldScope(descriptor_)->full_name());
+ variables["name"] = FieldName(descriptor_);
+ variables["proto_name"] = descriptor_->name();
+ variables["descriptor_addr"] = descriptor_addr;
+ variables["value"] = SimpleItoa(descriptor_->number());
+ const OneofDescriptor *oneof = descriptor_->containing_oneof();
+ if (oneof != NULL)
+ variables["oneofname"] = FullNameToLower(oneof->name());
+
+ if (FieldSyntax(descriptor_) == 3 &&
+ descriptor_->label() == FieldDescriptor::LABEL_OPTIONAL) {
+ variables["LABEL"] = "NONE";
+ optional_uses_has = false;
+ } else {
+ variables["LABEL"] = CamelToUpper(GetLabelName(descriptor_->label()));
+ }
+
+ if (descriptor_->has_default_value()) {
+ variables["default_value"] = string("&")
+ + FullNameToLower(descriptor_->full_name())
+ + "__default_value";
+ } else if (FieldSyntax(descriptor_) == 3 &&
+ descriptor_->type() == FieldDescriptor::TYPE_STRING) {
+ variables["default_value"] = "&protobuf_c_empty_string";
+ } else {
+ variables["default_value"] = "NULL";
+ }
+
+ variables["flags"] = "0";
+
+ if (descriptor_->label() == FieldDescriptor::LABEL_REPEATED
+ && is_packable_type (descriptor_->type())
+ && descriptor_->options().packed())
+ variables["flags"] += " | PROTOBUF_C_FIELD_FLAG_PACKED";
+
+ if (descriptor_->options().deprecated())
+ variables["flags"] += " | PROTOBUF_C_FIELD_FLAG_DEPRECATED";
+
+ if (oneof != NULL)
+ variables["flags"] += " | PROTOBUF_C_FIELD_FLAG_ONEOF";
+
+ printer->Print("{\n");
+ if (descriptor_->file()->options().has_optimize_for() &&
+ descriptor_->file()->options().optimize_for() ==
+ FileOptions_OptimizeMode_CODE_SIZE) {
+ printer->Print(" NULL, /* CODE_SIZE */\n");
+ } else {
+ printer->Print(variables, " \"$proto_name$\",\n");
+ }
+ printer->Print(variables,
+ " $value$,\n"
+ " PROTOBUF_C_LABEL_$LABEL$,\n"
+ " PROTOBUF_C_TYPE_$TYPE$,\n");
+ switch (descriptor_->label()) {
+ case FieldDescriptor::LABEL_REQUIRED:
+ printer->Print(variables, " 0, /* quantifier_offset */\n");
+ break;
+ case FieldDescriptor::LABEL_OPTIONAL:
+ if (oneof != NULL) {
+ printer->Print(variables, " offsetof($classname$, $oneofname$_case),\n");
+ } else if (optional_uses_has) {
+ printer->Print(variables, " offsetof($classname$, has_$name$),\n");
+ } else {
+ printer->Print(variables, " 0, /* quantifier_offset */\n");
+ }
+ break;
+ case FieldDescriptor::LABEL_REPEATED:
+ printer->Print(variables, " offsetof($classname$, n_$name$),\n");
+ break;
+ }
+ printer->Print(variables, " offsetof($classname$, $name$),\n");
+ printer->Print(variables, " $descriptor_addr$,\n");
+ printer->Print(variables, " $default_value$,\n");
+ printer->Print(variables, " $flags$, /* flags */\n");
+ printer->Print(variables, " 0,NULL,NULL /* reserved1,reserved2, etc */\n");
+ printer->Print("},\n");
+}
+
+FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor)
+ : descriptor_(descriptor),
+ field_generators_(
+ new scoped_ptr<FieldGenerator>[descriptor->field_count()]) {
+ // Construct all the FieldGenerators.
+ for (int i = 0; i < descriptor->field_count(); i++) {
+ field_generators_[i].reset(MakeGenerator(descriptor->field(i)));
+ }
+}
+
+FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field) {
+ switch (field->type()) {
+ case FieldDescriptor::TYPE_MESSAGE:
+ return new MessageFieldGenerator(field);
+ case FieldDescriptor::TYPE_STRING:
+ return new StringFieldGenerator(field);
+ case FieldDescriptor::TYPE_BYTES:
+ return new BytesFieldGenerator(field);
+ case FieldDescriptor::TYPE_ENUM:
+ return new EnumFieldGenerator(field);
+ case FieldDescriptor::TYPE_GROUP:
+ return 0; // XXX
+ default:
+ return new PrimitiveFieldGenerator(field);
+ }
+}
+
+FieldGeneratorMap::~FieldGeneratorMap() {}
+
+const FieldGenerator& FieldGeneratorMap::get(
+ const FieldDescriptor* field) const {
+ GOOGLE_CHECK_EQ(field->containing_type(), descriptor_);
+ return *field_generators_[field->index()];
+}
+
+} // namespace c
+} // namespace compiler
+} // namespace protobuf
+} // namespace google