TFile& TFile::AddAlias(const Stroka& name) { AddAliasImpl(name); const TStringBuf proto = STRINGBUF(".proto"); const TStringBuf gztproto = STRINGBUF(".gztproto"); // also add complementing .gztproto or .proto if (name.has_suffix(proto)) AddAliasImpl(Stroka(TStringBuf(name).Chop(proto.size()), gztproto)); else if (name.has_suffix(gztproto)) AddAliasImpl(Stroka(TStringBuf(name).Chop(gztproto.size()), proto)); return *this; }
static inline TStringBuf StripLeft(const TStringBuf& s) throw () { const char* b = s.begin(); const char* e = s.end(); StripRangeBegin(b, e); return TStringBuf(b, e); }
TStringBuf SubstrUTF8(const TStringBuf& str, size_t pos, size_t len) { const char* start = SkipUTF8Chars(str.begin(), str.end(), pos); const char* end = SkipUTF8Chars(start, str.end(), len); return TStringBuf(start, end - start); }
void TOpts::PrintUsage(const TStringBuf& program, IOutputStream& osIn, const NColorizer::TColors& colors) const { TStringStream os; if (!Title.empty()) os << Title << "\n\n"; PrintCmdLine(program, os, colors); TVector<TString> leftColumn(Opts_.size()); TVector<size_t> leftColumnSizes(leftColumn.size()); size_t leftWidth = 0; size_t requiredOptionsCount = 0; NColorizer::TColors disabledColors(false); for (size_t i = 0; i < Opts_.size(); i++) { const TOpt* opt = Opts_[i].Get(); if (opt->IsHidden()) continue; leftColumn[i] = FormatOption(opt, colors); const size_t leftColumnSize = colors.IsTTY() ? FormatOption(opt, disabledColors).size() : leftColumn[i].size(); leftColumnSizes[i] = leftColumnSize; leftWidth = Max(leftWidth, leftColumnSize); if (opt->IsRequired()) requiredOptionsCount++; } const size_t kMaxLeftWidth = 25; leftWidth = Min(leftWidth, kMaxLeftWidth); const TString maxPadding(kMaxLeftWidth, ' '); const TString leftPadding(leftWidth, ' '); for (size_t sectionId = 0; sectionId <= 1; sectionId++) { bool requiredOptionsSection = (sectionId == 0); if (requiredOptionsSection) { if (requiredOptionsCount == 0) continue; os << Endl << colors.BoldColor() << "Required parameters" << colors.OldColor() << ":" << Endl; } else { if (requiredOptionsCount == Opts_.size()) continue; if (requiredOptionsCount == 0) os << Endl << colors.BoldColor() << "Options" << colors.OldColor() << ":" << Endl; else os << Endl << colors.BoldColor() << "Optional parameters" << colors.OldColor() << ":" << Endl; // optional options would be a tautology } for (size_t i = 0; i < Opts_.size(); i++) { const TOpt* opt = Opts_[i].Get(); if (opt->IsHidden()) continue; if (opt->IsRequired() != requiredOptionsSection) continue; if (leftColumnSizes[i] > leftWidth && !opt->GetHelp().empty()) { os << SPad << leftColumn[i] << Endl << SPad << maxPadding << ' '; } else { os << SPad << leftColumn[i] << ' '; if (leftColumnSizes[i] < leftWidth) os << TStringBuf(~leftPadding, leftWidth - leftColumnSizes[i]); } bool multiLineHelp = false; if (!opt->GetHelp().empty()) { TVector<TStringBuf> helpLines; Split(opt->GetHelp(), "\n", helpLines); multiLineHelp = (helpLines.size() > 1); os << helpLines[0]; for (size_t j = 1; j < helpLines.size(); ++j) { if (helpLines[j].empty()) continue; os << Endl << SPad << leftPadding << ' ' << helpLines[j]; } } if (opt->HasDefaultValue()) { TString quotedDef = QuoteForHelp(opt->GetDefaultValue()); if (multiLineHelp) os << Endl << SPad << leftPadding << " Default: " << colors.CyanColor() << quotedDef << colors.OldColor(); else if (opt->GetHelp().empty()) os << "Default: " << colors.CyanColor() << quotedDef << colors.OldColor(); else os << " (default: " << colors.CyanColor() << quotedDef << colors.OldColor() << ")"; } os << Endl; } } PrintFreeArgsDesc(os, colors); osIn << os.Str(); }