From patchwork Mon May 4 12:34:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 39201 From: gprocida@google.com (Giuliano Procida) Date: Mon, 4 May 2020 13:34:07 +0100 Subject: [PATCH v4 06/15] Add POSIX regex wrapper functions. In-Reply-To: <20200504123416.243214-1-gprocida@google.com> References: <20200424092132.150547-1-gprocida@google.com> <20200504123416.243214-1-gprocida@google.com> Message-ID: <20200504123416.243214-7-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. Reviewed-by: Matthias Maennich Signed-off-by: Giuliano Procida --- include/abg-regex.h | 6 ++++++ src/abg-regex.cc | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/include/abg-regex.h b/include/abg-regex.h index 164083cc..7ab9fc08 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 namespace sptr_utils diff --git a/src/abg-regex.cc b/src/abg-regex.cc index a12ecc88..cd7c41ce 100644 --- a/src/abg-regex.cc +++ b/src/abg-regex.cc @@ -23,12 +23,22 @@ /// Some specialization for shared pointer utility templates. /// +#include "config.h" + #include #include +#include "abg-internal.h" + +// +ABG_BEGIN_EXPORT_DECLARATIONS + #include "abg-regex.h" #include "abg-sptr-utils.h" +ABG_END_EXPORT_DECLARATIONS +// + namespace abigail { @@ -104,6 +114,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