#include <stdio.h>
#include <blosc2.h>
#include <windows.h>
#define SIZE 100*1000*1000
#define SHAPE {100,1000,1000}
#define CHUNKSHAPE {1,1000,1000}
typedef int (__cdecl* COMPRESS_CTX)(int clevel, int doshuffle, size_t typesize,
size_t nbytes, const void* src, void* dest,
size_t destsize, const char* compressor,
size_t blocksize, int numinternalthreads);
typedef int (__cdecl* DECOMPRESS_CTX)(const void* src, void* dest,
size_t destsize, int numinternalthreads);
typedef char* (__cdecl* GET_VERSION_STRING)(void);
int main(void) {
HINSTANCE BDLL;
COMPRESS_CTX blosc_compress_ctx;
DECOMPRESS_CTX blosc_decompress_ctx;
GET_VERSION_STRING blosc_get_version_string;
static float data[SIZE];
static float data_out[SIZE];
static float data_dest[SIZE];
int isize = SIZE * sizeof(float), osize = SIZE * sizeof(float);
int dsize = SIZE * sizeof(float), csize;
int i;
BDLL = LoadLibrary(TEXT("myblosc.dll"));
if (BDLL == NULL) {
printf("Cannot find myblosc.dll library!\n");
goto out;
}
blosc_compress_ctx = (COMPRESS_CTX)GetProcAddress(BDLL, "blosc_compress_ctx");
if (!blosc_compress_ctx) {
printf("Cannot find blosc_compress_ctx() function!\n");
goto out;
}
blosc_decompress_ctx = (DECOMPRESS_CTX)GetProcAddress(BDLL, "blosc_decompress_ctx");
if (!blosc_decompress_ctx) {
printf("Cannot find blosc_decompress_ctx() function!\n");
goto out;
}
blosc_get_version_string = (GET_VERSION_STRING)GetProcAddress(BDLL, "blosc_get_version_string");
if (!blosc_get_version_string) {
printf("Cannot find blosc_get_version_string() function!\n");
goto out;
}
for (i = 0; i < SIZE; i++) {
data[i] = i;
}
printf("Blosc version info: %s\n", blosc_get_version_string());
csize = blosc_compress_ctx(3, 1, 16, isize, data, data_out, osize, "blosclz", 0, 2);
if (csize == 0) {
printf("Buffer is incompressible. Giving up.\n");
return 1;
}
else if (csize < 0) {
printf("Compression error. Error code: %d\n", csize);
return csize;
}
printf("Compression: %d -> %d (%.1fx)\n", isize, csize, (1. * isize) / csize);
dsize = blosc_decompress_ctx(data_out, data_dest, dsize, 1);
if (dsize < 0) {
printf("Decompression error. Error code: %d\n", dsize);
return dsize;
}
printf("Decompression successful!\n");
for (i = 0; i < SIZE; i++) {
if (data[i] != data_dest[i]) {
printf("Decompressed data differs from original!\n");
return -1;
}
}
printf("Successful roundtrip!\n");
return 0;
out:
FreeLibrary(BDLL);
return -1;
}