int64_t lzbench_blosclz_compress(char *inbuf, size_t insize, char *outbuf, size_t outsize, size_t level, size_t, char*) { return blosclz_compress(level, inbuf, insize, outbuf, outsize, 1); }
/* Shuffle & compress a single block */ static int blosc_c(uint32_t blocksize, int32_t leftoverblock, uint32_t ntbytes, uint32_t maxbytes, uint8_t *src, uint8_t *dest, uint8_t *tmp) { int32_t j, neblock, nsplits; int32_t cbytes; /* number of compressed bytes in split */ int32_t ctbytes = 0; /* number of compressed bytes in block */ int32_t maxout; uint32_t typesize = params.typesize; uint8_t *_tmp; if ((params.flags & BLOSC_DOSHUFFLE) && (typesize > 1)) { /* Shuffle this block (this makes sense only if typesize > 1) */ shuffle(typesize, blocksize, src, tmp); _tmp = tmp; } else { _tmp = src; } /* Compress for each shuffled slice split for this block. */ /* If typesize is too large, neblock is too small or we are in a leftover block, do not split at all. */ if ((typesize <= MAX_SPLITS) && (blocksize/typesize) >= MIN_BUFFERSIZE && (!leftoverblock)) { nsplits = typesize; } else { nsplits = 1; } neblock = blocksize / nsplits; for (j = 0; j < nsplits; j++) { dest += sizeof(int32_t); ntbytes += sizeof(int32_t); ctbytes += sizeof(int32_t); maxout = neblock; if (ntbytes+maxout > maxbytes) { maxout = maxbytes - ntbytes; /* avoid buffer overrun */ if (maxout <= 0) { return 0; /* non-compressible block */ } } cbytes = blosclz_compress(params.clevel, _tmp+j*neblock, neblock, dest, maxout); if (cbytes >= maxout) { /* Buffer overrun caused by blosclz_compress (should never happen) */ return -1; } else if (cbytes < 0) { /* cbytes should never be negative */ return -2; } else if (cbytes == 0) { /* The compressor has been unable to compress data significantly. */ /* Before doing the copy, check that we are not running into a buffer overflow. */ if ((ntbytes+neblock) > maxbytes) { return 0; /* Non-compressible data */ } memcpy(dest, _tmp+j*neblock, neblock); cbytes = neblock; } ((uint32_t *)(dest))[-1] = sw32(cbytes); dest += cbytes; ntbytes += cbytes; ctbytes += cbytes; } /* Closes j < nsplits */ return ctbytes; }