aboutsummaryrefslogtreecommitdiff
path: root/utils/FileCheck/FileCheck.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-09-24 20:39:13 +0000
committerChris Lattner <sabre@nondot.org>2009-09-24 20:39:13 +0000
commita29703e8426763fa5232f9a91e6a5fce4d4244d6 (patch)
treeacef59a3603caa964b92e034126829e67eccc0f2 /utils/FileCheck/FileCheck.cpp
parent9fc6678bea11f32acba4e9b6624ae9a0d3a9287b (diff)
change 'not' matching to use Pattern, move pattern parsing logic into
the Pattern class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82712 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/FileCheck/FileCheck.cpp')
-rw-r--r--utils/FileCheck/FileCheck.cpp83
1 files changed, 51 insertions, 32 deletions
diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp
index 56b59634b8..cab37fb586 100644
--- a/utils/FileCheck/FileCheck.cpp
+++ b/utils/FileCheck/FileCheck.cpp
@@ -39,16 +39,18 @@ static cl::opt<bool>
NoCanonicalizeWhiteSpace("strict-whitespace",
cl::desc("Do not treat all horizontal whitespace as equivalent"));
+//===----------------------------------------------------------------------===//
+// Pattern Handling Code.
+//===----------------------------------------------------------------------===//
+
class Pattern {
/// Str - The string to match.
std::string Str;
public:
- Pattern(StringRef S) : Str(S.str()) {
- // Remove duplicate spaces in the check strings if requested.
- if (!NoCanonicalizeWhiteSpace)
- CanonicalizeCheckString();
- }
+ Pattern() { }
+
+ bool ParsePattern(StringRef PatternStr, SourceMgr &SM);
/// Match - Match the pattern string against the input buffer Buffer. This
/// returns the position that is matched or npos if there is no match. If
@@ -78,6 +80,33 @@ private:
}
};
+bool Pattern::ParsePattern(StringRef PatternStr, SourceMgr &SM) {
+ // Ignore trailing whitespace.
+ while (!PatternStr.empty() &&
+ (PatternStr.back() == ' ' || PatternStr.back() == '\t'))
+ PatternStr = PatternStr.substr(0, PatternStr.size()-1);
+
+ // Check that there is something on the line.
+ if (PatternStr.empty()) {
+ SM.PrintMessage(SMLoc::getFromPointer(PatternStr.data()),
+ "found empty check string with prefix '"+CheckPrefix+":'",
+ "error");
+ return true;
+ }
+
+ Str = PatternStr.str();
+
+ // Remove duplicate spaces in the check strings if requested.
+ if (!NoCanonicalizeWhiteSpace)
+ CanonicalizeCheckString();
+
+ return false;
+}
+
+
+//===----------------------------------------------------------------------===//
+// Check Strings.
+//===----------------------------------------------------------------------===//
/// CheckString - This is a check that we found in the input file.
struct CheckString {
@@ -94,7 +123,7 @@ struct CheckString {
/// NotStrings - These are all of the strings that are disallowed from
/// occurring between this match string and the previous one (or start of
/// file).
- std::vector<std::pair<SMLoc, std::string> > NotStrings;
+ std::vector<std::pair<SMLoc, Pattern> > NotStrings;
CheckString(const Pattern &P, SMLoc L, bool isCheckNext)
: Pat(P), Loc(L), IsCheckNext(isCheckNext) {}
@@ -119,7 +148,7 @@ static bool ReadCheckFile(SourceMgr &SM,
// Find all instances of CheckPrefix followed by : in the file.
StringRef Buffer = F->getBuffer();
- std::vector<std::pair<SMLoc, std::string> > NotMatches;
+ std::vector<std::pair<SMLoc, Pattern> > NotMatches;
while (1) {
// See if Prefix occurs in the memory buffer.
@@ -157,29 +186,14 @@ static bool ReadCheckFile(SourceMgr &SM,
// Scan ahead to the end of line.
size_t EOL = Buffer.find_first_of("\n\r");
- if (EOL == StringRef::npos) EOL = Buffer.size();
-
- // Ignore trailing whitespace.
- while (EOL && (Buffer[EOL-1] == ' ' || Buffer[EOL-1] == '\t'))
- --EOL;
-
- // Check that there is something on the line.
- if (EOL == 0) {
- SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()),
- "found empty check string with prefix '"+CheckPrefix+":'",
- "error");
+
+ // Parse the pattern.
+ Pattern P;
+ if (P.ParsePattern(Buffer.substr(0, EOL), SM))
return true;
- }
- StringRef PatternStr = Buffer.substr(0, EOL);
-
- // Handle CHECK-NOT.
- if (IsCheckNot) {
- NotMatches.push_back(std::make_pair(SMLoc::getFromPointer(Buffer.data()),
- PatternStr.str()));
- Buffer = Buffer.substr(EOL);
- continue;
- }
+ Buffer = Buffer.substr(EOL);
+
// Verify that CHECK-NEXT lines have at least one CHECK line before them.
if (IsCheckNext && CheckStrings.empty()) {
@@ -189,15 +203,19 @@ static bool ReadCheckFile(SourceMgr &SM,
return true;
}
- Pattern P(PatternStr);
+ // Handle CHECK-NOT.
+ if (IsCheckNot) {
+ NotMatches.push_back(std::make_pair(SMLoc::getFromPointer(Buffer.data()),
+ P));
+ continue;
+ }
+
// Okay, add the string we captured to the output vector and move on.
CheckStrings.push_back(CheckString(P,
SMLoc::getFromPointer(Buffer.data()),
IsCheckNext));
std::swap(NotMatches, CheckStrings.back().NotStrings);
-
- Buffer = Buffer.substr(EOL);
}
if (CheckStrings.empty()) {
@@ -367,7 +385,8 @@ int main(int argc, char **argv) {
// If this match had "not strings", verify that they don't exist in the
// skipped region.
for (unsigned i = 0, e = CheckStr.NotStrings.size(); i != e; ++i) {
- size_t Pos = SkippedRegion.find(CheckStr.NotStrings[i].second);
+ size_t MatchLen = 0;
+ size_t Pos = CheckStr.NotStrings[i].second.Match(SkippedRegion, MatchLen);
if (Pos == StringRef::npos) continue;
SM.PrintMessage(SMLoc::getFromPointer(LastMatch+Pos),