diff options
Diffstat (limited to '3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp')
-rw-r--r-- | 3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp b/3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp index 645b6ffcda2..f5620d6ce42 100644 --- a/3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp +++ b/3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp @@ -14,8 +14,7 @@ class CByteSwap2: { public: MY_UNKNOWN_IMP - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); + INTERFACE_ICompressFilter(;) }; class CByteSwap4: @@ -24,8 +23,7 @@ class CByteSwap4: { public: MY_UNKNOWN_IMP - STDMETHOD(Init)(); - STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size); + INTERFACE_ICompressFilter(;) }; STDMETHODIMP CByteSwap2::Init() { return S_OK; } @@ -33,14 +31,22 @@ STDMETHODIMP CByteSwap2::Init() { return S_OK; } STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size) { const UInt32 kStep = 2; - UInt32 i; - for (i = 0; i + kStep <= size; i += kStep) + if (size < kStep) + return 0; + size &= ~(kStep - 1); + + const Byte *end = data + (size_t)size; + + do { - Byte b = data[i]; - data[i] = data[i + 1]; - data[i + 1] = b; + Byte b0 = data[0]; + data[0] = data[1]; + data[1] = b0; + data += kStep; } - return i; + while (data != end); + + return size; } STDMETHODIMP CByteSwap4::Init() { return S_OK; } @@ -48,26 +54,34 @@ STDMETHODIMP CByteSwap4::Init() { return S_OK; } STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size) { const UInt32 kStep = 4; - UInt32 i; - for (i = 0; i + kStep <= size; i += kStep) + if (size < kStep) + return 0; + size &= ~(kStep - 1); + + const Byte *end = data + (size_t)size; + + do { - Byte b0 = data[i]; - Byte b1 = data[i + 1]; - data[i] = data[i + 3]; - data[i + 1] = data[i + 2]; - data[i + 2] = b1; - data[i + 3] = b0; + Byte b0 = data[0]; + Byte b1 = data[1]; + data[0] = data[3]; + data[1] = data[2]; + data[2] = b1; + data[3] = b0; + data += kStep; } - return i; + while (data != end); + + return size; } -static void *CreateCodec2() { return (void *)(ICompressFilter *)(new CByteSwap2); } -static void *CreateCodec4() { return (void *)(ICompressFilter *)(new CByteSwap4); } +REGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2()) +REGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4()) -static CCodecInfo g_CodecsInfo[] = +REGISTER_CODECS_VAR { - { CreateCodec2, CreateCodec2, 0x020302, L"Swap2", 1, true }, - { CreateCodec4, CreateCodec4, 0x020304, L"Swap4", 1, true } + REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"), + REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4") }; REGISTER_CODECS(ByteSwap) |