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