/* 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)); }
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)); }