private static ArrayRule ParseRule(SafeReader reader, int min, int max) { var values = new bool[max + 1]; if (ParseListItem(reader, min, max, values)) { for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max, values);) { ; } } return(new ArrayRule(values)); }
private static bool WhiteSpaceAtLeastOnce(SafeReader s) { if (s.IsEmpty) { return(false); } var retval = false; while (s.MoveNextIf(' ')) { retval = true; } return(retval); }
private static NaiveRule ParseRule(SafeReader reader, int min, int max) { var values = new HashSet <int>(); if (ParseListItem(reader, min, max, values)) { for (; reader.MoveNextIf(',') && ParseListItem(reader, min, max, values);) { ; } //while (true) //{ // if (!reader.MoveNextIf(',')) break; // if (!ParseListItem(reader, min, max, values)) // throw new ArgumentException("Invalid input: " + reader); //} } return(new NaiveRule(values)); }
private static bool ParseListItem(SafeReader reader, int min, int max, HashSet <int> values) { // ? // *[/step] // from[-to][/step] int start, stop = -1, step; // ? does not support steps if (reader.MoveNextIf('?')) { AddRange(values, min, max, 1); 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) { values.Add(start); return(true); } step = 1; } AddRange(values, start, stop, step); return(true); }