summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/BRegex.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/BRegex.cc b/src/BRegex.cc
new file mode 100644
index 0000000..a7b37b0
--- /dev/null
+++ b/src/BRegex.cc
@@ -0,0 +1,49 @@
+#include "BRegex.h"
+
+Balau::Regex::Regex(const char * regex, bool icase) throw (GeneralException) {
+ int r = regcomp(&m_regex, regex, REG_EXTENDED | (icase ? REG_ICASE : 0));
+ if (r)
+ throw GeneralException(getError(r));
+}
+
+Balau::Regex::Captures Balau::Regex::match(const char * str) throw (GeneralException) {
+ Captures ret;
+ regmatch_t * matches = (regmatch_t *) alloca((m_regex.re_nsub + 1) * sizeof(regmatch_t));
+
+ int r = regexec(&m_regex, str, m_regex.re_nsub + 1, matches, 0);
+
+ if (r == REG_NOMATCH)
+ return ret;
+
+ if (r != 0)
+ throw GeneralException(getError(r));
+
+ for (int i = 0; i < m_regex.re_nsub + 1; i++) {
+ if (matches[i].rm_so >= 0) {
+ regoff_t begin = matches[i].rm_so;
+ regoff_t end = matches[i].rm_eo;
+ String t(str + begin, end - begin);
+ ret.push_back(t);
+ }
+ }
+
+ return ret;
+}
+
+Balau::Regex::~Regex() {
+ regfree(&m_regex);
+}
+
+Balau::String Balau::Regex::getError(int err) {
+ size_t s;
+ char * t;
+
+ s = regerror(err, &m_regex, NULL, 0);
+ t = (char *) malloc(s);
+ regerror(err, &m_regex, t, s);
+ String r(t, s - 1);
+ free(t);
+
+ return r;
+}
+