| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #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
|