Example #1
0
        public static nuint ZDICT_getDictHeaderSize(void *dictBuffer, nuint dictSize)
        {
            nuint headerSize;

            if (dictSize <= 8 || MEM_readLE32(dictBuffer) != 0xEC30A437)
            {
                return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_dictionary_corrupted)));
            }


            {
                ZSTD_compressedBlockState_t *bs = (ZSTD_compressedBlockState_t *)(malloc((nuint)(4592)));
                uint *wksp = (uint *)(malloc((nuint)(((6 << 10) + 256))));

                if (bs == null || wksp == null)
                {
                    headerSize = (unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_memory_allocation)));
                }
                else
                {
                    ZSTD_reset_compressedBlockState(bs);
                    headerSize = ZSTD_loadCEntropy(bs, (void *)wksp, dictBuffer, dictSize);
                }

                free((void *)bs);
                free((void *)wksp);
            }

            return(headerSize);
        }
Example #2
0
        /** ZSTD_compressSubBlock_multi() :
         *  Breaks super-block into multiple sub-blocks and compresses them.
         *  Entropy will be written to the first block.
         *  The following blocks will use repeat mode to compress.
         *  All sub-blocks are compressed blocks (no raw or rle blocks).
         *  @return : compressed size of the super block (which is multiple ZSTD blocks)
         *            Or 0 if it failed to compress. */
        private static nuint ZSTD_compressSubBlock_multi(seqStore_t *seqStorePtr, ZSTD_compressedBlockState_t *prevCBlock, ZSTD_compressedBlockState_t *nextCBlock, ZSTD_entropyCTablesMetadata_t *entropyMetadata, ZSTD_CCtx_params_s *cctxParams, void *dst, nuint dstCapacity, void *src, nuint srcSize, int bmi2, uint lastBlock, void *workspace, nuint wkspSize)
        {
            seqDef_s *sstart = seqStorePtr->sequencesStart;
            seqDef_s *send = seqStorePtr->sequences;
            seqDef_s *sp = sstart;
            byte *    lstart = seqStorePtr->litStart;
            byte *    lend = seqStorePtr->lit;
            byte *    lp = lstart;
            byte *    ip = (byte *)(src);
            byte *    iend = ip + srcSize;
            byte *    ostart = (byte *)(dst);
            byte *    oend = ostart + dstCapacity;
            byte *    op = ostart;
            byte *    llCodePtr = seqStorePtr->llCode;
            byte *    mlCodePtr = seqStorePtr->mlCode;
            byte *    ofCodePtr = seqStorePtr->ofCode;
            nuint     targetCBlockSize = cctxParams->targetCBlockSize;
            nuint     litSize, seqCount;
            int       writeLitEntropy = ((entropyMetadata->hufMetadata.hType == symbolEncodingType_e.set_compressed) ? 1 : 0);
            int       writeSeqEntropy = 1;
            int       lastSequence    = 0;

            litSize  = 0;
            seqCount = 0;
            do
            {
                nuint cBlockSizeEstimate = 0;

                if (sstart == send)
                {
                    lastSequence = 1;
                }
                else
                {
                    seqDef_s *sequence = sp + seqCount;

                    lastSequence = ((sequence == send - 1) ? 1 : 0);
                    litSize     += ZSTD_getSequenceLength(seqStorePtr, sequence).litLength;
                    seqCount++;
                }

                if (lastSequence != 0)
                {
                    assert(lp <= lend);
                    assert(litSize <= (nuint)(lend - lp));
                    litSize = (nuint)(lend - lp);
                }

                cBlockSizeEstimate = ZSTD_estimateSubBlockSize(lp, litSize, ofCodePtr, llCodePtr, mlCodePtr, seqCount, &nextCBlock->entropy, entropyMetadata, workspace, wkspSize, writeLitEntropy, writeSeqEntropy);
                if (cBlockSizeEstimate > targetCBlockSize || lastSequence != 0)
                {
                    int   litEntropyWritten = 0;
                    int   seqEntropyWritten = 0;
                    nuint decompressedSize  = ZSTD_seqDecompressedSize(seqStorePtr, sp, seqCount, litSize, lastSequence);
                    nuint cSize             = ZSTD_compressSubBlock(&nextCBlock->entropy, entropyMetadata, sp, seqCount, lp, litSize, llCodePtr, mlCodePtr, ofCodePtr, cctxParams, (void *)op, (nuint)(oend - op), bmi2, writeLitEntropy, writeSeqEntropy, &litEntropyWritten, &seqEntropyWritten, ((lastBlock != 0 && lastSequence != 0) ? 1U : 0U));


                    {
                        nuint err_code = (cSize);

                        if ((ERR_isError(err_code)) != 0)
                        {
                            return(err_code);
                        }
                    }

                    if (cSize > 0 && cSize < decompressedSize)
                    {
                        assert(ip + decompressedSize <= iend);
                        ip        += decompressedSize;
                        sp        += seqCount;
                        lp        += litSize;
                        op        += cSize;
                        llCodePtr += seqCount;
                        mlCodePtr += seqCount;
                        ofCodePtr += seqCount;
                        litSize    = 0;
                        seqCount   = 0;
                        if (litEntropyWritten != 0)
                        {
                            writeLitEntropy = 0;
                        }

                        if (seqEntropyWritten != 0)
                        {
                            writeSeqEntropy = 0;
                        }
                    }
                }
            }while (lastSequence == 0);

            if (writeLitEntropy != 0)
            {
                memcpy((void *)(&nextCBlock->entropy.huf), (void *)(&prevCBlock->entropy.huf), ((nuint)(sizeof(ZSTD_hufCTables_t))));
            }

            if (writeSeqEntropy != 0 && (ZSTD_needSequenceEntropyTables(&entropyMetadata->fseMetadata)) != 0)
            {
                return(0);
            }

            if (ip < iend)
            {
                nuint cSize = ZSTD_noCompressBlock((void *)op, (nuint)(oend - op), (void *)ip, (nuint)(iend - ip), lastBlock);


                {
                    nuint err_code = (cSize);

                    if ((ERR_isError(err_code)) != 0)
                    {
                        return(err_code);
                    }
                }

                assert(cSize != 0);
                op += cSize;
                if (sp < send)
                {
                    seqDef_s * seq;
                    repcodes_s rep;

                    memcpy((void *)(&rep), (void *)(prevCBlock->rep), ((nuint)(sizeof(repcodes_s))));
                    for (seq = sstart; seq < sp; ++seq)
                    {
                        rep = ZSTD_updateRep(rep.rep, seq->offset - 1, ((ZSTD_getSequenceLength(seqStorePtr, seq).litLength == 0) ? 1U : 0U));
                    }

                    memcpy((void *)(nextCBlock->rep), (void *)(&rep), ((nuint)(sizeof(repcodes_s))));
                }
            }

            return((nuint)(op - ostart));
        }