From patchwork Thu Apr 23 18:07:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39151 From: gprocida@google.com (Giuliano Procida) Date: Thu, 23 Apr 2020 19:07:22 +0100 Subject: [PATCH v2 07/21] Add POSIX regex wrapper functions. In-Reply-To: <20200423154441.170531-8-gprocida@google.com> References: <20200423154441.170531-8-gprocida@google.com> Message-ID: <20200423180722.70921-1-gprocida@google.com> libabigail code uses the POSIX regex library consistently: - compile std::string to regex, with the flag REG_EXTENDED - store regex using a shared pointer wrapper - check match of regex against std::string All the C string / std::string logic and so on is repeated at every call site. This patch introduces wrapper functions to take care of this logic. There are no behavioural changes. * include/abg-regex.h (compile): Declare new function. (match): Declare new function. * src/abg-regex.cc (compile): Add new function wrapping regcomp. (match): Add new function wrapping regexec. Signed-off-by: Giuliano Procida --- include/abg-regex.h | 6 ++++++ src/abg-regex.cc | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/abg-regex.h b/include/abg-regex.h index 59976794..c7951a8f 100644 --- a/include/abg-regex.h +++ b/include/abg-regex.h @@ -71,6 +71,12 @@ operator<<(std::ostream& os, const escape& esc); std::string generate_from_strings(const std::vector& strs); +regex_t_sptr +compile(const std::string& str); + +bool +match(const regex_t_sptr& r, const std::string& str); + }// end namespace regex /// Specialization of sptr_utils::build_sptr for regex_t. diff --git a/src/abg-regex.cc b/src/abg-regex.cc index 90e4d144..7e5277e2 100644 --- a/src/abg-regex.cc +++ b/src/abg-regex.cc @@ -23,11 +23,22 @@ /// Some specialization for shared pointer utility templates. /// +#include "config.h" + #include #include + +#include "abg-internal.h" + +// +ABG_BEGIN_EXPORT_DECLARATIONS + #include "abg-sptr-utils.h" #include "abg-regex.h" +ABG_END_EXPORT_DECLARATIONS +// + namespace abigail { @@ -101,6 +112,36 @@ generate_from_strings(const std::vector& strs) return os.str(); } +/// Compile a regex from a string. +/// +/// The result is held in a shared pointer. This will be null if regex +/// compilation fails. +/// +/// @param str the string representation of the regex. +/// +/// @return shared pointer holder of a compiled regex object. +regex_t_sptr +compile(const std::string& str) +{ + regex_t_sptr r = sptr_utils::build_sptr(new regex_t); + if (regcomp(r.get(), str.c_str(), REG_EXTENDED)) + r.reset(); + return r; +} + +/// See if a string matches a regex. +/// +/// @param r a shared pointer holder of a compiled regex object. +/// +/// @param str a string. +/// +/// @return whether there was a match. +bool +match(const regex_t_sptr& r, const std::string& str) +{ + return !regexec(r.get(), str.c_str(), 0, NULL, 0); +} + }//end namespace regex }//end namespace abigail