extlz4 0.2.5 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.ja.md +16 -1
  3. data/README.md +49 -51
  4. data/Rakefile +22 -0
  5. data/bin/extlz4 +1 -1
  6. data/contrib/lz4/LICENSE +2 -1
  7. data/contrib/lz4/Makefile.inc +111 -0
  8. data/contrib/lz4/NEWS +97 -0
  9. data/contrib/lz4/README.md +41 -36
  10. data/contrib/lz4/build/README.md +55 -0
  11. data/contrib/lz4/build/VS2010/datagen/datagen.vcxproj +169 -0
  12. data/contrib/lz4/build/VS2010/frametest/frametest.vcxproj +176 -0
  13. data/contrib/lz4/build/VS2010/fullbench/fullbench.vcxproj +176 -0
  14. data/contrib/lz4/build/VS2010/fullbench-dll/fullbench-dll.vcxproj +180 -0
  15. data/contrib/lz4/build/VS2010/fuzzer/fuzzer.vcxproj +173 -0
  16. data/contrib/lz4/build/VS2010/liblz4/liblz4.vcxproj +175 -0
  17. data/contrib/lz4/build/VS2010/liblz4-dll/liblz4-dll.rc +51 -0
  18. data/contrib/lz4/build/VS2010/liblz4-dll/liblz4-dll.vcxproj +179 -0
  19. data/contrib/lz4/build/VS2010/lz4/lz4.rc +51 -0
  20. data/contrib/lz4/build/VS2010/lz4/lz4.vcxproj +189 -0
  21. data/contrib/lz4/build/VS2010/lz4.sln +98 -0
  22. data/contrib/lz4/build/VS2017/datagen/datagen.vcxproj +173 -0
  23. data/contrib/lz4/build/VS2017/frametest/frametest.vcxproj +180 -0
  24. data/contrib/lz4/build/VS2017/fullbench/fullbench.vcxproj +180 -0
  25. data/contrib/lz4/build/VS2017/fullbench-dll/fullbench-dll.vcxproj +184 -0
  26. data/contrib/lz4/build/VS2017/fuzzer/fuzzer.vcxproj +177 -0
  27. data/contrib/lz4/build/VS2017/liblz4/liblz4.vcxproj +179 -0
  28. data/contrib/lz4/build/VS2017/liblz4-dll/liblz4-dll.rc +51 -0
  29. data/contrib/lz4/build/VS2017/liblz4-dll/liblz4-dll.vcxproj +183 -0
  30. data/contrib/lz4/build/VS2017/lz4/lz4.rc +51 -0
  31. data/contrib/lz4/build/VS2017/lz4/lz4.vcxproj +175 -0
  32. data/contrib/lz4/build/VS2017/lz4.sln +103 -0
  33. data/contrib/lz4/build/VS2022/datagen/datagen.vcxproj +173 -0
  34. data/contrib/lz4/build/VS2022/frametest/frametest.vcxproj +180 -0
  35. data/contrib/lz4/build/VS2022/fullbench/fullbench.vcxproj +180 -0
  36. data/contrib/lz4/build/VS2022/fullbench-dll/fullbench-dll.vcxproj +184 -0
  37. data/contrib/lz4/build/VS2022/fuzzer/fuzzer.vcxproj +177 -0
  38. data/contrib/lz4/build/VS2022/liblz4/liblz4.vcxproj +179 -0
  39. data/contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.rc +51 -0
  40. data/contrib/lz4/build/VS2022/liblz4-dll/liblz4-dll.vcxproj +183 -0
  41. data/contrib/lz4/build/VS2022/lz4.sln +103 -0
  42. data/contrib/lz4/build/cmake/CMakeLists.txt +273 -0
  43. data/contrib/lz4/build/cmake/lz4Config.cmake.in +2 -0
  44. data/contrib/lz4/lib/LICENSE +1 -1
  45. data/contrib/lz4/lib/README.md +111 -15
  46. data/contrib/lz4/lib/liblz4-dll.rc.in +35 -0
  47. data/contrib/lz4/lib/liblz4.pc.in +3 -3
  48. data/contrib/lz4/lib/lz4.c +1891 -733
  49. data/contrib/lz4/lib/lz4.h +597 -234
  50. data/contrib/lz4/lib/lz4file.c +311 -0
  51. data/contrib/lz4/lib/lz4file.h +93 -0
  52. data/contrib/lz4/lib/lz4frame.c +896 -493
  53. data/contrib/lz4/lib/lz4frame.h +408 -107
  54. data/contrib/lz4/lib/lz4frame_static.h +5 -112
  55. data/contrib/lz4/lib/lz4hc.c +1039 -301
  56. data/contrib/lz4/lib/lz4hc.h +264 -123
  57. data/contrib/lz4/lib/xxhash.c +376 -240
  58. data/contrib/lz4/lib/xxhash.h +128 -93
  59. data/contrib/lz4/ossfuzz/Makefile +79 -0
  60. data/contrib/lz4/ossfuzz/compress_frame_fuzzer.c +48 -0
  61. data/contrib/lz4/ossfuzz/compress_fuzzer.c +58 -0
  62. data/contrib/lz4/ossfuzz/compress_hc_fuzzer.c +64 -0
  63. data/contrib/lz4/ossfuzz/decompress_frame_fuzzer.c +75 -0
  64. data/contrib/lz4/ossfuzz/decompress_fuzzer.c +78 -0
  65. data/contrib/lz4/ossfuzz/fuzz.h +48 -0
  66. data/contrib/lz4/ossfuzz/fuzz_data_producer.c +77 -0
  67. data/contrib/lz4/ossfuzz/fuzz_data_producer.h +36 -0
  68. data/contrib/lz4/ossfuzz/fuzz_helpers.h +95 -0
  69. data/contrib/lz4/ossfuzz/lz4_helpers.c +51 -0
  70. data/contrib/lz4/ossfuzz/lz4_helpers.h +13 -0
  71. data/contrib/lz4/ossfuzz/ossfuzz.sh +23 -0
  72. data/contrib/lz4/ossfuzz/round_trip_frame_fuzzer.c +43 -0
  73. data/contrib/lz4/ossfuzz/round_trip_frame_uncompressed_fuzzer.c +134 -0
  74. data/contrib/lz4/ossfuzz/round_trip_fuzzer.c +117 -0
  75. data/contrib/lz4/ossfuzz/round_trip_hc_fuzzer.c +44 -0
  76. data/contrib/lz4/ossfuzz/round_trip_stream_fuzzer.c +302 -0
  77. data/contrib/lz4/ossfuzz/standaloneengine.c +74 -0
  78. data/contrib/lz4/ossfuzz/travisoss.sh +26 -0
  79. data/ext/blockapi.c +13 -48
  80. data/ext/extlz4.c +2 -0
  81. data/ext/extlz4.h +17 -0
  82. data/ext/frameapi.c +3 -14
  83. data/ext/hashargs.c +9 -3
  84. data/ext/hashargs.h +1 -1
  85. data/ext/lz4_amalgam.c +0 -23
  86. data/gemstub.rb +5 -16
  87. data/lib/extlz4/oldstream.rb +1 -1
  88. data/lib/extlz4.rb +51 -3
  89. data/test/common.rb +2 -2
  90. metadata +84 -16
  91. data/contrib/lz4/circle.yml +0 -38
  92. data/contrib/lz4/lib/lz4opt.h +0 -356
  93. data/lib/extlz4/version.rb +0 -3
