Update help in SkFlags.
Print the short name in addition to the standard name. Allow an option for getting help for a specific command. Review URL: https://codereview.chromium.org/12411007 git-svn-id: http://skia.googlecode.com/svn/trunk@8273 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
c78188896e
commit
8366df025a
@ -17,6 +17,56 @@ void SkFlags::SetUsage(const char* usage) {
|
||||
// Maximum line length for the help message.
|
||||
#define LINE_LENGTH 80
|
||||
|
||||
static void print_help_for_flag(const SkFlagInfo* flag) {
|
||||
SkDebugf("\t--%s", flag->name().c_str());
|
||||
const SkString& shortName = flag->shortName();
|
||||
if (shortName.size() > 0) {
|
||||
SkDebugf(" or -%s", shortName.c_str());
|
||||
}
|
||||
SkDebugf(":\ttype: %s", flag->typeAsString().c_str());
|
||||
if (flag->defaultValue().size() > 0) {
|
||||
SkDebugf("\tdefault: %s", flag->defaultValue().c_str());
|
||||
}
|
||||
SkDebugf("\n");
|
||||
const SkString& help = flag->help();
|
||||
size_t length = help.size();
|
||||
const char* currLine = help.c_str();
|
||||
const char* stop = currLine + length;
|
||||
while (currLine < stop) {
|
||||
if (strlen(currLine) < LINE_LENGTH) {
|
||||
// Only one line length's worth of text left.
|
||||
SkDebugf("\t\t%s\n", currLine);
|
||||
break;
|
||||
}
|
||||
int lineBreak = SkStrFind(currLine, "\n");
|
||||
if (lineBreak < 0 || lineBreak > LINE_LENGTH) {
|
||||
// No line break within line length. Will need to insert one.
|
||||
// Find a space before the line break.
|
||||
int spaceIndex = LINE_LENGTH - 1;
|
||||
while (spaceIndex > 0 && currLine[spaceIndex] != ' ') {
|
||||
spaceIndex--;
|
||||
}
|
||||
int gap;
|
||||
if (0 == spaceIndex) {
|
||||
// No spaces on the entire line. Go ahead and break mid word.
|
||||
spaceIndex = LINE_LENGTH;
|
||||
gap = 0;
|
||||
} else {
|
||||
// Skip the space on the next line
|
||||
gap = 1;
|
||||
}
|
||||
SkDebugf("\t\t%.*s\n", spaceIndex, currLine);
|
||||
currLine += spaceIndex + gap;
|
||||
} else {
|
||||
// the line break is within the limit. Break there.
|
||||
lineBreak++;
|
||||
SkDebugf("\t\t%.*s", lineBreak, currLine);
|
||||
currLine += lineBreak;
|
||||
}
|
||||
}
|
||||
SkDebugf("\n");
|
||||
}
|
||||
|
||||
void SkFlags::ParseCommandLine(int argc, char** argv) {
|
||||
// Only allow calling this function once.
|
||||
static bool gOnce;
|
||||
@ -34,55 +84,43 @@ void SkFlags::ParseCommandLine(int argc, char** argv) {
|
||||
if (0 == strcmp("-h", argv[i]) || 0 == strcmp("--h", argv[i])
|
||||
|| 0 == strcmp("-help", argv[i]) || 0 == strcmp("--help", argv[i])) {
|
||||
// Print help message.
|
||||
SkDebugf("%s\n%s\n", argv[0], gUsage.c_str());
|
||||
SkTDArray<const char*> helpFlags;
|
||||
for (int j = i + 1; j < argc; j++) {
|
||||
if (SkStrStartsWith(argv[j], '-')) {
|
||||
break;
|
||||
}
|
||||
helpFlags.append(1, &argv[j]);
|
||||
}
|
||||
if (0 == helpFlags.count()) {
|
||||
// Only print general help message if help for specific flags is not requested.
|
||||
SkDebugf("%s\n%s\n", argv[0], gUsage.c_str());
|
||||
}
|
||||
SkDebugf("Flags:\n");
|
||||
SkFlagInfo* flag = SkFlags::gHead;
|
||||
while (flag != NULL) {
|
||||
SkDebugf("\t--%s:\ttype: %s", flag->name().c_str(),
|
||||
flag->typeAsString().c_str());
|
||||
if (flag->defaultValue().size() > 0) {
|
||||
SkDebugf("\tdefault: %s", flag->defaultValue().c_str());
|
||||
}
|
||||
SkDebugf("\n");
|
||||
const SkString& help = flag->help();
|
||||
size_t length = help.size();
|
||||
const char* currLine = help.c_str();
|
||||
const char* stop = currLine + length;
|
||||
while (currLine < stop) {
|
||||
if (strlen(currLine) < LINE_LENGTH) {
|
||||
// Only one line length's worth of text left.
|
||||
SkDebugf("\t\t%s\n", currLine);
|
||||
break;
|
||||
}
|
||||
int lineBreak = SkStrFind(currLine, "\n");
|
||||
if (lineBreak < 0 || lineBreak > LINE_LENGTH) {
|
||||
// No line break within line length. Will need to insert one.
|
||||
// Find a space before the line break.
|
||||
int spaceIndex = LINE_LENGTH - 1;
|
||||
while (spaceIndex > 0 && currLine[spaceIndex] != ' ') {
|
||||
spaceIndex--;
|
||||
// If no flags followed --help, print them all
|
||||
bool printFlag = 0 == helpFlags.count();
|
||||
if (!printFlag) {
|
||||
for (int k = 0; k < helpFlags.count(); k++) {
|
||||
if (flag->name().equals(helpFlags[k]) ||
|
||||
flag->shortName().equals(helpFlags[k])) {
|
||||
printFlag = true;
|
||||
helpFlags.remove(k);
|
||||
break;
|
||||
}
|
||||
int gap;
|
||||
if (0 == spaceIndex) {
|
||||
// No spaces on the entire line. Go ahead and break mid word.
|
||||
spaceIndex = LINE_LENGTH;
|
||||
gap = 0;
|
||||
} else {
|
||||
// Skip the space on the next line
|
||||
gap = 1;
|
||||
}
|
||||
SkDebugf("\t\t%.*s\n", spaceIndex, currLine);
|
||||
currLine += spaceIndex + gap;
|
||||
} else {
|
||||
// the line break is within the limit. Break there.
|
||||
lineBreak++;
|
||||
SkDebugf("\t\t%.*s", lineBreak, currLine);
|
||||
currLine += lineBreak;
|
||||
}
|
||||
}
|
||||
SkDebugf("\n");
|
||||
if (printFlag) {
|
||||
print_help_for_flag(flag);
|
||||
}
|
||||
flag = flag->next();
|
||||
}
|
||||
if (helpFlags.count() > 0) {
|
||||
SkDebugf("Requested help for unrecognized flags:\n");
|
||||
for (int k = 0; k < helpFlags.count(); k++) {
|
||||
SkDebugf("\t--%s\n", helpFlags[k]);
|
||||
}
|
||||
}
|
||||
helpPrinted = true;
|
||||
}
|
||||
if (!helpPrinted) {
|
||||
|
@ -298,6 +298,8 @@ public:
|
||||
|
||||
const SkString& name() const { return fName; }
|
||||
|
||||
const SkString& shortName() const { return fShortName; }
|
||||
|
||||
const SkString& help() const { return fHelpString; }
|
||||
|
||||
SkString defaultValue() const {
|
||||
|
Loading…
Reference in New Issue
Block a user