Example #1
0
        public static bool TryParse(ref string error, string rangeString, out IndexedRangeSet output)
        {
            var tempRange   = new List <Range>();
            var tempIndexes = new List <int>();
            var length      = rangeString.Length;
            var str         = rangeString.ToCharArray();
            int index       = 0;
            int start       = 0;
            int end         = 0;

            output = null;
            //Phase == 0 -> index
            //Phase == 1 -> start
            //Phase == 2 -> end
            int  phase          = 0;
            bool lastPlus       = false;
            bool tallyingInZero = false;

            if (String.IsNullOrWhiteSpace(rangeString))
            {
                output = new IndexedRangeSet(tempRange, tempIndexes);
                return(true);
            }
            for (int i = 0; i < length; i++)
            {
                var c = str[i];
                if (Char.IsWhiteSpace(c) || Char.IsLetter(c))
                {
                    continue;
                }
                lastPlus = false;
                switch (phase)
                {
                case 0:
                    if (Char.IsNumber(c))
                    {
                        index          = ((index << 3) + (index << 1)) + (c - '0');
                        tallyingInZero = true;
                    }
                    else if (c == ':')
                    {
                        start = 0;
                        phase = 1;
                    }
                    else if (c == ',')
                    {
                        tempRange.Add(new Range()
                        {
                            Start = index, Stop = index
                        });
                        tempIndexes.Add(index);
                        index = 0;
                        start = 0;
                        end   = 0;
                    }
                    else if (c == '-')
                    {
                        if (!tallyingInZero)
                        {
                            error = "No number was inserted before a range!";
                            return(false);
                        }
                        start = index;
                        end   = 0;
                        phase = 2;
                    }
                    else if (c == '+')
                    {
                        if (!tallyingInZero)
                        {
                            error = "No number was inserted before a range!";
                            return(false);
                        }
                        end = int.MaxValue;
                        tempRange.Add(new Range {
                            Start = start, Stop = end
                        });
                        tempIndexes.Add(start);
                        index          = 0;
                        start          = 0;
                        phase          = 0;
                        tallyingInZero = false;
                        lastPlus       = true;
                    }
                    else
                    {
                        error = "Unrecognized symbol " + c;
                        return(false);
                    }
                    break;

                case 1:
                    if (Char.IsNumber(c))
                    {
                        start = ((start << 3) + (start << 1)) + (c - '0');
                    }
                    else if (c == '+')
                    {
                        end = int.MaxValue;
                        tempRange.Add(new Range()
                        {
                            Start = start, Stop = end
                        });
                        tempIndexes.Add(index);
                        index          = 0;
                        start          = 0;
                        phase          = 0;
                        tallyingInZero = false;
                        lastPlus       = true;
                    }
                    else if (c == '-')
                    {
                        end   = 0;
                        phase = 2;
                    }
                    break;

                case 2:
                    if (Char.IsNumber(c))
                    {
                        end = ((end << 3) + (end << 1)) + (c - '0');
                    }
                    else if (c == ',')
                    {
                        tempRange.Add(new Range()
                        {
                            Start = start, Stop = end
                        });
                        tempIndexes.Add(index);
                        index          = 0;
                        phase          = 0;
                        start          = 0;
                        end            = 0;
                        tallyingInZero = false;
                    }
                    break;
                }
            }
            if (phase == 2)
            {
                tempRange.Add(new Range()
                {
                    Start = start, Stop = end
                });
                tempIndexes.Add(index);
            }
            else if (phase == 0 && tallyingInZero)
            {
                tempRange.Add(new Range()
                {
                    Start = index, Stop = index
                });
                tempIndexes.Add(index);
            }
            else if (!lastPlus)
            {
                error = "Ended while reading a " + (phase == 0 ? "range's index!" : "range's start value!");
                return(false);
            }
            output = new IndexedRangeSet(tempRange, tempIndexes);
            return(true);
        }
