private static bool ParseFileName(ITextSegment textSegment, StringBuilder stringBuilder) { Assert.IsNotNull(textSegment); Assert.IsNotNull(stringBuilder); int terminator = textSegment.IndexOf('\0'); if (terminator == -1) { textSegment.MoveTo(stringBuilder, textSegment.Length); } else { if (terminator != 0) { textSegment.MoveTo(stringBuilder, terminator); } textSegment.Skip(1); RemoveTrailingSlash(stringBuilder); return(true); } return(false); }
public bool Parse(ITextSegment textSegment) { Verify.Argument.IsNotNull(textSegment, nameof(textSegment)); Verify.State.IsFalse(_isCompleted, "Field is already completed."); if (textSegment.Length > 0) { int eol = textSegment.IndexOf('\n'); if (eol == -1) { textSegment.MoveTo(_line, textSegment.Length); } else { if (eol != 0) { textSegment.MoveTo(_line, eol); } textSegment.Skip(1); return(true); } } return(false); }
public bool Parse(ITextSegment textSegment) { while(textSegment.Length > 0) { switch(_state) { case State.ReadingHeader: { int terminator = textSegment.IndexOf(' '); if(terminator == -1) { int count = textSegment.Length; if(_bufferOffset + count > _buffer.Length) { throw new Exception("header is too large"); } textSegment.MoveTo(_buffer, _bufferOffset, count); _bufferOffset += count; } else { if(terminator != 0) { if(_bufferOffset + terminator > _buffer.Length) { throw new Exception("header is too large"); } textSegment.MoveTo(_buffer, _bufferOffset, terminator); _bufferOffset += terminator; } textSegment.Skip(1); switch(_part) { case Part.None: if(CurrentHeaderIs(@"commit")) { _part = Part.Commit; } else { throw new Exception("Expected header: commit"); } break; case Part.Commit: if(CurrentHeaderIs(@"tree")) { _part = Part.Tree; } else { throw new Exception("Expected header: tree"); } break; case Part.Tree: case Part.Parent: if(CurrentHeaderIs(@"parent")) { _part = Part.Parent; } else if(CurrentHeaderIs(@"author")) { _part = Part.Author; } else { throw new Exception("Expected header: parent or author"); } break; case Part.Author: if(CurrentHeaderIs("committer")) { _part = Part.Committer; } else { throw new Exception("Expected header: committer"); } break; default: throw new Exception("Invalid parser state."); } _bufferOffset = 0; _state = State.ReadingContent; } } break; case State.ReadingContent: switch(_part) { case Part.Commit: if(ReadHash(textSegment)) { _commit = new Hash(_buffer); _state = State.ReadingHeader; } break; case Part.Tree: if(ReadHash(textSegment)) { _tree = new Hash(_buffer); _state = State.ReadingHeader; } break; case Part.Parent: if(ReadHash(textSegment)) { _parents.Add(new Hash(_buffer)); _state = State.ReadingHeader; } break; } break; } } return false; }
public bool Parse(ITextSegment textSegment) { while (textSegment.Length > 0) { switch (_state) { case State.ReadingHeader: { int terminator = textSegment.IndexOf(' '); if (terminator == -1) { int count = textSegment.Length; if (_bufferOffset + count > _buffer.Length) { throw new Exception("header is too large"); } textSegment.MoveTo(_buffer, _bufferOffset, count); _bufferOffset += count; } else { if (terminator != 0) { if (_bufferOffset + terminator > _buffer.Length) { throw new Exception("header is too large"); } textSegment.MoveTo(_buffer, _bufferOffset, terminator); _bufferOffset += terminator; } textSegment.Skip(1); switch (_part) { case Part.None: if (CurrentHeaderIs(@"commit")) { _part = Part.Commit; } else { throw new Exception("Expected header: commit"); } break; case Part.Commit: if (CurrentHeaderIs(@"tree")) { _part = Part.Tree; } else { throw new Exception("Expected header: tree"); } break; case Part.Tree: case Part.Parent: if (CurrentHeaderIs(@"parent")) { _part = Part.Parent; } else if (CurrentHeaderIs(@"author")) { _part = Part.Author; } else { throw new Exception("Expected header: parent or author"); } break; case Part.Author: if (CurrentHeaderIs("committer")) { _part = Part.Committer; } else { throw new Exception("Expected header: committer"); } break; default: throw new Exception("Invalid parser state."); } _bufferOffset = 0; _state = State.ReadingContent; } } break; case State.ReadingContent: switch (_part) { case Part.Commit: if (ReadHash(textSegment)) { _commit = new Hash(_buffer); _state = State.ReadingHeader; } break; case Part.Tree: if (ReadHash(textSegment)) { _tree = new Hash(_buffer); _state = State.ReadingHeader; } break; case Part.Parent: if (ReadHash(textSegment)) { _parents.Add(new Hash(_buffer)); _state = State.ReadingHeader; } break; } break; } } return(false); }
public bool Parse(ITextSegment textSegment) { Verify.Argument.IsNotNull(textSegment, nameof(textSegment)); Verify.State.IsFalse(_isCompleted, "Field is already completed."); while (textSegment.Length > 0) { int separatorIndex = _isSubjectCompleted ? textSegment.IndexOf('\0') : textSegment.IndexOfAny(Separators); if (separatorIndex == -1) { if (_isSubjectCompleted) { textSegment.MoveTo(_body, textSegment.Length); } else { if (_separator.Length != 0) { _separator.Dump(_subject); } textSegment.MoveTo(_subject, textSegment.Length); } return(false); } else { if (_isSubjectCompleted) { textSegment.MoveTo(_body, separatorIndex); } else { if (separatorIndex != 0) { if (_separator.Length != 0) { _separator.Dump(_subject); } textSegment.MoveTo(_subject, separatorIndex); } } var separatorChar = textSegment.ReadChar(); switch (separatorChar) { case '\0': RemoveTrailingWhitespace(_subject); if (_isSubjectCompleted) { RemoveTrailingWhitespace(_body); } _isCompleted = true; return(true); case '\r': case '\n': if (_isSubjectCompleted) { _body.Append(separatorChar); } else { if (_separator.Append(separatorChar)) { _isSubjectCompleted = true; _separator.Reset(); } } break; } } } return(false); }