data/ext/blockapi.c CHANGED
@@ -32,7 +32,7 @@ aux_LZ4_compress_fast_continue_nogvl(va_list *vp)
32
32
  static int
33
33
  aux_LZ4_compress_fast_continue(void *context, const char *src, char *dest, int srcsize, int destsize, int acceleration)
34
34
  {
35
- return (int)aux_thread_call_without_gvl(
35
+ return (int)(intptr_t)aux_thread_call_without_gvl(
36
36
  aux_LZ4_compress_fast_continue_nogvl, NULL,
37
37
  context, src, dest, srcsize, destsize, acceleration);
38
38
  }
@@ -54,7 +54,7 @@ static int
54
54
  aux_LZ4_compressHC_continue(void *context, const char *src, char *dest, int srcsize, int destsize, int acceleration__ignored__)
55
55
  {
56
56
  (void)acceleration__ignored__;
57
- return (int)aux_thread_call_without_gvl(
57
+ return (int)(intptr_t)aux_thread_call_without_gvl(
58
58
  aux_LZ4_compressHC_continue_nogvl, NULL,
59
59
  context, src, dest, srcsize, destsize);
60
60
  }
@@ -76,7 +76,7 @@ aux_LZ4_decompress_safe_continue_nogvl(va_list *vp)
76
76
  static int
77
77
  aux_LZ4_decompress_safe_continue(LZ4_streamDecode_t *context, const char *src, char *dest, int srcsize, int maxsize)
78
78
  {
79
- return (int)aux_thread_call_without_gvl(
79
+ return (int)(intptr_t)aux_thread_call_without_gvl(
80
80
  aux_LZ4_decompress_safe_continue_nogvl, NULL,
81
81
  context, src, dest, srcsize, maxsize);
82
82
  }
@@ -188,7 +188,7 @@ aux_shouldbe_string(VALUE obj)
188
188
  static inline size_t
189
189
  aux_lz4_compressbound(VALUE src)
190
190
  {
191
- return LZ4_compressBound(RSTRING_LEN(src));
191
+ return LZ4_compressBound(rb_long2int(RSTRING_LEN(src)));
192
192
  }
193
193
 
194
194
  enum {
@@ -441,7 +441,7 @@ blkenc_setup(int argc, VALUE argv[], struct blockencoder *p, VALUE predict)
441
441
  * NOTE: すぐ下で LZ4_saveDict() を実行するため、
442
442
  * NOTE: p->predict のバッファ領域が保持されることはない。
443
443
  */
444
- p->traits->loaddict(p->context, RSTRING_PTR(p->predict), RSTRING_LEN(p->predict));
444
+ p->traits->loaddict(p->context, RSTRING_PTR(p->predict), rb_long2int(RSTRING_LEN(p->predict)));
445
445
  }
446
446
 
447
447
  p->prefixsize = p->traits->savedict(p->context, p->prefix, sizeof(p->prefix));
@@ -451,9 +451,6 @@ blkenc_setup(int argc, VALUE argv[], struct blockencoder *p, VALUE predict)
451
451
  * call-seq:
452
452
  * initialize(level = nil, predict = nil)
453
453
  *
454
- * [INFECTION]
455
- * +self+ <- +predict+
456
- *
457
454
  * [RETURN]
458
455
  * self
459
456
  *
@@ -476,7 +473,6 @@ blkenc_init(int argc, VALUE argv[], VALUE enc)
476
473
  }
477
474
 
478
475
  blkenc_setup(argc, argv, p, Qnil);
479
- rb_obj_infect(enc, p->predict);
480
476
 
481
477
  return enc;
482
478
  }
@@ -485,9 +481,6 @@ blkenc_init(int argc, VALUE argv[], VALUE enc)
485
481
  * call-seq:
486
482
  * update(src, dest = "") -> dest
487
483
  * update(src, max_dest_size, dest = "") -> dest
488
- *
489
- * [INFECTION]
490
- * +dest+ <- +self+ <- +src+
491
484
  */
492
485
  static VALUE
493
486
  blkenc_update(int argc, VALUE argv[], VALUE enc)
@@ -496,15 +489,13 @@ blkenc_update(int argc, VALUE argv[], VALUE enc)
496
489
  VALUE src, dest;
497
490
  size_t maxsize;
498
491
  blockprocess_args(argc, argv, &src, &dest, &maxsize, NULL, aux_lz4_compressbound);
499
- rb_obj_infect(enc, src);
500
- rb_obj_infect(dest, enc);
501
492
  char *srcp;
502
493
  size_t srcsize;
503
494
  RSTRING_GETMEM(src, srcp, srcsize);
504
- int s = p->traits->update(p->context, srcp, RSTRING_PTR(dest), srcsize, maxsize, p->level);
495
+ int s = p->traits->update(p->context, srcp, RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize), p->level);
505
496
  if (s <= 0) {
506
497
  rb_raise(extlz4_eError,
507
- "destsize too small (given destsize is %zu)",
498
+ "destsize too small (given destsize is %"PRIuSIZE")",
508
499
  rb_str_capacity(dest));
509
500
  }
