From 0b57cec536236d46e3dba9bd041533462f33dbb7 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Fri, 20 Dec 2019 19:53:05 +0000 Subject: Move all sources from the llvm project into contrib/llvm-project. This uses the new layout of the upstream repository, which was recently migrated to GitHub, and converted into a "monorepo". That is, most of the earlier separate sub-projects with their own branches and tags were consolidated into one top-level directory, and are now branched and tagged together. Updating the vendor area to match this layout is next. --- contrib/llvm/lib/Support/Regex.cpp | 209 ------------------------------------- 1 file changed, 209 deletions(-) delete mode 100644 contrib/llvm/lib/Support/Regex.cpp (limited to 'contrib/llvm/lib/Support/Regex.cpp') diff --git a/contrib/llvm/lib/Support/Regex.cpp b/contrib/llvm/lib/Support/Regex.cpp deleted file mode 100644 index 4c1b07038024..000000000000 --- a/contrib/llvm/lib/Support/Regex.cpp +++ /dev/null @@ -1,209 +0,0 @@ -//===-- Regex.cpp - Regular Expression matcher implementation -------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// This file implements a POSIX regular expression matcher. -// -//===----------------------------------------------------------------------===// - -#include "llvm/Support/Regex.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/Twine.h" -#include - -// Important this comes last because it defines "_REGEX_H_". At least on -// Darwin, if included before any header that (transitively) includes -// xlocale.h, this will cause trouble, because of missing regex-related types. -#include "regex_impl.h" - -using namespace llvm; - -Regex::Regex() : preg(nullptr), error(REG_BADPAT) {} - -Regex::Regex(StringRef regex, unsigned Flags) { - unsigned flags = 0; - preg = new llvm_regex(); - preg->re_endp = regex.end(); - if (Flags & IgnoreCase) - flags |= REG_ICASE; - if (Flags & Newline) - flags |= REG_NEWLINE; - if (!(Flags & BasicRegex)) - flags |= REG_EXTENDED; - error = llvm_regcomp(preg, regex.data(), flags|REG_PEND); -} - -Regex::Regex(Regex &®ex) { - preg = regex.preg; - error = regex.error; - regex.preg = nullptr; - regex.error = REG_BADPAT; -} - -Regex::~Regex() { - if (preg) { - llvm_regfree(preg); - delete preg; - } -} - -bool Regex::isValid(std::string &Error) const { - if (!error) - return true; - - size_t len = llvm_regerror(error, preg, nullptr, 0); - - Error.resize(len - 1); - llvm_regerror(error, preg, &Error[0], len); - return false; -} - -/// getNumMatches - In a valid regex, return the number of parenthesized -/// matches it contains. -unsigned Regex::getNumMatches() const { - return preg->re_nsub; -} - -bool Regex::match(StringRef String, SmallVectorImpl *Matches){ - if (error) - return false; - - unsigned nmatch = Matches ? preg->re_nsub+1 : 0; - - // pmatch needs to have at least one element. - SmallVector pm; - pm.resize(nmatch > 0 ? nmatch : 1); - pm[0].rm_so = 0; - pm[0].rm_eo = String.size(); - - int rc = llvm_regexec(preg, String.data(), nmatch, pm.data(), REG_STARTEND); - - if (rc == REG_NOMATCH) - return false; - if (rc != 0) { - // regexec can fail due to invalid pattern or running out of memory. - error = rc; - return false; - } - - // There was a match. - - if (Matches) { // match position requested - Matches->clear(); - - for (unsigned i = 0; i != nmatch; ++i) { - if (pm[i].rm_so == -1) { - // this group didn't match - Matches->push_back(StringRef()); - continue; - } - assert(pm[i].rm_eo >= pm[i].rm_so); - Matches->push_back(StringRef(String.data()+pm[i].rm_so, - pm[i].rm_eo-pm[i].rm_so)); - } - } - - return true; -} - -std::string Regex::sub(StringRef Repl, StringRef String, - std::string *Error) { - SmallVector Matches; - - // Reset error, if given. - if (Error && !Error->empty()) *Error = ""; - - // Return the input if there was no match. - if (!match(String, &Matches)) - return String; - - // Otherwise splice in the replacement string, starting with the prefix before - // the match. - std::string Res(String.begin(), Matches[0].begin()); - - // Then the replacement string, honoring possible substitutions. - while (!Repl.empty()) { - // Skip to the next escape. - std::pair Split = Repl.split('\\'); - - // Add the skipped substring. - Res += Split.first; - - // Check for terminimation and trailing backslash. - if (Split.second.empty()) { - if (Repl.size() != Split.first.size() && - Error && Error->empty()) - *Error = "replacement string contained trailing backslash"; - break; - } - - // Otherwise update the replacement string and interpret escapes. - Repl = Split.second; - - // FIXME: We should have a StringExtras function for mapping C99 escapes. - switch (Repl[0]) { - // Treat all unrecognized characters as self-quoting. - default: - Res += Repl[0]; - Repl = Repl.substr(1); - break; - - // Single character escapes. - case 't': - Res += '\t'; - Repl = Repl.substr(1); - break; - case 'n': - Res += '\n'; - Repl = Repl.substr(1); - break; - - // Decimal escapes are backreferences. - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { - // Extract the backreference number. - StringRef Ref = Repl.slice(0, Repl.find_first_not_of("0123456789")); - Repl = Repl.substr(Ref.size()); - - unsigned RefValue; - if (!Ref.getAsInteger(10, RefValue) && - RefValue < Matches.size()) - Res += Matches[RefValue]; - else if (Error && Error->empty()) - *Error = ("invalid backreference string '" + Twine(Ref) + "'").str(); - break; - } - } - } - - // And finally the suffix. - Res += StringRef(Matches[0].end(), String.end() - Matches[0].end()); - - 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(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; -} -- cgit v1.2.3