SkString SkTabString(const SkString& string, int tabCnt) { if (tabCnt <= 0) { return string; } SkString tabs; for (int i = 0; i < tabCnt; ++i) { tabs.append("\t"); } SkString result; static const char newline[] = "\n"; const char* input = string.c_str(); int nextNL = SkStrFind(input, newline); while (nextNL >= 0) { if (nextNL > 0) { result.append(tabs); } result.append(input, nextNL + 1); input += nextNL + 1; nextNL = SkStrFind(input, newline); } if (*input != '\0') { result.append(tabs); result.append(input); } return result; }
static void print_indented(const SkString& text) { size_t length = text.size(); const char* currLine = text.c_str(); const char* stop = currLine + length; while (currLine < stop) { int lineBreak = SkStrFind(currLine, "\n"); if (lineBreak < 0) { lineBreak = static_cast<int>(strlen(currLine)); } if (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(" %.*s\n", spaceIndex, currLine); currLine += spaceIndex + gap; } else { // the line break is within the limit. Break there. lineBreak++; SkDebugf(" %.*s", lineBreak, currLine); currLine += lineBreak; } } }
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"); }
bool SkFlagInfo::match(const char* string) { if (SkStrStartsWith(string, '-') && strlen(string) > 1) { string++; const SkString* compareName; if (SkStrStartsWith(string, '-') && strlen(string) > 1) { string++; // There were two dashes. Compare against full name. compareName = &fName; } else { // One dash. Compare against the short name. compareName = &fShortName; } if (kBool_FlagType == fFlagType) { // In this case, go ahead and set the value. if (compareName->equals(string)) { *fBoolValue = true; return true; } if (SkStrStartsWith(string, "no") && strlen(string) > 2) { string += 2; // Only allow "no" to be prepended to the full name. if (fName.equals(string)) { *fBoolValue = false; return true; } return false; } int equalIndex = SkStrFind(string, "="); if (equalIndex > 0) { // The string has an equal sign. Check to see if the string matches. SkString flag(string, equalIndex); if (flag.equals(*compareName)) { // Check to see if the remainder beyond the equal sign is true or false: string += equalIndex + 1; parse_bool_arg(string, fBoolValue); return true; } else { return false; } } } return compareName->equals(string); } else { // Has no dash return false; } return false; }