Ejemplo n.º 1
0
        private void PushOrPop(ITokenStateTransition currentTransition,
                               Stack <ITokenStateTransition> transitions)
        {
            if (transitions.Count > 0)
            {
                ITokenStateTransition previousTransition = transitions.Peek();

                if ((previousTransition.To == currentTransition.From) &&
                    (previousTransition.From == currentTransition.To) &&
                    (previousTransition.Match.Pattern.Equals(currentTransition.Match.Pattern) == false))
                {
                    transitions.Pop();
                }
                else
                {
                    transitions.Push(currentTransition);
                }
            }
            else
            {
                if (currentTransition.IsMessageBegin() == true)
                {
                    transitions.Push(currentTransition);
                }
            }
        }
Ejemplo n.º 2
0
        public static bool IsMessageBoundary(ITokenStateTransition first,
                                             ITokenStateTransition second)
        {
            bool isBegin = first.IsMessageBegin();
            bool isEnd   = second.IsMessageEnd();

            return((isBegin == true) && (isEnd == true));
        }
Ejemplo n.º 3
0
        private bool HandleTransition(ITokenStateTransition currentTransition,
                                      Stack <ITokenStateTransition> transitions,
                                      ref ReadOnlySequence <byte> buffer,
                                      ref ReadOnlySequence <byte> token,
                                      out long consumedBytes)
        {
            consumedBytes = 0;

            bool result = false;

            if (transitions.Count == 1)
            {
                ITokenStateTransition previousTransition = transitions.Peek();

                if (previousTransition.IsMessageBegin() == true &&
                    currentTransition.IsMessageEnd() == true)
                {
                    if (this.GetMessageBoundary(previousTransition,
                                                currentTransition,
                                                ref buffer,
                                                ref token,
                                                out consumedBytes) == true)
                    {
                        transitions.Pop();

                        result = true;
                    }
                }
                else
                {
                    this.PushOrPop(currentTransition, transitions);
                }
            }
            else
            {
                this.PushOrPop(currentTransition, transitions);
            }

            return(result);
        }
Ejemplo n.º 4
0
        private bool GetMessageBoundary(ITokenStateTransition previousTransition,
                                        ITokenStateTransition currentTransition,
                                        ref ReadOnlySequence <byte> buffer,
                                        ref ReadOnlySequence <byte> token,
                                        out long consumedBytes)
        {
            consumedBytes = 0;

            bool result = false;

            if (TokenStateTransition.IsMessageBoundary(previousTransition, currentTransition) == true)
            {
                long startIndex = previousTransition.Match.StartIndex;
                long length     = currentTransition.Match.EndIndex - startIndex;

                token         = buffer.Slice(startIndex, length);
                consumedBytes = startIndex + length;

                result = true;
            }

            return(result);
        }