std::vector<ParsedOption> ProgramInterface::getUsedOptionArguments() { std::vector<ParsedOption> opts; unsigned int numFlags = m_optionArguments.size(); for (unsigned int i = 0; i < numFlags; ++i) { Option& opt = *m_optionArguments[i]; if (opt.used && opt.longName != "negate-next") opts.push_back(ParsedOption(opt)); } return opts; }
QList<ParsedOption> OptionParser::parse(QString cmd, bool *ok) { QList<ParsedOption> options; if (ok) *ok = false; for (int i = 0; i < cmd.length(); ) { int j = cmd.indexOf(QRegExp("\\s+"), i); if (i == j) j = cmd.indexOf(QRegExp("[^\\s]+"), i); else { QString param = cmd.mid(i, j - i); if (param.startsWith("--")) { QString paramName = param.mid(2); bool optionOk; Option option = this->findOption(paramName, true, &optionOk); if (optionOk) { ParsedOption::OptionType type; QVariant value; if (option.flags() & Option::OptionFlagsHasValue) { i = cmd.indexOf(QRegExp("[^\\s]+"), j); j = cmd.indexOf(QRegExp("\\s+"), i); QString valueString = cmd.mid(i, j - i); if (QRegExp(option.valregex()).exactMatch(valueString)) value = this->convertValue(param, valueString); else { this->m_error = QString("Invalid value: %1 for %2").arg(valueString).arg(param); return options; } type = ParsedOption::OptionTypePair; } else type = ParsedOption::OptionTypeSingle; options << ParsedOption(paramName, value, type); } else { if (ok) *ok = false; this->m_error = QString("Invalid option: %1").arg(param); return options; } } else if (param.startsWith("-")) { QString paramName = param.mid(1); bool optionOk; Option option = this->findOption(paramName, false, &optionOk); if (optionOk) { ParsedOption::OptionType type; QVariant value; if (option.flags() & Option::OptionFlagsHasValue) { i = cmd.indexOf(QRegExp("[^\\s]+"), j); j = cmd.indexOf(QRegExp("\\s+"), i); QString valueString = cmd.mid(i, j - i); if (QRegExp(option.valregex()).exactMatch(valueString)) value = this->convertValue(param, valueString); else { this->m_error = QString("Invalid value: %1 for %2").arg(valueString).arg(param); return options; } type = ParsedOption::OptionTypePair; } else type = ParsedOption::OptionTypeSingle; options << ParsedOption(paramName, value, type); } else { if (ok) *ok = false; this->m_error = QString("Invalid option: %1").arg(param); return options; } } else options << ParsedOption("", param, ParsedOption::OptionTypeData); } if (j < 0) break; else i = j; } if (ok) *ok = true; return options; }