tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ByteSwap.cpp (1708B)


      1 // ByteSwap.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../Common/MyCom.h"
      6 
      7 #include "../ICoder.h"
      8 
      9 #include "../Common/RegisterCodec.h"
     10 
     11 namespace NCompress {
     12 namespace NByteSwap {
     13 
     14 class CByteSwap2:
     15  public ICompressFilter,
     16  public CMyUnknownImp
     17 {
     18 public:
     19  MY_UNKNOWN_IMP1(ICompressFilter);
     20  INTERFACE_ICompressFilter(;)
     21 };
     22 
     23 class CByteSwap4:
     24  public ICompressFilter,
     25  public CMyUnknownImp
     26 {
     27 public:
     28  MY_UNKNOWN_IMP1(ICompressFilter);
     29  INTERFACE_ICompressFilter(;)
     30 };
     31 
     32 STDMETHODIMP CByteSwap2::Init() { return S_OK; }
     33 
     34 STDMETHODIMP_(UInt32) CByteSwap2::Filter(Byte *data, UInt32 size)
     35 {
     36  const UInt32 kStep = 2;
     37  if (size < kStep)
     38    return 0;
     39  size &= ~(kStep - 1);
     40  
     41  const Byte *end = data + (size_t)size;
     42  
     43  do
     44  {
     45    Byte b0 = data[0];
     46    data[0] = data[1];
     47    data[1] = b0;
     48    data += kStep;
     49  }
     50  while (data != end);
     51 
     52  return size;
     53 }
     54 
     55 STDMETHODIMP CByteSwap4::Init() { return S_OK; }
     56 
     57 STDMETHODIMP_(UInt32) CByteSwap4::Filter(Byte *data, UInt32 size)
     58 {
     59  const UInt32 kStep = 4;
     60  if (size < kStep)
     61    return 0;
     62  size &= ~(kStep - 1);
     63  
     64  const Byte *end = data + (size_t)size;
     65  
     66  do
     67  {
     68    Byte b0 = data[0];
     69    Byte b1 = data[1];
     70    data[0] = data[3];
     71    data[1] = data[2];
     72    data[2] = b1;
     73    data[3] = b0;
     74    data += kStep;
     75  }
     76  while (data != end);
     77 
     78  return size;
     79 }
     80 
     81 REGISTER_FILTER_CREATE(CreateFilter2, CByteSwap2())
     82 REGISTER_FILTER_CREATE(CreateFilter4, CByteSwap4())
     83 
     84 REGISTER_CODECS_VAR
     85 {
     86  REGISTER_FILTER_ITEM(CreateFilter2, CreateFilter2, 0x20302, "Swap2"),
     87  REGISTER_FILTER_ITEM(CreateFilter4, CreateFilter4, 0x20304, "Swap4")
     88 };
     89 
     90 REGISTER_CODECS(ByteSwap)
     91 
     92 }}