private void InnerParse(string[] args)
{
parsedArgs = args;
var tokenizer = new Tokenizer(args);
while (!tokenizer.Finished)
{
var token = tokenizer.ReadNextToken();
if (token is PositionalArgumentToken)
{
if (currentValuesCount < values.Count())
{
values[currentValuesCount].Descriptor = token.Descriptor;
values[currentValuesCount++].Value = ((PositionalArgumentToken)token).Value;
}
else
{
unexpectedArguments.Add(new UnexpectedArgument(((PositionalArgumentToken)token).Value));
}
}
else if (token is LongNameToken)
{
var foundOption = options.SingleOrDefault(x => x.LongName == ((LongNameToken)token).Name);
if (foundOption != null)
{
var parsedOption = new CommandLineOption(foundOption);
int additionalLength = 0;
var isSeparated = true;
if (foundOption.AcceptsArgument)
{
tokenizer.MarkPosition();
var argumentString = tokenizer.ReadUntilTheEndOfString();
if (((LongNameToken)token).HasAssignment)
{
additionalLength = argumentString.Length + 1; // argument length + '='
isSeparated = false;
}
if (parsedOption.ParseArgument(argumentString, isSeparated))
{
tokenizer.MoveToTheNextString();
}
else
{
tokenizer.ResetPosition();
}
}
parsedOption.Descriptor = token.Descriptor.WithLengthChangedBy(2 + additionalLength); // -- prefix
if (foundOption.OptionType == typeof(bool))
{
parsedOption.Value = true;
}
parsedOptions.Add(parsedOption);
}
else
{
unexpectedArguments.Add(new UnexpectedArgument(((LongNameToken)token).Name));
}
}
else if (token is ShortNameToken)
{
var foundOption = options.SingleOrDefault(x => x.ShortName == ((ShortNameToken)token).Name);
if (foundOption != null)
{
var parsedOption = new CommandLineOption(foundOption);
int additionalLength = 0;
var isSeparated = false;
if (foundOption.AcceptsArgument)
{
tokenizer.MarkPosition();
var argumentString = tokenizer.ReadUntilTheEndOfString();
if (argumentString == string.Empty)
{
// it means that the value is separated by a whitespace
tokenizer.MoveToTheNextString();
argumentString = tokenizer.ReadUntilTheEndOfString();
isSeparated = true;
}
if (argumentString != null)
{
additionalLength = isSeparated ? 0 : argumentString.Length;
if (!parsedOption.ParseArgument(argumentString, isSeparated))
{
tokenizer.ResetPosition();
}
}
}
parsedOption.Descriptor = token.Descriptor.WithLengthChangedBy(additionalLength);
if (foundOption.OptionType == typeof(bool))
{
parsedOption.Value = true;
}
parsedOptions.Add(parsedOption);
}
else
{
unexpectedArguments.Add(new UnexpectedArgument(((ShortNameToken)token).Name.ToString()));
}
}
}
}