5 #ifndef POCKETLZMA_POCKETLZMA_CLASS_HPP
6 #define POCKETLZMA_POCKETLZMA_CLASS_HPP
19 inline StatusCode compress(
const std::vector<uint8_t> &input, std::vector<uint8_t> &output);
20 inline StatusCode compress(
const uint8_t *input,
const size_t inputSize, std::vector<uint8_t> &output);
23 inline StatusCode decompress(
const uint8_t *input,
const size_t inputSize, std::vector<uint8_t> &output);
28 Settings m_settings {};
46 m_settings = settings;
66 return compress(&input[0], input.size(), output);
72 size_t propsSize = LZMA_PROPS_SIZE;
73 uint8_t propsEncoded[propsSize];
75 size_t outSize = inputSize + (inputSize / 3) + 128;
78 int rc = plz::c::LzmaCompress(out, &outSize, input, inputSize, propsEncoded, &propsSize, m_settings.
level, m_settings.
dictionarySize,
84 std::vector<uint8_t> sizeBits;
85 for (
int i = 0; i < 8; i++)
86 sizeBits.push_back((inputSize >> (i * 8)) & 0xFF);
88 output.insert(output.end(), propsEncoded, propsEncoded + propsSize);
89 output.insert(output.end(), sizeBits.begin(), sizeBits.end());
90 output.insert(output.end(), out, out + outSize);
108 return decompress(&input[0], input.size(), output);
124 return StatusCode::InvalidLzmaData;
126 size_t propsSize = LZMA_PROPS_SIZE + 8;
128 bool sizeInfoMissing =
true;
130 for (
int i = 0; i < 8; i++)
132 uint8_t value = input[LZMA_PROPS_SIZE + i];
134 sizeInfoMissing =
false;
136 size |= (value << (i * 8));
143 size_t outSize = size;
145 size_t inSize = inputSize - propsSize;
146 int rc = plz::c::LzmaUncompress(out, &outSize, &input[propsSize], &inSize, &input[0], LZMA_PROPS_SIZE);
150 output.insert(output.end(), out, out + outSize);
193 return StatusCode::InvalidLzmaData;
197 plz::c::CLzmaDec state;
198 size_t propsSize = LZMA_PROPS_SIZE + 8;
201 unsigned char header[propsSize];
204 for(
int i = 0; i < propsSize; ++i)
205 header[i] = input[i];
207 LzmaDec_Construct(&state);
209 res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &plz::c::g_Alloc);
211 uint8_t outBuf[bufferSize];
212 size_t inPos = 0, inSize = 0, outPos = 0;
213 inSize = inputSize - propsSize;
214 plz::c::LzmaDec_Init(&state);
218 plz::c::SizeT inProcessed = inSize - inPos;
219 plz::c::SizeT outProcessed = bufferSize - outPos;
220 plz::c::ELzmaFinishMode finishMode = plz::c::LZMA_FINISH_ANY;
221 plz::c::ELzmaStatus status;
224 res = plz::c::LzmaDec_DecodeToBuf(&state, outBuf + outPos, &outProcessed,
225 &input[propsSize] + inPos, &inProcessed, finishMode, &status);
228 inPos += inProcessed;
229 outPos += outProcessed;
230 unpackSize -= outProcessed;
232 output.insert(output.end(), outBuf, outBuf + outPos);
239 if (inProcessed == 0 && outProcessed == 0)
241 if (status != plz::c::LZMA_STATUS_FINISHED_WITH_MARK)
243 LzmaDec_Free(&state, &plz::c::g_Alloc);
244 return static_cast<StatusCode>(SZ_ERROR_DATA);
250 LzmaDec_Free(&state, &plz::c::g_Alloc);
257 #endif //POCKETLZMA_POCKETLZMA_CLASS_HPP