rbzip2 0.2.0 → 0.3.0

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 (47) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -1
  3. data/README.md +73 -37
  4. data/Rakefile +2 -0
  5. data/lib/core_ext/io.rb +12 -0
  6. data/lib/rbzip2.rb +13 -9
  7. data/lib/rbzip2/adapter.rb +17 -0
  8. data/lib/rbzip2/ffi.rb +33 -0
  9. data/lib/rbzip2/ffi/compressor.rb +85 -0
  10. data/lib/rbzip2/ffi/constants.rb +30 -0
  11. data/lib/rbzip2/ffi/decompressor.rb +163 -0
  12. data/lib/rbzip2/ffi/errors.rb +14 -0
  13. data/lib/rbzip2/io.rb +19 -5
  14. data/lib/rbzip2/java.rb +23 -0
  15. data/lib/rbzip2/java/compressor.rb +38 -0
  16. data/lib/rbzip2/java/decompressor.rb +65 -0
  17. data/lib/rbzip2/ruby.rb +18 -0
  18. data/lib/rbzip2/{compressor.rb → ruby/compressor.rb} +141 -191
  19. data/lib/rbzip2/{constants.rb → ruby/constants.rb} +2 -2
  20. data/lib/rbzip2/ruby/crc.rb +70 -0
  21. data/lib/rbzip2/{decompressor.rb → ruby/decompressor.rb} +107 -127
  22. data/lib/rbzip2/{input_data.rb → ruby/input_data.rb} +8 -18
  23. data/lib/rbzip2/{output_data.rb → ruby/output_data.rb} +6 -9
  24. data/lib/rbzip2/version.rb +2 -2
  25. data/spec/common/compressor_spec.rb +68 -0
  26. data/spec/common/decompressor_spec.rb +63 -0
  27. data/spec/ffi/compressor_spec.rb +12 -0
  28. data/spec/ffi/decompressor_spec.rb +12 -0
  29. data/spec/java/compressor_spec.rb +12 -0
  30. data/spec/java/decompressor_spec.rb +12 -0
  31. data/spec/ruby/compressor_spec.rb +12 -0
  32. data/spec/ruby/decompressor_spec.rb +12 -0
  33. metadata +56 -149
  34. data/.gemtest +0 -0
  35. data/.gitignore +0 -3
  36. data/.travis.yml +0 -9
  37. data/Gemfile +0 -3
  38. data/Gemfile.lock +0 -28
  39. data/lib/rbzip2/crc.rb +0 -105
  40. data/rbzip2.gemspec +0 -27
  41. data/spec/compressor_spec.rb +0 -42
  42. data/spec/decompressor_spec.rb +0 -41
  43. data/spec/fixtures/big_test.bz2 +0 -0
  44. data/spec/fixtures/big_test.txt +0 -2018
  45. data/spec/fixtures/test.bz2 +0 -0
  46. data/spec/fixtures/test.txt +0 -11
  47. data/spec/helper.rb +0 -12
@@ -0,0 +1,14 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2013, Brian Lopez
5
+ # Copyright (c) 2013, Sebastian Staudt
6
+
7
+ module RBzip2::FFI
8
+
9
+ class Error < StandardError; end
10
+ class BufferError < Error; end
11
+ class ConfigError < Error; end
12
+ class CorruptError < Error; end
13
+
14
+ end
@@ -1,16 +1,14 @@
1
1
  # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2011, Sebastian Staudt
5
-
6
- require 'rbzip2/decompressor'
4
+ # Copyright (c) 2011-2017, Sebastian Staudt
7
5
 
8
6
  class RBzip2::IO
9
7
 
10
8
  def initialize(io)
11
9
  @io = io
12
- @compressor = Compressor.new io
13
- @decompressor = Decompressor.new io
10
+ @compressor = RBzip2.default_adapter::Compressor.new io
11
+ @decompressor = RBzip2.default_adapter::Decompressor.new io
14
12
  end
15
13
 
16
14
  def close
@@ -18,6 +16,22 @@ class RBzip2::IO
18
16
  @decompressor.close
19
17
  end
20
18
 
19
+ def getc
20
+ @decompressor.getc
21
+ end
22
+
23
+ def gets
24
+ @decompressor.gets
25
+ end
26
+
27
+ def putc(int)
28
+ @compressor.putc int
29
+ end
30
+
31
+ def puts(line)
32
+ @compressor.puts line
33
+ end
34
+
21
35
  def read
22
36
  @decompressor.read
23
37
  end
