mirror of
https://github.com/termux-pacman/termux-packages.git
synced 2026-01-11 13:23:23 +00:00
183 lines
8.6 KiB
Diff
183 lines
8.6 KiB
Diff
+++ ./protoc-gen-c/c_helpers.h
|
|
@@ -65,6 +65,7 @@
|
|
#define PROTOBUF_C_PROTOC_GEN_C_C_HELPERS_H__
|
|
|
|
#include <string>
|
|
+#include <string_view>
|
|
#include <vector>
|
|
#include <sstream>
|
|
|
|
@@ -196,6 +197,19 @@
|
|
# define GOOGLE_LOG ABSL_LOG
|
|
#endif
|
|
|
|
+// std::string_view versions of above functions
|
|
+static inline std::string CEscape(const std::string_view& src) { return CEscape(std::string{src}); }
|
|
+static inline std::string CamelToUpper(const std::string_view &class_name) { return CamelToUpper(std::string{class_name}); }
|
|
+static inline std::string CamelToLower(const std::string_view &class_name) { return CamelToLower(std::string{class_name}); }
|
|
+static inline std::string ToCamel(const std::string_view &name) { return ToCamel(std::string{name}); }
|
|
+static inline std::string ToLower(const std::string_view &class_name) { return ToLower(std::string{class_name}); }
|
|
+static inline std::string ToUpper(const std::string_view &class_name) { return ToUpper(std::string{class_name}); }
|
|
+static inline std::string FullNameToLower(const std::string_view &full_name, const google::protobuf::FileDescriptor *file) { return FullNameToLower(std::string{full_name}, file); }
|
|
+static inline std::string FullNameToUpper(const std::string_view &full_name, const google::protobuf::FileDescriptor *file) { return FullNameToUpper(std::string{full_name}, file); }
|
|
+static inline std::string FullNameToC(const std::string_view &class_name, const google::protobuf::FileDescriptor *file) { return FullNameToC(std::string{class_name}, file); }
|
|
+static inline std::string StripProto(const std::string_view& filename) { return StripProto(std::string{filename}); }
|
|
+static inline std::string FilenameIdentifier(const std::string_view& filename) { return FilenameIdentifier(std::string{filename}); }
|
|
+
|
|
} // namespace protobuf_c
|
|
|
|
#endif // PROTOBUF_C_PROTOC_GEN_C_C_HELPERS_H__
|
|
+++ ./protoc-gen-c/c_enum_field.cc
|
|
@@ -78,7 +78,7 @@
|
|
(*variables)["type"] = FullNameToC(descriptor->enum_type()->full_name(), descriptor->enum_type()->file());
|
|
const google::protobuf::EnumValueDescriptor* default_value = descriptor->default_value_enum();
|
|
(*variables)["default"] = FullNameToUpper(default_value->type()->full_name(), default_value->type()->file())
|
|
- + "__" + default_value->name();
|
|
+ + "__" + std::string{default_value->name()};
|
|
(*variables)["deprecated"] = FieldDeprecated(descriptor);
|
|
}
|
|
|
|
+++ ./protoc-gen-c/c_enum.cc
|
|
@@ -152,7 +152,7 @@
|
|
descriptor_->file()->options().optimize_for() ==
|
|
google::protobuf::FileOptions_OptimizeMode_CODE_SIZE;
|
|
vars["enum_value_name"] = vd->name();
|
|
- vars["c_enum_value_name"] = FullNameToUpper(descriptor_->full_name(), descriptor_->file()) + "__" + vd->name();
|
|
+ vars["c_enum_value_name"] = FullNameToUpper(descriptor_->full_name(), descriptor_->file()) + "__" + std::string{vd->name()};
|
|
vars["value"] = SimpleItoa(vd->number());
|
|
if (optimize_code_size)
|
|
printer->Print(vars, " { NULL, NULL, $value$ }, /* CODE_SIZE */\n");
|
|
@@ -194,18 +194,29 @@
|
|
|
|
// Sort by name and value, dropping duplicate values if they appear later.
|
|
// TODO: use a c++ paradigm for this!
|
|
- NameIndex *name_index = new NameIndex[descriptor_->value_count()];
|
|
- ValueIndex *value_index = new ValueIndex[descriptor_->value_count()];
|
|
+ struct _ValueIndex {
|
|
+ int value;
|
|
+ unsigned index;
|
|
+ unsigned final_index; /* index in uniqified array of values */
|
|
+ const google::protobuf::EnumValueDescriptor *vd;
|
|
+ };
|
|
+ _ValueIndex *value_index = new _ValueIndex[descriptor_->value_count()];
|
|
for (int j = 0; j < descriptor_->value_count(); j++) {
|
|
- const google::protobuf::EnumValueDescriptor *vd = descriptor_->value(j);
|
|
- name_index[j].index = j;
|
|
- name_index[j].name = vd->name().c_str();
|
|
+ value_index[j].vd = descriptor_->value(j);
|
|
value_index[j].index = j;
|
|
- value_index[j].value = vd->number();
|
|
- value_index[j].name = vd->name().c_str();
|
|
+ value_index[j].value = value_index[j].vd->number();
|
|
}
|
|
qsort(value_index, descriptor_->value_count(),
|
|
- sizeof(ValueIndex), compare_value_indices_by_value_then_index);
|
|
+ sizeof(_ValueIndex), [](const void *a, const void *b) -> int {
|
|
+ const _ValueIndex *vi_a = static_cast<const _ValueIndex*>(a);
|
|
+ const _ValueIndex *vi_b = static_cast<const _ValueIndex*>(b);
|
|
+
|
|
+ if (vi_a->value < vi_b->value) return -1;
|
|
+ if (vi_a->value > vi_b->value) return +1;
|
|
+ if (vi_a->index < vi_b->index) return -1;
|
|
+ if (vi_a->index > vi_b->index) return +1;
|
|
+ return 0;
|
|
+ });
|
|
|
|
// only record unique values
|
|
int n_unique_values;
|
|
@@ -276,13 +287,17 @@
|
|
|
|
if (!optimize_code_size) {
|
|
qsort(value_index, descriptor_->value_count(),
|
|
- sizeof(ValueIndex), compare_value_indices_by_name);
|
|
+ sizeof(_ValueIndex), [](const void *a, const void *b) -> int {
|
|
+ const _ValueIndex *vi_a = static_cast<const _ValueIndex*>(a);
|
|
+ const _ValueIndex *vi_b = static_cast<const _ValueIndex*>(b);
|
|
+ return strncmp(vi_a->vd->name().data(), vi_b->vd->name().data(), std::min(vi_a->vd->name().size(), vi_b->vd->name().size()));
|
|
+ });
|
|
printer->Print(vars,
|
|
"static const ProtobufCEnumValueIndex $lcclassname$__enum_values_by_name[$value_count$] =\n"
|
|
"{\n");
|
|
for (int j = 0; j < descriptor_->value_count(); j++) {
|
|
vars["index"] = SimpleItoa(value_index[j].final_index);
|
|
- vars["name"] = value_index[j].name;
|
|
+ vars["name"] = std::string{value_index[j].vd->name()};
|
|
printer->Print (vars, " { \"$name$\", $index$ },\n");
|
|
}
|
|
printer->Print(vars, "};\n");
|
|
@@ -321,7 +336,6 @@
|
|
}
|
|
|
|
delete[] value_index;
|
|
- delete[] name_index;
|
|
}
|
|
|
|
} // namespace protobuf_c
|
|
+++ ./protoc-gen-c/c_message.cc
|
|
@@ -581,17 +581,25 @@
|
|
printer->Print(vars, "};\n");
|
|
|
|
if (!optimize_code_size) {
|
|
- NameIndex *field_indices = new NameIndex [descriptor_->field_count()];
|
|
+ struct _NameIndex {
|
|
+ unsigned index;
|
|
+ const google::protobuf::FieldDescriptor* field;
|
|
+ };
|
|
+ _NameIndex *field_indices = new _NameIndex [descriptor_->field_count()];
|
|
for (int i = 0; i < descriptor_->field_count(); i++) {
|
|
- field_indices[i].name = sorted_fields[i]->name().c_str();
|
|
+ field_indices[i].field = sorted_fields[i];
|
|
field_indices[i].index = i;
|
|
}
|
|
- qsort (field_indices, descriptor_->field_count(), sizeof (NameIndex),
|
|
- compare_name_indices_by_name);
|
|
+ qsort (field_indices, descriptor_->field_count(), sizeof (_NameIndex),
|
|
+ [](const void *a, const void *b) -> int {
|
|
+ const _NameIndex *vi_a = static_cast<const _NameIndex*>(a);
|
|
+ const _NameIndex *vi_b = static_cast<const _NameIndex*>(b);
|
|
+ return strncmp(vi_a->field->name().data(), vi_b->field->name().data(), std::min(vi_a->field->name().size(), vi_b->field->name().size()));
|
|
+ });
|
|
printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n");
|
|
for (int i = 0; i < descriptor_->field_count(); i++) {
|
|
vars["index"] = SimpleItoa(field_indices[i].index);
|
|
- vars["name"] = field_indices[i].name;
|
|
+ vars["name"] = std::string{field_indices[i].field->name()};
|
|
printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n");
|
|
}
|
|
printer->Print("};\n");
|
|
+++ ./protoc-gen-c/c_service.cc
|
|
@@ -184,13 +184,13 @@
|
|
"}\n");
|
|
}
|
|
|
|
-struct MethodIndexAndName { unsigned i; const char *name; };
|
|
+struct MethodIndexAndName { unsigned i; const google::protobuf::MethodDescriptor* method; };
|
|
static int
|
|
compare_method_index_and_name_by_name (const void *a, const void *b)
|
|
{
|
|
const MethodIndexAndName *ma = (const MethodIndexAndName *) a;
|
|
const MethodIndexAndName *mb = (const MethodIndexAndName *) b;
|
|
- return strcmp (ma->name, mb->name);
|
|
+ return strncmp (ma->method->name().data(), mb->method->name().data(), std::min(ma->method->name().size(), ma->method->name().size()));
|
|
}
|
|
|
|
void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* printer)
|
|
@@ -218,7 +218,7 @@
|
|
" { \"$method$\", $input_descriptor$, $output_descriptor$ },\n");
|
|
}
|
|
mi_array[i].i = i;
|
|
- mi_array[i].name = method->name().c_str();
|
|
+ mi_array[i].method = method;
|
|
}
|
|
printer->Print(vars_, "};\n");
|
|
|
|
@@ -228,7 +228,7 @@
|
|
printer->Print(vars_, "const unsigned $lcfullname$__method_indices_by_name[] = {\n");
|
|
for (int i = 0; i < n_methods; i++) {
|
|
vars_["i"] = SimpleItoa(mi_array[i].i);
|
|
- vars_["name"] = mi_array[i].name;
|
|
+ vars_["name"] = std::string{mi_array[i].method->name()};
|
|
vars_["comma"] = (i + 1 < n_methods) ? "," : " ";
|
|
printer->Print(vars_, " $i$$comma$ /* $name$ */\n");
|
|
}
|