#define ERROR_LIST(ITEM) \
ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \
ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(frameParameter_unsupported)) ITEM(PREFIX(frameParameter_unsupportedBy32bitsImplementation)) \
- ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) \
+ ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) ITEM(PREFIX(stage_wrong)) \
ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \
ITEM(PREFIX(corruption_detected)) \
ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \
{
void* dstWorkSpace = dstCCtx->workSpace;
size_t dstWorkSpaceSize = dstCCtx->workSpaceSize;
+ const U32 contentLog = (srcCCtx->params.strategy == ZSTD_fast) ? 1 : srcCCtx->params.contentLog;
+ const size_t tableSpace = ((1 << contentLog) + (1 << srcCCtx->params.hashLog)) * sizeof(U32);
+ const size_t blockSize = MIN(BLOCKSIZE, (size_t)1 << srcCCtx->params.windowLog);
+ const size_t neededSpace = tableSpace + (3*blockSize);
- if (dstWorkSpaceSize < srcCCtx->workSpaceSize)
+ if (srcCCtx->stage!=0) return ERROR(stage_wrong);
+
+ if (dstWorkSpaceSize < neededSpace)
{
- free(dstCCtx->workSpace);
- dstWorkSpaceSize = srcCCtx->workSpaceSize;
+ free(dstWorkSpace);
+ dstWorkSpaceSize = neededSpace;
dstWorkSpace = malloc(dstWorkSpaceSize);
if (dstWorkSpace==NULL) return ERROR(memory_allocation);
}
dstCCtx->workSpace = dstWorkSpace;
dstCCtx->workSpaceSize = dstWorkSpaceSize;
+ memcpy(dstWorkSpace, srcCCtx->workSpace, tableSpace);
+
return 0;
}