@@ -0,0 +1,23 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2013, Sebastian Staudt
5
+
6
+ module RBzip2::Java
7
+
8
+ def self.init
9
+ begin
10
+ require 'java'
11
+ include_package 'org.apache.commons.compress.compressors.bzip2'
12
+ BZip2CompressorOutputStream
13
+ rescue LoadError, NameError
14
+ @@available = false
15
+ end
16
+ end
17
+
18
+ extend RBzip2::Adapter
19
+
20
+ autoload :Compressor, 'rbzip2/java/compressor'
21
+ autoload :Decompressor, 'rbzip2/java/decompressor'
22
+
23
+ end
@@ -0,0 +1,38 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2013-2017, Sebastian Staudt
5
+
6
+ class RBzip2::Java::Compressor
7
+
8
+ def initialize(io)
9
+ @io = RBzip2::Java::BZip2CompressorOutputStream.new io.to_outputstream
10
+ end
11
+
12
+ def flush
13
+ @io.flush
14
+ end
15
+
16
+ def close
17
+ @io.close
18
+ end
19
+
20
+ def putc(int)
21
+ if int.is_a? Numeric
22
+ write int & 0xff
23
+ else
24
+ write int.to_s[0]
25
+ end
26
+ end
27
+
28
+ def puts(line)
29
+ write line + $/
30
+ end
31
+
32
+ def write(bytes)
33
+ raise 'stream closed' if @io.nil?
34
+
35
+ @io.write bytes.to_java_bytes
36
+ end
37
+
38
+ end
@@ -0,0 +1,65 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2013-2017, Sebastian Staudt
5
+
6
+ class RBzip2::Java::Decompressor
7
+
8
+ def initialize(io)
9
+ @io = io
10
+ @is = RBzip2::Java::BZip2CompressorInputStream.new io.to_inputstream
11
+ end
12
+
13
+ def close
14
+ @is.close
15
+ end
16
+
17
+ def getc
18
+ read(1)[0].chr
19
+ end
20
+
21
+ def gets
22
+ line = ''
23
+ loop do
24
+ char = getc
25
+ line += char
26
+ break if char == "\n"
27
+ end
28
+ line
29
+ end
30
+
31
+ def read(length = nil)
32
+ if length.nil?
33
+ bytes = Java::byte[0].new
34
+ chunk = Java::byte[1024].new
35
+ begin
36
+ bytes_read = @is.read chunk
37
+ chunk = chunk[0..(bytes_read - 1)] if bytes_read < 1024
38
+ bytes += chunk
39
+ end while bytes_read == 1024
40
+ else
41
+ bytes = Java::byte[length].new
42
+ @is.read bytes
43
+ end
44
+
45
+ String.from_java_bytes bytes
46
+ end
47
+
48
+ def size
49
+ if @io.is_a? StringIO
50
+ @io.size
51
+ elsif @io.is_a? File
52
+ @io.stat.size
53
+ end
54
+ end
55
+
56
+ def uncompressed
57
+ @data = read
58
+ @data.size
59
+ end
60
+
61
+ def inspect
62
+ "#<#{self.class}: @io=#{@io.inspect} size=#{size} uncompressed=#{uncompressed}>"
63
+ end
64
+
65
+ end
@@ -0,0 +1,18 @@
1
+ # This code is free software; you can redistribute it and/or modify it under
2
+ # the terms of the new BSD License.
3
+ #
4
+ # Copyright (c) 2013, Sebastian Staudt
5
+
6
+ module RBzip2::Ruby
7
+
8
+ extend RBzip2::Adapter
9
+
10
+ autoload :CRC, 'rbzip2/ruby/crc'
11
+ autoload :Compressor, 'rbzip2/ruby/compressor'
12
+ autoload :Constants, 'rbzip2/ruby/constants'
13
+ autoload :Decompressor, 'rbzip2/ruby/decompressor'
14
+ autoload :IO, 'rbzip2/ruby/io'
15
+ autoload :InputData, 'rbzip2/ruby/input_data'
16
+ autoload :OutputData, 'rbzip2/ruby/output_data'
17
+
18
+ end
@@ -1,11 +1,11 @@
1
- # This code is free software you can redistribute it and/or modify it under
1
+ # This code is free software; you can redistribute it and/or modify it under
2
2
  # the terms of the new BSD License.
3
3
  #
4
- # Copyright (c) 2011, Sebastian Staudt
4
+ # Copyright (c) 2011-2017, Sebastian Staudt
5
5
 
6
- class RBzip2::Compressor
6
+ class RBzip2::Ruby::Compressor
7
7
 
8
- include RBzip2::Constants
8
+ include RBzip2::Ruby::Constants
9
9
 
10
10
  def self.assign_codes(code, length, min_len, max_len, alpha_size)
11
11
  vec = 0
@@ -63,11 +63,10 @@ class RBzip2::Compressor
63
63
  heap[1] = heap[n_heap]
64
64
  n_heap -= 1
65
65
 
66
- yy = 0
67
66
  zz = 1
68
67
  tmp = heap[1]
69
68
 
