diff options
author | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-05-14 00:00:00 +0000 |
---|---|---|
committer | Igor Pavlov <87184205+ip7z@users.noreply.github.com> | 2024-05-15 23:55:04 +0500 |
commit | fc662341e6f85da78ada0e443f6116b978f79f22 (patch) | |
tree | 1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /C/XzEnc.c | |
parent | 5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff) | |
download | 7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.gz 7zip-fc662341e6f85da78ada0e443f6116b978f79f22.tar.bz2 7zip-fc662341e6f85da78ada0e443f6116b978f79f22.zip |
24.0524.05
Diffstat (limited to 'C/XzEnc.c')
-rw-r--r-- | C/XzEnc.c | 60 |
1 files changed, 33 insertions, 27 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* XzEnc.c -- Xz Encode | 1 | /* XzEnc.c -- Xz Encode |
2 | 2023-04-13 : Igor Pavlov : Public domain */ | 2 | 2024-03-01 : Igor Pavlov : Public domain */ |
3 | 3 | ||
4 | #include "Precomp.h" | 4 | #include "Precomp.h" |
5 | 5 | ||
@@ -29,8 +29,9 @@ | |||
29 | 29 | ||
30 | #define XZ_GET_PAD_SIZE(dataSize) ((4 - ((unsigned)(dataSize) & 3)) & 3) | 30 | #define XZ_GET_PAD_SIZE(dataSize) ((4 - ((unsigned)(dataSize) & 3)) & 3) |
31 | 31 | ||
32 | /* max pack size for LZMA2 block + check-64bytrs: */ | 32 | #define XZ_CHECK_SIZE_MAX 64 |
33 | #define XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize) ((unpackSize) + ((unpackSize) >> 10) + 16 + 64) | 33 | /* max pack size for LZMA2 block + pad4 + check_size: */ |
34 | #define XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize) ((unpackSize) + ((unpackSize) >> 10) + 16 + XZ_CHECK_SIZE_MAX) | ||
34 | 35 | ||
35 | #define XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(unpackSize) (XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize)) | 36 | #define XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(unpackSize) (XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize)) |
36 | 37 | ||
@@ -325,12 +326,13 @@ typedef struct | |||
325 | 326 | ||
326 | static const z7_Func_BranchConv g_Funcs_BranchConv_RISC_Enc[] = | 327 | static const z7_Func_BranchConv g_Funcs_BranchConv_RISC_Enc[] = |
327 | { | 328 | { |
328 | Z7_BRANCH_CONV_ENC(PPC), | 329 | Z7_BRANCH_CONV_ENC_2 (BranchConv_PPC), |
329 | Z7_BRANCH_CONV_ENC(IA64), | 330 | Z7_BRANCH_CONV_ENC_2 (BranchConv_IA64), |
330 | Z7_BRANCH_CONV_ENC(ARM), | 331 | Z7_BRANCH_CONV_ENC_2 (BranchConv_ARM), |
331 | Z7_BRANCH_CONV_ENC(ARMT), | 332 | Z7_BRANCH_CONV_ENC_2 (BranchConv_ARMT), |
332 | Z7_BRANCH_CONV_ENC(SPARC), | 333 | Z7_BRANCH_CONV_ENC_2 (BranchConv_SPARC), |
333 | Z7_BRANCH_CONV_ENC(ARM64) | 334 | Z7_BRANCH_CONV_ENC_2 (BranchConv_ARM64), |
335 | Z7_BRANCH_CONV_ENC_2 (BranchConv_RISCV) | ||
334 | }; | 336 | }; |
335 | 337 | ||
336 | static SizeT XzBcFilterStateBase_Filter_Enc(CXzBcFilterStateBase *p, Byte *data, SizeT size) | 338 | static SizeT XzBcFilterStateBase_Filter_Enc(CXzBcFilterStateBase *p, Byte *data, SizeT size) |
@@ -888,9 +890,9 @@ static SRes Xz_CompressBlock( | |||
888 | blockSizes->unpackSize = checkInStream.processed; | 890 | blockSizes->unpackSize = checkInStream.processed; |
889 | } | 891 | } |
890 | { | 892 | { |
891 | Byte buf[4 + 64]; | 893 | Byte buf[4 + XZ_CHECK_SIZE_MAX]; |
892 | unsigned padSize = XZ_GET_PAD_SIZE(seqSizeOutStream.processed); | 894 | const unsigned padSize = XZ_GET_PAD_SIZE(seqSizeOutStream.processed); |
893 | UInt64 packSize = seqSizeOutStream.processed; | 895 | const UInt64 packSize = seqSizeOutStream.processed; |
894 | 896 | ||
895 | buf[0] = 0; | 897 | buf[0] = 0; |
896 | buf[1] = 0; | 898 | buf[1] = 0; |
@@ -898,7 +900,8 @@ static SRes Xz_CompressBlock( | |||
898 | buf[3] = 0; | 900 | buf[3] = 0; |
899 | 901 | ||
900 | SeqCheckInStream_GetDigest(&checkInStream, buf + 4); | 902 | SeqCheckInStream_GetDigest(&checkInStream, buf + 4); |
901 | RINOK(WriteBytes(&seqSizeOutStream.vt, buf + (4 - padSize), padSize + XzFlags_GetCheckSize((CXzStreamFlags)props->checkId))) | 903 | RINOK(WriteBytes(&seqSizeOutStream.vt, buf + (4 - padSize), |
904 | padSize + XzFlags_GetCheckSize((CXzStreamFlags)props->checkId))) | ||
902 | 905 | ||
903 | blockSizes->totalSize = seqSizeOutStream.processed - padSize; | 906 | blockSizes->totalSize = seqSizeOutStream.processed - padSize; |
904 | 907 | ||
@@ -1083,18 +1086,19 @@ static SRes XzEnc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBuf | |||
1083 | CXzEnc *me = (CXzEnc *)pp; | 1086 | CXzEnc *me = (CXzEnc *)pp; |
1084 | SRes res; | 1087 | SRes res; |
1085 | CMtProgressThunk progressThunk; | 1088 | CMtProgressThunk progressThunk; |
1086 | 1089 | Byte *dest; | |
1087 | Byte *dest = me->outBufs[outBufIndex]; | ||
1088 | |||
1089 | UNUSED_VAR(finished) | 1090 | UNUSED_VAR(finished) |
1090 | |||
1091 | { | 1091 | { |
1092 | CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; | 1092 | CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; |
1093 | bInfo->totalSize = 0; | 1093 | bInfo->totalSize = 0; |
1094 | bInfo->unpackSize = 0; | 1094 | bInfo->unpackSize = 0; |
1095 | bInfo->headerSize = 0; | 1095 | bInfo->headerSize = 0; |
1096 | // v23.02: we don't compress empty blocks | ||
1097 | // also we must ignore that empty block in XzEnc_MtCallback_Write() | ||
1098 | if (srcSize == 0) | ||
1099 | return SZ_OK; | ||
1096 | } | 1100 | } |
1097 | 1101 | dest = me->outBufs[outBufIndex]; | |
1098 | if (!dest) | 1102 | if (!dest) |
1099 | { | 1103 | { |
1100 | dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); | 1104 | dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); |
@@ -1140,18 +1144,20 @@ static SRes XzEnc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBuf | |||
1140 | static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) | 1144 | static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) |
1141 | { | 1145 | { |
1142 | CXzEnc *me = (CXzEnc *)pp; | 1146 | CXzEnc *me = (CXzEnc *)pp; |
1143 | |||
1144 | const CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; | 1147 | const CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; |
1145 | const Byte *data = me->outBufs[outBufIndex]; | 1148 | // v23.02: we don't write empty blocks |
1146 | 1149 | // note: if (bInfo->unpackSize == 0) then there is no compressed data of block | |
1147 | RINOK(WriteBytes(me->outStream, data, bInfo->headerSize)) | 1150 | if (bInfo->unpackSize == 0) |
1148 | 1151 | return SZ_OK; | |
1149 | { | 1152 | { |
1150 | UInt64 totalPackFull = bInfo->totalSize + XZ_GET_PAD_SIZE(bInfo->totalSize); | 1153 | const Byte *data = me->outBufs[outBufIndex]; |
1151 | RINOK(WriteBytes(me->outStream, data + XZ_BLOCK_HEADER_SIZE_MAX, (size_t)totalPackFull - bInfo->headerSize)) | 1154 | RINOK(WriteBytes(me->outStream, data, bInfo->headerSize)) |
1155 | { | ||
1156 | const UInt64 totalPackFull = bInfo->totalSize + XZ_GET_PAD_SIZE(bInfo->totalSize); | ||
1157 | RINOK(WriteBytes(me->outStream, data + XZ_BLOCK_HEADER_SIZE_MAX, (size_t)totalPackFull - bInfo->headerSize)) | ||
1158 | } | ||
1159 | return XzEncIndex_AddIndexRecord(&me->xzIndex, bInfo->unpackSize, bInfo->totalSize, me->alloc); | ||
1152 | } | 1160 | } |
1153 | |||
1154 | return XzEncIndex_AddIndexRecord(&me->xzIndex, bInfo->unpackSize, bInfo->totalSize, me->alloc); | ||
1155 | } | 1161 | } |
1156 | 1162 | ||
1157 | #endif | 1163 | #endif |