public IEnumerable <ReadOnlyListEx <char> > ReadLine() { var list = new ListEx <char>(); using var memoryOwner = MemoryPool <char> .Shared.Rent(10 * 1024); using var fileStream = File.Open(_filePath, FileMode.Open, FileAccess.Read, FileShare.Read); using var sr = new StreamReader(fileStream); var memory = memoryOwner.Memory; var tmpMemory = ArraySegment <char> .Empty; var parseResult = new ParseLineResult(ParseLineStatus.Success, 0); while (true) { tmpMemory = ReadSpan(sr, memory.AsArraySegment()); if (!parseResult.Status.HasFlag(ParseLineStatus.EndlRequired)) { parseResult = new ParseLineResult(ParseLineStatus.Success, 0); } if (tmpMemory.Count == 0) { if (list.Count != 0) { yield return(list.AsReadonlyEx()); list.Clear(); } yield break; } while (parseResult.Status.HasFlag(ParseLineStatus.Success) || (parseResult.Status.HasFlag(ParseLineStatus.EndlRequired) && tmpMemory.Count > 0)) { parseResult = ParseLine(tmpMemory, list, parseResult.Status); tmpMemory = tmpMemory.Slice(parseResult.Index); // Faster hasflags...i guess if ((parseResult.Status & ParseLineStatus.Success) != 0) { yield return(list.AsReadonlyEx()); list.Clear(); } } } }
public static Result <Variable, string> ParseLine(string line) { if (String.IsNullOrWhiteSpace(line)) { return(ParseLineResult.WithFailure(EMPTY_LINE)); } if (line[0] == '#') { return(ParseLineResult.WithFailure(COMMENT_LINE)); } var match = Regex.Match(line); if (match.Success) { var result = new Variable(match.Groups["key"].Value, match.Groups["value"].Value); return(ParseLineResult.WithSuccess(result)); } return(ParseLineResult.WithFailure(E_COULD_NOT_PARSE_LINE)); }