510
501
  p->prefixsize = p->traits->savedict(p->context, p->prefix, sizeof(p->prefix));
@@ -517,9 +508,6 @@ blkenc_update(int argc, VALUE argv[], VALUE enc)
517
508
  * reset(level = nil) -> self
518
509
  * reset(level, predict) -> self
519
510
  *
520
- * [INFECTION]
521
- * +self+ < +predict+
522
- *
523
511
  * Reset block stream encoder.
524
512
  */
525
513
  static VALUE
@@ -527,7 +515,6 @@ blkenc_reset(int argc, VALUE argv[], VALUE enc)
527
515
  {
528
516
  struct blockencoder *p = encoder_context(enc);
529
517
  blkenc_setup(argc, argv, p, p->predict);
530
- rb_obj_infect(enc, p->predict);
531
518
 
532
519
  return enc;
533
520
  }
@@ -575,7 +562,6 @@ blkenc_savedict(int argc, VALUE argv[], VALUE enc)
575
562
  memcpy(RSTRING_PTR(dict), p->prefix, p->prefixsize);
576
563
  if (p->prefixsize > 0) {
577
564
  rb_str_set_len(dict, p->prefixsize);
578
- rb_obj_infect(dict, enc);
579
565
  return dict;
580
566
  } else {
581
567
  return Qnil;
@@ -632,9 +618,6 @@ typedef int aux_lz4_encoder_f(const char *src, char *dest, int srcsize, int maxs
632
618
  *
633
619
  * 実装の都合上、圧縮関数は LZ4_compress_fast / LZ4_compress_HC が使われます。
634
620
  *
635
- * [INFECTION]
636
- * +dest+ <- +src+
637
- *
638
621
  * [RETURN]
639
622
  * 圧縮されたデータが文字列として返ります。dest を指定した場合は、圧縮データを格納した dest を返します。
640
623
  *
@@ -684,14 +667,13 @@ blkenc_s_encode(int argc, VALUE argv[], VALUE lz4)
684
667
  size_t srcsize = RSTRING_LEN(src);
685
668
  if (srcsize > LZ4_MAX_INPUT_SIZE) {
686
669
  rb_raise(extlz4_eError,
687
- "source size is too big for lz4 encode (given %zu, but max %zu bytes)",
670
+ "source size is too big for lz4 encode (given %"PRIuSIZE", but max %"PRIuSIZE" bytes)",
688
671
  srcsize, (size_t)LZ4_MAX_INPUT_SIZE);
689
672
  }
690
673
  aux_str_reserve(dest, maxsize);
691
674
  rb_str_set_len(dest, 0);
692
- rb_obj_infect(dest, src);
693
675
 
694
- int size = encoder(RSTRING_PTR(src), RSTRING_PTR(dest), srcsize, maxsize, level);
676
+ int size = encoder(RSTRING_PTR(src), RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize), level);
695
677
  if (size <= 0) {
696
678
  rb_raise(extlz4_eError,
697
679
  "failed LZ4 compress - maxsize is too small, or out of memory");
@@ -838,9 +820,6 @@ blkdec_setup(int argc, VALUE argv[], VALUE predict, struct blockdecoder *p)
838
820
  * call-seq:
839
821
  * initialize
840
822
  * initialize(preset_dictionary)
841
- *
842
- * [INFECTION]
843
- * +self+ < +preset_dictionary+
844
823
  */
845
824
  static VALUE
846
825
  blkdec_init(int argc, VALUE argv[], VALUE dec)
@@ -848,7 +827,6 @@ blkdec_init(int argc, VALUE argv[], VALUE dec)
848
827
  struct blockdecoder *p = getdecoder(dec);
849
828
 
850
829
  blkdec_setup(argc, argv, Qnil, p);
851
- rb_obj_infect(dec, p->predict);
852
830
 
853
831
  return dec;
854
832
  }
@@ -857,9 +835,6 @@ blkdec_init(int argc, VALUE argv[], VALUE dec)
857
835
  * call-seq:
858
836
  * reset
859
837
  * reset(preset_dictionary)
860
- *
861
- * [INFECTION]
862
- * +self+ < +preset_dictionary+
863
838
  */
864
839
  static VALUE
865
840
  blkdec_reset(int argc, VALUE argv[], VALUE dec)
@@ -867,7 +842,6 @@ blkdec_reset(int argc, VALUE argv[], VALUE dec)
867
842
  struct blockdecoder *p = getdecoder(dec);
868
843
 
869
844
  blkdec_setup(argc, argv, p->predict, p);
870
- rb_obj_infect(dec, p->predict);
871
845
 
872
846
  return dec;
873
847
  }
