bool parseArg()

in cli/cmdline.cpp [84:286]


bool parseArg( wchar_t* text, CModelData& modelData )
{
    const wchar_t* UNKNOWN_OPTION_MSG = L"Unknown option:";

    // every argument is at least two char long and first character is '/' or '-'
    if( wcslen( text ) < 2 || ( text[ 0 ] != L'/' && text[ 0 ] != L'-' ) )
    {
        PrintMessage( InputDataError, UNKNOWN_OPTION_MSG, text );
        return( false );
    }

    wchar_t currentArg = towlower( text[ 1 ] );

    // are we seeing the same parameter again?
    if( modelData.ProvidedArguments.find( currentArg ) != modelData.ProvidedArguments.end() )
    {
        wstring opt = L"'";
        opt += currentArg;
        opt += L"'";
        PrintMessage( InputDataError, L"Option", opt.c_str(), L"was provided more than once" );
        return( false );
    }

    bool unknownOption = false;
    switch( currentArg )
    {
    case SWITCH_ORDER:
    {
        unsigned int i = getUIntFromArg( text );
        if( i == 0 )
        {
            unknownOption = true;
            break;
        }
        modelData.Order = i;
        break;
    }
    case SWITCH_DELIMITER:
    {
        wchar_t c = getSpecialCharFromArg( text );
        if( c == 0 )
        {
            c = getCharFromArg( text );
            if( c == 0 )
            {
                unknownOption = true;
                break;
            }
        }
        modelData.ValuesDelim = c;
        break;
    }
    case SWITCH_ALIAS_DELIMITER:
    {
        wchar_t c = getSpecialCharFromArg( text );
        if( c == 0 )
        {
            c = getCharFromArg( text );
            if( c == 0 )
            {
                unknownOption = true;
                break;
            }
        }
        modelData.NamesDelim = c;
        break;
    }
    case SWITCH_NEGATIVE_VALUES:
    {
        wchar_t c = getCharFromArg( text );
        if( c == 0 )
        {
            unknownOption = true;
            break;
        }
        modelData.InvalidPrefix = c;
        break;
    }
    case SWITCH_SEED_FILE:
    {
        wstring s = getStringFromArg( text );
        if( s.empty() )
        {
            unknownOption = true;
            break;
        }
        modelData.RowSeedsFile = s;
        break;
    }
    case SWITCH_RANDOMIZE:
    {
        // /r
        if( wcslen( text ) == 2 )
        {
            modelData.RandSeed = (unsigned short) ( time( nullptr ) );
        }
        // /r:
        else if( wcslen( text ) == 3 )
        {
            unknownOption = true;
            break;
        }
        // /r:NNNN
        else
        {
            unsigned int i = getUIntFromArg( text );
            modelData.RandSeed = (unsigned short) i;
        }
        break;
    }
    case SWITCH_CASE_SENSITIVE:
    {
        if( wcslen( text ) == 2 )
        {
            modelData.CaseSensitive = true;
        }
        else
        {
            unknownOption = true;
            break;
        }
        break;
    }
    case SWITCH_STATISTICS:
    {
        if( wcslen( text ) == 2 )
        {
            modelData.Statistics = true;
        }
        else
        {
            unknownOption = true;
            break;
        }
        break;
    }
    case SWITCH_VERBOSE:
    {
        if( wcslen( text ) == 2 )
        {
            modelData.Verbose = true;
        }
        else
        {
            unknownOption = true;
            break;
        }
        break;
    }
    case SWITCH_PREVIEW:
    {
        if( wcslen( text ) == 2 )
        {
            modelData.GenerationMode = GenerationMode::Preview;
        }
        else
        {
            unknownOption = true;
            break;
        }
        break;
    }
    case SWITCH_APPROXIMATE:
    {
        // /x
        if( wcslen( text ) == 2 )
        {
            modelData.GenerationMode = GenerationMode::Approximate;
        }
        // /x:
        else if( wcslen( text ) == 3 )
        {
            unknownOption = true;
            break;
        }
        // /x:NNNN
        else
        {
            unsigned int i = getUIntFromArg( text );
            modelData.GenerationMode = GenerationMode::Approximate;
            modelData.MaxApproxTries = (unsigned short) i;
        }
        break;
    }
    default:
    {
        unknownOption = true;
        break;
    }
    }

    if( unknownOption )
    {
        PrintMessage( InputDataError, UNKNOWN_OPTION_MSG, text );
        return( false );
    }
    else
    {
        // add the current arg to the collection so we can discover dupes later
        modelData.ProvidedArguments.insert( currentArg );
        return( true );
    }
}