void TOpts::AddCharOptions(const TStringBuf& optstring) { size_t p = 0; if (optstring[p] == '+') { ArgPermutation_ = REQUIRE_ORDER; ++p; } else if (optstring[p] == '-') { ArgPermutation_ = RETURN_IN_ORDER; ++p; } while (p < optstring.size()) { char c = optstring[p]; p++; EHasArg ha = NO_ARGUMENT; if (p < optstring.size() && optstring[p] == ':') { ha = REQUIRED_ARGUMENT; p++; } if (p < optstring.size() && optstring[p] == ':') { ha = OPTIONAL_ARGUMENT; p++; } AddCharOption(c, ha); } }
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; }
bool SkipPrefix(TStringBuf& keytext, const TStringBuf& prefix) { if (keytext.has_prefix(prefix)) { keytext.Skip(prefix.size()); return true; } else return false; }
static inline void CustomSplit(const TStringBuf& str, char sep, yvector<TStringBuf>& result) { result.clear(); typedef TContainerConsumer< yvector<TStringBuf> > TConsumer; TConsumer consumer(&result); TSkipEmptyTokens<TConsumer> filter(&consumer); SplitString(str.data(), str.data() + str.size(), TCharDelimiter<const char>(sep), filter); }
void DecodeUserInput(const TStringBuf& text, Wtroka& res, ECharset encoding, const Stroka& filename, size_t linenum) { const size_t MAX_MSG_TEXT_LEN = 250; try { CharToWide(text, res, encoding); } catch (...) { Cerr << "Cannot decode supplied text, invalid encoding (expected " << NameByCharset(encoding) << "):\n\n"; if (text.size() <= MAX_MSG_TEXT_LEN) Cerr << text; else Cerr << text.SubStr(0, MAX_MSG_TEXT_LEN) << "..."; Cerr << "\n"; if (!filename.empty()) { Cerr << "\n(File " << filename; if (linenum) Cerr << ", line " << linenum; Cerr << ")"; } Cerr << Endl; throw; } }