Esempio n. 1
0
            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);
            }
Esempio n. 2
0
            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);
            }
Esempio n. 3
0
 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;
 }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
            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);
            }