OpenHome.Git.Pack.ApplyDelta C# (CSharp) Method

ApplyDelta() static private method

static private ApplyDelta ( BinaryReader aReader, Object aObject, long aLength ) : Object
aReader System.IO.BinaryReader
aObject Object
aLength long
return Object
        internal static Object ApplyDelta(BinaryReader aReader, Object aObject, long aLength)
        {
            byte[] delta = Inflate(aReader, aLength);

            byte b;

            int shift = 7;

            uint deltaOffset = 0;

            b = delta[deltaOffset++];

            uint inputLength = b & 0x7fu;

            while ((b & 0x80u) != 0)
            {
                b = delta[deltaOffset++];
                inputLength += (b & 0x7fu) << shift;
                shift += 7;
            }

            shift = 7;

            b = delta[deltaOffset++];

            uint outputLength = b & 0x7fu;

            while ((b & 0x80u) != 0)
            {
                b = delta[deltaOffset++];
                outputLength += (b & 0x7fu) << shift;
                shift += 7;
            }

            byte[] output = new byte[outputLength];

            uint outputOffset = 0;

            while (deltaOffset < delta.Length)
            {
                byte opcode = delta[deltaOffset++];

                if ((opcode & 0x80u) != 0)
                {   // copy
                    shift = 0;

                    uint chunkOffset = 0;
                    uint chunkLength = 0;

                    for (uint i = 0; i < 4; i++)
                    {
                        if ((opcode & 0x01u) > 0)
                        {
                            uint x = delta[deltaOffset++];
                            chunkOffset += (x << shift);
                        }

                        opcode >>= 1;

                        shift += 8;
                    }

                    shift = 0;

                    for (uint i = 0; i < 3; i++)
                    {
                        if ((opcode & 0x01u) > 0)
                        {
                            uint x = delta[deltaOffset++];
                            chunkLength += (x << shift);
                        }

                        opcode >>= 1;

                        shift += 8;
                    }

                    if (chunkLength == 0)
                    {
                        chunkLength = 1 << 16;
                    }

                    Array.Copy(aObject.Contents, chunkOffset, output, outputOffset, chunkLength);

                    outputOffset += chunkLength;
                }
                else
                {   // insert
                    uint chunkLength = (opcode & 0x7fu);

                    Array.Copy(delta, deltaOffset, output, outputOffset, chunkLength);

                    deltaOffset += chunkLength;

                    outputOffset += chunkLength;
                }
            }

            return (new Object(aObject.Type, output));
        }