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