sq_blosc.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #ifdef SQ_USE_CBLOSC
  2. #include "squirrel.h"
  3. #include "sqstdblobimpl.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <blosc.h>
  7. static SQRESULT sq_blosc_version(HSQUIRRELVM v)
  8. {
  9. sq_pushstring(v, blosc_get_version_string(), -1);
  10. return 1;
  11. }
  12. static SQRESULT sq_blosc_init(HSQUIRRELVM v)
  13. {
  14. blosc_init();
  15. return 0;
  16. }
  17. static SQRESULT sq_blosc_destroy(HSQUIRRELVM v)
  18. {
  19. blosc_destroy();
  20. return 0;
  21. }
  22. static SQRESULT sq_blosc_free_resources(HSQUIRRELVM v)
  23. {
  24. sq_pushinteger(v, blosc_free_resources());
  25. return 1;
  26. }
  27. static SQRESULT sq_blosc_list_compressors(HSQUIRRELVM v)
  28. {
  29. sq_pushstring(v, blosc_list_compressors(), -1);
  30. return 1;
  31. }
  32. static SQRESULT sq_blosc_cbuffer_sizes(HSQUIRRELVM v)
  33. {
  34. SQ_FUNC_VARS_NO_TOP(v);
  35. SQ_GET_STRING(v, 2, cbuffer);
  36. size_t nbytes, cbytes, blocksize;
  37. blosc_cbuffer_sizes((const void *)cbuffer, &nbytes, &cbytes, &blocksize);
  38. sq_newtable(v);
  39. sq_pushliteral(v, _SC("nbytes"));
  40. sq_pushinteger(v, nbytes);
  41. sq_rawset(v, -3);
  42. sq_pushliteral(v, _SC("cbytes"));
  43. sq_pushinteger(v, cbytes);
  44. sq_rawset(v, -3);
  45. sq_pushliteral(v, _SC("blocksize"));
  46. sq_pushinteger(v, blocksize);
  47. sq_rawset(v, -3);
  48. return 1;
  49. }
  50. static SQRESULT sq_blosc_cbuffer_metainfo(HSQUIRRELVM v)
  51. {
  52. SQ_FUNC_VARS_NO_TOP(v);
  53. SQ_GET_STRING(v, 2, cbuffer);
  54. size_t typesize;
  55. int flags;
  56. blosc_cbuffer_metainfo((const void *)cbuffer, &typesize, &flags);
  57. sq_newtable(v);
  58. sq_pushliteral(v, _SC("typesize"));
  59. sq_pushinteger(v, typesize);
  60. sq_rawset(v, -3);
  61. sq_pushliteral(v, _SC("flags"));
  62. sq_pushinteger(v, flags);
  63. sq_rawset(v, -3);
  64. return 1;
  65. }
  66. static SQRESULT sq_blosc_cbuffer_complib(HSQUIRRELVM v)
  67. {
  68. SQ_FUNC_VARS_NO_TOP(v);
  69. SQ_GET_STRING(v, 2, cbuffer);
  70. sq_pushstring(v, blosc_cbuffer_complib(cbuffer), -1);
  71. return 1;
  72. }
  73. static SQRESULT sq_blosc_blocksize(HSQUIRRELVM v)
  74. {
  75. SQ_FUNC_VARS(v);
  76. if(_top_ == 1)
  77. {
  78. sq_pushinteger(v, blosc_get_blocksize());
  79. return 1;
  80. }
  81. SQ_GET_INTEGER(v, 2, new_size);
  82. blosc_set_blocksize(new_size);
  83. return 0;
  84. }
  85. static SQRESULT sq_blosc_compcode_to_compname(HSQUIRRELVM v)
  86. {
  87. SQ_FUNC_VARS_NO_TOP(v);
  88. SQ_GET_INTEGER(v, 2, compcode);
  89. char *compname;
  90. int rc = blosc_compcode_to_compname(compcode, &compname);
  91. if(rc > -1) sq_pushstring(v, compname, -1);
  92. else sq_pushnull(v);
  93. return 1;
  94. }
  95. static SQRESULT sq_blosc_compname_to_compcode(HSQUIRRELVM v)
  96. {
  97. SQ_FUNC_VARS_NO_TOP(v);
  98. SQ_GET_STRING(v, 2, compname);
  99. sq_pushinteger(v, blosc_compname_to_compcode(compname));
  100. return 1;
  101. }
  102. static SQRESULT sq_blosc_compressor(HSQUIRRELVM v)
  103. {
  104. SQ_FUNC_VARS(v);
  105. if(_top_ == 1) sq_pushstring(v, blosc_get_compressor(), -1);
  106. else
  107. {
  108. SQ_GET_STRING(v, 2, compname);
  109. sq_pushinteger(v, blosc_set_compressor(compname));
  110. }
  111. return 1;
  112. }
  113. static SQRESULT sq_blosc_nthreads(HSQUIRRELVM v)
  114. {
  115. SQ_FUNC_VARS(v);
  116. if(_top_ == 1) sq_pushinteger(v, blosc_get_nthreads());
  117. else
  118. {
  119. SQ_GET_INTEGER(v, 2, nthreads);
  120. sq_pushinteger(v, blosc_set_nthreads(nthreads));
  121. }
  122. return 1;
  123. }
  124. static SQRESULT sq_blosc_compress0(HSQUIRRELVM v, int isCtx)
  125. {
  126. SQ_FUNC_VARS_NO_TOP(v);
  127. SQ_GET_INTEGER(v, 2, clevel);
  128. SQ_GET_INTEGER(v, 3, doshuffle);
  129. SQ_GET_INTEGER(v, 4, typesize);
  130. SQ_GET_STRING(v, 5, src);
  131. size_t destsize = src_size + BLOSC_MAX_OVERHEAD;
  132. SQChar *dest = sq_getscratchpad(v, destsize);
  133. int csize;
  134. if(isCtx)
  135. {
  136. SQ_GET_STRING(v, 6, compname);
  137. SQ_GET_INTEGER(v, 7, blocksize);
  138. SQ_GET_INTEGER(v, 8, nthreads);
  139. csize = blosc_compress_ctx(clevel, doshuffle, typesize,
  140. src_size, (const void *)src, (void *)dest, destsize,
  141. compname, blocksize, nthreads);
  142. }
  143. else
  144. {
  145. csize = blosc_compress(clevel, doshuffle, typesize,
  146. src_size, (const void *)src, (void *)dest, destsize);
  147. }
  148. if(csize > 0) sq_pushstring(v, dest, csize);
  149. else sq_pushinteger(v, csize);
  150. return 1;
  151. }
  152. static SQRESULT sq_blosc_compress(HSQUIRRELVM v)
  153. {
  154. return sq_blosc_compress0(v, 0);
  155. }
  156. static SQRESULT sq_blosc_compress_ctx(HSQUIRRELVM v)
  157. {
  158. return sq_blosc_compress0(v, 1);
  159. }
  160. static SQRESULT sq_blosc_decompress0(HSQUIRRELVM v, int isCtx)
  161. {
  162. SQ_FUNC_VARS_NO_TOP(v);
  163. SQ_GET_STRING(v, 2, cbuffer);
  164. size_t nbytes, cbytes, blocksize;
  165. blosc_cbuffer_sizes((const void *)cbuffer, &nbytes, &cbytes, &blocksize);
  166. SQChar *dest = sq_getscratchpad(v, nbytes);
  167. int dsize;
  168. if(isCtx)
  169. {
  170. SQ_GET_INTEGER(v, 3, nthreads);
  171. dsize = blosc_decompress_ctx((const void *)cbuffer, (void *)dest, nbytes, nthreads);
  172. }
  173. else dsize = blosc_decompress((const void *)cbuffer, (void *)dest, nbytes);
  174. if(dsize > 0) sq_pushstring(v, dest, dsize);
  175. else sq_pushinteger(v, dsize);
  176. return 1;
  177. }
  178. static SQRESULT sq_blosc_decompress(HSQUIRRELVM v)
  179. {
  180. return sq_blosc_decompress0(v, 0);
  181. }
  182. static SQRESULT sq_blosc_decompress_ctx(HSQUIRRELVM v)
  183. {
  184. return sq_blosc_decompress0(v, 1);
  185. }
  186. static SQRESULT sq_blosc_getitem(HSQUIRRELVM v)
  187. {
  188. SQ_FUNC_VARS_NO_TOP(v);
  189. SQ_GET_STRING(v, 2, cbuffer);
  190. SQ_GET_INTEGER(v, 3, start_pos)
  191. SQ_GET_INTEGER(v, 4, nitems)
  192. size_t typesize;
  193. int flags;
  194. blosc_cbuffer_metainfo((const void *)cbuffer, &typesize, &flags);
  195. SQChar *dest = sq_getscratchpad(v, nitems * typesize);
  196. int dsize = blosc_getitem((const void *)cbuffer, start_pos, nitems, (void *)dest);
  197. if(dsize > 0) sq_pushstring(v, dest, dsize);
  198. else sq_pushinteger(v, dsize);
  199. return 1;
  200. }
  201. #ifdef __cplusplus
  202. extern "C" {
  203. #endif
  204. #define INT_CONST(v,num) sq_pushstring(v,_SC(#num),-1);sq_pushinteger(v,num);sq_newslot(v,-3,SQTrue);
  205. #define STR_CONST(v,str) sq_pushstring(v,_SC(#str),-1);sq_pushstring(v,str, -1);sq_newslot(v,-3,SQTrue);
  206. SQRESULT sqext_register_sq_blosc(HSQUIRRELVM v)
  207. {
  208. sq_pushliteral(v,_SC("blosc"));
  209. sq_newtable(v);
  210. INT_CONST(v, BLOSC_MIN_HEADER_LENGTH);
  211. INT_CONST(v, BLOSC_MAX_OVERHEAD);
  212. INT_CONST(v, BLOSC_MAX_BUFFERSIZE);
  213. INT_CONST(v, BLOSC_MAX_TYPESIZE);
  214. INT_CONST(v, BLOSC_MAX_THREADS);
  215. INT_CONST(v, BLOSC_NOSHUFFLE);
  216. INT_CONST(v, BLOSC_SHUFFLE);
  217. INT_CONST(v, BLOSC_BITSHUFFLE);
  218. STR_CONST(v, BLOSC_BLOSCLZ_COMPNAME);
  219. STR_CONST(v, BLOSC_LZ4_COMPNAME);
  220. STR_CONST(v, BLOSC_LZ4HC_COMPNAME);
  221. STR_CONST(v, BLOSC_SNAPPY_COMPNAME);
  222. STR_CONST(v, BLOSC_ZLIB_COMPNAME);
  223. STR_CONST(v, BLOSC_ZSTD_COMPNAME);
  224. sq_insertfunc(v, _SC("version"), sq_blosc_version, 1, _SC("."), SQTrue);
  225. sq_insertfunc(v, _SC("init"), sq_blosc_init, 1, _SC("."), SQTrue);
  226. sq_insertfunc(v, _SC("destroy"), sq_blosc_destroy, 1, _SC("."), SQTrue);
  227. sq_insertfunc(v, _SC("free_resources"), sq_blosc_free_resources, 1, _SC("."), SQTrue);
  228. sq_insertfunc(v, _SC("list_compressors"), sq_blosc_list_compressors, 1, _SC("."), SQTrue);
  229. sq_insertfunc(v, _SC("cbuffer_sizes"), sq_blosc_cbuffer_sizes, 2, _SC(".s"), SQTrue);
  230. sq_insertfunc(v, _SC("cbuffer_metainfo"), sq_blosc_cbuffer_metainfo, 2, _SC(".s"), SQTrue);
  231. sq_insertfunc(v, _SC("cbuffer_complib"), sq_blosc_cbuffer_complib, 2, _SC(".s"), SQTrue);
  232. sq_insertfunc(v, _SC("compcode_to_compname"), sq_blosc_compcode_to_compname, 2, _SC(".i"), SQTrue);
  233. sq_insertfunc(v, _SC("compname_to_compcode"), sq_blosc_compname_to_compcode, 2, _SC(".s"), SQTrue);
  234. sq_insertfunc(v, _SC("blocksize"), sq_blosc_blocksize, -1, _SC(".i"), SQTrue);
  235. sq_insertfunc(v, _SC("compressor"), sq_blosc_compressor, -1, _SC(".s"), SQTrue);
  236. sq_insertfunc(v, _SC("nthreads"), sq_blosc_nthreads, -1, _SC(".i"), SQTrue);
  237. sq_insertfunc(v, _SC("compress"), sq_blosc_compress, 5, _SC(".iiis"), SQTrue);
  238. sq_insertfunc(v, _SC("compress_ctx"), sq_blosc_compress_ctx, 8, _SC(".iiissii"), SQTrue);
  239. sq_insertfunc(v, _SC("decompress"), sq_blosc_decompress, 2, _SC(".s"), SQTrue);
  240. sq_insertfunc(v, _SC("decompress_ctx"), sq_blosc_decompress_ctx, 3, _SC(".si"), SQTrue);
  241. sq_insertfunc(v, _SC("getitem"), sq_blosc_getitem, 4, _SC(".sii"), SQTrue);
  242. sq_newslot(v,-3,SQTrue); //push blosc table
  243. return 0;
  244. }
  245. #ifdef __cplusplus
  246. }
  247. #endif
  248. #endif // SQ_USE_CBLOSC