70
- loop do
69
+ while true do
71
70
  yy = zz << 1
72
71
 
73
72
  break if yy > n_heap
@@ -86,11 +85,10 @@ class RBzip2::Compressor
86
85
  heap[1] = heap[n_heap]
87
86
  n_heap -= 1
88
87
 
89
- yy = 0
90
88
  zz = 1
91
89
  tmp = heap[1]
92
90
 
93
- loop do
91
+ while true do
94
92
  yy = zz << 1
95
93
 
96
94
  break if yy > n_heap
@@ -119,7 +117,6 @@ class RBzip2::Compressor
119
117
  n_heap += 1
120
118
  heap[n_heap] = n_nodes
121
119
 
122
- tmp = 0
123
120
  zz = n_heap
124
121
  tmp = heap[zz]
125
122
  weight_tmp = weight[tmp]
@@ -160,9 +157,7 @@ class RBzip2::Compressor
160
157
  def self.vswap(fmap, p1, p2, n)
161
158
  n += p1
162
159
  while p1 < n
163
- t = fmap[p1]
164
- fmap[p1] = fmap[p2]
165
- fmap[p2] = t
160
+ fmap[p1], fmap[p2] = fmap[p2], fmap[p1]
166
161
  p1 += 1
167
162
  p2 += 1
168
163
  end
@@ -175,7 +170,7 @@ class RBzip2::Compressor
175
170
  @block_size = block_size
176
171
  @buff = 0
177
172
  @combined_crc = 0
178
- @crc = RBzip2::CRC.new
173
+ @crc = RBzip2::Ruby::CRC.new
179
174
  @current_char = -1
180
175
  @io = io
181
176
  @last = 0
@@ -309,15 +304,13 @@ class RBzip2::Compressor
309
304
  z_pend = 0
310
305
 
311
306
  0.upto(last_shadow) do |i|
312
- ll_i = unseq_to_seq[block[fmap[i]] & 0xff]
307
+ ll_i = unseq_to_seq[block[fmap[i]]]
313
308
  tmp = yy[0]
314
309
  j = 0
315
310
 
316
311
  while ll_i != tmp
317
312
  j += 1
318
- tmp2 = tmp
319
- tmp = yy[j]
320
- yy[j] = tmp2
313
+ tmp, yy[j] = yy[j], tmp
321
314
  end
322
315
  yy[0] = tmp
323
316
 
@@ -326,7 +319,7 @@ class RBzip2::Compressor
326
319
  else
327
320
  if z_pend > 0
328
321
  z_pend -= 1
329
- loop do
322
+ while true do
330
323
  if (z_pend & 1) == 0
331
324
  sfmap[wr] = RUNA
332
325
  mtf_freq[RUNA] += 1
@@ -350,7 +343,7 @@ class RBzip2::Compressor
350
343
 
351
344
  if z_pend > 0
352
345
  z_pend -= 1
353
- loop do
346
+ while true do
354
347
  if (z_pend & 1) == 0
355
348
  sfmap[wr] = RUNA
356
349
  mtf_freq[RUNA] += 1
@@ -375,7 +368,7 @@ class RBzip2::Compressor
375
368
  put_byte 0x42
376
369
  put_byte 0x5a
377
370
 
378
- @data = RBzip2::OutputData.new @block_size
371
+ @data = RBzip2::Ruby::OutputData.new @block_size
379
372
 
380
373
  put_byte 0x68
381
374
  put_byte 0x30 + @block_size
@@ -403,42 +396,37 @@ class RBzip2::Compressor
403
396
  block = data_shadow.block
404
397
  fmap = data_shadow.fmap
405
398
  quadrant = data_shadow.quadrant
406
- last_shadow = @last
407
- work_limit_shadow = @work_limit
408
- first_attempt_shadow = @first_attempt
409
399
 
410
400
  65537.times { |i| ftab[i] = 0 }
411
401
 
412
402
  NUM_OVERSHOOT_BYTES.times do |i|
413
- block[last_shadow + i + 2] = block[(i % (last_shadow + 1)) + 1]
403
+ block[@last + i + 2] = block[(i % (@last + 1)) + 1]
414
404
  end
415
- (last_shadow + NUM_OVERSHOOT_BYTES).times do |i|
405
+ (@last + NUM_OVERSHOOT_BYTES).times do |i|
416
406
  quadrant[i] = 0
417
407
  end
418
- block[0] = block[last_shadow + 1]
408
+ block[0] = block[@last + 1]
419
409
 
420
- c1 = block[0] & 0xff
421
- (last_shadow + 1).times do |i|
422
- c2 = block[i + 1] & 0xff
410
+ c1 = block[0]
411
+ (@last + 1).times do |i|
412
+ c2 = block[i + 1]
423
413
  ftab[(c1 << 8) + c2] += 1
424
414
  c1 = c2
