aboutsummaryrefslogtreecommitdiff
path: root/src/libutil
diff options
context:
space:
mode:
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/regex.cc33
-rw-r--r--src/libutil/regex.hh22
2 files changed, 55 insertions, 0 deletions
diff --git a/src/libutil/regex.cc b/src/libutil/regex.cc
new file mode 100644
index 000000000..36c8458ce
--- /dev/null
+++ b/src/libutil/regex.cc
@@ -0,0 +1,33 @@
+#include "regex.hh"
+#include "types.hh"
+
+namespace nix {
+
+Regex::Regex(const string & pattern)
+{
+ /* Patterns must match the entire string. */
+ int err = regcomp(&preg, ("^(" + pattern + ")$").c_str(), REG_NOSUB | REG_EXTENDED);
+ if (err) throw Error(format("compiling pattern ‘%1%’: %2%") % pattern % showError(err));
+}
+
+Regex::~Regex()
+{
+ regfree(&preg);
+}
+
+bool Regex::matches(const string & s)
+{
+ int err = regexec(&preg, s.c_str(), 0, 0, 0);
+ if (err == 0) return true;
+ else if (err == REG_NOMATCH) return false;
+ throw Error(format("matching string ‘%1%’: %2%") % s % showError(err));
+}
+
+string Regex::showError(int err)
+{
+ char buf[256];
+ regerror(err, &preg, buf, sizeof(buf));
+ return string(buf);
+}
+
+}
diff --git a/src/libutil/regex.hh b/src/libutil/regex.hh
new file mode 100644
index 000000000..aa012b721
--- /dev/null
+++ b/src/libutil/regex.hh
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "types.hh"
+
+#include <sys/types.h>
+#include <regex.h>
+
+namespace nix {
+
+class Regex
+{
+public:
+ Regex(const string & pattern);
+ ~Regex();
+ bool matches(const string & s);
+
+private:
+ regex_t preg;
+ string showError(int err);
+};
+
+}