Exemplo n.º 1
0
 private static void ParseRule(UnsafeReader reader, int min, int max)
 {
     if (ParseListItem(reader, min, max))
     {
         for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max);)
         {
             ;
         }
     }
 }
        private static unsafe NaiveRule ParseRule(UnsafeReader reader, int min, int max)
        {
            var values = new HashSet <int>();

            if (ParseListItem(reader, min, max, values))
            {
                for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max, values);)
                {
                    ;
                }
            }

            return(new NaiveRule(values));
        }
Exemplo n.º 3
0
        private static bool WhiteSpaceAtLeastOnce(UnsafeReader s)
        {
            if (s.IsEmpty)
            {
                return(false);
            }

            var retval = false;

            while (s.MoveNextIf(' '))
            {
                retval = true;
            }

            return(retval);
        }
Exemplo n.º 4
0
        private static bool ParseListItem(UnsafeReader reader, int min, int max)
        {
            // ?
            // *[/step]
            // from[-to][/step]
            int start, stop = -1, step;


            // ? does not support steps
            if (reader.MoveNextIf('?'))
            {
                return(true);
            }

            // *
            if (reader.MoveNextIf('*'))
            {
                start = min;
                stop  = max;
            }
            else
            {
                // min[-max]
                if (!TryReadInt(reader, out start) ||
                    start < min ||
                    start > max)
                {
                    return(false);
                }

                // [-max]
                if (reader.MoveNextIf('-'))
                {
                    if (!TryReadInt(reader, out stop) ||
                        stop > max ||
                        stop < start)
                    {
                        // syntax error
                        return(false);
                    }
                }
            }

            if (reader.MoveNextIf('/'))
            {
                if (!TryReadInt(reader, out step))
                {
                    // syntax error
                    return(false);
                }

                if (stop == -1)
                {
                    stop = max;
                }
            }
            else
            {
                // short-circuit for simple scalar
                if (stop == -1)
                {
                    return(true);
                }

                step = 1;
            }

            return(true);
        }