Ejemplo n.º 1
0
        /* HUF_compress_internal() :
         * `workSpace_align4` must be aligned on 4-bytes boundaries,
         * and occupies the same space as a table of HUF_WORKSPACE_SIZE_U32 unsigned */
        private static nuint HUF_compress_internal(void *dst, nuint dstSize, void *src, nuint srcSize, uint maxSymbolValue, uint huffLog, HUF_nbStreams_e nbStreams, void *workSpace_align4, nuint wkspSize, HUF_CElt_s *oldHufTable, HUF_repeat *repeat, int preferRepeat, int bmi2)
        {
            HUF_compress_tables_t *table = (HUF_compress_tables_t *)(workSpace_align4);
            byte *ostart = (byte *)(dst);
            byte *oend   = ostart + dstSize;
            byte *op     = ostart;

            assert(((nuint)(workSpace_align4) & 3) == 0);
            if (wkspSize < (uint)(((6 << 10) + 256)))
            {
                return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_workSpace_tooSmall)));
            }

            if (srcSize == 0)
            {
                return(0);
            }

            if (dstSize == 0)
            {
                return(0);
            }

            if (srcSize > (uint)((128 * 1024)))
            {
                return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_srcSize_wrong)));
            }

            if (huffLog > 12)
            {
                return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_tableLog_tooLarge)));
            }

            if (maxSymbolValue > 255)
            {
                return(unchecked ((nuint)(-(int)ZSTD_ErrorCode.ZSTD_error_maxSymbolValue_tooLarge)));
            }

            if (maxSymbolValue == 0)
            {
                maxSymbolValue = 255;
            }

            if (huffLog == 0)
            {
                huffLog = 11;
            }

            if (preferRepeat != 0 && repeat != null && *repeat == HUF_repeat.HUF_repeat_valid)
            {
                return(HUF_compressCTable_internal(ostart, op, oend, src, srcSize, nbStreams, oldHufTable, bmi2));
            }


            {
                nuint largest = HIST_count_wksp((uint *)table->count, &maxSymbolValue, (void *)(byte *)(src), srcSize, workSpace_align4, wkspSize);

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

                if (largest == srcSize)
                {
                    *ostart = ((byte *)(src))[0];
                    return(1);
                }

                if (largest <= (srcSize >> 7) + 4)
                {
                    return(0);
                }
            }

            if (repeat != null && *repeat == HUF_repeat.HUF_repeat_check && (HUF_validateCTable(oldHufTable, (uint *)table->count, maxSymbolValue)) == 0)
            {
                *repeat = HUF_repeat.HUF_repeat_none;
            }

            if (preferRepeat != 0 && repeat != null && *repeat != HUF_repeat.HUF_repeat_none)
            {
                return(HUF_compressCTable_internal(ostart, op, oend, src, srcSize, nbStreams, oldHufTable, bmi2));
            }

            huffLog = HUF_optimalTableLog(huffLog, srcSize, maxSymbolValue);

            {
                nuint maxBits = HUF_buildCTable_wksp((HUF_CElt_s *)table->CTable, (uint *)table->count, maxSymbolValue, huffLog, (void *)&table->buildCTable_wksp, (nuint)(4352));


                {
                    nuint _var_err__ = maxBits;

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

                huffLog = (uint)(maxBits);
                memset((void *)((table->CTable + (maxSymbolValue + 1))), (0), ((nuint)(sizeof(HUF_CElt_s) * 256) - ((maxSymbolValue + 1) * (nuint)(sizeof(HUF_CElt_s)))));
            }


            {
                nuint hSize = HUF_writeCTable((void *)op, dstSize, (HUF_CElt_s *)table->CTable, maxSymbolValue, huffLog);

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

                if (repeat != null && *repeat != HUF_repeat.HUF_repeat_none)
                {
                    nuint oldSize = HUF_estimateCompressedSize(oldHufTable, (uint *)table->count, maxSymbolValue);
                    nuint newSize = HUF_estimateCompressedSize((HUF_CElt_s *)table->CTable, (uint *)table->count, maxSymbolValue);

                    if (oldSize <= hSize + newSize || hSize + 12 >= srcSize)
                    {
                        return(HUF_compressCTable_internal(ostart, op, oend, src, srcSize, nbStreams, oldHufTable, bmi2));
                    }
                }

                if (hSize + 12U >= srcSize)
                {
                    return(0);
                }

                op += hSize;
                if (repeat != null)
                {
                    *repeat = HUF_repeat.HUF_repeat_none;
                }

                if (oldHufTable != null)
                {
                    memcpy((void *)(oldHufTable), (void *)(table->CTable), ((nuint)(sizeof(HUF_CElt_s) * 256)));
                }
            }

            return(HUF_compressCTable_internal(ostart, op, oend, src, srcSize, nbStreams, (HUF_CElt_s *)table->CTable, bmi2));
        }
Ejemplo n.º 2
0
        private static nuint HUF_compressCTable_internal(byte *ostart, byte *op, byte *oend, void *src, nuint srcSize, HUF_nbStreams_e nbStreams, HUF_CElt_s *CTable, int bmi2)
        {
            nuint cSize = (nbStreams == HUF_nbStreams_e.HUF_singleStream) ? HUF_compress1X_usingCTable_internal((void *)op, (nuint)(oend - op), src, srcSize, CTable, bmi2) : HUF_compress4X_usingCTable_internal((void *)op, (nuint)(oend - op), src, srcSize, CTable, bmi2);

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

            if (cSize == 0)
            {
                return(0);
            }

            op += cSize;
            assert(op >= ostart);
            if ((nuint)(op - ostart) >= srcSize - 1)
            {
                return(0);
            }

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