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)); }
private static bool WhiteSpaceAtLeastOnce(UnsafeReader s) { if (s.IsEmpty) { return(false); } var retval = false; while (s.MoveNextIf(' ')) { retval = true; } return(retval); }
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); }