]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
Support for nbSeq > 32767
authorYann Collet <yann.collet.73@gmail.com>
Fri, 4 Mar 2016 13:45:31 +0000 (14:45 +0100)
committerYann Collet <yann.collet.73@gmail.com>
Fri, 4 Mar 2016 13:45:31 +0000 (14:45 +0100)
tamed -Wstrict-aliasing warning

lib/zstd_compress.c
lib/zstd_decompress.c
lib/zstd_internal.h

index 50fa2fdc26537879d9beb36bcb3c43173d1060bb..0c6ee8814754047cbf48921b02c8b62a18cfa9e1 100644 (file)
@@ -212,8 +212,8 @@ static size_t ZSTD_resetCCtx_advanced (ZSTD_CCtx* zc,
     zc->seqStore.litLengthFreq = zc->seqStore.litFreq + (1<<Litbits);
     zc->seqStore.matchLengthFreq = zc->seqStore.litLengthFreq + (1<<LLbits);
     zc->seqStore.offCodeFreq = zc->seqStore.matchLengthFreq + (1<<MLbits);
-    zc->seqStore.matchTable = (ZSTD_match_t*)(zc->seqStore.offCodeFreq + (1<<Offbits));
-    zc->seqStore.priceTable = (ZSTD_optimal_t*)(zc->seqStore.matchTable + ZSTD_OPT_NUM+1);
+    zc->seqStore.matchTable = (ZSTD_match_t*)(void*)(zc->seqStore.offCodeFreq + (1<<Offbits));
+    zc->seqStore.priceTable = (ZSTD_optimal_t*)(void*)(zc->seqStore.matchTable + ZSTD_OPT_NUM+1);
 
     zc->seqStore.litLengthSum = 0;
     zc->hbSize = 0;
@@ -232,7 +232,7 @@ size_t ZSTD_copyCCtx(ZSTD_CCtx* dstCCtx, const ZSTD_CCtx* srcCCtx)
 {
     const U32 contentLog = (srcCCtx->params.strategy == ZSTD_fast) ? 1 : srcCCtx->params.contentLog;
     const size_t tableSpace = ((1 << contentLog) + (1 << srcCCtx->params.hashLog) + (1 << srcCCtx->params.hashLog3)) * sizeof(U32);
-    
+
     if (srcCCtx->stage!=0) return ERROR(stage_wrong);
 
     ZSTD_resetCCtx_advanced(dstCCtx, srcCCtx->params);
@@ -546,17 +546,11 @@ size_t ZSTD_compressSequences(ZSTD_CCtx* zc,
         op += cSize;
     }
 
-#if ZSTD_OPT_DEBUG >= 5
-    if (nbSeq >= 32768)
-        printf("ERROR: nbSeq=%d\n", (int)nbSeq);
-#endif
-
     /* Sequences Header */
     if ((oend-op) < MIN_SEQUENCES_SIZE) return ERROR(dstSize_tooSmall);
-    if (nbSeq < 128) *op++ = (BYTE)nbSeq;
-    else {
-        op[0] = (BYTE)((nbSeq>>8) + 128); op[1] = (BYTE)nbSeq; op+=2;
-    }
+    if (nbSeq < 0x7F) *op++ = (BYTE)nbSeq;
+    else if (nbSeq < LONGNBSEQ) op[0] = (BYTE)((nbSeq>>8) + 0x80), op[1] = (BYTE)nbSeq, op+=2;
+    else op[0]=0xFF, MEM_writeLE16(op+1, (U16)(nbSeq - LONGNBSEQ)), op+=3;
     if (nbSeq==0) goto _check_compressibility;
 
     /* dumps : contains rests of large lengths */
index e9d3bdb691e271eb8a9df84dfbf7f8634782adaf..c4338bcc2187b7600af1d7739961e137d4e4d239 100644 (file)
@@ -496,9 +496,14 @@ size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLen
     /* SeqHead */
     *nbSeq = *ip++;
     if (*nbSeq==0) return 1;
-    if (*nbSeq >= 128)
-        *nbSeq = ((nbSeq[0]-128)<<8) + *ip++;
+    if (*nbSeq >= 0x7F) {
+        if (*nbSeq == 0xFF)
+            *nbSeq = MEM_readLE16(ip) + LONGNBSEQ, ip+=2;
+        else
+            *nbSeq = ((nbSeq[0]-0x80)<<8) + *ip++;
+    }
 
+    /* FSE table descriptors */
     LLtype  = *ip >> 6;
     Offtype = (*ip >> 4) & 3;
     MLtype  = (*ip >> 2) & 3;
index 4948e2397e0e0ed39677c1dc8fde471131f7de1a..bbd19b004aa1d8b1de4e0e3f58811443208b9802 100644 (file)
@@ -105,12 +105,13 @@ static const size_t ZSTD_frameHeaderSize_min = 5;
 #define OffFSELog   9
 #define MaxSeq MAX(MaxLL, MaxML)
 
+#define LONGNBSEQ 0xFF00
+
 #define FSE_ENCODING_RAW     0
 #define FSE_ENCODING_RLE     1
 #define FSE_ENCODING_STATIC  2
 #define FSE_ENCODING_DYNAMIC 3
 
-
 #define HufLog 12
 
 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */