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;
}
예제 #2
0
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;
}