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