/* 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)); }
/* HUF_compress4X_repeat(): * compress input using 4 streams. * re-use an existing huffman compression table */ public static nuint HUF_compress4X_repeat(void *dst, nuint dstSize, void *src, nuint srcSize, uint maxSymbolValue, uint huffLog, void *workSpace, nuint wkspSize, HUF_CElt_s *hufTable, HUF_repeat *repeat, int preferRepeat, int bmi2) { return(HUF_compress_internal(dst, dstSize, src, srcSize, maxSymbolValue, huffLog, HUF_nbStreams_e.HUF_fourStreams, workSpace, wkspSize, hufTable, repeat, preferRepeat, bmi2)); }