函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source File:lib\zstd\huf_compress.c Create Date:2022-07-27 08:00:08
首页 Copyright©Brick

527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
#define HUF_FLUSHBITS(s)  BIT_flushBits(s)
 
#define HUF_FLUSHBITS_1(stream)                                            \
    if (sizeof((stream)->bitContainer) * 8 < HUF_TABLELOG_MAX * 2 + 7) \
    HUF_FLUSHBITS(stream)
 
#define HUF_FLUSHBITS_2(stream)                                            \
    if (sizeof((stream)->bitContainer) * 8 < HUF_TABLELOG_MAX * 4 + 7) \
    HUF_FLUSHBITS(stream)
 
size_t HUF_compress1X_usingCTable(void *dst, size_t dstSize, const void *src, size_t srcSize, const HUF_CElt *CTable)
{
    const BYTE *ip = (const BYTE *)src;
    BYTE *const ostart = (BYTE *)dst;
    BYTE *const oend = ostart + dstSize;
    BYTE *op = ostart;
    size_t n;
    BIT_CStream_t bitC;
 
    /* init */
    if (dstSize < 8)
        return 0; /* not enough space to compress */
    {
        size_t const initErr = BIT_initCStream(&bitC, op, oend - op);
        if (HUF_isError(initErr))
            return 0;
    }
 
    n = srcSize & ~3; /* join to mod 4 */
    switch (srcSize & 3) {
    case 3: HUF_encodeSymbol(&bitC, ip[n + 2], CTable); HUF_FLUSHBITS_2(&bitC);
        /* fall through */
    case 2: HUF_encodeSymbol(&bitC, ip[n + 1], CTable); HUF_FLUSHBITS_1(&bitC);
        /* fall through */
    case 1: HUF_encodeSymbol(&bitC, ip[n + 0], CTable); HUF_FLUSHBITS(&bitC);
    case 0:
    default:;
    }
 
    for (; n > 0; n -= 4) { /* note : n&3==0 at this stage */
        HUF_encodeSymbol(&bitC, ip[n - 1], CTable);
        HUF_FLUSHBITS_1(&bitC);
        HUF_encodeSymbol(&bitC, ip[n - 2], CTable);
        HUF_FLUSHBITS_2(&bitC);
        HUF_encodeSymbol(&bitC, ip[n - 3], CTable);
        HUF_FLUSHBITS_1(&bitC);
        HUF_encodeSymbol(&bitC, ip[n - 4], CTable);
        HUF_FLUSHBITS(&bitC);
    }
 
    return BIT_closeCStream(&bitC);
}