52#include <libdap/debug.h>
53#include <libdap/util.h>
66BESRegex::init(
const char *t)
69 d_preg =
static_cast<void*
>(
new regex_t);
71 int result = regcomp(
static_cast<regex_t*
>(d_preg), t, REG_EXTENDED);
73 size_t msg_len = regerror(result,
static_cast<regex_t*
>(d_preg),
74 static_cast<char*
>(
nullptr),
75 static_cast<size_t>(0));
77 vector<char> msg(msg_len+1);
78 regerror(result,
static_cast<regex_t*
>(d_preg), msg.data(), msg_len);
79 string err = string(
"BESRegex error: ") + string(msg.data(), msg_len);
80 throw BESError(err, BES_SYNTAX_USER_ERROR, __FILE__, __LINE__);
89BESRegex::init(
const string &t)
98 regfree(
static_cast<regex_t*
>(d_preg));
99 delete static_cast<regex_t*
>(d_preg); d_preg = 0;
133 regmatch_t *pmatch =
new regmatch_t[len+1];
136 int result = regexec(
static_cast<regex_t*
>(d_preg),
137 ss.substr(pos, len-pos).c_str(), len, pmatch, 0);
139 if (result == REG_NOMATCH)
142 matchnum = pmatch[0].rm_eo - pmatch[0].rm_so;
144 delete[] pmatch; pmatch = 0;
149 throw Error(
"Position exceed length in BESRegex::match()");
152 auto target = string(s+pos, len-pos);
153 bool found = regex_search(target,
match, d_exp);
155 return (
int)
match.length();
171 bool found = regex_search(s,
match, d_exp);
173 return (
int)
match.length();
177 return match(s.c_str(), s.length(), 0);
196 if (!libdap::size_ok(
sizeof(regmatch_t), len+1))
207 regmatch_t *pmatch =
new regmatch_t[len+1];
210 int result = regexec(
static_cast<regex_t*
>(d_preg),
211 ss.substr(pos, len-pos).c_str(), len, pmatch, 0);
212 if (result == REG_NOMATCH) {
213 delete[] pmatch; pmatch = 0;
219 for (
int i = 1; i < len; ++i)
220 if (pmatch[i].rm_so != -1 && pmatch[i].rm_so < pmatch[m].rm_so)
223 matchlen = pmatch[m].rm_eo - pmatch[m].rm_so;
224 int matchpos = pmatch[m].rm_so;
226 delete[] pmatch; pmatch = 0;
233 auto target = string(s+pos, len-pos);
234 bool found = regex_search(target,
match, d_exp);
237 return (
int)
match.position();
254 bool found = regex_search(s,
match, d_exp);
257 return (
int)
match.position();
262 return search(s.c_str(), s.length(), matchlen, 0);
Base exception class for the BES with basic string message.
BESRegex(const char *s)
initialize a BESRegex with a C string
int match(const char *s, int len, int pos=0) const
Does the pattern match.
int search(const char *s, int len, int &matchlen, int pos=0) const
How much of the string does the pattern match.