aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support/Regex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/Regex.cpp')
-rw-r--r--lib/Support/Regex.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/Support/Regex.cpp b/lib/Support/Regex.cpp
index 5413641840..1115534427 100644
--- a/lib/Support/Regex.cpp
+++ b/lib/Support/Regex.cpp
@@ -33,8 +33,10 @@ Regex::Regex(StringRef regex, unsigned Flags) {
}
Regex::~Regex() {
- llvm_regfree(preg);
- delete preg;
+ if (preg) {
+ llvm_regfree(preg);
+ delete preg;
+ }
}
bool Regex::isValid(std::string &Error) {
@@ -169,9 +171,23 @@ std::string Regex::sub(StringRef Repl, StringRef String,
return Res;
}
+// These are the special characters matched in functions like "p_ere_exp".
+static const char RegexMetachars[] = "()^$|*+?.[]\\{}";
+
bool Regex::isLiteralERE(StringRef Str) {
// Check for regex metacharacters. This list was derived from our regex
// implementation in regcomp.c and double checked against the POSIX extended
// regular expression specification.
- return Str.find_first_of("()^$|*+?.[]\\{}") == StringRef::npos;
+ return Str.find_first_of(RegexMetachars) == StringRef::npos;
+}
+
+std::string Regex::escape(StringRef String) {
+ std::string RegexStr;
+ for (unsigned i = 0, e = String.size(); i != e; ++i) {
+ if (strchr(RegexMetachars, String[i]))
+ RegexStr += '\\';
+ RegexStr += String[i];
+ }
+
+ return RegexStr;
}