[v4,06/15] Add POSIX regex wrapper functions.
Commit Message
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 <maennich@google.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
---
include/abg-regex.h | 6 ++++++
src/abg-regex.cc | 40 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 46 insertions(+)
Comments
Giuliano Procida <gprocida@google.com> a ?crit:
> 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.
Applied to master, thanks.
@@ -71,6 +71,12 @@ operator<<(std::ostream& os, const escape& esc);
std::string
generate_from_strings(const std::vector<std::string>& 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
@@ -23,12 +23,22 @@
/// Some specialization for shared pointer utility templates.
///
+#include "config.h"
+
#include <sstream>
#include <ostream>
+#include "abg-internal.h"
+
+// <headers defining libabigail's API go under here>
+ABG_BEGIN_EXPORT_DECLARATIONS
+
#include "abg-regex.h"
#include "abg-sptr-utils.h"
+ABG_END_EXPORT_DECLARATIONS
+// </headers defining libabigail's API>
+
namespace abigail
{
@@ -104,6 +114,36 @@ generate_from_strings(const std::vector<std::string>& 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