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 );
}
}