aboutsummaryrefslogtreecommitdiff
path: root/C/XzEnc.c
diff options
context:
space:
mode:
authorIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-14 00:00:00 +0000
committerIgor Pavlov <87184205+ip7z@users.noreply.github.com>2024-05-15 23:55:04 +0500
commitfc662341e6f85da78ada0e443f6116b978f79f22 (patch)
tree1be1cc402a7a9cbc18d4eeea6b141354c2d559e3 /C/XzEnc.c
parent5b39dc76f1bc82f941d5c800ab9f34407a06b53a (diff)
download7zip-24.05.tar.gz
7zip-24.05.tar.bz2
7zip-24.05.zip
24.0524.05
Diffstat (limited to 'C/XzEnc.c')
-rw-r--r--C/XzEnc.c60
1 files changed, 33 insertions, 27 deletions
diff --git a/C/XzEnc.c b/C/XzEnc.c
index 22408e2..c1affad 100644
--- a/C/XzEnc.c
+++ b/C/XzEnc.c
@@ -1,5 +1,5 @@
1/* XzEnc.c -- Xz Encode 1/* XzEnc.c -- Xz Encode
22023-04-13 : Igor Pavlov : Public domain */ 22024-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
326static const z7_Func_BranchConv g_Funcs_BranchConv_RISC_Enc[] = 327static 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
336static SizeT XzBcFilterStateBase_Filter_Enc(CXzBcFilterStateBase *p, Byte *data, SizeT size) 338static 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
1140static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) 1144static 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