Example #2
0
        public static bool TryParse(ref string error, string rangeString, out IndexedRangeSet output)
        {
            var tempRange = new List<Range>();
            var tempIndexes = new List<int>();
            var length = rangeString.Length;
            var str = rangeString.ToCharArray();
            int index = 0;
            int start = 0;
            int end = 0;
            output = null;
            //Phase == 0 -> index
            //Phase == 1 -> start
            //Phase == 2 -> end
            int phase = 0;
            bool lastPlus = false;
            bool tallyingInZero = false;
            if ( String.IsNullOrWhiteSpace( rangeString ) )
            {
                output = new IndexedRangeSet( tempRange, tempIndexes );
                return true;
            }
            for ( int i = 0; i < length; i++ )
            {
                var c = str[i];
                if ( Char.IsWhiteSpace( c ) || Char.IsLetter( c ) ) continue;
                lastPlus = false;
                switch ( phase )
                {
                    case 0:
                        if ( Char.IsNumber( c ) )
                        {
                            index = ( ( index << 3 ) + ( index << 1 ) ) + ( c - '0' );
                            tallyingInZero = true;
                        }
                        else if ( c == ':' )
                        {
                            start = 0;
                            phase = 1;
                        }
                        else if ( c == ',' )
                        {
                            tempRange.Add( new Range() { Start = index, Stop = index } );
                            tempIndexes.Add( index );
                            index = 0;
                            start = 0;
                            end = 0;
                        }
                        else if ( c == '-' )
                        {
                            if ( !tallyingInZero )
                            {
                                error = "No number was inserted before a range!";
                                return false;
                            }
                            start = index;
                            end = 0;
                            phase = 2;
                        }
                        else if ( c == '+' )
                        {
                            if ( !tallyingInZero )
                            {
                                error = "No number was inserted before a range!";
                                return false;
                            }
                            end = int.MaxValue;
                            tempRange.Add( new Range { Start = start, Stop = end } );
                            tempIndexes.Add( start );
                            index = 0;
                            start = 0;
                            phase = 0;
                            tallyingInZero = false;
                            lastPlus = true;
                        }
                        else
                        {
                            error = "Unrecognized symbol " + c;
                            return false;
                        }
                        break;

                    case 1:
                        if ( Char.IsNumber( c ) )
                        {
                            start = ( ( start << 3 ) + ( start << 1 ) ) + ( c - '0' );
                        }
                        else if ( c == '+' )
                        {
                            end = int.MaxValue;
                            tempRange.Add( new Range() { Start = start, Stop = end } );
                            tempIndexes.Add( index );
                            index = 0;
                            start = 0;
                            phase = 0;
                            tallyingInZero = false;
                            lastPlus = true;
                        }
                        else if ( c == '-' )
                        {
                            end = 0;
                            phase = 2;
                        }
                        break;

                    case 2:
                        if ( Char.IsNumber( c ) )
                        {
                            end = ( ( end << 3 ) + ( end << 1 ) ) + ( c - '0' );
                        }
                        else if ( c == ',' )
                        {
                            tempRange.Add( new Range() { Start = start, Stop = end } );
                            tempIndexes.Add( index );
                            index = 0;
                            phase = 0;
                            start = 0;
                            end = 0;
                            tallyingInZero = false;
                        }
                        break;
                }
            }
            if ( phase == 2 )
            {
                tempRange.Add( new Range() { Start = start, Stop = end } );
                tempIndexes.Add( index );
            }
            else if ( phase == 0 && tallyingInZero )
            {
                tempRange.Add( new Range() { Start = index, Stop = index } );
                tempIndexes.Add( index );
            }
            else if ( !lastPlus )
            {
                error = "Ended while reading a " + ( phase == 0 ? "range's index!" : "range's start value!" );
                return false;
            }
            output = new IndexedRangeSet( tempRange, tempIndexes );
            return true;
        }
Example #3
0
        public static bool TryParse(string rangeString, out IndexedRangeSet output)
        {
            string error = null;

            return(TryParse(ref error, rangeString, out output));
        }
Example #4
0
 public static bool TryParse(string rangeString, out IndexedRangeSet output)
 {
     string error = null;
     return TryParse( ref error, rangeString, out output );
 }