private static Range GetRange(int start, int end)
        {
            Range range = new Range(start, end);

            range.Length = Codec.GetValidatedSuperCommandSize(range.Length);
            return(range);
        }
Exemple #2
0
        private static void CreateNodesFromCommand(int command, int byteCount, ChunkNodeCollection nodeCollection, int i, ChunkNode parentNode)
        {
            byteCount = Codec.GetValidatedSuperCommandSize(byteCount);

            if (byteCount > Codec.NormalCommandMax)
            {
                int reducedByteCount = Math.Min(byteCount, Codec.NormalCommandMax);
                nodeCollection.Add(i + reducedByteCount, new ChunkNode(parentNode, command, i, reducedByteCount));
            }

            nodeCollection.Add(i + byteCount, new ChunkNode(parentNode, command, i, byteCount));
        }
Exemple #3
0
        public Range GetMaxBackRange(int offset)
        {
            Range maxBackRange = Range.Empty;

            byte value = this.buffer[offset];

            foreach (int otherOffset in this.byteDictionary[value])
            {
                if (otherOffset >= offset)
                {
                    break;
                }

                int iterator     = offset;
                int backIterator = otherOffset;

                do
                {
                    iterator++;
                    backIterator++;
                }while (iterator < this.buffer.Length &&
                        this.buffer[backIterator] == this.buffer[iterator]);

                int start = otherOffset;
                int end   = backIterator;

                Range backRange = new Range(start, end);
                backRange.Length = Codec.GetValidatedSuperCommandSize(backRange.Length);

                if (backRange.Length >= maxBackRange.Length)
                {
                    maxBackRange = backRange;
                }
            }

            return(maxBackRange);
        }
Exemple #4
0
        public Range[] GetMaxBackRanges(int offset)
        {
            Range maxRange4n = Range.Empty; // Command 4 normal
            Range maxRange4s = Range.Empty; // Command 4 super
            Range maxRange6n = Range.Empty; // Command 6 normal
            Range maxRange6s = Range.Empty; // Command 6 super

            byte value = this.buffer[offset];

            int startPosition = offset - 0xFF;

            if (startPosition < 0)
            {
                startPosition = 0;
            }

            foreach (int otherOffset in this.byteDictionary[value])
            {
                if (otherOffset >= offset)
                {
                    break;
                }

                int iterator     = offset;
                int backIterator = otherOffset;

                do
                {
                    iterator++;
                    backIterator++;
                }while (iterator < this.buffer.Length &&
                        this.buffer[backIterator] == this.buffer[iterator]);

                int start = otherOffset;
                int end   = backIterator;

                Range backRange = new Range(start, end);
                backRange.Length = Codec.GetValidatedSuperCommandSize(backRange.Length);

                if (otherOffset < startPosition)
                {
                    if (backRange.Length >= maxRange4s.Length)
                    {
                        maxRange4s = backRange;
                    }
                }
                else
                {
                    if (backRange.Length >= maxRange6s.Length)
                    {
                        maxRange6s = backRange;
                    }
                }
            }

            maxRange6n = maxRange6s;
            if (maxRange6n.Length <= Codec.NormalCommandMax)
            {
                maxRange6s = Range.Empty;
            }
            else
            {
                maxRange6n.Length = Codec.NormalCommandMax;
            }

            maxRange4n = maxRange4s;
            if (maxRange4n.Length <= Codec.NormalCommandMax)
            {
                maxRange4s = Range.Empty;
            }
            else
            {
                maxRange4n.Length = Codec.NormalCommandMax;
            }

            if (maxRange4n.Length == maxRange6n.Length)
            {
                maxRange4n = Range.Empty;
            }

            if (maxRange4s.Length == maxRange6s.Length)
            {
                maxRange4s = Range.Empty;
            }

            return(new[] { maxRange4n, maxRange4s, maxRange6n, maxRange6s });
        }