Index: bench/benchmain.cpp |
=================================================================== |
--- bench/benchmain.cpp (revision 9088) |
+++ bench/benchmain.cpp (working copy) |
@@ -271,17 +271,35 @@ |
} |
static bool skip_name(const SkTDArray<const char*> array, const char name[]) { |
- if (0 == array.count()) { |
- // no names, so don't skip anything |
- return false; |
- } |
+ // FIXME: this duplicates the logic in skia_test.cpp, gmmain.cpp -- consolidate |
+ int count = array.count(); |
+ size_t testLen = strlen(name); |
+ bool anyExclude = count == 0; |
for (int i = 0; i < array.count(); ++i) { |
- if (strstr(name, array[i])) { |
- // found the name, so don't skip |
- return false; |
+ const char* matchName = array[i]; |
+ 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(name, matchName, matchLen) == 0 |
+ : matchEnd ? matchLen <= testLen |
+ && strncmp(name + testLen - matchLen, matchName, matchLen) == 0 |
+ : strstr(name, matchName) != 0) { |
+ return matchExclude; |
+ } |
} |
- return true; |
+ return !anyExclude; |
} |
static void help() { |
@@ -329,7 +347,14 @@ |
SkDebugf(" -1 for either value means use the default. 0 for either disables the cache.\n"); |
#endif |
SkDebugf(" --strokeWidth width : The width for path stroke.\n"); |
- SkDebugf(" --match name : Only run bench whose name is matched.\n"); |
+ SkDebugf(" --match [~][^]substring[$] [...] of test name to run.\n" |
+ " Multiple matches may be separated by spaces.\n" |
+ " ~ causes a matching test to always be skipped\n" |
+ " ^ requires the start of the test to match\n" |
+ " $ requires the end of the test to match\n" |
+ " ^ and $ requires an exact match\n" |
+ " If a test does not match any list entry,\n" |
+ " it is skipped unless some list entry starts with ~\n"); |
SkDebugf(" --mode normal|deferred|deferredSilent|record|picturerecord :\n" |
" Run in the corresponding mode\n" |
" normal, Use a normal canvas to draw to;\n" |
@@ -526,9 +551,11 @@ |
} |
} else if (strcmp(*argv, "--match") == 0) { |
argv++; |
- if (argv < stop) { |
- *fMatches.append() = *argv; |
- } else { |
+ while (argv < stop && (*argv)[0] != '-') { |
+ *fMatches.append() = *argv++; |
+ } |
+ argv--; |
+ if (!fMatches.count()) { |
logger.logError("missing arg for --match\n"); |
help(); |
return -1; |