1 // BranchMisc.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "../../../C/CpuArch.h"
6 
7 #include "../Common/StreamUtils.h"
8 
9 #include "BranchMisc.h"
10 
11 namespace NCompress {
12 namespace NBranch {
13 
Init()14 Z7_COM7F_IMF(CCoder::Init())
15 {
16   _pc = 0;
17   return S_OK;
18 }
19 
20 
Z7_COM7F_IMF2(UInt32, CCoder::Filter(Byte *data, UInt32 size))21 Z7_COM7F_IMF2(UInt32, CCoder::Filter(Byte *data, UInt32 size))
22 {
23   const UInt32 processed = (UInt32)(size_t)(BraFunc(data, size, _pc) - data);
24   _pc += processed;
25   return processed;
26 }
27 
28 
29 namespace NArm64 {
30 
31 #ifndef Z7_EXTRACT_ONLY
32 
Init()33 Z7_COM7F_IMF(CEncoder::Init())
34 {
35   _pc = _pc_Init;
36   return S_OK;
37 }
38 
Z7_COM7F_IMF2(UInt32, CEncoder::Filter(Byte *data, UInt32 size))39 Z7_COM7F_IMF2(UInt32, CEncoder::Filter(Byte *data, UInt32 size))
40 {
41   const UInt32 processed = (UInt32)(size_t)(Z7_BRANCH_CONV_ENC(ARM64)(data, size, _pc) - data);
42   _pc += processed;
43   return processed;
44 }
45 
SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps)46 Z7_COM7F_IMF(CEncoder::SetCoderProperties(const PROPID *propIDs, const PROPVARIANT *props, UInt32 numProps))
47 {
48   UInt32 pc = 0;
49   for (UInt32 i = 0; i < numProps; i++)
50   {
51     const PROPID propID = propIDs[i];
52     if (propID == NCoderPropID::kDefaultProp ||
53         propID == NCoderPropID::kBranchOffset)
54     {
55       const PROPVARIANT &prop = props[i];
56       if (prop.vt != VT_UI4)
57         return E_INVALIDARG;
58       pc = prop.ulVal;
59       if ((pc & 3) != 0)
60         return E_INVALIDARG;
61     }
62   }
63   _pc_Init = pc;
64   return S_OK;
65 }
66 
67 
WriteCoderProperties(ISequentialOutStream *outStream)68 Z7_COM7F_IMF(CEncoder::WriteCoderProperties(ISequentialOutStream *outStream))
69 {
70   if (_pc_Init == 0)
71     return S_OK;
72   Byte buf[4];
73   SetUi32(buf, _pc_Init)
74   return WriteStream(outStream, buf, 4);
75 }
76 
77 #endif
78 
79 
Init()80 Z7_COM7F_IMF(CDecoder::Init())
81 {
82   _pc = _pc_Init;
83   return S_OK;
84 }
85 
Z7_COM7F_IMF2(UInt32, CDecoder::Filter(Byte *data, UInt32 size))86 Z7_COM7F_IMF2(UInt32, CDecoder::Filter(Byte *data, UInt32 size))
87 {
88   const UInt32 processed = (UInt32)(size_t)(Z7_BRANCH_CONV_DEC(ARM64)(data, size, _pc) - data);
89   _pc += processed;
90   return processed;
91 }
92 
SetDecoderProperties2(const Byte *props, UInt32 size)93 Z7_COM7F_IMF(CDecoder::SetDecoderProperties2(const Byte *props, UInt32 size))
94 {
95   UInt32 val = 0;
96   if (size != 0)
97   {
98     if (size != 4)
99       return E_NOTIMPL;
100     val = GetUi32(props);
101     if ((val & 3) != 0)
102       return E_NOTIMPL;
103   }
104   _pc_Init = val;
105   return S_OK;
106 }
107 
108 }
109 
110 }}
111