@@ -884,9 +858,6 @@ blkdec_reset(int argc, VALUE argv[], VALUE dec)
884
858
  *
885
859
  * 出力先は、max_dest_size が与えられていない場合、必要に応じて自動的に拡張されます。
886
860
  * この場合、いったん圧縮された LZ4 データを走査するため、事前に僅かな CPU 時間を必要とします。
887
- *
888
- * [INFECTION]
889
- * +dest+ < +self+ < +src+
890
861
  */
891
862
  static VALUE
892
863
  blkdec_update(int argc, VALUE argv[], VALUE dec)
@@ -896,13 +867,11 @@ blkdec_update(int argc, VALUE argv[], VALUE dec)
896
867
  VALUE src, dest;
897
868
  size_t maxsize;
898
869
  blockprocess_args(argc, argv, &src, &dest, &maxsize, NULL, aux_lz4_scansize);
899
- rb_obj_infect(dec, src);
900
- rb_obj_infect(dest, dec);
901
870
  const char *srcp;
902
871
  size_t srcsize;
903
872
  RSTRING_GETMEM(src, srcp, srcsize);
904
- LZ4_setStreamDecode(p->context, p->dictbuf, p->dictsize);
905
- int s = aux_LZ4_decompress_safe_continue(p->context, srcp, RSTRING_PTR(dest), srcsize, maxsize);
873
+ LZ4_setStreamDecode(p->context, p->dictbuf, aux_size2int(p->dictsize));
874
+ int s = aux_LZ4_decompress_safe_continue(p->context, srcp, RSTRING_PTR(dest), aux_size2int(srcsize), aux_size2int(maxsize));
906
875
  if (s < 0) {
907
876
  rb_raise(extlz4_eError,
908
877
  "`max_dest_size' too small, or corrupt lz4'd data");
@@ -910,7 +879,7 @@ blkdec_update(int argc, VALUE argv[], VALUE dec)
910
879
  rb_str_set_len(dest, s);
911
880
 
912
881
  /* copy prefix */
913
- if (s < sizeof(p->dictbuf)) {
882
+ if ((size_t)s < sizeof(p->dictbuf)) {
914
883
  ssize_t discard = (p->dictsize + s) - sizeof(p->dictbuf);
915
884
  if (discard > 0) {
916
885
  size_t remain = p->dictsize - discard;
@@ -987,9 +956,6 @@ blkdec_s_linksize(VALUE mod, VALUE str)
987
956
  *
988
957
  * 出力先は、max_dest_size が与えられていない場合、必要に応じて自動的に拡張されます。
989
958
  * この場合、いったん圧縮された LZ4 データを走査するため、事前に僅かな CPU 時間を必要とします。
990
- *
991
- * [INFECTION]
992
- * +dest+ < +src+
993
959
  */
994
960
  static VALUE
995
961
  blkdec_s_decode(int argc, VALUE argv[], VALUE lz4)
@@ -1000,9 +966,8 @@ blkdec_s_decode(int argc, VALUE argv[], VALUE lz4)
1000
966
 
1001
967
  aux_str_reserve(dest, maxsize);
1002
968
  rb_str_set_len(dest, 0);
1003
- rb_obj_infect(dest, src);
1004
969
 
1005
- int size = LZ4_decompress_safe(RSTRING_PTR(src), RSTRING_PTR(dest), RSTRING_LEN(src), maxsize);
970
+ int size = LZ4_decompress_safe(RSTRING_PTR(src), RSTRING_PTR(dest), rb_long2int(RSTRING_LEN(src)), aux_size2int(maxsize));
1006
971
  if (size < 0) {
1007
972
  rb_raise(extlz4_eError,
1008
973
  "failed LZ4_decompress_safe - max_dest_size is too small, or data is corrupted");
data/ext/extlz4.c CHANGED
@@ -40,6 +40,8 @@ VALUE extlz4_mLZ4;
40
40
  RBEXT_API void
41
41
  Init_extlz4(void)
42
42
  {
43
+ RB_EXT_RACTOR_SAFE(true);
44
+
43
45
  extlz4_mLZ4 = rb_define_module("LZ4");
44
46
 
45
47
  /*
data/ext/extlz4.h CHANGED
@@ -6,6 +6,7 @@
6
6
  #include <stdarg.h>
7
7
  #include <stdlib.h>
8
8
  #include <errno.h>
9
+ #include <stdbool.h>
9
10
 
10
11
  #ifndef RB_OBJ_FROZEN
11
12
  # define RB_OBJ_FROZEN OBJ_FROZEN
@@ -17,6 +18,10 @@ extern VALUE extlz4_eError; /* class LZ4::Error < ::RuntimeError */
17
18
  extern void extlz4_init_blockapi(void);
18
19
  extern void extlz4_init_frameapi(void);
19
20
 
21
+ #ifndef RB_EXT_RACTOR_SAFE
22
+ # define RB_EXT_RACTOR_SAFE(FEATURE) ((void)(FEATURE))
23
+ #endif
24
+
20
25
  #define AUX_FUNCALL(RECV, METHOD, ...) \
21
26
  ({ \
22
27
  VALUE args__[] = { __VA_ARGS__ }; \
@@ -106,4 +111,16 @@ getref(VALUE obj, const rb_data_type_t *type)
106
111
  return checkref(obj, getrefp(obj, type));
107
112
  }
108
113
 
114
+ static inline int
115
+ aux_size2int(size_t n)
116
+ {
117
+ int m = (int)n;
118
+
119
+ if (m < 0 || (size_t)m != n) {
120
+ rb_raise(rb_eRangeError, "out of range integer conversion (size_t to int)");
121
+ }
122
+
123
+ return m;
124
+ }
125
+
109
126
  #endif /* !EXTLZ4_H */
data/ext/frameapi.c CHANGED
@@ -210,7 +210,6 @@ fenc_init(int argc, VALUE argv[], VALUE enc)
210
210
  rb_str_set_len(p->workbuf, s);
211
211
  rb_funcall2(outport, id_op_lshift, 1, &p->workbuf);
212
212
  p->outport = outport;
213
- rb_obj_infect(p->outport, enc);
214
213
  return enc;
215
214
  }
216
215
 
@@ -244,9 +243,6 @@ fenc_write(int argc, VALUE argv[], VALUE enc)
244
243
  struct encoder *p = getencoder(enc);
245
244
  VALUE src;
246
245
  rb_scan_args(argc, argv, "1", &src);
247
- rb_obj_infect(enc, src);
248
- rb_obj_infect(enc, p->workbuf);
249
- rb_obj_infect(p->outport, enc);
250
246
  fenc_update(p, src, NULL);
251
247
  return enc;
252
248
  }
@@ -255,9 +251,6 @@ static VALUE
255
251
  fenc_push(VALUE enc, VALUE src)
256
252
  {
257
253
  struct encoder *p = getencoder(enc);
258
- rb_obj_infect(enc, src);
259
- rb_obj_infect(enc, p->workbuf);
260
- rb_obj_infect(p->outport, enc);
261
254
  fenc_update(p, src, NULL);
262
255
  return enc;
263
256
  }
@@ -430,7 +423,7 @@ aux_read(VALUE obj, size_t size, VALUE buf)
430
423
  if (NIL_P(AUX_FUNCALL(obj, id_read, SIZET2NUM(size), buf))) {
431
424
  return Qnil;
432
425
  } else {
433
- if (RSTRING_LEN(buf) > size) {
426
+ if ((size_t)RSTRING_LEN(buf) > size) {
434
427
  rb_raise(rb_eRuntimeError, "most read (%d, but expected to %d)", (int)RSTRING_LEN(buf), (int)size);
435
428
  }
436
429
  return buf;
@@ -455,7 +448,6 @@ fdec_init(int argc, VALUE argv[], VALUE dec)
455
448
  rb_scan_args(argc, argv, "1", &inport);
456
449
  LZ4F_errorCode_t err = LZ4F_createDecompressionContext(&p->decoder, LZ4F_VERSION);
457
450
  aux_lz4f_check_error(err);
458
- rb_obj_infect(dec, inport);
459
451
  p->inport = inport;
460
452
  p->readbuf = rb_str_buf_new(0);
461
453
  char *readp;
@@ -519,7 +511,7 @@ fdec_read_fetch(VALUE dec, struct decoder *p)
519
511
  rb_str_set_len(p->inbuf, 0);
520
512
  }
521
513
 
522
- while (RSTRING_LEN(p->inbuf) < p->status) {
514
+ while ((size_t)RSTRING_LEN(p->inbuf) < p->status) {
523
515
  p->readbuf = aux_read(p->inport, p->status - RSTRING_LEN(p->inbuf), p->readbuf);
524
516
  if (NIL_P(p->readbuf)) {
525
517
  rb_raise(rb_eRuntimeError,
@@ -555,7 +547,7 @@ fdec_read_decode(VALUE dec, struct decoder *p, char *dest, size_t size)
555
547
  break;
556
548
  }
557
549
 
558
- if (p->status > 0 && p->outoff >= RSTRING_LEN(p->outbuf)) {
550
+ if (p->status > 0 && p->outoff >= (size_t)RSTRING_LEN(p->outbuf)) {
559
551
  fdec_read_fetch(dec, p);
560
552
  }
561
553
 
@@ -591,7 +583,6 @@ fdec_read(int argc, VALUE argv[], VALUE dec)
591
583
  VALUE dest;
592
584
  fdec_read_args(argc, argv, &size, &dest);
593
585
  if (size == 0) {
594
- rb_obj_infect(dest, dec);
595
586
  return dest;
596
587
  }
597
588
 
@@ -616,7 +607,6 @@ fdec_read(int argc, VALUE argv[], VALUE dec)
616
607
  rb_str_resize(tmpbuf, 0);
617
608
  }
618
609
 
619
- rb_obj_infect(dest, dec);
620
610
 
621
611
  if (RSTRING_LEN(dest) > 0) {
622
612
  return dest;
@@ -644,7 +634,6 @@ fdec_getc(VALUE dec)
644
634
  size_t s = fdec_read_decode(dec, p, &ch, 1);
645
635
  if (s > 0) {
646
636
  VALUE v = rb_str_new(&ch, 1);
647
- rb_obj_infect(v, dec);
648
637
  return v;
649
638
  } else {
650
639
  return Qnil;
data/ext/hashargs.c CHANGED
@@ -6,11 +6,17 @@
6
6
  * To the extent possible under law, dearblue has waived all copyright
7
7
  * and related or neighboring rights to this work.
8
8
  *
9
- * dearblue <dearblue@users.noreply.github.com>
9
+ * dearblue <dearblue@users.osdn.me>
10
10
  */
11
11
 
12
12
  #include "hashargs.h"
13
13
 
14
+ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L
15
+ # define aux_noreturn _Noreturn
16
+ #else
17
+ # define aux_noreturn
18
+ #endif
19
+
14
20
  struct rbx_scanhash_args
15
21
  {
16
22
  struct rbx_scanhash_arg *args;
@@ -18,7 +24,7 @@ struct rbx_scanhash_args
18
24
  VALUE rest;
19
25
  };
20
26
 
21
- static void
27
+ aux_noreturn static void
22
28
  rbx_scanhash_error(ID given, struct rbx_scanhash_arg *args, const struct rbx_scanhash_arg *end)
23
29
  {
24
30
  // 引数の数が㌧でもない数の場合、よくないことが起きそう。
@@ -142,7 +148,7 @@ rbx_scanhash(VALUE hash, VALUE rest, struct rbx_scanhash_arg *args, struct rbx_s
142
148
  hash = rbx_scanhash_to_hash(hash);
143
149
  if (!NIL_P(hash) && !RHASH_EMPTY_P(hash)) {
144
150
  struct rbx_scanhash_args argset = { args, end, rest };
145
- rb_hash_foreach(hash, rbx_scanhash_foreach, (VALUE)&argset);
151
+ rb_hash_foreach(hash, (int (*)(VALUE, VALUE, VALUE))rbx_scanhash_foreach, (VALUE)&argset);
146
152
  }
147
153
 
148
154
  rbx_scanhash_check_missingkeys(args, end);
data/ext/hashargs.h CHANGED
@@ -6,7 +6,7 @@
6
6
  * To the extent possible under law, dearblue has waived all copyright
7
7
  * and related or neighboring rights to this work.
8
8
  *
9
- * dearblue <dearblue@users.noreply.github.com>
9
+ * dearblue <dearblue@users.osdn.me>
10
10
  */
11
11
 
12
12
  #ifndef RBX_HASHARGS_H
data/ext/lz4_amalgam.c CHANGED
@@ -3,29 +3,6 @@
3
3
  #endif
4
4
 
5
5
  #include "../contrib/lz4/lib/lz4.c"
6
-
7
- #define LZ4_isLittleEndian amalg_LZ4_isLittleEndian
8
- #define LZ4_read16 amalg_LZ4_read16
9
- #define LZ4_read32 amalg_LZ4_read32
10
- #define LZ4_read_ARCH amalg_LZ4_read_ARCH
11
- #define LZ4_write16 amalg_LZ4_write16
12
- #define LZ4_write32 amalg_LZ4_write32
13
- #define LZ4_readLE16 amalg_LZ4_readLE16
14
- #define LZ4_writeLE16 amalg_LZ4_writeLE16
15
- #define LZ4_copy8 amalg_LZ4_copy8
16
- #define LZ4_wildCopy amalg_LZ4_wildCopy
17
- #define LZ4_minLength amalg_LZ4_minLength
18
- #define LZ4_NbCommonBytes amalg_LZ4_NbCommonBytes
19
- #define LZ4_count amalg_LZ4_count
20
- #define limitedOutput amalg_limitedOutput
21
- #define limitedOutput_directive amalg_limitedOutput_directive
22
- #define unalign amalg_unalign
23
6
  #include "../contrib/lz4/lib/lz4hc.c"
24
-
25
- #undef ALLOCATOR
26
- #undef KB
27
- #undef MB
28
- #undef GB
29
7
  #include "../contrib/lz4/lib/lz4frame.c"
30
-
31
8
  #include "../contrib/lz4/lib/xxhash.c"
data/gemstub.rb CHANGED
@@ -1,19 +1,7 @@
1
- unless File.read("README.md", 4096) =~ /^\s*\*\s*version:{1,2}\s*(.+)/i
1
+ unless ver = File.read("README.md").scan(/^\s*[\*\-]\s*version:{1,2}\s*(.+)/i).flatten[-1]
2
2
  raise "バージョン情報が README.md に見つかりません"
3
3
  end
4
4
 
5
- ver = $1
6
- verfile = "lib/extlz4/version.rb"
7
- LIB << verfile
8
-
9
- file verfile => "README.md" do |*args|
10
- File.binwrite args[0].name, <<-VERSION_FILE
11
- module LZ4
12
- VERSION = "#{ver}"
13
- end
14
- VERSION_FILE
15
- end
16
-
17
5
 
18
6
  unmatch = %r(\bcontrib/lz4/(?:Makefile|appveyor\.yml|contrib|doc|examples|lib/Makefile|lib/dll|programs|tests|visual)(?:$|/))
19
7
 
@@ -29,12 +17,13 @@ GEMSTUB = Gem::Specification.new do |s|
29
17
  s.version = ver
30
18
  s.summary = "ruby bindings for LZ4"
31
19
  s.description = <<EOS
32
- ruby bindings for LZ4 <https://github.com/lz4/lz4>.
20
+ unofficial ruby bindings for LZ4 <https://github.com/lz4/lz4>.
33
21
  EOS
34
22
  s.homepage = "https://github.com/dearblue/ruby-extlz4"
35
23
  s.license = "BSD-2-Clause"
36
24
  s.author = "dearblue"
37
- s.email = "dearblue@users.noreply.github.com"
25
+ s.email = "dearblue@users.osdn.me"
38
26
 
39
- s.add_development_dependency "rake"
27
+ s.add_development_dependency "rake", "~> 0"
28
+ s.add_development_dependency "test-unit", "~> 3.3"
40
29
  end
@@ -5,7 +5,7 @@
5
5
  # To the extent possible under law, dearblue has waived all copyright
6
6
  # and related or neighboring rights to this work.
7
7
  #
8
- # dearblue <dearblue@users.noreply.github.com>
8
+ # dearblue <dearblue@users.osdn.me>
9
9
  #
10
10
 
11
11
  require_relative "../extlz4"
data/lib/extlz4.rb CHANGED
@@ -4,9 +4,11 @@ require "stringio"
4
4
 
5
5
  ver = RUBY_VERSION[/\d+\.\d+/]
6
6
  soname = File.basename(__FILE__, ".rb") << ".so"
7
- require_relative File.join(ver, soname)
8
-
9
- require_relative "extlz4/version"
7
+ begin
8
+ require_relative File.join(ver, soname)
9
+ rescue LoadError
10
+ require File.join(ver, soname)
11
+ end
10
12
 
11
13
  #
12
14
  # LZ4 data and streaming data processor.
@@ -322,6 +324,52 @@ module LZ4
322
324
  alias block_stream_decompress block_stream_decode
323
325
  alias block_stream_uncompress block_stream_decode
324
326
  end
327
+
328
+ refine String do
329
+ #
330
+ # call-seq:
331
+ # to_lz4frame(level = 1, opts = {}) -> lz4 frame'd data
332
+ #
333
+ def to_lz4frame(*args)
334
+ LZ4.encode self, *args
335
+ end
336
+
337
+ #
338
+ # call-seq:
339
+ # unlz4frame -> decoded data
340
+ #
341
+ def unlz4frame(*args, &block)
342
+ LZ4.decode self, *args, &block
343
+ end
344
+
345
+ def to_lz4block(*args)
346
+ LZ4.block_encode(self, *args)
347
+ end
348
+
349
+ def unlz4block(*args)
350
+ LZ4.block_decode(self, *args)
351
+ end
352
+ end
353
+
354
+ refine Object do
355
+ #
356
+ # call-seq:
357
+ # to_lz4frame(level = 1, opts = {}) -> stream encoder
358
+ # to_lz4frame(level = 1, opts = {}) { |stream_encoder| ... } -> yield_status
359
+ #
360
+ def to_lz4frame(*args, &block)
361
+ LZ4.encode self, *args, &block
362
+ end
363
+
364
+ #
365
+ # call-seq:
366
+ # -> decoder
367
+ # { |decoder| ... } -> yield_status
368
+ #
369
+ def unlz4frame(*args, &block)
370
+ LZ4.decode self, *args, &block
371
+ end
372
+ end
325
373
  end
326
374
 
327
375
  require_relative "extlz4/compat"
data/test/common.rb CHANGED
@@ -14,5 +14,5 @@ SAMPLES = {
14
14
  "random (big size)" => OpenSSL::Random.random_bytes(BIGSIZE),
15
15
  }
16
16
 
17
- SAMPLES["freebsd ports index"] = File.read("/usr/ports/INDEX-10", mode: "rb") rescue nil # if on FreeBSD
18
- SAMPLES["freebsd kernel"] = File.read("/boot/kernel/kernel", mode: "rb") rescue nil # if on FreeBSD
17
+ (SAMPLES["freebsd ports index"] = File.read("/usr/ports/INDEX-12", mode: "rb")) rescue nil # if on FreeBSD
18
+ (SAMPLES["freebsd kernel"] = File.read("/boot/kernel/kernel", mode: "rb")) rescue nil # if on FreeBSD