[csmaild-cvs] csmaild/src/Imap/Commands ImapCommand.cs,1.7,1.8
Brought to you by:
tamc
|
From: <ta...@us...> - 2003-07-27 17:07:08
|
Update of /cvsroot/csmaild/csmaild/src/Imap/Commands
In directory sc8-pr-cvs1:/tmp/cvs-serv31192/src/Imap/Commands
Modified Files:
ImapCommand.cs
Log Message:
Modified the parsing of the sequence set to include the asterix character. Rewrote it to use regular expressions for easier parsing.
Index: ImapCommand.cs
===================================================================
RCS file: /cvsroot/csmaild/csmaild/src/Imap/Commands/ImapCommand.cs,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** ImapCommand.cs 26 Jul 2003 23:55:47 -0000 1.7
--- ImapCommand.cs 27 Jul 2003 17:07:05 -0000 1.8
***************
*** 93,102 ****
{
// parse and validate the arguments
! if(!ParseArguments() || mUnparsedArgumentIdx < mUnparsedArguments.Length || !InternalProcess())
! {
! mConnection.SendTaggedMessage("BAD");
! return false;
! }
! return true;
}
--- 93,106 ----
{
// parse and validate the arguments
! if(!ParseArguments())
! mConnection.SendTaggedMessage("BAD Invalid arguments");
! else if(mUnparsedArgumentIdx < mUnparsedArguments.Length)
! mConnection.SendTaggedMessage("BAD Too many arguments");
! else if(!InternalProcess())
! mConnection.SendTaggedMessage("BAD Processing problems");
! else
! return true;
!
! return false;
}
***************
*** 250,326 ****
private SequenceSet ParseSequenceSet()
{
! bool isGood = false; // will determine whether we've read a valid quoted string
SequenceSet sequenceSet = new SequenceSet(); // will store the sequenceSet string as we "read" it
! uint startNumber = 0;
! uint sequenceNumber = 0;
! for(; mUnparsedArgumentIdx < mUnparsedArguments.Length; ++mUnparsedArgumentIdx)
{
! if(sequenceNumber == 0) // haven't started yet, need to read a non-zero digit
! {
! if(CommandPart.DigitNz.IndexOf(mUnparsedArguments[mUnparsedArgumentIdx]) == -1)
! return null;
! else
! {
! sequenceNumber = uint.Parse(mUnparsedArguments[mUnparsedArgumentIdx] + string.Empty);
! isGood = true;
! }
! }
! else if(mUnparsedArguments[mUnparsedArgumentIdx] == ':') // making a range
! {
! isGood = false;
! if(startNumber != 0) // we started a range earlier, can't start another so soon
! return null;
! startNumber = sequenceNumber;
! sequenceNumber = 0;
! }
! else if(mUnparsedArguments[mUnparsedArgumentIdx] == ',') // next sequence set
{
! isGood = false;
! if(startNumber != 0) // we started a range earlier
{
! sequenceSet.AddRange(startNumber, sequenceNumber);
! startNumber = 0;
}
- else // make a range of size 1
- sequenceSet.AddRange(sequenceNumber);
- sequenceNumber = 0;
- }
- else if(mUnparsedArguments[mUnparsedArgumentIdx] == '*') // largest possible message
- {
- if(sequenceNumber != 0) // * can't be part of a number
- return null;
- sequenceNumber = int.MaxValue;
- }
- else if(mUnparsedArguments[mUnparsedArgumentIdx] == ' ') // a space, done with the argument
- break;
- else
- {
- if(CommandPart.Digit.IndexOf(mUnparsedArguments[mUnparsedArgumentIdx]) == -1)
- return null;
else
! {
! sequenceNumber *= 10;
! sequenceNumber += uint.Parse(mUnparsedArguments[mUnparsedArgumentIdx] + string.Empty);
! }
}
! }
!
! if(isGood)
! {
! // add the last range
! if(startNumber != 0) // we started a range earlier
{
! sequenceSet.AddRange(startNumber, sequenceNumber);
! startNumber = 0;
}
- else // make a range of size 1
- sequenceSet.AddRange(sequenceNumber);
! return sequenceSet;
}
! return null;
}
--- 254,303 ----
private SequenceSet ParseSequenceSet()
{
! int endIdx = mUnparsedArguments.IndexOf(' ', mUnparsedArgumentIdx);
! string sequenceSetString = string.Empty;
SequenceSet sequenceSet = new SequenceSet(); // will store the sequenceSet string as we "read" it
! if(endIdx == -1)
! sequenceSetString = mUnparsedArguments.Substring(mUnparsedArgumentIdx);
! else
! sequenceSetString = mUnparsedArguments.Substring(mUnparsedArgumentIdx, endIdx - mUnparsedArgumentIdx);
! string[] parts = sequenceSetString.Split(' ');
! foreach(string part in parts)
{
! Match m = Regex.Match(part, @"^(?:(?:([1-9][0-9]{0,9})(?::([1-9][0-9]{0,9}|\*))?)|(?:(\*):([1-9][0-9]{0,9})))$");
! if(!m.Success)
! return null;
! uint startNum = 0;
! uint endNum = 0;
!
! if(m.Groups[1].Success)
{
! startNum = uint.Parse(m.Groups[1].Value);
! if(m.Groups[2].Success)
{
! if(m.Groups[2].Value == "*")
! endNum = uint.MaxValue;
! else
! endNum = uint.Parse(m.Groups[2].Value);
}
else
! endNum = startNum;
}
! else if(m.Groups[3].Success)
{
! if(m.Groups[3].Value == "*")
! startNum = uint.MaxValue;
! else
! startNum = uint.Parse(m.Groups[3].Value);
! endNum = uint.Parse(m.Groups[4].Value);
}
! sequenceSet.AddRange(startNum, endNum);
}
! mUnparsedArgumentIdx += sequenceSetString.Length;
!
! return sequenceSet;
}
***************
*** 429,433 ****
public override string ToString()
{
! return mLow + ":" + mHigh + (mNext != null ? "," + mNext.ToString() : string.Empty);
}
}
--- 406,410 ----
public override string ToString()
{
! return mLow + ":" + (mHigh == uint.MaxValue ? "*" : mHigh.ToString()) + (mNext != null ? "," + mNext.ToString() : string.Empty);
}
}
|