425
415
  end
426
416
 
427
417
  1.upto(65536) { |i| ftab[i] += ftab[i - 1] }
428
418
 
429
- c1 = block[1] & 0xff
430
- last_shadow.times do |i|
431
- c2 = block[i + 2] & 0xff
419
+ c1 = block[1]
420
+ @last.times do |i|
421
+ c2 = block[i + 2]
432
422
  fmap[ftab[(c1 << 8) + c2] -= 1] = i
433
423
  c1 = c2
434
424
  end
435
425
 
436
- fmap[ftab[((block[last_shadow + 1] & 0xff) << 8) + (block[1] & 0xff)] -= 1] = last_shadow
426
+ fmap[ftab[((block[@last + 1]) << 8) + block[1]] -= 1] = @last
437
427
 
438
- 256.times do |i|
439
- big_done[i] = false
440
- running_order[i] = i
441
- end
428
+ big_done.replace Array.new(256, false)
429
+ 256.times { |i| running_order[i] = i }
442
430
 
443
431
  h = 364
444
432
  while h != 1
@@ -472,7 +460,7 @@ class RBzip2::Compressor
472
460
  hi = (ftab[sb + 1] & CLEARMASK) - 1
473
461
  if hi > lo
474
462
  main_qsort3 data_shadow, lo, hi, 2
475
- return if first_attempt_shadow && (@work_done > work_limit_shadow)
463
+ return if @first_attempt && (@work_done > @work_limit)
476
464
  end
477
465
  ftab[sb] = ftab_sb | SETMASK
478
466
  end
@@ -483,9 +471,9 @@ class RBzip2::Compressor
483
471
  hj = ftab[(ss + 1) << 8] & CLEARMASK
484
472
  (ftab[ss << 8] & CLEARMASK).upto(hj - 1) do |j|
485
473
  fmap_j = fmap[j]
486
- c1 = block[fmap_j] & 0xff
487
- if !big_done[c1]
488
- fmap[copy[c1]] = (fmap_j == 0) ? last_shadow : (fmap_j - 1)
474
+ c1 = block[fmap_j]
475
+ unless big_done[c1]
476
+ fmap[copy[c1]] = (fmap_j == 0) ? @last : (fmap_j - 1)
489
477
  copy[c1] += 1
490
478
  end
491
479
  end
@@ -508,7 +496,7 @@ class RBzip2::Compressor
508
496
  q_val = j >> shifts
509
497
  quadrant[a2update] = q_val
510
498
  if a2update < NUM_OVERSHOOT_BYTES
511
- quadrant[a2update + last_shadow + 1] = q_val
499
+ quadrant[a2update + @last + 1] = q_val
512
500
  end
513
501
  end
514
502
  end
@@ -536,7 +524,7 @@ class RBzip2::Compressor
536
524
  return if main_simple_sort data_shadow, lo, hi, d
537
525
  else
538
526
  d1 = d + 1
539
- med = self.class.med3(block[fmap[lo] + d1], block[fmap[hi] + d1], block[fmap[(lo + hi) >> 1] + d1]) & 0xff
527
+ med = self.class.med3 block[fmap[lo] + d1], block[fmap[hi] + d1], block[fmap[(lo + hi) >> 1] + d1]
540
528
 
541
529
  un_lo = lo
542
530
  un_hi = hi
@@ -545,11 +533,9 @@ class RBzip2::Compressor
545
533
 
546
534
  while true
547
535
  while un_lo <= un_hi
548
- n = (block[fmap[un_lo] + d1] & 0xff) - med
536
+ n = block[fmap[un_lo] + d1] - med
549
537
  if n == 0
550
- temp = fmap[un_lo]
551
- fmap[un_lo] = fmap[lt_lo]
552
- fmap[lt_lo] = temp
538
+ fmap[un_lo], fmap[lt_lo] = fmap[lt_lo], fmap[un_lo]
553
539
  un_lo += 1
554
540
  lt_lo += 1
555
541
  elsif n < 0
@@ -560,11 +546,9 @@ class RBzip2::Compressor
560
546
  end
561
547
 
562
548
  while un_lo <= un_hi
563
- n = (block[fmap[un_hi] + d1] & 0xff) - med
549
+ n = block[fmap[un_hi] + d1] - med
564
550
  if n == 0
565
- temp = fmap[un_hi]
566
- fmap[un_hi] = fmap[gt_hi]
567
- fmap[gt_hi] = temp
551
+ fmap[un_hi], fmap[gt_hi] = fmap[gt_hi], fmap[un_hi]
568
552
  un_hi -= 1
569
553
  gt_hi -= 1
570
554
  elsif n > 0
@@ -575,9 +559,7 @@ class RBzip2::Compressor
575
559
  end
576
560
 
577
561
  if un_lo <= un_hi
