From patchwork Thu Apr 23 15:44:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39134 From: gprocida@google.com (Giuliano Procida) Date: Thu, 23 Apr 2020 16:44:27 +0100 Subject: [PATCH 07/21] Add POSIX regex wrapper functions. In-Reply-To: <20200423154441.170531-1-gprocida@google.com> References: <20200423154441.170531-1-gprocida@google.com> Message-ID: <20200423154441.170531-8-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 | 4 ++++ src/abg-regex.cc | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/abg-regex.h b/include/abg-regex.h index 59976794..4a56292a 100644 --- a/include/abg-regex.h +++ b/include/abg-regex.h @@ -71,6 +71,10 @@ 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..e4466bf4 100644 --- a/src/abg-regex.cc +++ b/src/abg-regex.cc @@ -101,6 +101,34 @@ 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