rbzip2 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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