578
- temp = fmap[un_lo]
579
- fmap[un_lo] = fmap[un_hi]
580
- fmap[un_hi] = temp
562
+ fmap[un_lo], fmap[un_hi] = fmap[un_hi], fmap[un_lo]
581
563
  un_lo += 1
582
564
  un_hi -= 1
583
565
  else
@@ -599,20 +581,10 @@ class RBzip2::Compressor
599
581
  n = lo + un_lo - lt_lo - 1
600
582
  m = hi - (gt_hi - un_hi) + 1
601
583
 
602
- stack_ll[sp] = lo
603
- stack_hh[sp] = n
604
- stack_dd[sp] = d
605
- sp += 1
606
-
607
- stack_ll[sp] = n + 1
608
- stack_hh[sp] = m - 1
609
- stack_dd[sp] = d1
610
- sp += 1
611
-
612
- stack_ll[sp] = m
613
- stack_hh[sp] = hi
614
- stack_dd[sp] = d
615
- sp += 1
584
+ stack_ll[sp, 3] = lo, n + 1, m
585
+ stack_hh[sp, 3] = n, m - 1, hi
586
+ stack_dd[sp, 3] = d, d1, d
587
+ sp += 3
616
588
  end
617
589
  end
618
590
  end
@@ -630,13 +602,8 @@ class RBzip2::Compressor
630
602
  fmap = data_shadow.fmap
631
603
  quadrant = data_shadow.quadrant
632
604
  block = data_shadow.block
633
- last_shadow = @last
634
- last_plus_1 = last_shadow + 1
635
- first_attempt_shadow = @first_attempt
636
- work_limit_shadow = @work_limit
637
- work_done_shadow = @work_done
605
+ last_plus_1 = @last + 1
638
606
 
639
- a = nil
640
607
  h = nil
641
608
  i1 = nil
642
609
  i2 = nil
@@ -660,14 +627,14 @@ class RBzip2::Compressor
660
627
  if quadrant[i1 + 3] == quadrant[i2 + 3]
661
628
  i1 -= last_plus_1 if (i1 += 4) >= last_plus_1
662
629
  i2 -= last_plus_1 if (i2 += 4) >= last_plus_1
663
- work_done_shadow += 1
630
+ @work_done += 1
664
631
  next
665
632
  elsif quadrant[i1 + 3] > quadrant[i2 + 3]
666
633
  return true
667
634
  else
668
635
  return false
669
636
  end
670
- elsif (block[i1 + 4] & 0xff) > (block[i2 + 4] & 0xff)
637
+ elsif block[i1 + 4] > block[i2 + 4]
671
638
  return true
672
639
  else
673
640
  return false
@@ -677,7 +644,7 @@ class RBzip2::Compressor
677
644
  else
678
645
  return false
679
646
  end
680
- elsif (block[i1 + 3] & 0xff) > (block[i2 + 3] & 0xff)
647
+ elsif block[i1 + 3] > block[i2 + 3]
681
648
  return true
682
649
  else
683
650
  return false
@@ -687,17 +654,17 @@ class RBzip2::Compressor
687
654
  else
688
655
  return false
689
656
  end
690
- elsif (block[i1 + 2] & 0xff) > (block[i2 + 2] & 0xff)
657
+ elsif block[i1 + 2] > block[i2 + 2]
691
658
  return true
692
659
  else
693
660
  return false
694
661
  end
695
- elsif (quadrant[i1] > quadrant[i2])
662
+ elsif quadrant[i1] > quadrant[i2]
696
663
  return true
697
664
  else
698
665
  return false
699
666
  end
700
- elsif (block[i1 + 1] & 0xff) > (block[i2 + 1] & 0xff)
667
+ elsif block[i1 + 1] > block[i2 + 1]
701
668
  return true
702
669
  else
703
670
  return false
@@ -728,37 +695,37 @@ class RBzip2::Compressor
728
695
  if block[i1 + 4] == block[i2 + 4]
729
696
  if block[i1 + 5] == block[i2 + 5]
730
697
  if block[i1 += 6] == block[i2 += 6]
731
- x = last_shadow
698
+ x = @last
732
699
 
733
700
  break unless x_loop.call
734
701
  else
735
- if (block[i1] & 0xff) > (block[i2] & 0xff)
702
+ if block[i1] > block[i2]
736
703
  next
737
704
  else
738
705
  break
739
706
  end
740
707
  end
741
- elsif (block[i1 + 5] & 0xff) > (block[i2 + 5] & 0xff)
708
+ elsif block[i1 + 5] > block[i2 + 5]
742
709
  next
743
710
  else
744
711
  break
745
712
  end
746
- elsif (block[i1 + 4] & 0xff) > (block[i2 + 4] & 0xff)
713
+ elsif block[i1 + 4] > block[i2 + 4]
747
714
  next
