aboutsummaryrefslogtreecommitdiff
path: root/libraries/protobuf-c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/protobuf-c')
-rw-r--r--libraries/protobuf-c/762.patch1443
-rw-r--r--libraries/protobuf-c/protobuf-c.SlackBuild8
-rw-r--r--libraries/protobuf-c/protobuf-c.info6
3 files changed, 5 insertions, 1452 deletions
diff --git a/libraries/protobuf-c/762.patch b/libraries/protobuf-c/762.patch
deleted file mode 100644
index 3b660f84d7..0000000000
--- a/libraries/protobuf-c/762.patch
+++ /dev/null
@@ -1,1443 +0,0 @@
-From b28683f8027bf1e886b748b5603eb16d203b5a92 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 18:18:33 -0500
-Subject: [PATCH 01/11] protoc-gen-c/c_helpers.h: Move compat defines into new
- header file compat.h
-
----
- protoc-gen-c/c_field.cc | 1 +
- protoc-gen-c/c_helpers.cc | 1 +
- protoc-gen-c/c_helpers.h | 10 -------
- protoc-gen-c/c_message.cc | 1 +
- protoc-gen-c/c_primitive_field.cc | 1 +
- protoc-gen-c/compat.h | 46 +++++++++++++++++++++++++++++++
- protoc-gen-c/main.cc | 1 +
- 7 files changed, 51 insertions(+), 10 deletions(-)
- create mode 100644 protoc-gen-c/compat.h
-
-diff --git a/protoc-gen-c/c_field.cc b/protoc-gen-c/c_field.cc
-index 5e79967b..d6d8597e 100644
---- a/protoc-gen-c/c_field.cc
-+++ b/protoc-gen-c/c_field.cc
-@@ -74,6 +74,7 @@
- #include "c_message_field.h"
- #include "c_primitive_field.h"
- #include "c_string_field.h"
-+#include "compat.h"
-
- namespace protobuf_c {
-
-diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc
-index 5edcf904..c38843f8 100644
---- a/protoc-gen-c/c_helpers.cc
-+++ b/protoc-gen-c/c_helpers.cc
-@@ -73,6 +73,7 @@
- #include <google/protobuf/stubs/common.h>
-
- #include "c_helpers.h"
-+#include "compat.h"
-
- namespace protobuf_c {
-
-diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h
-index 943676e9..e69504bb 100644
---- a/protoc-gen-c/c_helpers.h
-+++ b/protoc-gen-c/c_helpers.h
-@@ -186,16 +186,6 @@ inline int FieldSyntax(const google::protobuf::FieldDescriptor* field) {
- return 2;
- }
-
--// Work around changes in protobuf >= 22.x without breaking compilation against
--// older protobuf versions.
--#if GOOGLE_PROTOBUF_VERSION >= 4022000
--# define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE
--# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ
--# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ
--# define GOOGLE_DCHECK_GE ABSL_DCHECK_GE
--# define GOOGLE_LOG ABSL_LOG
--#endif
--
- } // namespace protobuf_c
-
- #endif // PROTOBUF_C_PROTOC_GEN_C_C_HELPERS_H__
-diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc
-index d4a9a01e..46413873 100644
---- a/protoc-gen-c/c_message.cc
-+++ b/protoc-gen-c/c_message.cc
-@@ -78,6 +78,7 @@
- #include "c_extension.h"
- #include "c_helpers.h"
- #include "c_message.h"
-+#include "compat.h"
-
- namespace protobuf_c {
-
-diff --git a/protoc-gen-c/c_primitive_field.cc b/protoc-gen-c/c_primitive_field.cc
-index 253b00bd..588f60e6 100644
---- a/protoc-gen-c/c_primitive_field.cc
-+++ b/protoc-gen-c/c_primitive_field.cc
-@@ -67,6 +67,7 @@
-
- #include "c_helpers.h"
- #include "c_primitive_field.h"
-+#include "compat.h"
-
- namespace protobuf_c {
-
-diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h
-new file mode 100644
-index 00000000..2ee78281
---- /dev/null
-+++ b/protoc-gen-c/compat.h
-@@ -0,0 +1,46 @@
-+// Copyright (c) 2008-2025, Dave Benson and the protobuf-c authors.
-+// 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.
-+
-+#ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
-+#define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
-+
-+#if GOOGLE_PROTOBUF_VERSION >= 4022000
-+# define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE
-+# define GOOGLE_CHECK_EQ ABSL_CHECK_EQ
-+# define GOOGLE_DCHECK_GE ABSL_DCHECK_GE
-+# define GOOGLE_LOG ABSL_LOG
-+#endif
-+
-+namespace protobuf_c {
-+
-+namespace compat {
-+
-+} // namespace compat
-+
-+} // namespace protobuf_c
-+
-+#endif // PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
-diff --git a/protoc-gen-c/main.cc b/protoc-gen-c/main.cc
-index 0656c113..5ab929d3 100644
---- a/protoc-gen-c/main.cc
-+++ b/protoc-gen-c/main.cc
-@@ -32,6 +32,7 @@
-
- #include "c_generator.h"
- #include "c_helpers.h"
-+#include "compat.h"
-
- int main(int argc, char* argv[]) {
- protobuf_c::CGenerator c_generator;
-
-From 1678f1fba6f2d3e5c1db2817495ddcd72bd4e87b Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:09:03 -0500
-Subject: [PATCH 02/11] protoc-gen-c/compat.h: Add `compat::StringView` type
-
-protobuf >= 30.x replaces `const std::string&` in various APIs with
-its own string view type that may actually be a `absl::string_view`.
-Introduce our own `compat::StringView` type that we can use instead
-of `const std::string&` in order to support compiling across multiple
-protobuf versions.
----
- protoc-gen-c/compat.h | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
-diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h
-index 2ee78281..fe8041b5 100644
---- a/protoc-gen-c/compat.h
-+++ b/protoc-gen-c/compat.h
-@@ -28,6 +28,8 @@
- #ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
- #define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
-
-+#include <string>
-+
- #if GOOGLE_PROTOBUF_VERSION >= 4022000
- # define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE
- # define GOOGLE_CHECK_EQ ABSL_CHECK_EQ
-@@ -39,6 +41,12 @@ namespace protobuf_c {
-
- namespace compat {
-
-+#if GOOGLE_PROTOBUF_VERSION >= 6030000
-+typedef google::protobuf::internal::DescriptorStringView StringView;
-+#else
-+typedef const std::string& StringView;
-+#endif
-+
- } // namespace compat
-
- } // namespace protobuf_c
-
-From db5252c131c82fb48ee599179b6989a577b7fbc8 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:13:44 -0500
-Subject: [PATCH 03/11] Remove some unused functions
-
----
- protoc-gen-c/c_helpers.cc | 64 ---------------------------------------
- protoc-gen-c/c_helpers.h | 3 --
- 2 files changed, 67 deletions(-)
-
-diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc
-index c38843f8..bbb4a615 100644
---- a/protoc-gen-c/c_helpers.cc
-+++ b/protoc-gen-c/c_helpers.cc
-@@ -90,14 +90,6 @@ namespace protobuf_c {
- #pragma warning(disable:4996)
- #endif
-
--std::string DotsToUnderscores(const std::string& name) {
-- return StringReplace(name, ".", "_", true);
--}
--
--std::string DotsToColons(const std::string& name) {
-- return StringReplace(name, ".", "::", true);
--}
--
- std::string SimpleFtoa(float f) {
- char buf[100];
- snprintf(buf,sizeof(buf),"%.*g", FLT_DIG, f);
-@@ -333,11 +325,6 @@ std::string FilenameIdentifier(const std::string& filename) {
- return result;
- }
-
--// Return the name of the BuildDescriptors() function for a given file.
--std::string GlobalBuildDescriptorsName(const std::string& filename) {
-- return "proto_BuildDescriptors_" + FilenameIdentifier(filename);
--}
--
- std::string GetLabelName(google::protobuf::FieldDescriptor::Label label) {
- switch (label) {
- case google::protobuf::FieldDescriptor::LABEL_OPTIONAL: return "optional";
-@@ -392,57 +379,6 @@ WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *
- }
- }
-
--
--
--// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
--// XXXXXXXXX this stuff is copied from strutils.cc !!!! XXXXXXXXXXXXXXXXXXXXXXXXXXXXx
--// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
--// ----------------------------------------------------------------------
--// StringReplace()
--// Replace the "old" pattern with the "new" pattern in a string,
--// and append the result to "res". If replace_all is false,
--// it only replaces the first instance of "old."
--// ----------------------------------------------------------------------
--
--void StringReplace(const std::string& s, const std::string& oldsub,
-- const std::string& newsub, bool replace_all,
-- std::string* res) {
-- if (oldsub.empty()) {
-- res->append(s); // if empty, append the given string.
-- return;
-- }
--
-- std::string::size_type start_pos = 0;
-- std::string::size_type pos;
-- do {
-- pos = s.find(oldsub, start_pos);
-- if (pos == std::string::npos) {
-- break;
-- }
-- res->append(s, start_pos, pos - start_pos);
-- res->append(newsub);
-- start_pos = pos + oldsub.size(); // start searching again after the "old"
-- } while (replace_all);
-- res->append(s, start_pos, s.length() - start_pos);
--}
--
--
--// ----------------------------------------------------------------------
--// StringReplace()
--// Give me a string and two patterns "old" and "new", and I replace
--// the first instance of "old" in the string with "new", if it
--// exists. If "global" is true; call this repeatedly until it
--// fails. RETURN a new string, regardless of whether the replacement
--// happened or not.
--// ----------------------------------------------------------------------
--
--std::string StringReplace(const std::string& s, const std::string& oldsub,
-- const std::string& newsub, bool replace_all) {
-- std::string ret;
-- StringReplace(s, oldsub, newsub, replace_all, &ret);
-- return ret;
--}
--
- // ----------------------------------------------------------------------
- // SplitStringUsing()
- // Split a string using a character delimiter. Append the components
-diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h
-index e69504bb..377d4272 100644
---- a/protoc-gen-c/c_helpers.h
-+++ b/protoc-gen-c/c_helpers.h
-@@ -150,9 +150,6 @@ const char* DeclaredTypeMethodName(google::protobuf::FieldDescriptor::Type type)
- // Convert a file name into a valid identifier.
- std::string FilenameIdentifier(const std::string& filename);
-
--// Return the name of the BuildDescriptors() function for a given file.
--std::string GlobalBuildDescriptorsName(const std::string& filename);
--
- // return 'required', 'optional', or 'repeated'
- std::string GetLabelName(google::protobuf::FieldDescriptor::Label label);
-
-
-From bc2cb66d908f016dd3f7082c8a6ad7c58bc03412 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:18:05 -0500
-Subject: [PATCH 04/11] Use `compat::StringView` type across various function
- signatures
-
----
- protoc-gen-c/c_helpers.cc | 44 +++++++++++++++++++++------------------
- protoc-gen-c/c_helpers.h | 36 ++++++++++++++++----------------
- 2 files changed, 42 insertions(+), 38 deletions(-)
-
-diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc
-index bbb4a615..c759c8c2 100644
---- a/protoc-gen-c/c_helpers.cc
-+++ b/protoc-gen-c/c_helpers.cc
-@@ -96,6 +96,7 @@ std::string SimpleFtoa(float f) {
- buf[sizeof(buf)-1] = 0; /* should NOT be necessary */
- return buf;
- }
-+
- std::string SimpleDtoa(double d) {
- char buf[100];
- snprintf(buf,sizeof(buf),"%.*g", DBL_DIG, d);
-@@ -103,7 +104,7 @@ std::string SimpleDtoa(double d) {
- return buf;
- }
-
--std::string CamelToUpper(const std::string &name) {
-+std::string CamelToUpper(compat::StringView name) {
- bool was_upper = true; // suppress initial _
- std::string rv = "";
- int len = name.length();
-@@ -120,7 +121,8 @@ std::string CamelToUpper(const std::string &name) {
- }
- return rv;
- }
--std::string CamelToLower(const std::string &name) {
-+
-+std::string CamelToLower(compat::StringView name) {
- bool was_upper = true; // suppress initial _
- std::string rv = "";
- int len = name.length();
-@@ -138,8 +140,7 @@ std::string CamelToLower(const std::string &name) {
- return rv;
- }
-
--
--std::string ToUpper(const std::string &name) {
-+std::string ToUpper(compat::StringView name) {
- std::string rv = "";
- int len = name.length();
- for (int i = 0; i < len; i++) {
-@@ -147,7 +148,8 @@ std::string ToUpper(const std::string &name) {
- }
- return rv;
- }
--std::string ToLower(const std::string &name) {
-+
-+std::string ToLower(compat::StringView name) {
- std::string rv = "";
- int len = name.length();
- for (int i = 0; i < len; i++) {
-@@ -155,7 +157,8 @@ std::string ToLower(const std::string &name) {
- }
- return rv;
- }
--std::string ToCamel(const std::string &name) {
-+
-+std::string ToCamel(compat::StringView name) {
- std::string rv = "";
- int len = name.length();
- bool next_is_upper = true;
-@@ -172,7 +175,7 @@ std::string ToCamel(const std::string &name) {
- return rv;
- }
-
--std::string OverrideFullName(const std::string &full_name, const google::protobuf::FileDescriptor* file) {
-+std::string OverrideFullName(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
- const ProtobufCFileOptions opt = file->options().GetExtension(pb_c_file);
- if (!opt.has_c_package())
- return full_name;
-@@ -184,7 +187,7 @@ std::string OverrideFullName(const std::string &full_name, const google::protobu
- return new_name + full_name.substr(file->package().length());
- }
-
--std::string FullNameToLower(const std::string &full_name, const google::protobuf::FileDescriptor* file) {
-+std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
- std::vector<std::string> pieces;
- SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces);
- std::string rv = "";
-@@ -195,7 +198,8 @@ std::string FullNameToLower(const std::string &full_name, const google::protobuf
- }
- return rv;
- }
--std::string FullNameToUpper(const std::string &full_name, const google::protobuf::FileDescriptor* file) {
-+
-+std::string FullNameToUpper(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
- std::vector<std::string> pieces;
- SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces);
- std::string rv = "";
-@@ -206,7 +210,8 @@ std::string FullNameToUpper(const std::string &full_name, const google::protobuf
- }
- return rv;
- }
--std::string FullNameToC(const std::string &full_name, const google::protobuf::FileDescriptor* file) {
-+
-+std::string FullNameToC(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
- std::vector<std::string> pieces;
- SplitStringUsing(OverrideFullName(full_name, file), ".", &pieces);
- std::string rv = "";
-@@ -248,7 +253,7 @@ void PrintComment(google::protobuf::io::Printer* printer, std::string comment)
- }
- }
-
--std::string ConvertToSpaces(const std::string &input) {
-+std::string ConvertToSpaces(compat::StringView input) {
- return std::string(input.size(), ' ');
- }
-
-@@ -259,8 +264,7 @@ int compare_name_indices_by_name(const void *a, const void *b)
- return strcmp (ni_a->name, ni_b->name);
- }
-
--
--std::string CEscape(const std::string& src);
-+std::string CEscape(compat::StringView src);
-
- const char* const kKeywordList[] = {
- "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case",
-@@ -300,7 +304,7 @@ std::string FieldDeprecated(const google::protobuf::FieldDescriptor* field) {
- return "";
- }
-
--std::string StripProto(const std::string& filename) {
-+std::string StripProto(compat::StringView filename) {
- if (HasSuffixString(filename, ".protodevel")) {
- return StripSuffixString(filename, ".protodevel");
- } else {
-@@ -309,7 +313,7 @@ std::string StripProto(const std::string& filename) {
- }
-
- // Convert a file name into a valid identifier.
--std::string FilenameIdentifier(const std::string& filename) {
-+std::string FilenameIdentifier(compat::StringView filename) {
- std::string result;
- for (unsigned i = 0; i < filename.size(); i++) {
- if (isalnum(filename[i])) {
-@@ -335,7 +339,7 @@ std::string GetLabelName(google::protobuf::FieldDescriptor::Label label) {
- }
-
- unsigned
--WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, const std::string &name)
-+WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, compat::StringView name)
- {
- std::map<std::string, std::string> vars;
- vars["name"] = name;
-@@ -389,7 +393,7 @@ WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *
- // ----------------------------------------------------------------------
- template <typename ITR>
- static inline
--void SplitStringToIteratorUsing(const std::string& full,
-+void SplitStringToIteratorUsing(compat::StringView full,
- const char* delim,
- ITR& result) {
- // Optimize the common case where delim is a single character.
-@@ -422,7 +426,7 @@ void SplitStringToIteratorUsing(const std::string& full,
- }
- }
-
--void SplitStringUsing(const std::string& full,
-+void SplitStringUsing(compat::StringView full,
- const char* delim,
- std::vector<std::string>* result) {
- std::back_insert_iterator< std::vector<std::string> > it(*result);
-@@ -435,7 +439,6 @@ char* FastHexToBuffer(int i, char* buffer)
- return buffer;
- }
-
--
- static int CEscapeInternal(const char* src, int src_len, char* dest,
- int dest_len, bool use_hex) {
- const char* src_end = src + src_len;
-@@ -478,7 +481,8 @@ static int CEscapeInternal(const char* src, int src_len, char* dest,
- dest[used] = '\0'; // doesn't count towards return value though
- return used;
- }
--std::string CEscape(const std::string& src) {
-+
-+std::string CEscape(compat::StringView src) {
- const int dest_length = src.size() * 4 + 1; // Maximum possible expansion
- std::unique_ptr<char[]> dest(new char[dest_length]);
- const int len = CEscapeInternal(src.data(), src.size(),
-diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h
-index 377d4272..ccd39ca2 100644
---- a/protoc-gen-c/c_helpers.h
-+++ b/protoc-gen-c/c_helpers.h
-@@ -73,6 +73,8 @@
-
- #include <protobuf-c/protobuf-c.pb.h>
-
-+#include "compat.h"
-+
- namespace protobuf_c {
-
- // --- Borrowed from stubs. ---
-@@ -84,11 +86,10 @@ template <typename T> std::string SimpleItoa(T n) {
-
- std::string SimpleFtoa(float f);
- std::string SimpleDtoa(double f);
--void SplitStringUsing(const std::string &str, const char *delim, std::vector<std::string> *out);
--std::string CEscape(const std::string& src);
--std::string StringReplace(const std::string& s, const std::string& oldsub, const std::string& newsub, bool replace_all);
--inline bool HasSuffixString(const std::string& str, const std::string& suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; }
--inline std::string StripSuffixString(const std::string& str, const std::string& suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } }
-+void SplitStringUsing(compat::StringView str, const char *delim, std::vector<std::string> *out);
-+std::string CEscape(compat::StringView src);
-+inline bool HasSuffixString(compat::StringView str, compat::StringView suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; }
-+inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } }
- char* FastHexToBuffer(int i, char* buffer);
-
-
-@@ -110,31 +111,31 @@ inline const google::protobuf::Descriptor* FieldScope(const google::protobuf::Fi
-
- // convert a CamelCase class name into an all uppercase affair
- // with underscores separating words, e.g. MyClass becomes MY_CLASS.
--std::string CamelToUpper(const std::string &class_name);
--std::string CamelToLower(const std::string &class_name);
-+std::string CamelToUpper(compat::StringView class_name);
-+std::string CamelToLower(compat::StringView class_name);
-
- // lowercased, underscored name to camel case
--std::string ToCamel(const std::string &name);
-+std::string ToCamel(compat::StringView name);
-
- // lowercase the string
--std::string ToLower(const std::string &class_name);
--std::string ToUpper(const std::string &class_name);
-+std::string ToLower(compat::StringView class_name);
-+std::string ToUpper(compat::StringView class_name);
-
- // full_name() to lowercase with underscores
--std::string FullNameToLower(const std::string &full_name, const google::protobuf::FileDescriptor *file);
--std::string FullNameToUpper(const std::string &full_name, const google::protobuf::FileDescriptor *file);
-+std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor *file);
-+std::string FullNameToUpper(compat::StringView full_name, const google::protobuf::FileDescriptor *file);
-
- // full_name() to c-typename (with underscores for packages, otherwise camel case)
--std::string FullNameToC(const std::string &class_name, const google::protobuf::FileDescriptor *file);
-+std::string FullNameToC(compat::StringView class_name, const google::protobuf::FileDescriptor *file);
-
- // Splits, indents, formats, and prints comment lines
- void PrintComment(google::protobuf::io::Printer* printer, std::string comment);
-
- // make a string of spaces as long as input
--std::string ConvertToSpaces(const std::string &input);
-+std::string ConvertToSpaces(compat::StringView input);
-
- // Strips ".proto" or ".protodevel" from the end of a filename.
--std::string StripProto(const std::string& filename);
-+std::string StripProto(compat::StringView filename);
-
- // Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.).
- // Note: non-built-in type names will be qualified, meaning they will start
-@@ -148,15 +149,14 @@ const char* PrimitiveTypeName(google::protobuf::FieldDescriptor::CppType type);
- const char* DeclaredTypeMethodName(google::protobuf::FieldDescriptor::Type type);
-
- // Convert a file name into a valid identifier.
--std::string FilenameIdentifier(const std::string& filename);
-+std::string FilenameIdentifier(compat::StringView filename);
-
- // return 'required', 'optional', or 'repeated'
- std::string GetLabelName(google::protobuf::FieldDescriptor::Label label);
-
--
- // write IntRanges entries for a bunch of sorted values.
- // returns the number of ranges there are to bsearch.
--unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, const std::string &name);
-+unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, const int *values, compat::StringView name);
-
- struct NameIndex
- {
-
-From 75f1c32cc429233a3726358c999009f9ea373b45 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:25:43 -0500
-Subject: [PATCH 05/11] Convert string views to owned strings where necessary
-
----
- protoc-gen-c/c_enum.cc | 2 +-
- protoc-gen-c/c_enum_field.cc | 2 +-
- protoc-gen-c/c_helpers.cc | 8 ++++----
- protoc-gen-c/c_helpers.h | 3 +--
- 4 files changed, 7 insertions(+), 8 deletions(-)
-
-diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc
-index 9212ab82..311e4c86 100644
---- a/protoc-gen-c/c_enum.cc
-+++ b/protoc-gen-c/c_enum.cc
-@@ -152,7 +152,7 @@ void EnumGenerator::GenerateValueInitializer(google::protobuf::io::Printer *prin
- 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");
-diff --git a/protoc-gen-c/c_enum_field.cc b/protoc-gen-c/c_enum_field.cc
-index 0926ae59..c3111f50 100644
---- a/protoc-gen-c/c_enum_field.cc
-+++ b/protoc-gen-c/c_enum_field.cc
-@@ -78,7 +78,7 @@ void SetEnumVariables(const google::protobuf::FieldDescriptor* descriptor,
- (*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);
- }
-
-diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc
-index c759c8c2..1aecef93 100644
---- a/protoc-gen-c/c_helpers.cc
-+++ b/protoc-gen-c/c_helpers.cc
-@@ -178,13 +178,13 @@ std::string ToCamel(compat::StringView name) {
- std::string OverrideFullName(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
- const ProtobufCFileOptions opt = file->options().GetExtension(pb_c_file);
- if (!opt.has_c_package())
-- return full_name;
-+ return std::string(full_name);
-
- std::string new_name = opt.c_package();
- if (file->package().empty())
- new_name += ".";
-
-- return new_name + full_name.substr(file->package().length());
-+ return new_name + std::string(full_name.substr(file->package().length()));
- }
-
- std::string FullNameToLower(compat::StringView full_name, const google::protobuf::FileDescriptor* file) {
-@@ -418,10 +418,10 @@ void SplitStringToIteratorUsing(compat::StringView full,
- while (begin_index != std::string::npos) {
- end_index = full.find_first_of(delim, begin_index);
- if (end_index == std::string::npos) {
-- *result++ = full.substr(begin_index);
-+ *result++ = std::string(full.substr(begin_index));
- return;
- }
-- *result++ = full.substr(begin_index, (end_index - begin_index));
-+ *result++ = std::string(full.substr(begin_index, (end_index - begin_index)));
- begin_index = full.find_first_not_of(delim, end_index);
- }
- }
-diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h
-index ccd39ca2..985e4db6 100644
---- a/protoc-gen-c/c_helpers.h
-+++ b/protoc-gen-c/c_helpers.h
-@@ -89,10 +89,9 @@ std::string SimpleDtoa(double f);
- void SplitStringUsing(compat::StringView str, const char *delim, std::vector<std::string> *out);
- std::string CEscape(compat::StringView src);
- inline bool HasSuffixString(compat::StringView str, compat::StringView suffix) { return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; }
--inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return str.substr(0, str.size() - suffix.size()); } else { return str; } }
-+inline std::string StripSuffixString(compat::StringView str, compat::StringView suffix) { if (HasSuffixString(str, suffix)) { return std::string(str.substr(0, str.size() - suffix.size())); } else { return std::string(str); } }
- char* FastHexToBuffer(int i, char* buffer);
-
--
- // Get the (unqualified) name that should be used for this field in C code.
- // The name is coerced to lower-case to emulate proto1 behavior. People
- // should be using lowercase-with-underscores style for proto field names
-
-From 0edca93db369fb84f01cc0d4e3ee4cd6c2ad7f4f Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:39:11 -0500
-Subject: [PATCH 06/11] 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`.
----
- protoc-gen-c/c_enum.cc | 35 ++++++++++++++++++-----------------
- protoc-gen-c/c_helpers.cc | 2 +-
- protoc-gen-c/c_helpers.h | 2 +-
- protoc-gen-c/c_message.cc | 28 ++++++++++++----------------
- protoc-gen-c/c_service.cc | 19 +++++++++----------
- 5 files changed, 41 insertions(+), 45 deletions(-)
-
-diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc
-index 311e4c86..c7839edd 100644
---- a/protoc-gen-c/c_enum.cc
-+++ b/protoc-gen-c/c_enum.cc
-@@ -142,7 +142,7 @@ struct ValueIndex
- int value;
- unsigned index;
- 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)
- {
-@@ -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_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) {
-@@ -194,18 +194,20 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
-
- // 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()];
-- for (int j = 0; j < descriptor_->value_count(); j++) {
-+ std::vector<ValueIndex> value_index;
-+ for (unsigned 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].index = j;
-- value_index[j].value = vd->number();
-- value_index[j].name = vd->name().c_str();
-+ value_index.push_back({
-+ .value = vd->number(),
-+ .index = j,
-+ .final_index = 0,
-+ .name = vd->name(),
-+ });
- }
-- qsort(value_index, descriptor_->value_count(),
-- sizeof(ValueIndex), compare_value_indices_by_value_then_index);
-+ qsort(&value_index[0],
-+ value_index.size(),
-+ sizeof(ValueIndex),
-+ compare_value_indices_by_value_then_index);
-
- // only record unique values
- int n_unique_values;
-@@ -275,8 +277,10 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
- vars["n_ranges"] = SimpleItoa(n_ranges);
-
- if (!optimize_code_size) {
-- qsort(value_index, descriptor_->value_count(),
-- sizeof(ValueIndex), compare_value_indices_by_name);
-+ qsort(&value_index[0],
-+ value_index.size(),
-+ sizeof(ValueIndex),
-+ compare_value_indices_by_name);
- printer->Print(vars,
- "static const ProtobufCEnumValueIndex $lcclassname$__enum_values_by_name[$value_count$] =\n"
- "{\n");
-@@ -319,9 +323,6 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
- " NULL,NULL,NULL,NULL /* reserved[1234] */\n"
- "};\n");
- }
--
-- delete[] value_index;
-- delete[] name_index;
- }
-
- } // namespace protobuf_c
-diff --git a/protoc-gen-c/c_helpers.cc b/protoc-gen-c/c_helpers.cc
-index 1aecef93..dec9ce28 100644
---- a/protoc-gen-c/c_helpers.cc
-+++ b/protoc-gen-c/c_helpers.cc
-@@ -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_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);
-diff --git a/protoc-gen-c/c_helpers.h b/protoc-gen-c/c_helpers.h
-index 985e4db6..69369997 100644
---- a/protoc-gen-c/c_helpers.h
-+++ b/protoc-gen-c/c_helpers.h
-@@ -160,7 +160,7 @@ unsigned WriteIntRanges(google::protobuf::io::Printer* printer, int n_values, co
- struct NameIndex
- {
- unsigned index;
-- const char *name;
-+ compat::StringView name;
- };
- int compare_name_indices_by_name(const void*, const void*);
-
-diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc
-index 46413873..7252923c 100644
---- a/protoc-gen-c/c_message.cc
-+++ b/protoc-gen-c/c_message.cc
-@@ -567,27 +567,26 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init)
- "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n"
- "{\n");
- 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++) {
-- 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*),
- compare_pfields_by_number);
-- for (int i = 0; i < descriptor_->field_count(); i++) {
-- const google::protobuf::FieldDescriptor* field = sorted_fields[i];
-+ for (auto field : sorted_fields) {
- field_generators_.get(field).GenerateDescriptorInitializer(printer);
- }
- printer->Outdent();
- printer->Print(vars, "};\n");
-
- if (!optimize_code_size) {
-- 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].index = i;
-+ std::vector<NameIndex> field_indices;
-+ for (unsigned i = 0; i < descriptor_->field_count(); i++) {
-+ field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() });
- }
-- qsort (field_indices, descriptor_->field_count(), sizeof (NameIndex),
-+ qsort(&field_indices[0], field_indices.size(), sizeof(NameIndex),
- compare_name_indices_by_name);
- printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n");
- for (int i = 0; i < descriptor_->field_count(); i++) {
-@@ -596,19 +595,16 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init)
- printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n");
- }
- printer->Print("};\n");
-- delete[] field_indices;
- }
-
- // create range initializers
-- int *values = new int[descriptor_->field_count()];
-+ std::vector<int> values;
- 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,
-- descriptor_->field_count(), values,
-+ descriptor_->field_count(), &values[0],
- vars["lcclassname"] + "__number_ranges");
-- delete [] values;
-- delete [] sorted_fields;
-
- vars["n_ranges"] = SimpleItoa(n_ranges);
- } else {
-diff --git a/protoc-gen-c/c_service.cc b/protoc-gen-c/c_service.cc
-index ee4d4a95..2c3ddcf3 100644
---- a/protoc-gen-c/c_service.cc
-+++ b/protoc-gen-c/c_service.cc
-@@ -184,19 +184,19 @@ void ServiceGenerator::GenerateInit(google::protobuf::io::Printer* printer)
- "}\n");
- }
-
--struct MethodIndexAndName { unsigned i; const char *name; };
-+struct MethodIndexAndName { unsigned i; compat::StringView name; };
- 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 ma->name.compare(mb->name);
- }
-
- void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer* printer)
- {
- 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() &&
- descriptor_->file()->options().optimize_for() ==
-@@ -205,7 +205,7 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer*
- vars_["n_methods"] = SimpleItoa(n_methods);
- printer->Print(vars_, "static const ProtobufCMethodDescriptor $lcfullname$__method_descriptors[$n_methods$] =\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);
- vars_["method"] = method->name();
- 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*
- printer->Print(vars_,
- " { \"$method$\", $input_descriptor$, $output_descriptor$ },\n");
- }
-- mi_array[i].i = i;
-- mi_array[i].name = method->name().c_str();
-+ mi_array.push_back({i, method->name()});
- }
- printer->Print(vars_, "};\n");
-
- if (!optimize_code_size) {
-- qsort ((void*)mi_array, n_methods, sizeof (MethodIndexAndName),
-- compare_method_index_and_name_by_name);
-+ qsort(&mi_array[0],
-+ mi_array.size(),
-+ sizeof(MethodIndexAndName),
-+ compare_method_index_and_name_by_name);
- 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);
-@@ -258,8 +259,6 @@ void ServiceGenerator::GenerateServiceDescriptor(google::protobuf::io::Printer*
- " $lcfullname$__method_indices_by_name\n"
- "};\n");
- }
--
-- delete[] mi_array;
- }
-
- void ServiceGenerator::GenerateCallersImplementations(google::protobuf::io::Printer* printer)
-
-From ebeddac1a746393a16d9ba4cf80e3d12c3ab7d7f Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 20:56:48 -0500
-Subject: [PATCH 07/11] Fix indentation of
- MessageGenerator::GenerateMessageDescriptor()
-
----
- protoc-gen-c/c_message.cc | 321 +++++++++++++++++++-------------------
- 1 file changed, 159 insertions(+), 162 deletions(-)
-
-diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc
-index 7252923c..2a3b2a2f 100644
---- a/protoc-gen-c/c_message.cc
-+++ b/protoc-gen-c/c_message.cc
-@@ -461,199 +461,196 @@ GenerateHelperFunctionDefinitions(google::protobuf::io::Printer* printer,
-
- void MessageGenerator::
- GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init) {
-- std::map<std::string, std::string> vars;
-- vars["fullname"] = descriptor_->full_name();
-- vars["classname"] = FullNameToC(descriptor_->full_name(), descriptor_->file());
-- vars["lcclassname"] = FullNameToLower(descriptor_->full_name(), descriptor_->file());
-- vars["shortname"] = ToCamel(descriptor_->name());
-- vars["n_fields"] = SimpleItoa(descriptor_->field_count());
-- vars["packagename"] = descriptor_->file()->package();
--
-- bool optimize_code_size = descriptor_->file()->options().has_optimize_for() &&
-- descriptor_->file()->options().optimize_for() ==
-- google::protobuf::FileOptions_OptimizeMode_CODE_SIZE;
--
-- const ProtobufCMessageOptions opt =
-- descriptor_->options().GetExtension(pb_c_msg);
-- // Override parent settings, if needed
-- if (opt.has_gen_init_helpers())
-- gen_init = opt.gen_init_helpers();
--
-- for (int i = 0; i < descriptor_->nested_type_count(); i++) {
-- nested_generators_[i]->GenerateMessageDescriptor(printer, gen_init);
-- }
-+ std::map<std::string, std::string> vars;
-+ vars["fullname"] = descriptor_->full_name();
-+ vars["classname"] = FullNameToC(descriptor_->full_name(), descriptor_->file());
-+ vars["lcclassname"] = FullNameToLower(descriptor_->full_name(), descriptor_->file());
-+ vars["shortname"] = ToCamel(descriptor_->name());
-+ vars["n_fields"] = SimpleItoa(descriptor_->field_count());
-+ vars["packagename"] = descriptor_->file()->package();
-
-- for (int i = 0; i < descriptor_->enum_type_count(); i++) {
-- enum_generators_[i]->GenerateEnumDescriptor(printer);
-- }
-+ bool optimize_code_size = descriptor_->file()->options().has_optimize_for() &&
-+ descriptor_->file()->options().optimize_for() ==
-+ google::protobuf::FileOptions_OptimizeMode_CODE_SIZE;
-
-- for (int i = 0; i < descriptor_->field_count(); i++) {
-- const google::protobuf::FieldDescriptor* fd = descriptor_->field(i);
-- if (fd->has_default_value()) {
-- field_generators_.get(fd).GenerateDefaultValueImplementations(printer);
-- }
-- }
-+ const ProtobufCMessageOptions opt = descriptor_->options().GetExtension(pb_c_msg);
-+ // Override parent settings, if needed
-+ if (opt.has_gen_init_helpers()) {
-+ gen_init = opt.gen_init_helpers();
-+ }
-
-- for (int i = 0; i < descriptor_->field_count(); i++) {
-- const google::protobuf::FieldDescriptor* fd = descriptor_->field(i);
-- const ProtobufCFieldOptions opt = fd->options().GetExtension(pb_c_field);
-- if (fd->has_default_value()) {
--
-- bool already_defined = false;
-- vars["name"] = fd->name();
-- vars["lcname"] = CamelToLower(fd->name());
-- vars["maybe_static"] = "static ";
-- vars["field_dv_ctype_suffix"] = "";
-- vars["default_value"] = field_generators_.get(fd).GetDefaultValue();
-- switch (fd->cpp_type()) {
-- case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
-- vars["field_dv_ctype"] = "int32_t";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
-- vars["field_dv_ctype"] = "int64_t";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
-- vars["field_dv_ctype"] = "uint32_t";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
-- vars["field_dv_ctype"] = "uint64_t";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
-- vars["field_dv_ctype"] = "float";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
-- vars["field_dv_ctype"] = "double";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
-- vars["field_dv_ctype"] = "protobuf_c_boolean";
-- break;
--
-- case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
-- // NOTE: not supported by protobuf
-- vars["maybe_static"] = "";
-- vars["field_dv_ctype"] = "{ ... }";
-- GOOGLE_LOG(FATAL) << "Messages can't have default values!";
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
-- if (fd->type() == google::protobuf::FieldDescriptor::TYPE_BYTES || opt.string_as_bytes())
-- {
-- vars["field_dv_ctype"] = "ProtobufCBinaryData";
-- }
-- else /* STRING type */
-- {
-- already_defined = true;
-- vars["maybe_static"] = "";
-- vars["field_dv_ctype"] = "char";
-- vars["field_dv_ctype_suffix"] = "[]";
-- }
-- break;
-- case google::protobuf::FieldDescriptor::CPPTYPE_ENUM:
-- {
-- const google::protobuf::EnumValueDescriptor* vd = fd->default_value_enum();
-- vars["field_dv_ctype"] = FullNameToC(vd->type()->full_name(), vd->type()->file());
-- break;
-- }
-- default:
-- GOOGLE_LOG(FATAL) << "Unknown CPPTYPE";
-- break;
-- }
-- if (!already_defined)
-- printer->Print(vars, "$maybe_static$const $field_dv_ctype$ $lcclassname$__$lcname$__default_value$field_dv_ctype_suffix$ = $default_value$;\n");
-- }
-- }
-+ for (int i = 0; i < descriptor_->nested_type_count(); i++) {
-+ nested_generators_[i]->GenerateMessageDescriptor(printer, gen_init);
-+ }
-
-- if ( descriptor_->field_count() ) {
-- printer->Print(vars,
-- "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n"
-- "{\n");
-- printer->Indent();
-+ for (int i = 0; i < descriptor_->enum_type_count(); i++) {
-+ enum_generators_[i]->GenerateEnumDescriptor(printer);
-+ }
-
-- std::vector<const google::protobuf::FieldDescriptor*> sorted_fields;
- for (int i = 0; i < descriptor_->field_count(); i++) {
-- sorted_fields.push_back(descriptor_->field(i));
-- }
-- qsort(&sorted_fields[0], sorted_fields.size(),
-- sizeof(const google::protobuf::FieldDescriptor*),
-- compare_pfields_by_number);
-- for (auto field : sorted_fields) {
-- field_generators_.get(field).GenerateDescriptorInitializer(printer);
-+ const google::protobuf::FieldDescriptor* fd = descriptor_->field(i);
-+ if (fd->has_default_value()) {
-+ field_generators_.get(fd).GenerateDefaultValueImplementations(printer);
-+ }
- }
-- printer->Outdent();
-- printer->Print(vars, "};\n");
-
-- if (!optimize_code_size) {
-- std::vector<NameIndex> field_indices;
-- for (unsigned i = 0; i < descriptor_->field_count(); i++) {
-- field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() });
-+ for (int i = 0; i < descriptor_->field_count(); i++) {
-+ const google::protobuf::FieldDescriptor* fd = descriptor_->field(i);
-+ const ProtobufCFieldOptions opt = fd->options().GetExtension(pb_c_field);
-+ if (fd->has_default_value()) {
-+ bool already_defined = false;
-+ vars["name"] = fd->name();
-+ vars["lcname"] = CamelToLower(fd->name());
-+ vars["maybe_static"] = "static ";
-+ vars["field_dv_ctype_suffix"] = "";
-+ vars["default_value"] = field_generators_.get(fd).GetDefaultValue();
-+ switch (fd->cpp_type()) {
-+ case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
-+ vars["field_dv_ctype"] = "int32_t";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
-+ vars["field_dv_ctype"] = "int64_t";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_UINT32:
-+ vars["field_dv_ctype"] = "uint32_t";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_UINT64:
-+ vars["field_dv_ctype"] = "uint64_t";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT:
-+ vars["field_dv_ctype"] = "float";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE:
-+ vars["field_dv_ctype"] = "double";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_BOOL:
-+ vars["field_dv_ctype"] = "protobuf_c_boolean";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE:
-+ // NOTE: not supported by protobuf
-+ vars["maybe_static"] = "";
-+ vars["field_dv_ctype"] = "{ ... }";
-+ GOOGLE_LOG(FATAL) << "Messages can't have default values!";
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_STRING:
-+ if (fd->type() == google::protobuf::FieldDescriptor::TYPE_BYTES || opt.string_as_bytes()) {
-+ vars["field_dv_ctype"] = "ProtobufCBinaryData";
-+ } else {
-+ /* STRING type */
-+ already_defined = true;
-+ vars["maybe_static"] = "";
-+ vars["field_dv_ctype"] = "char";
-+ vars["field_dv_ctype_suffix"] = "[]";
-+ }
-+ break;
-+ case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: {
-+ const google::protobuf::EnumValueDescriptor* vd = fd->default_value_enum();
-+ vars["field_dv_ctype"] = FullNameToC(vd->type()->full_name(), vd->type()->file());
-+ break;
-+ }
-+ default:
-+ GOOGLE_LOG(FATAL) << "Unknown CPPTYPE";
-+ break;
-+ }
-+ if (!already_defined) {
-+ printer->Print(vars, "$maybe_static$const $field_dv_ctype$ $lcclassname$__$lcname$__default_value$field_dv_ctype_suffix$ = $default_value$;\n");
-+ }
- }
-- qsort(&field_indices[0], field_indices.size(), sizeof(NameIndex),
-- compare_name_indices_by_name);
-- printer->Print(vars, "static const unsigned $lcclassname$__field_indices_by_name[] = {\n");
-+ }
-+
-+ if (descriptor_->field_count()) {
-+ printer->Print(vars,
-+ "static const ProtobufCFieldDescriptor $lcclassname$__field_descriptors[$n_fields$] =\n"
-+ "{\n");
-+ printer->Indent();
-+
-+ std::vector<const google::protobuf::FieldDescriptor*> sorted_fields;
- for (int i = 0; i < descriptor_->field_count(); i++) {
-- vars["index"] = SimpleItoa(field_indices[i].index);
-- vars["name"] = field_indices[i].name;
-- printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n");
-+ sorted_fields.push_back(descriptor_->field(i));
- }
-- printer->Print("};\n");
-- }
-+ qsort(&sorted_fields[0],
-+ sorted_fields.size(),
-+ sizeof(const google::protobuf::FieldDescriptor*),
-+ compare_pfields_by_number);
-+ for (auto field : sorted_fields) {
-+ field_generators_.get(field).GenerateDescriptorInitializer(printer);
-+ }
-+ printer->Outdent();
-+ printer->Print(vars, "};\n");
-
-- // create range initializers
-- std::vector<int> values;
-- for (int i = 0; i < descriptor_->field_count(); i++) {
-- values.push_back(sorted_fields[i]->number());
-- }
-- int n_ranges = WriteIntRanges(printer,
-- descriptor_->field_count(), &values[0],
-- vars["lcclassname"] + "__number_ranges");
-+ if (!optimize_code_size) {
-+ std::vector<NameIndex> field_indices;
-+ for (unsigned i = 0; i < descriptor_->field_count(); i++) {
-+ field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() });
-+ }
-+ qsort(&field_indices[0],
-+ field_indices.size(),
-+ sizeof(NameIndex),
-+ compare_name_indices_by_name);
-+ 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;
-+ printer->Print(vars, " $index$, /* field[$index$] = $name$ */\n");
-+ }
-+ printer->Print("};\n");
-+ }
-
-- vars["n_ranges"] = SimpleItoa(n_ranges);
-- } else {
-- /* MS compiler can't handle arrays with zero size and empty
-- * initialization list. Furthermore it is an extension of GCC only but
-- * not a standard. */
-- vars["n_ranges"] = "0";
-- printer->Print(vars,
-- "#define $lcclassname$__field_descriptors NULL\n"
-- "#define $lcclassname$__field_indices_by_name NULL\n"
-- "#define $lcclassname$__number_ranges NULL\n");
-+ // create range initializers
-+ std::vector<int> values;
-+ for (int i = 0; i < descriptor_->field_count(); i++) {
-+ values.push_back(sorted_fields[i]->number());
- }
-+ int n_ranges = WriteIntRanges(printer,
-+ descriptor_->field_count(),
-+ &values[0],
-+ vars["lcclassname"] + "__number_ranges");
-+
-+ vars["n_ranges"] = SimpleItoa(n_ranges);
-+ } else {
-+ /* MS compiler can't handle arrays with zero size and empty
-+ * initialization list. Furthermore it is an extension of GCC only but
-+ * not a standard. */
-+ vars["n_ranges"] = "0";
-+ printer->Print(vars,
-+ "#define $lcclassname$__field_descriptors NULL\n"
-+ "#define $lcclassname$__field_indices_by_name NULL\n"
-+ "#define $lcclassname$__number_ranges NULL\n");
-+ }
-
- printer->Print(vars,
-- "const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n"
-- "{\n"
-- " PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,\n");
-+ "const ProtobufCMessageDescriptor $lcclassname$__descriptor =\n"
-+ "{\n"
-+ " PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,\n");
- if (optimize_code_size) {
- printer->Print(" NULL,NULL,NULL,NULL, /* CODE_SIZE */\n");
- } else {
- printer->Print(vars,
-- " \"$fullname$\",\n"
-- " \"$shortname$\",\n"
-- " \"$classname$\",\n"
-- " \"$packagename$\",\n");
-+ " \"$fullname$\",\n"
-+ " \"$shortname$\",\n"
-+ " \"$classname$\",\n"
-+ " \"$packagename$\",\n");
- }
- printer->Print(vars,
-- " sizeof($classname$),\n"
-- " $n_fields$,\n"
-- " $lcclassname$__field_descriptors,\n");
-+ " sizeof($classname$),\n"
-+ " $n_fields$,\n"
-+ " $lcclassname$__field_descriptors,\n");
- if (optimize_code_size) {
- printer->Print(" NULL, /* CODE_SIZE */\n");
- } else {
-- printer->Print(vars,
-- " $lcclassname$__field_indices_by_name,\n");
-+ printer->Print(vars, " $lcclassname$__field_indices_by_name,\n");
- }
- printer->Print(vars,
-- " $n_ranges$,"
-- " $lcclassname$__number_ranges,\n");
-+ " $n_ranges$,"
-+ " $lcclassname$__number_ranges,\n");
- if (gen_init) {
-- printer->Print(vars,
-- " (ProtobufCMessageInit) $lcclassname$__init,\n");
-+ printer->Print(vars, " (ProtobufCMessageInit) $lcclassname$__init,\n");
- } else {
-- printer->Print(vars,
-- " NULL, /* gen_init_helpers = false */\n");
-+ printer->Print(vars, " NULL, /* gen_init_helpers = false */\n");
- }
- printer->Print(vars,
-- " NULL,NULL,NULL /* reserved[123] */\n"
-- "};\n");
-+ " NULL,NULL,NULL /* reserved[123] */\n"
-+ "};\n");
- }
-
- int MessageGenerator::GetOneofUnionOrder(const google::protobuf::FieldDescriptor* fd)
-
-From c59b146aee2d97091ca2adeecd3f2741cb7f0082 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 21:10:37 -0500
-Subject: [PATCH 08/11] compat: Use absl::string_view instead of
- google::protobuf::internal::DescriptorStringView
-
-Even though google::protobuf::internal::DescriptorStringView is exposed
-in public protobuf headers, it's probably not a good idea to rely on an
-"internal" typedef.
-
-According to https://protobuf.dev/news/2024-10-02/#descriptor-apis:
-
- v30 will update return types in descriptor (such as full_name) to be
- absl::string_view.
-
-So `absl::string_view` is probably the right type to use here.
----
- protoc-gen-c/compat.h | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h
-index fe8041b5..a70cef34 100644
---- a/protoc-gen-c/compat.h
-+++ b/protoc-gen-c/compat.h
-@@ -37,12 +37,16 @@
- # define GOOGLE_LOG ABSL_LOG
- #endif
-
-+#if GOOGLE_PROTOBUF_VERSION >= 6030000
-+# include <absl/strings/string_view.h>
-+#endif
-+
- namespace protobuf_c {
-
- namespace compat {
-
- #if GOOGLE_PROTOBUF_VERSION >= 6030000
--typedef google::protobuf::internal::DescriptorStringView StringView;
-+typedef absl::string_view StringView;
- #else
- typedef const std::string& StringView;
- #endif
-
-From 9c56038fd9d3cc2552c297457d7a66efe5cbd2c7 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 21:37:30 -0500
-Subject: [PATCH 09/11] Makefile.am: Add compat.h to
- protoc_gen_c_protoc_gen_c_SOURCES
-
----
- Makefile.am | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/Makefile.am b/Makefile.am
-index 77aa9d99..26d19f16 100644
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -102,6 +102,7 @@ protoc_gen_c_protoc_gen_c_SOURCES = \
- protoc-gen-c/c_service.h \
- protoc-gen-c/c_string_field.cc \
- protoc-gen-c/c_string_field.h \
-+ protoc-gen-c/compat.h \
- protobuf-c/protobuf-c.pb.cc \
- protobuf-c/protobuf-c.pb.h \
- protoc-gen-c/main.cc
-
-From 4ebd5cd8238d1f2ac6291b8c8925f34e16ce2123 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 21:38:07 -0500
-Subject: [PATCH 10/11] compat: Conditionalize the include of <string>
-
-It is only needed on older protobuf versions where absl::string_view is
-not being used.
----
- protoc-gen-c/compat.h | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/protoc-gen-c/compat.h b/protoc-gen-c/compat.h
-index a70cef34..f6ace7cb 100644
---- a/protoc-gen-c/compat.h
-+++ b/protoc-gen-c/compat.h
-@@ -28,8 +28,6 @@
- #ifndef PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
- #define PROTOBUF_C_PROTOC_GEN_C_COMPAT_H__
-
--#include <string>
--
- #if GOOGLE_PROTOBUF_VERSION >= 4022000
- # define GOOGLE_ARRAYSIZE ABSL_ARRAYSIZE
- # define GOOGLE_CHECK_EQ ABSL_CHECK_EQ
-@@ -39,6 +37,8 @@
-
- #if GOOGLE_PROTOBUF_VERSION >= 6030000
- # include <absl/strings/string_view.h>
-+#else
-+# include <string>
- #endif
-
- namespace protobuf_c {
-
-From 9a6b35e1e6956fb5cb044910448049b7a5339244 Mon Sep 17 00:00:00 2001
-From: Robert Edmonds <edmonds@users.noreply.github.com>
-Date: Sat, 8 Feb 2025 21:44:42 -0500
-Subject: [PATCH 11/11] Cater to Microsoft Visual C++
-
-Apparently MSVC doesn't support designated initializers for some reason.
----
- protoc-gen-c/c_enum.cc | 9 ++-------
- protoc-gen-c/c_message.cc | 2 +-
- 2 files changed, 3 insertions(+), 8 deletions(-)
-
-diff --git a/protoc-gen-c/c_enum.cc b/protoc-gen-c/c_enum.cc
-index c7839edd..1940ba9d 100644
---- a/protoc-gen-c/c_enum.cc
-+++ b/protoc-gen-c/c_enum.cc
-@@ -195,14 +195,9 @@ void EnumGenerator::GenerateEnumDescriptor(google::protobuf::io::Printer* printe
- // Sort by name and value, dropping duplicate values if they appear later.
- // TODO: use a c++ paradigm for this!
- std::vector<ValueIndex> value_index;
-- 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);
-- value_index.push_back({
-- .value = vd->number(),
-- .index = j,
-- .final_index = 0,
-- .name = vd->name(),
-- });
-+ value_index.push_back({ vd->number(), (unsigned)j, 0, vd->name() });
- }
- qsort(&value_index[0],
- value_index.size(),
-diff --git a/protoc-gen-c/c_message.cc b/protoc-gen-c/c_message.cc
-index 2a3b2a2f..94889179 100644
---- a/protoc-gen-c/c_message.cc
-+++ b/protoc-gen-c/c_message.cc
-@@ -581,7 +581,7 @@ GenerateMessageDescriptor(google::protobuf::io::Printer* printer, bool gen_init)
- if (!optimize_code_size) {
- std::vector<NameIndex> field_indices;
- for (unsigned i = 0; i < descriptor_->field_count(); i++) {
-- field_indices.push_back({ .index = i, .name = sorted_fields[i]->name() });
-+ field_indices.push_back({ i, sorted_fields[i]->name() });
- }
- qsort(&field_indices[0],
- field_indices.size(),
diff --git a/libraries/protobuf-c/protobuf-c.SlackBuild b/libraries/protobuf-c/protobuf-c.SlackBuild
index 4d9027670c..a1fadd4e33 100644
--- a/libraries/protobuf-c/protobuf-c.SlackBuild
+++ b/libraries/protobuf-c/protobuf-c.SlackBuild
@@ -25,8 +25,8 @@
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=protobuf-c
-VERSION=${VERSION:-1.5.1}
-BUILD=${BUILD:-3}
+VERSION=${VERSION:-1.5.2}
+BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -73,10 +73,6 @@ find -L . \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
-# Fix protobuf 30.x
-patch -p1 < $CWD/762.patch
-
-autoreconf -vif
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
diff --git a/libraries/protobuf-c/protobuf-c.info b/libraries/protobuf-c/protobuf-c.info
index 86ff34bdc0..44d2b2f8bc 100644
--- a/libraries/protobuf-c/protobuf-c.info
+++ b/libraries/protobuf-c/protobuf-c.info
@@ -1,8 +1,8 @@
PRGNAM="protobuf-c"
-VERSION="1.5.1"
+VERSION="1.5.2"
HOMEPAGE="https://github.com/protobuf-c/protobuf-c"
-DOWNLOAD="https://github.com/protobuf-c/protobuf-c/releases/download/v1.5.1/protobuf-c-1.5.1.tar.gz"
-MD5SUM="0c02b1bb2b20bb9fc3489fe9e3df354b"
+DOWNLOAD="https://github.com/protobuf-c/protobuf-c/releases/download/v1.5.2/protobuf-c-1.5.2.tar.gz"
+MD5SUM="0612ee47cccaaf4ad1c4f0c8bdc13abf"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="protobuf3"