Add POSIX regex wrapper functions.

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>
This commit is contained in:
Giuliano Procida 2020-05-04 13:34:07 +01:00 committed by Dodji Seketeli
parent db8e3a0584
commit c72f52c381
2 changed files with 46 additions and 0 deletions

View File

@ -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

View File

@ -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