public ReadOnlyMemory <char> ReadFrom ( char[] openChars, char[] closeChars ) { if (IsEOF) { return(EmptySpan); } var state = new StateHolder(this); var c = PeekChar(); if (Array.IndexOf(openChars, c) < 0) { state.Dispose(); return(EmptySpan); } ReadChar(); while (true) { c = ReadChar(); if (c == EOF) { state.Dispose(); return(EmptySpan); } if (Array.IndexOf(closeChars, c) >= 0) { break; } } return(Substring ( state.Position, _position - state.Position )); }
public ReadOnlyMemory <char> ReadUntil ( char[] openChars, char[] closeChars, char[] stopChars ) { var state = new StateHolder(this); var level = 0; while (true) { var c = PeekChar(); if (c == EOF) { state.Dispose(); return(EmptySpan); } if (c.IsOneOf(openChars)) { level++; } else if (c.IsOneOf(closeChars)) { if (level == 0 && c.IsOneOf(stopChars)) { break; } level--; } else if (c.IsOneOf(stopChars)) { if (level == 0) { break; } } ReadChar(); } return(Substring ( state.Position, _position - state.Position )); }
public ReadOnlyMemory <char> ReadUntil ( string stopString ) { // Sure.NotNullNorEmpty(stopString, nameof(stopString)); var state = new StateHolder(this); var length = 0; var span = _text.Span; while (true) { AGAIN: var c = ReadChar(); if (c == EOF) { state.Dispose(); return(EmptySpan); } length++; if (length >= stopString.Length) { var start = _position - stopString.Length; for (var i = 0; i < stopString.Length; i++) { if (span[start + i] != stopString[i]) { goto AGAIN; } } break; } } var result = Substring ( state.Position, _position - state.Position - stopString.Length ); _position -= stopString.Length; return(result); }