| Index: tests/skia_test.cpp | 
| =================================================================== | 
| --- tests/skia_test.cpp	(revision 10283) | 
| +++ tests/skia_test.cpp	(working copy) | 
| @@ -159,6 +159,44 @@ | 
| int32_t* fFailCount; | 
| }; | 
|  | 
| +/* Takes a list of the form [~][^]match[$] | 
| +   ~ causes a matching test to always be skipped | 
| +   ^ requires the start of the test to match | 
| +   $ requires the end of the test to match | 
| +   ^ and $ requires an exact match | 
| +   If a test does not match any list entry, it is skipped unless some list entry starts with ~ | 
| + */ | 
| +static bool shouldSkip(const char* testName) { | 
| +    int count = FLAGS_match.count(); | 
| +    size_t testLen = strlen(testName); | 
| +    bool anyExclude = count == 0; | 
| +    for (int index = 0; index < count; ++index) { | 
| +        const char* matchName = FLAGS_match[index]; | 
| +        size_t matchLen = strlen(matchName); | 
| +        bool matchExclude, matchStart, matchEnd; | 
| +        if ((matchExclude = matchName[0] == '~')) { | 
| +            anyExclude = true; | 
| +            matchName++; | 
| +            matchLen--; | 
| +        } | 
| +        if ((matchStart = matchName[0] == '^')) { | 
| +            matchName++; | 
| +            matchLen--; | 
| +        } | 
| +        if ((matchEnd = matchName[matchLen - 1] == '$')) { | 
| +            matchLen--; | 
| +        } | 
| +        if (matchStart ? (!matchEnd || matchLen == testLen) | 
| +                && strncmp(testName, matchName, matchLen) == 0 | 
| +                : matchEnd ? matchLen <= testLen | 
| +                && strncmp(testName + testLen - matchLen, matchName, matchLen) == 0 | 
| +                : strstr(testName, matchName) != 0) { | 
| +            return matchExclude; | 
| +        } | 
| +    } | 
| +    return !anyExclude; | 
| +} | 
| + | 
| int tool_main(int argc, char** argv); | 
| int tool_main(int argc, char** argv) { | 
| SkCommandLineFlags::SetUsage(""); | 
| @@ -206,16 +244,9 @@ | 
| int total = 0; | 
| int toRun = 0; | 
| Test* test; | 
| - | 
| -    SkTDArray<const char*> matchStrs; | 
| -    for(int i = 0; i < FLAGS_match.count(); ++i) { | 
| -        matchStrs.push(FLAGS_match[i]); | 
| -    } | 
| - | 
| while ((test = iter.next()) != NULL) { | 
| SkAutoTDelete<Test> owned(test); | 
| - | 
| -        if(!SkCommandLineFlags::ShouldSkip(matchStrs, test->getName())) { | 
| +        if(!shouldSkip(test->getName())) { | 
| toRun++; | 
| } | 
| total++; | 
| @@ -231,7 +262,7 @@ | 
| SkTArray<Test*> unsafeTests;  // Always passes ownership to an SkTestRunnable | 
| for (int i = 0; i < total; i++) { | 
| SkAutoTDelete<Test> test(iter.next()); | 
| -        if (SkCommandLineFlags::ShouldSkip(matchStrs, test->getName())) { | 
| +        if (shouldSkip(test->getName())) { | 
| ++skipCount; | 
| } else if (!test->isThreadsafe()) { | 
| unsafeTests.push_back() = test.detach(); | 
|  |