748
715
  else
749
716
  break
750
717
  end
751
- elsif (block[i1 + 3] & 0xff) > (block[i2 + 3] & 0xff)
718
+ elsif block[i1 + 3] > block[i2 + 3]
752
719
  next
753
720
  else
754
721
  break
755
722
  end
756
- elsif (block[i1 + 2] & 0xff) > (block[i2 + 2] & 0xff)
723
+ elsif block[i1 + 2] > block[i2 + 2]
757
724
  next
758
725
  else
759
726
  break
760
727
  end
761
- elsif (block[i1 + 1] & 0xff) > (block[i2 + 1] & 0xff)
728
+ elsif block[i1 + 1] > block[i2 + 1]
762
729
  next
763
730
  else
764
731
  break
@@ -788,12 +755,10 @@ class RBzip2::Compressor
788
755
  end
789
756
  end
790
757
 
791
- break if first_attempt_shadow && i <= hi && work_done_shadow > work_limit_shadow
758
+ break if @first_attempt && i <= hi && @work_done > @work_limit
792
759
  end
793
760
 
794
- @work_done = work_done_shadow
795
-
796
- first_attempt_shadow && (work_done_shadow > work_limit_shadow)
761
+ @first_attempt && @work_done > @work_limit
797
762
  end
798
763
 
799
764
  def move_to_front_code_and_send
@@ -802,6 +767,18 @@ class RBzip2::Compressor
802
767
  send_mtf_values
803
768
  end
804
769
 
770
+ def putc(int)
771
+ if int.is_a? Numeric
772
+ put_byte int & 0xff
773
+ else
774
+ write int.to_s[0].chr
775
+ end
776
+ end
777
+
778
+ def puts(line)
779
+ write line + $/
780
+ end
781
+
805
782
  def put_byte(c)
806
783
  c = c[0].to_i if c.is_a? String
807
784
  w 8, c
@@ -815,9 +792,8 @@ class RBzip2::Compressor
815
792
  end
816
793
 
817
794
  def randomize_block
818
- in_use = @data.in_use
819
- block = @data.block
820
- last_shadow = @last
795
+ in_use = @data.in_use
796
+ block = @data.block
821
797
 
822
798
  256.times { |i| in_use[i] = false }
823
799
 
@@ -825,7 +801,7 @@ class RBzip2::Compressor
825
801
  r_t_pos = 0
826
802
  j = 1
827
803
  i = 0
828
- while i <= last_shadow
804
+ while i <= @last
829
805
  i = j
830
806
 
831
807
  if r_n_to_go == 0
@@ -836,7 +812,7 @@ class RBzip2::Compressor
836
812
  r_n_to_go -= 1
837
813
  block[j] ^= r_n_to_go == 1 ? 1 : 0
838
814
 
839
- in_use[block[j] & 0xff] = true
815
+ in_use[block[j]] = true
840
816
 
841
817
  j += 1
842
818
  end
@@ -899,7 +875,7 @@ class RBzip2::Compressor
899
875
  end
900
876
  end
901
877
 
902
- gs = ge +1
878
+ gs = ge + 1
903
879
  rem_f -= a_freq
904
880
  end
905
881
  end
@@ -918,7 +894,6 @@ class RBzip2::Compressor
918
894
  len_3 = len[3]
919
895
  len_4 = len[4]
920
896
  len_5 = len[5]
921
- n_mtf_shadow = @n_mtf
922
897
  n_selectors = 0
923
898
 
924
899
  N_ITERS.times do
@@ -932,7 +907,7 @@ class RBzip2::Compressor
932
907
 
933
908
  gs = 0
934
909
  while gs < @n_mtf
935
- ge = [gs + G_SIZE - 1, n_mtf_shadow - 1].min
910
+ ge = [gs + G_SIZE - 1, @n_mtf - 1].min
936
911
 
937
912
  if n_groups == N_GROUPS
938
913
  cost0 = 0
@@ -1008,9 +983,7 @@ class RBzip2::Compressor
1008
983
 
1009
984
  while ll_i != tmp
1010
985
  j += 1
1011
- tmp2 = tmp
1012
- tmp = pos[j]
1013
- pos[j] = tmp2
986
+ tmp, pos[j] = pos[j], tmp
1014
987
  end
1015
988
 
1016
989
  pos[0] = tmp
@@ -1048,7 +1021,7 @@ class RBzip2::Compressor
1048
1021
  end
1049
1022
  end
1050
1023
 
1051
- 16.times { |i| w 1, (in_use_16[i] ? 1 : 0) }
1024
+ 16.times { |i| w 1, in_use_16[i] ? 1 : 0 }
1052
1025
 
1053
1026
  io_shadow = @io
1054
1027
  live_shadow = @live
@@ -1112,83 +1085,71 @@ class RBzip2::Compressor
1112
1085
 
