Exemplo n.º 1
0
GETOPT_INLINE void GetOpt_pp::_parse_env()
{
    // this will be optimized in version 3
    std::string var_name;
    std::string var_value;
    size_t var = 0;
    std::string::size_type pos;
    OptionData* data;

    while (environ[var] != NULL)
    {
        var_name = environ[var];
        pos = var_name.find('=');

        if (pos != std::string::npos)
        {
            var_value = var_name.substr(pos + 1);
            var_name = var_name.substr(0, pos);

            if (_longOps.find(var_name) == _longOps.end())
            {
                data = &_longOps[var_name];
                data->token = _add_token(var_name, Token::LongOption);
                data->flags = OptionData::Envir;
                _add_token(var_value, Token::OptionArgument);
            }
        }
        else
            (data = &_longOps[var_name])->flags = OptionData::Envir;

        var++;
    }
}
Exemplo n.º 2
0
GETOPT_INLINE void GetOpt_pp::_parse(int argc, char* argv[])
{
    _app_name = argv[0];
    bool any_option_processed = false;

    // parse arguments by their '-' or '--':
    //   (this will be a state machine soon)
    for (int i = 1; i < argc; i++)
    {
        const char current = argv[i][0];
        const char next = argv[i][1];

        if (current == '-' && (isalnum(next) || next == '-'))
        {
            // see what's next, differentiate whether it's short or long:
            if (next == '-' && argv[i][2] != 0)
            {
                // long option
                _longOps[&argv[i][2]].token = _add_token(&argv[i][2], Token::LongOption);
                any_option_processed = true;
            }
            else
            {
                // short option
                // iterate over all of them, keeping the last one in currentData
                // (so the intermediates will generate 'existent' arguments, as of '-abc')
                size_t j = 1;
                do
                {
                    _shortOps[argv[i][j]].token = _add_token(std::string(&argv[i][j], 1), Token::ShortOption);
                    j++;
                }
                while (argv[i][j] != 0);

                any_option_processed = true;
            }
        }
        else
        {
            _add_token(argv[i], any_option_processed ? Token::UnknownYet : Token::GlobalArgument);
        }
    }

    _last = _Option::OK;    // TODO: IMPROVE!!
}
Exemplo n.º 3
0
GETOPT_INLINE void GetOpt_pp::_parse(const std::vector<std::string>& args)
{
    bool any_option_processed = false;
    const size_t argc = args.size();

    size_t start = 0;
    if ( _app_name.empty() )
    {
        _app_name = args[0];
        start = 1;
    }

    // parse arguments by their '-' or '--':
    //   (this will be a state machine soon)
    for (size_t i = start; i < argc; i++)
    {
        const std::string& currentArg = args[i];

        if (currentArg[0] == '-' && currentArg.size() > 1)
        {
            // see what's next, differentiate whether it's short or long:
            if (currentArg[1] == '-')
            {
                if ( currentArg.size() > 2 )
                {
                    // long option
                    _longOps[currentArg.substr(2)].token = _add_token(currentArg.substr(2), Token::LongOption);
                }
                else
                {
                    // it's the -- option alone
                    _longOps[currentArg].token = _add_token(currentArg, Token::GlobalArgument);
                }

                any_option_processed = true;
            }
            else
            {
                // check if it is a negative number: rules
                //  * floating point negative numbers are straight classified as 'arguments'
                //  * integer negative numbers of more than 1 digit length are also 'arguments'
                //  * integer negatives of 1 digit length can be either arguments or short options.
                //  * anything else: short options.
                int anInt;
                float aFloat;
                std::stringstream dummy;
                if ( convert(currentArg, anInt, dummy.flags()) == _Option::OK )
                {
                    if ( currentArg.size() > 2 ) // if it's larger than -d (d=digit), then assume it's a negative number:
                        _add_token(currentArg, any_option_processed ? Token::UnknownYet : Token::GlobalArgument);
                    else // size == 2: it's a 1 digit negative number
                        _shortOps[currentArg[1]].token = _add_token(currentArg, Token::PossibleNegativeArgument);
                }
                else if ( convert(currentArg, aFloat, dummy.flags()) == _Option::OK )
                    _add_token(currentArg, any_option_processed ? Token::UnknownYet : Token::GlobalArgument);
                else
                {
                    // short option
                    // iterate over all of them, keeping the last one in currentData
                    // (so the intermediates will generate 'existent' arguments, as of '-abc')
                    for( size_t j = 1; j < currentArg.size(); j++ )
                        _shortOps[currentArg[j]].token = _add_token(std::string(currentArg, j, 1), Token::ShortOption);
                }

                any_option_processed = true;
            }
        }
        else if ( currentArg[0] == '@' && currentArg.size() > 1 )
        {
            // suboptions file
            _parse_sub_file(currentArg.substr(1));
        }
        else
        {
            _add_token(currentArg, any_option_processed ? Token::UnknownYet : Token::GlobalArgument);
        }
    }

    _last = _Option::OK;    // TODO: IMPROVE!!
}