private IEnumerable<Interval> ParseIntervals(string input)
{
int mode = 0xA;
int num = 0;
bool error = false;
Interval interval = null;
var intervals = new List<Interval>();
for (int i = 0; i < input.Length; i++)
{
switch (input[i])
{
case '-':
if (mode != 0xB)
{
error = true;
}
interval = new Interval() { Start = num, End = num };
num = 0;
mode = 0xC;
break;
case ',':
if (mode == 0xB)
interval = new Interval() { Start = num, End = num };
else if (mode == 0xC)
interval.End = num;
else
{
error = true;
break;
}
intervals.Add(interval);
interval = null;
mode = 0xA;
num = 0;
break;
case '0':
goto case '9';
case '1':
goto case '9';
case '2':
goto case '9';
case '3':
goto case '9';
case '4':
goto case '9';
case '5':
goto case '9';
case '6':
goto case '9';
case '7':
goto case '9';
case '8':
goto case '9';
case '9':
num = num * 10 + (int)(input[i] - '0');
if (mode == 0xA) mode = 0xB;
else mode = 0xC;
break;
}
if (error)
throw new Exception("Parsing error.");
}
//append last interval in sequence
if (mode == 0xB)
interval = new Interval() { Start = num, End = num };
else if (mode == 0xC)
interval.End = num;
else
throw new Exception("Parsing error.");
intervals.Add(interval);
return intervals;
}
}