1113
1086
  def send_mtf_values6(n_groups, alpha_size)
1114
1087
  len = @data.send_mtf_values_len
1115
- io_shadow = @io
1116
-
1117
- live_shadow = @live
1118
- buff_shadow = @buff
1119
1088
 
1120
1089
  n_groups.times do |t|
1121
1090
  len_t = len[t]
1122
1091
  curr = len_t[0] & 0xff
1123
1092
 
1124
- while live_shadow >= 8
1125
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1126
- buff_shadow <<= 8
1127
- buff_shadow &= 0xffffffff
1128
- live_shadow -= 8
1093
+ while @live >= 8
1094
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1095
+ @buff <<= 8
1096
+ @buff &= 0xffffffff
1097
+ @live -= 8
1129
1098
  end
1130
- buff_shadow |= curr << (32 - live_shadow - 5)
1131
- live_shadow += 5
1099
+ @buff |= curr << (32 - @live - 5)
1100
+ @live += 5
1132
1101
 
1133
1102
  alpha_size.times do |i|
1134
1103
  lti = len_t[i] & 0xff
1135
1104
  while curr < lti
1136
- while live_shadow >= 8
1137
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1138
- buff_shadow <<= 8
1139
- buff_shadow &= 0xffffffff
1140
- live_shadow -= 8
1105
+ while @live >= 8
1106
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1107
+ @buff <<= 8
1108
+ @buff &= 0xffffffff
1109
+ @live -= 8
1141
1110
  end
1142
- buff_shadow |= 2 << (32 - live_shadow - 2)
1143
- live_shadow += 2
1111
+ @buff |= 2 << (32 - @live - 2)
1112
+ @live += 2
1144
1113
 
1145
1114
  curr += 1
1146
1115
  end
1147
1116
 
1148
1117
  while curr > lti
1149
- while live_shadow >= 8
1150
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1151
- buff_shadow <<= 8
1152
- buff_shadow &= 0xffffffff
1153
- live_shadow -= 8
1118
+ while @live >= 8
1119
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1120
+ @buff <<= 8
1121
+ @buff &= 0xffffffff
1122
+ @live -= 8
1154
1123
  end
1155
- buff_shadow |= 3 << (32 - live_shadow - 2)
1156
- live_shadow += 2
1124
+ @buff |= 3 << (32 - @live - 2)
1125
+ @live += 2
1157
1126
 
1158
1127
  curr -= 1
1159
1128
  end
1160
1129
 
1161
- while live_shadow >= 8
1162
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1163
- buff_shadow <<= 8
1164
- buff_shadow &= 0xffffffff
1165
- live_shadow -= 8
1130
+ while @live >= 8
1131
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1132
+ @buff <<= 8
1133
+ @buff &= 0xffffffff
1134
+ @live -= 8
1166
1135
  end
1167
- live_shadow += 1
1136
+ @live += 1
1168
1137
  end
1169
1138
  end
1170
-
1171
- @buff = buff_shadow
1172
- @live = live_shadow
1173
1139
  end
1174
1140
 
1175
1141
  def send_mtf_values7
1176
1142
  data_shadow = @data
1177
1143
  len = data_shadow.send_mtf_values_len
1178
1144
  code = data_shadow.send_mtf_values_code
1179
- io_shadow = @io
1180
1145
  selector = data_shadow.selector
1181
1146
  sfmap = data_shadow.sfmap
1182
- n_mtf_shadow = @n_mtf
1183
1147
 
1184
1148
  sel_ctr = 0
1185
1149
 
1186
- live_shadow = @live
1187
- buff_shadow = @buff
1188
-
1189
1150
  gs = 0
1190
- while gs < n_mtf_shadow
1191
- ge = [gs + G_SIZE - 1, n_mtf_shadow - 1].min
1151
+ while gs < @n_mtf
1152
+ ge = [gs + G_SIZE - 1, @n_mtf - 1].min
1192
1153
  selector_sel_ctr = selector[sel_ctr] & 0xff
1193
1154
  code_sel_ctr = code[selector_sel_ctr]
1194
1155
  len_sel_ctr = len[selector_sel_ctr]
@@ -1196,15 +1157,15 @@ class RBzip2::Compressor
1196
1157
  while gs <= ge
1197
1158
  sfmap_i = sfmap[gs]
1198
1159
 
1199
- while live_shadow >= 8
1200
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1201
- buff_shadow <<= 8
1202
- buff_shadow &= 0xffffffff
1203
- live_shadow -= 8
1160
+ while @live >= 8
1161
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1162
+ @buff <<= 8
1163
+ @buff &= 0xffffffff
1164
+ @live -= 8
1204
1165
  end
1205
1166
  n = len_sel_ctr[sfmap_i] & 0xff
