|
|
@@ -0,0 +1,294 @@
|
|
|
+#ifdef SQ_USE_CBLOSC
|
|
|
+
|
|
|
+#include "squirrel.h"
|
|
|
+#include "sqstdblobimpl.h"
|
|
|
+#include <stdio.h>
|
|
|
+#include <string.h>
|
|
|
+#include <blosc.h>
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_version(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ sq_pushstring(v, blosc_get_version_string(), -1);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_init(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ blosc_init();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_destroy(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ blosc_destroy();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_free_resources(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ sq_pushinteger(v, blosc_free_resources());
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_list_compressors(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ sq_pushstring(v, blosc_list_compressors(), -1);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_cbuffer_sizes(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, cbuffer);
|
|
|
+ size_t nbytes, cbytes, blocksize;
|
|
|
+ blosc_cbuffer_sizes((const void *)cbuffer, &nbytes, &cbytes, &blocksize);
|
|
|
+ sq_newtable(v);
|
|
|
+
|
|
|
+ sq_pushliteral(v, _SC("nbytes"));
|
|
|
+ sq_pushinteger(v, nbytes);
|
|
|
+ sq_rawset(v, -3);
|
|
|
+
|
|
|
+ sq_pushliteral(v, _SC("cbytes"));
|
|
|
+ sq_pushinteger(v, cbytes);
|
|
|
+ sq_rawset(v, -3);
|
|
|
+
|
|
|
+ sq_pushliteral(v, _SC("blocksize"));
|
|
|
+ sq_pushinteger(v, blocksize);
|
|
|
+ sq_rawset(v, -3);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_cbuffer_metainfo(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, cbuffer);
|
|
|
+ size_t typesize;
|
|
|
+ int flags;
|
|
|
+ blosc_cbuffer_metainfo((const void *)cbuffer, &typesize, &flags);
|
|
|
+ sq_newtable(v);
|
|
|
+
|
|
|
+ sq_pushliteral(v, _SC("typesize"));
|
|
|
+ sq_pushinteger(v, typesize);
|
|
|
+ sq_rawset(v, -3);
|
|
|
+
|
|
|
+ sq_pushliteral(v, _SC("flags"));
|
|
|
+ sq_pushinteger(v, flags);
|
|
|
+ sq_rawset(v, -3);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_cbuffer_complib(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, cbuffer);
|
|
|
+ sq_pushstring(v, blosc_cbuffer_complib(cbuffer), -1);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_blocksize(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS(v);
|
|
|
+ if(_top_ == 1)
|
|
|
+ {
|
|
|
+ sq_pushinteger(v, blosc_get_blocksize());
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ SQ_GET_INTEGER(v, 2, new_size);
|
|
|
+ blosc_set_blocksize(new_size);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compcode_to_compname(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_INTEGER(v, 2, compcode);
|
|
|
+ char *compname;
|
|
|
+ int rc = blosc_compcode_to_compname(compcode, &compname);
|
|
|
+ if(rc > -1) sq_pushstring(v, compname, -1);
|
|
|
+ else sq_pushnull(v);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compname_to_compcode(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, compname);
|
|
|
+ sq_pushinteger(v, blosc_compname_to_compcode(compname));
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compressor(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS(v);
|
|
|
+ if(_top_ == 1) sq_pushstring(v, blosc_get_compressor(), -1);
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SQ_GET_STRING(v, 2, compname);
|
|
|
+ sq_pushinteger(v, blosc_set_compressor(compname));
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_nthreads(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS(v);
|
|
|
+ if(_top_ == 1) sq_pushinteger(v, blosc_get_nthreads());
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SQ_GET_INTEGER(v, 2, nthreads);
|
|
|
+ sq_pushinteger(v, blosc_set_nthreads(nthreads));
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compress0(HSQUIRRELVM v, int isCtx)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_INTEGER(v, 2, clevel);
|
|
|
+ SQ_GET_INTEGER(v, 3, doshuffle);
|
|
|
+ SQ_GET_INTEGER(v, 4, typesize);
|
|
|
+ SQ_GET_STRING(v, 5, src);
|
|
|
+
|
|
|
+ size_t destsize = src_size + BLOSC_MAX_OVERHEAD;
|
|
|
+ SQChar *dest = sq_getscratchpad(v, destsize);
|
|
|
+ int csize;
|
|
|
+ if(isCtx)
|
|
|
+ {
|
|
|
+ SQ_GET_STRING(v, 6, compname);
|
|
|
+ SQ_GET_INTEGER(v, 7, blocksize);
|
|
|
+ SQ_GET_INTEGER(v, 8, nthreads);
|
|
|
+
|
|
|
+ csize = blosc_compress_ctx(clevel, doshuffle, typesize,
|
|
|
+ src_size, (const void *)src, (void *)dest, destsize,
|
|
|
+ compname, blocksize, nthreads);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ csize = blosc_compress(clevel, doshuffle, typesize,
|
|
|
+ src_size, (const void *)src, (void *)dest, destsize);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(csize > 0) sq_pushstring(v, dest, csize);
|
|
|
+ else sq_pushinteger(v, csize);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compress(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ return sq_blosc_compress0(v, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_compress_ctx(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ return sq_blosc_compress0(v, 1);
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_decompress0(HSQUIRRELVM v, int isCtx)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, cbuffer);
|
|
|
+
|
|
|
+ size_t nbytes, cbytes, blocksize;
|
|
|
+ blosc_cbuffer_sizes((const void *)cbuffer, &nbytes, &cbytes, &blocksize);
|
|
|
+
|
|
|
+ SQChar *dest = sq_getscratchpad(v, nbytes);
|
|
|
+ int dsize;
|
|
|
+ if(isCtx)
|
|
|
+ {
|
|
|
+ SQ_GET_INTEGER(v, 3, nthreads);
|
|
|
+ dsize = blosc_decompress_ctx((const void *)cbuffer, (void *)dest, nbytes, nthreads);
|
|
|
+ }
|
|
|
+ else dsize = blosc_decompress((const void *)cbuffer, (void *)dest, nbytes);
|
|
|
+ if(dsize > 0) sq_pushstring(v, dest, dsize);
|
|
|
+ else sq_pushinteger(v, dsize);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_decompress(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ return sq_blosc_decompress0(v, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_decompress_ctx(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ return sq_blosc_decompress0(v, 1);
|
|
|
+}
|
|
|
+
|
|
|
+static SQRESULT sq_blosc_getitem(HSQUIRRELVM v)
|
|
|
+{
|
|
|
+ SQ_FUNC_VARS_NO_TOP(v);
|
|
|
+ SQ_GET_STRING(v, 2, cbuffer);
|
|
|
+ SQ_GET_INTEGER(v, 3, start_pos)
|
|
|
+ SQ_GET_INTEGER(v, 4, nitems)
|
|
|
+
|
|
|
+ size_t typesize;
|
|
|
+ int flags;
|
|
|
+ blosc_cbuffer_metainfo((const void *)cbuffer, &typesize, &flags);
|
|
|
+
|
|
|
+ SQChar *dest = sq_getscratchpad(v, nitems * typesize);
|
|
|
+
|
|
|
+ int dsize = blosc_getitem((const void *)cbuffer, start_pos, nitems, (void *)dest);
|
|
|
+ if(dsize > 0) sq_pushstring(v, dest, dsize);
|
|
|
+ else sq_pushinteger(v, dsize);
|
|
|
+
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef __cplusplus
|
|
|
+extern "C" {
|
|
|
+#endif
|
|
|
+#define INT_CONST(v,num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
|
|
|
+#define STR_CONST(v,str) sq_pushstring(v,_SC(#str),-1);sq_pushstring(v,str, -1);sq_newslot(v,-3,SQTrue);
|
|
|
+
|
|
|
+
|
|
|
+ SQRESULT sqext_register_sq_blosc(HSQUIRRELVM v)
|
|
|
+ {
|
|
|
+ sq_pushliteral(v,_SC("blosc"));
|
|
|
+ sq_newtable(v);
|
|
|
+ INT_CONST(v, BLOSC_MIN_HEADER_LENGTH);
|
|
|
+ INT_CONST(v, BLOSC_MAX_OVERHEAD);
|
|
|
+ INT_CONST(v, BLOSC_MAX_BUFFERSIZE);
|
|
|
+ INT_CONST(v, BLOSC_MAX_TYPESIZE);
|
|
|
+ INT_CONST(v, BLOSC_MAX_THREADS);
|
|
|
+ INT_CONST(v, BLOSC_NOSHUFFLE);
|
|
|
+ INT_CONST(v, BLOSC_SHUFFLE);
|
|
|
+ INT_CONST(v, BLOSC_BITSHUFFLE);
|
|
|
+
|
|
|
+ STR_CONST(v, BLOSC_BLOSCLZ_COMPNAME);
|
|
|
+ STR_CONST(v, BLOSC_LZ4_COMPNAME);
|
|
|
+ STR_CONST(v, BLOSC_LZ4HC_COMPNAME);
|
|
|
+ STR_CONST(v, BLOSC_SNAPPY_COMPNAME);
|
|
|
+ STR_CONST(v, BLOSC_ZLIB_COMPNAME);
|
|
|
+ STR_CONST(v, BLOSC_ZSTD_COMPNAME);
|
|
|
+
|
|
|
+ sq_insertfunc(v, _SC("version"), sq_blosc_version, 1, _SC("."), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("init"), sq_blosc_init, 1, _SC("."), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("destroy"), sq_blosc_destroy, 1, _SC("."), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("free_resources"), sq_blosc_free_resources, 1, _SC("."), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("list_compressors"), sq_blosc_list_compressors, 1, _SC("."), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("cbuffer_sizes"), sq_blosc_cbuffer_sizes, 2, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("cbuffer_metainfo"), sq_blosc_cbuffer_metainfo, 2, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("cbuffer_complib"), sq_blosc_cbuffer_complib, 2, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("compcode_to_compname"), sq_blosc_compcode_to_compname, 2, _SC(".i"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("compname_to_compcode"), sq_blosc_compname_to_compcode, 2, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("blocksize"), sq_blosc_blocksize, -1, _SC(".i"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("compressor"), sq_blosc_compressor, -1, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("nthreads"), sq_blosc_nthreads, -1, _SC(".i"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("compress"), sq_blosc_compress, 5, _SC(".iiis"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("compress_ctx"), sq_blosc_compress_ctx, 8, _SC(".iiissii"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("decompress"), sq_blosc_decompress, 2, _SC(".s"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("decompress_ctx"), sq_blosc_decompress_ctx, 3, _SC(".si"), SQTrue);
|
|
|
+ sq_insertfunc(v, _SC("getitem"), sq_blosc_getitem, 4, _SC(".sii"), SQTrue);
|
|
|
+
|
|
|
+ sq_newslot(v,-3,SQTrue); //push blosc table
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef __cplusplus
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+#endif // SQ_USE_CBLOSC
|