struct LRegex::Impl {
///
regex_t * preg;
-
+
///
int error_code;
-
+
///
mutable LRegex::SubMatches matches;
-
+
///
- Impl(string const & regex)
+ Impl(string const & regex)
: preg(new regex_t), error_code(0)
{
error_code = regcomp(preg, regex.c_str(), REG_EXTENDED);
}
-
+
///
~Impl()
{
regfree(preg);
delete preg;
}
-
+
///
bool exact_match(string const & str) const
{
regmatch_t tmp;
if (!regexec(preg, str.c_str(), 1, &tmp, 0)) {
- if (tmp.rm_so == 0 &&
+ if (tmp.rm_so == 0 &&
tmp.rm_eo == static_cast<signed int>(str.length()))
return true;
}
// no match
return false;
}
-
+
///
LRegex::MatchPair const first_match(string const & str) const
{
regmatch_t tmp;
regexec(preg, str.c_str(), 1, &tmp, 0);
- unsigned int first = tmp.rm_so != -1 ?
- static_cast<unsigned int>(tmp.rm_so) : string::npos;
- unsigned int second = tmp.rm_eo != -1 ?
- static_cast<unsigned int>(tmp.rm_eo) : string::npos;
+ string::size_type const first = tmp.rm_so != -1 ?
+ tmp.rm_so : string::npos;
+ string::size_type const second = tmp.rm_eo != -1 ?
+ tmp.rm_eo : string::npos;
return make_pair(first, second - first);
}
-
+
///
string const getError() const
{
size_t nr = regerror(error_code, preg, 0, 0);
char * tmp = new char[nr];
regerror(error_code, preg, tmp, nr);
- string ret(tmp);
+ string const ret(tmp);
delete [] tmp;
return ret;
}
-
+
///
LRegex::SubMatches const & exec(string const & str) const
{
// func much faster, but client code will be simpler,
// because then it will only be needed to scan through
// all the entries in matches.
- size_t subs = (preg->re_nsub != 0 ? (preg->re_nsub + 1) : 1);
+ size_t const subs =
+ (preg->re_nsub != 0 ? (preg->re_nsub + 1) : 1);
regmatch_t * mat = new regmatch_t[subs];
- unsigned int first = 0;
- unsigned int second = 0;
+ string::size_type first = 0;
+ string::size_type second = 0;
matches.erase(matches.begin(), matches.end());
if (!regexec(preg, str.c_str(), subs, mat, 0)) { // some match
matches.reserve(subs);
for (size_t i = 0; i < subs; ++i) {
first = mat[i].rm_so != -1 ?
- static_cast<unsigned int>
- (mat[i].rm_so) : string::npos;
+ mat[i].rm_so : string::npos;
second = mat[i].rm_eo != -1 ?
- static_cast<unsigned int>
- (mat[i].rm_eo) : string::npos;
+ mat[i].rm_eo : string::npos;
matches.push_back(make_pair(first,
second - first));
}