1206
- buff_shadow |= code_sel_ctr[sfmap_i] << (32 - live_shadow - n)
1207
- live_shadow += n
1167
+ @buff |= code_sel_ctr[sfmap_i] << (32 - @live - n)
1168
+ @live += n
1208
1169
 
1209
1170
  gs += 1
1210
1171
  end
@@ -1212,25 +1173,18 @@ class RBzip2::Compressor
1212
1173
  gs = ge + 1
1213
1174
  sel_ctr += 1
1214
1175
  end
1215
-
1216
- @buff = buff_shadow
1217
- @live = live_shadow
1218
1176
  end
1219
1177
 
1220
1178
  def w(n, v)
1221
- io_shadow = @io
1222
- live_shadow = @live
1223
- buff_shadow = @buff
1224
-
1225
- while live_shadow >= 8
1226
- io_shadow.write(((buff_shadow >> 24) & 0xffffffff).chr)
1227
- buff_shadow <<= 8
1228
- buff_shadow &= 0xffffffff
1229
- live_shadow -= 8
1179
+ while @live >= 8
1180
+ @io.write(((@buff >> 24) & 0xffffffff).chr)
1181
+ @buff <<= 8
1182
+ @buff &= 0xffffffff
1183
+ @live -= 8
1230
1184
  end
1231
1185
 
1232
- @buff = buff_shadow | (v << (32 - live_shadow - n))
1233
- @live = live_shadow + n
1186
+ @buff = @buff | (v << (32 - @live - n))
1187
+ @live += n
1234
1188
  end
1235
1189
 
1236
1190
  def write(bytes)
@@ -1240,8 +1194,8 @@ class RBzip2::Compressor
1240
1194
  end
1241
1195
 
1242
1196
  def write0(b)
1197
+ b &= 0xff
1243
1198
  if @current_char != -1
1244
- b &= 0xff
1245
1199
  if @current_char == b
1246
1200
  @run_length += 1
1247
1201
  if @run_length > 254
@@ -1255,50 +1209,46 @@ class RBzip2::Compressor
1255
1209
  @current_char = b
1256
1210
  end
1257
1211
  else
1258
- @current_char = b & 0xff
1212
+ @current_char = b
1259
1213
  @run_length += 1
1260
1214
  end
1261
1215
  end
1262
1216
 
1263
1217
  def write_run
1264
- last_shadow = @last
1265
-
1266
- if last_shadow < @allowable_block_size
1267
- current_char_shadow = @current_char
1218
+ if @last < @allowable_block_size
1219
+ ch = @current_char
1268
1220
  data_shadow = @data
1269
- data_shadow.in_use[current_char_shadow] = true
1270
- ch = current_char_shadow
1221
+ data_shadow.in_use[ch] = true
1222
+ block = data_shadow.block
1271
1223
 
1272
1224
  run_length_shadow = @run_length
1273
- @crc.update_crc current_char_shadow, run_length_shadow
1225
+ run_length_shadow.times { @crc.update_crc ch }
1274
1226
 
1275
1227
  case run_length_shadow
1276
1228
  when 1
1277
- data_shadow.block[last_shadow + 2] = ch
1278
- @last = last_shadow + 1
1229
+ block[@last + 2] = ch
1230
+ @last += 1
1279
1231
 
1280
1232
  when 2
1281
- data_shadow.block[last_shadow + 2] = ch
1282
- data_shadow.block[last_shadow + 3] = ch
1283
- @last = last_shadow + 2
1233
+ block[@last + 2] = ch
1234
+ block[@last + 3] = ch
1235
+ @last += 2
1284
1236
 
1285
1237
  when 3
1286
- block = data_shadow.block
1287
- block[last_shadow + 2] = ch
1288
- block[last_shadow + 3] = ch
1289
- block[last_shadow + 4] = ch
1290
- @last = last_shadow + 3
1238
+ block[@last + 2] = ch
1239
+ block[@last + 3] = ch
1240
+ block[@last + 4] = ch
1241
+ @last += 3
1291
1242
 
1292
1243
  else
1293
1244
  run_length_shadow -= 4
1294
1245
  data_shadow.in_use[run_length_shadow] = true
1295
- block = data_shadow.block
1296
- block[last_shadow + 2] = ch
1297
- block[last_shadow + 3] = ch
1298
- block[last_shadow + 4] = ch
1299
- block[last_shadow + 5] = ch
1300
- block[last_shadow + 6] = run_length_shadow
1301
- @last = last_shadow + 5
1246
+ block[@last + 2] = ch
1247
+ block[@last + 3] = ch
1248
+ block[@last + 4] = ch
1249
+ block[@last + 5] = ch
1250
+ block[@last + 6] = run_length_shadow
1251
+ @last += 5
1302
1252
  end
1303
1253
  else
1304
1254
  end_block