Commit 0edca93d authored by Robert Edmonds's avatar Robert Edmonds

Convert various uses of `const char *` to `compat::StringView`

Also replace some uses of arrays manually allocated with new/delete with
uses of `std::vector`.
parent 75f1c32c
...@@ -142,7 +142,7 @@ struct ValueIndex ...@@ -142,7 +142,7 @@ struct ValueIndex
int value; int value;
unsigned index; unsigned index;
unsigned final_index; /* index in uniqified array of values */ unsigned final_index; /* index in uniqified array of values */
const char *name; compat::StringView name;
}; };
void EnumGenerator::GenerateValueInitializer(google::protobuf::io::Printer *printer, int index) void EnumGenerator::GenerateValueInitializer(google::protobuf::io::Printer *printer, int index)
{ {
...@@ -176,7 +176,7 @@ static int compare_value_indices_by_name(const void *a, const void *b) ...@@ -176,7 +176,7 @@ static int compare_value_indices_by_name(const void *a, const void *b)
{ {
const ValueIndex *vi_a = (const ValueIndex *) a; const ValueIndex *vi_a = (const ValueIndex *) a;
const ValueIndex *vi_b = (const ValueIndex *) b; const ValueIndex *vi_b = (const ValueIndex *) b;
return strcmp (vi_a->name, vi_b->name); return vi_a->name.compare(vi_b->name);
} }
void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printer) { void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printer) {
...@@ -194,18 +194,20 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe ...@@ -194,18 +194,20 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
// Sort by name and value, dropping duplicate values if they appear later. // Sort by name and value, dropping duplicate values if they appear later.
// TODO: use a c++ paradigm for this! // TODO: use a c++ paradigm for this!
NameIndex *name_index = new NameIndex[descriptor_->value_count()]; std::vector<ValueIndex> value_index;
ValueIndex *value_index = new ValueIndex[descriptor_->value_count()]; for (unsigned j = 0; j < descriptor_->value_count(); j++) {
for (int j = 0; j < descriptor_->value_count(); j++) {
const google::protobuf::EnumValueDescriptor *vd = descriptor_->value(j); const google::protobuf::EnumValueDescriptor *vd = descriptor_->value(j);
name_index[j].index = j; value_index.push_back({
name_index[j].name = vd->name().c_str(); .value = vd->number(),
value_index[j].index = j; .index = j,
value_index[j].value = vd->number(); .final_index = 0,
value_index[j].name = vd->name().c_str(); .name = vd->name(),
});
} }
qsort(value_index, descriptor_->value_count(), qsort(&value_index[0],
sizeof(ValueIndex), compare_value_indices_by_value_then_index); value_index.size(),
sizeof(ValueIndex),
compare_value_indices_by_value_then_index);
// only record unique values // only record unique values
int n_unique_values; int n_unique_values;
...@@ -275,8 +277,10 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe ...@@ -275,8 +277,10 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
vars["n_ranges"] = SimpleItoa(n_ranges); vars["n_ranges"] = SimpleItoa(n_ranges);
if (!optimize_code_size) { if (!optimize_code_size) {
qsort(value_index, descriptor_->value_count(), qsort(&value_index[0],
sizeof(ValueIndex), compare_value_indices_by_name); value_index.size(),
sizeof(ValueIndex),
compare_value_indices_by_name);
printer->Print(vars, printer->Print(vars,
"static const ProtobufCEnumValueIndex $lcclassname$__enum_values_by_name[$value_count$] =\n" "static const ProtobufCEnumValueIndex $lcclassname$__enum_values_by_name[$value_count$] =\n"
"{\n"); "{\n");
...@@ -319,9 +323,6 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe ...@@ -319,9 +323,6 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
" NULL,NULL,NULL,NULL /* reserved[1234] */\n" " NULL,NULL,NULL,NULL /* reserved[1234] */\n"
"};\n"); "};\n");
} }
delete[] value_index;
delete[] name_index;
} }
} // namespace protobuf_c } // namespace protobuf_c
...@@ -261,7 +261,7 @@ int compare_name_indices_by_name(const void *a, const void *b) ...@@ -261,7 +261,7 @@ int compare_name_indices_by_name(const void *a, const void *b)
{ {
const NameIndex *ni_a = (const NameIndex *) a; const NameIndex *ni_a = (const NameIndex *) a;
const NameIndex *ni_b = (const NameIndex *) b; const NameIndex *ni_b = (const NameIndex *) b;
return strcmp (ni_a->name, ni_b->name); return ni_a->name.compare(ni_b->name);
} }
std::string CEscape(compat::StringView src); std::string CEscape(compat::StringView src);
......
...@@ -160,7 +160,7 @@ unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, co ...@@ -160,7 +160,7 @@ unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, co
struct NameIndex struct NameIndex
{ {
unsigned index; unsigned index;
const char *name; compat::StringView name;
}; };
int compare_name_indices_by_name(const void*, const void*); int compare_name_indices_by_name(const void*, const void*);
......
...@@ -567,27 +567,26 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) ...@@ -567,27 +567,26 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init)
"static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n" "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n"
"{\n"); "{\n");
printer->Indent(); printer->Indent();
const google::protobuf::FieldDescriptor **sorted_fields = new const google::protobuf::FieldDescriptor *[descriptor_->field_count()];
std::vector<const google::protobuf::FieldDescriptor*> sorted_fields;
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
sorted_fields[i] = descriptor_->field(i); sorted_fields.push_back(descriptor_->field(i));
} }
qsort (sorted_fields, descriptor_->field_count(), qsort(&sorted_fields[0], sorted_fields.size(),
sizeof(const google::protobuf::FieldDescriptor*), sizeof(const google::protobuf::FieldDescriptor*),
compare_pfields_by_number); compare_pfields_by_number);
for (int i = 0; i < descriptor_->field_count(); i++) { for (auto field : sorted_fields) {
const google::protobuf::FieldDescriptor* field = sorted_fields[i];
field_generators_.get(field).GenerateDescriptorInitializer(printer); field_generators_.get(field).GenerateDescriptorInitializer(printer);
} }
printer->Outdent(); printer->Outdent();
printer->Print(vars, "};\n"); printer->Print(vars, "};\n");
if (!optimize_code_size) { if (!optimize_code_size) {
NameIndex *field_indices = new NameIndex [descriptor_->field_count()]; std::vector<NameIndex> field_indices;
for (int i = 0; i < descriptor_->field_count(); i++) { for (unsigned i = 0; i < descriptor_->field_count(); i++) {
field_indices[i].name = sorted_fields[i]->name().c_str(); field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() });
field_indices[i].index = i;
} }
qsort (field_indices, descriptor_->field_count(), sizeof (NameIndex), qsort(&field_indices[0], field_indices.size(), sizeof(NameIndex),
compare_name_indices_by_name); compare_name_indices_by_name);
printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n"); printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n");
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
...@@ -596,19 +595,16 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) ...@@ -596,19 +595,16 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init)
printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n"); printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n");
} }
printer->Print("};\n"); printer->Print("};\n");
delete[] field_indices;
} }
// create range initializers // create range initializers
int *values = new int[descriptor_->field_count()]; std::vector<int> values;
for (int i = 0; i < descriptor_->field_count(); i++) { for (int i = 0; i < descriptor_->field_count(); i++) {
values[i] = sorted_fields[i]->number(); values.push_back(sorted_fields[i]->number());
} }
int n_ranges = WriteIntRanges(printer, int n_ranges = WriteIntRanges(printer,
descriptor_->field_count(), values, descriptor_->field_count(), &values[0],
vars["lcclassname"] + "__number_ranges"); vars["lcclassname"] + "__number_ranges");
delete [] values;
delete [] sorted_fields;
vars["n_ranges"] = SimpleItoa(n_ranges); vars["n_ranges"] = SimpleItoa(n_ranges);
} else { } else {
......
...@@ -184,19 +184,19 @@ void ServiceGenerator::GenerateInit(google::protobuf::io::Printer* printer) ...@@ -184,19 +184,19 @@ void ServiceGenerator::GenerateInit(google::protobuf::io::Printer* printer)
"}\n"); "}\n");
} }
struct MethodIndexAndName { unsigned i; const char *name; }; struct MethodIndexAndName { unsigned i; compat::StringView name; };
static int static int
compare_method_index_and_name_by_name (const void *a, const void *b) compare_method_index_and_name_by_name (const void *a, const void *b)
{ {
const MethodIndexAndName *ma = (const MethodIndexAndName *) a; const MethodIndexAndName *ma = (const MethodIndexAndName *) a;
const MethodIndexAndName *mb = (const MethodIndexAndName *) b; const MethodIndexAndName *mb = (const MethodIndexAndName *) b;
return strcmp (ma->name, mb->name); return ma->name.compare(mb->name);
} }
void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* printer) void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* printer)
{ {
int n_methods = descriptor_->method_count(); int n_methods = descriptor_->method_count();
MethodIndexAndName *mi_array = new MethodIndexAndName[n_methods]; std::vector<MethodIndexAndName> mi_array;
bool optimize_code_size = descriptor_->file()->options().has_optimize_for() && bool optimize_code_size = descriptor_->file()->options().has_optimize_for() &&
descriptor_->file()->options().optimize_for() == descriptor_->file()->options().optimize_for() ==
...@@ -205,7 +205,7 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* ...@@ -205,7 +205,7 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer*
vars_["n_methods"] = SimpleItoa(n_methods); vars_["n_methods"] = SimpleItoa(n_methods);
printer->Print(vars_, "static const ProtobufCMethodDescriptor $lcfullname$__method_descriptors[$n_methods$] =\n" printer->Print(vars_, "static const ProtobufCMethodDescriptor $lcfullname$__method_descriptors[$n_methods$] =\n"
"{\n"); "{\n");
for (int i = 0; i < n_methods; i++) { for (unsigned i = 0; i < n_methods; i++) {
const google::protobuf::MethodDescriptor* method = descriptor_->method(i); const google::protobuf::MethodDescriptor* method = descriptor_->method(i);
vars_["method"] = method->name(); vars_["method"] = method->name();
vars_["input_descriptor"] = "&" + FullNameToLower(method->input_type()->full_name(), method->input_type()->file()) + "__descriptor"; vars_["input_descriptor"] = "&" + FullNameToLower(method->input_type()->full_name(), method->input_type()->file()) + "__descriptor";
...@@ -217,14 +217,15 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* ...@@ -217,14 +217,15 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer*
printer->Print(vars_, printer->Print(vars_,
" { \"$method$\", $input_descriptor$, $output_descriptor$ },\n"); " { \"$method$\", $input_descriptor$, $output_descriptor$ },\n");
} }
mi_array[i].i = i; mi_array.push_back({i, method->name()});
mi_array[i].name = method->name().c_str();
} }
printer->Print(vars_, "};\n"); printer->Print(vars_, "};\n");
if (!optimize_code_size) { if (!optimize_code_size) {
qsort ((void*)mi_array, n_methods, sizeof (MethodIndexAndName), qsort(&mi_array[0],
compare_method_index_and_name_by_name); mi_array.size(),
sizeof(MethodIndexAndName),
compare_method_index_and_name_by_name);
printer->Print(vars_, "const unsigned $lcfullname$__method_indices_by_name[] = {\n"); printer->Print(vars_, "const unsigned $lcfullname$__method_indices_by_name[] = {\n");
for (int i = 0; i < n_methods; i++) { for (int i = 0; i < n_methods; i++) {
vars_["i"] = SimpleItoa(mi_array[i].i); vars_["i"] = SimpleItoa(mi_array[i].i);
...@@ -258,8 +259,6 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* ...@@ -258,8 +259,6 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer*
" $lcfullname$__method_indices_by_name\n" " $lcfullname$__method_indices_by_name\n"
"};\n"); "};\n");
} }
delete[] mi_array;
} }
void ServiceGenerator::GenerateCallersImplementations(google::protobuf::io::Printer* printer) void ServiceGenerator::GenerateCallersImplementations(google::protobuf::io::Printer* printer)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment