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
@@ -1,9 +1,9 @@
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
4
+ # Copyright (c) 2011-2013, Sebastian Staudt
5
5
 
6
- module RBzip2::Constants
6
+ module RBzip2::Ruby::Constants
7
7
 
8
8
  BASEBLOCKSIZE = 100000
9
9
  MAX_ALPHA_SIZE = 258
@@ -0,0 +1,70 @@
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) 2011-2017, Sebastian Staudt
5
+
6
+ class RBzip2::Ruby::CRC
7
+
8
+ CRC32_TABLE = [
9
+ 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
10
+ 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
11
+ 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
12
+ 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
13
+ 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
14
+ 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
15
+ 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
16
+ 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
17
+ 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
18
+ 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
19
+ 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
20
+ 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
21
+ 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
22
+ 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
23
+ 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
24
+ 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
25
+ 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
26
+ 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
27
+ 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
28
+ 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
29
+ 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
30
+ 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
31
+ 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
32
+ 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
33
+ 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
34
+ 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
35
+ 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
36
+ 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
37
+ 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
38
+ 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
39
+ 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
40
+ 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
41
+ 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
42
+ 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
43
+ 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
44
+ 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
45
+ 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
46
+ 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
47
+ 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
48
+ 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
49
+ 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
50
+ 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
51
+ 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
52
+ ]
53
+
54
+ def initialize
55
+ initialize_crc
56
+ end
57
+
58
+ def initialize_crc
59
+ @global_crc = 0xffffffff
60
+ end
61
+
62
+ def final_crc
63
+ @global_crc ^ 0xffffffff
64
+ end
65
+
66
+ def update_crc(in_ch)
67
+ @global_crc = ((@global_crc << 8) & 0xffffffff) ^ CRC32_TABLE[(@global_crc >> 24) ^ in_ch]
68
+ end
69
+
70
+ end
@@ -1,19 +1,19 @@
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
4
+ # Copyright (c) 2011-2017, Sebastian Staudt
5
5
 
6
- require 'stringio'
6
+ require 'core_ext/io'
7
7
 
8
- class RBzip2::Decompressor
8
+ class RBzip2::Ruby::Decompressor
9
9
 
10
- include RBzip2::Constants
10
+ include RBzip2::Ruby::Constants
11
11
 
12
12
  def initialize(io)
13
13
  @buff = 0
14
14
  @bytes_read = 0
15
15
  @computed_combined_crc = 0
16
- @crc = RBzip2::CRC.new
16
+ @crc = RBzip2::Ruby::CRC.new
17
17
  @current_char = -1
18
18
  @io = io
19
19
  @live = 0
@@ -26,57 +26,62 @@ class RBzip2::Decompressor
26
26
  @bytes_read += read if read != -1
27
27
  end
28
28
 
29
+ def getc
30
+ read 1
31
+ end
32
+
33
+ def gets
34
+ line = ''
35
+ loop do
36
+ char = getc
37
+ line += char
38
+ break if char == "\n"
39
+ end
40
+ line
41
+ end
42
+
29
43
  def read(length = nil)
30
44
  raise 'stream closed' if @io.nil?
31
45
 
32
46
  if length == 1
33
47
  r = read0
34
48
  count (r < 0 ? -1 : 1)
35
- r
49
+ r.chr
36
50
  else
37
- r = StringIO.new
51
+ r = ''
38
52
  if length == nil
39
- loop do
53
+ while true do
40
54
  b = read0
41
55
  break if b < 0
42
- r.write b.chr
56
+ r << b.chr
43
57
  end
44
58
  elsif length > 0
45
59
  length.times do
46
60
  b = read0
47
61
  break if b < 0
48
- r.write b.chr
62
+ r << b.chr
49
63
  end
50
64
  count r.size
51
65
  end
52
- r.string
66
+ r
53
67
  end
54
68
  end
55
69
 
56
70
  def read0
57
71
  ret_char = @current_char
58
72
 
59
- case @current_state
60
- when EOF
61
- return -1
62
-
63
- when RAND_PART_B_STATE
64
- setup_rand_part_b
65
-
66
- when RAND_PART_C_STATE
67
- setup_rand_part_c
68
-
69
- when NO_RAND_PART_B_STATE
70
- setup_no_rand_part_b
71
-
72
- when NO_RAND_PART_C_STATE
73
- setup_no_rand_part_c
74
-
75
- when START_BLOCK_STATE
76
- when RAND_PART_A_STATE
77
- when NO_RAND_PART_A_STATE
78
- else
79
- raise 'illegal state'
73
+ if @current_state == RAND_PART_B_STATE
74
+ setup_rand_part_b
75
+ elsif @current_state == NO_RAND_PART_B_STATE
76
+ setup_no_rand_part_b
77
+ elsif @current_state == RAND_PART_C_STATE
78
+ setup_rand_part_c
79
+ elsif @current_state == NO_RAND_PART_C_STATE
80
+ setup_no_rand_part_c
81
+ elsif @current_state == EOF
82
+ return -1
83
+ else
84
+ raise 'illegal state'
80
85
  end
81
86
 
82
87
  ret_char
@@ -84,9 +89,9 @@ class RBzip2::Decompressor
84
89
 
85
90
  def make_maps
86
91
  in_use = @data.in_use
87
- seq_to_unseq = @data.seq_to_unseq;
92
+ seq_to_unseq = @data.seq_to_unseq
88
93
 
89
- n_in_use_shadow = 0;
94
+ n_in_use_shadow = 0
90
95
 
91
96
  256.times do |i|
92
97
  if in_use[i]
@@ -95,7 +100,7 @@ class RBzip2::Decompressor
95
100
  end
96
101
  end
97
102
 
98
- @n_in_use = n_in_use_shadow;
103
+ @n_in_use = n_in_use_shadow
99
104
  end
100
105
 
101
106
  def init
@@ -126,7 +131,7 @@ class RBzip2::Decompressor
126
131
  @stored_block_crc = int
127
132
  @block_randomised = bit
128
133
 
129
- @data = RBzip2::InputData.new @block_size if @data.nil?
134
+ @data = RBzip2::Ruby::InputData.new @block_size if @data.nil?
130
135
 
131
136
  get_and_move_to_front_decode
132
137
 
@@ -138,14 +143,9 @@ class RBzip2::Decompressor
138
143
  def end_block
139
144
  @computed_block_crc = @crc.final_crc
140
145
 
141
- if @stored_block_crc != @computed_block_crc
142
- @computed_combined_crc = (@stored_combined_crc << 1) | (@stored_combined_crc >> 31)
143
- @computed_combined_crc ^= @stored_block_crc
144
-
145
- raise 'BZip2 CRC error'
146
- end
146
+ raise 'BZip2 CRC error' if @stored_block_crc != @computed_block_crc
147
147
 
148
- @computed_combined_crc = (@computed_combined_crc << 1) | (@computed_combined_crc >> 31)
148
+ @computed_combined_crc = ((@computed_combined_crc << 1) & 0xffffffff) | (@computed_combined_crc >> 31)
149
149
  @computed_combined_crc ^= @computed_block_crc
150
150
  end
151
151
 
@@ -170,7 +170,7 @@ class RBzip2::Decompressor
170
170
 
171
171
  if live_shadow < n
172
172
  begin
173
- thech = @io.read(1)[0].ord
173
+ thech = @io.readbyte
174
174
 
175
175
  raise 'unexpected end of stream' if thech < 0
176
176
 
@@ -195,7 +195,7 @@ class RBzip2::Decompressor
195
195
  end
196
196
 
197
197
  def int
198
- (((((r(8) << 8) | r(8)) << 8) | r(8)) << 8) | r(8)
198
+ r 32
199
199
  end
200
200
 
201
201
  def create_decode_tables(limit, base, perm, length, min_len, max_len, alpha_size)
@@ -209,10 +209,8 @@ class RBzip2::Decompressor
209
209
  end
210
210
  end
211
211
 
212
- MAX_CODE_LEN.downto 1 do |i|
213
- base[i] = 0
214
- limit[i] = 0
215
- end
212
+ base[1..MAX_CODE_LEN] = 0
213
+ limit[1..MAX_CODE_LEN] = 0
216
214
 
217
215
  alpha_size.times do |i|
218
216
  base[length[i] + 1] += 1
@@ -229,8 +227,7 @@ class RBzip2::Decompressor
229
227
  b = base[i]
230
228
  nb = base[i + 1]
231
229
  vec += nb - b
232
- b = nb
233
- limit[i] = vec -1
230
+ limit[i] = vec - 1
234
231
  vec = vec << 1
235
232
  end
236
233
 
@@ -251,9 +248,7 @@ class RBzip2::Decompressor
251
248
  in_use16 |= 1 << i if bit
252
249
  end
253
250
 
254
- 255.downto(0) do |i|
255
- in_use[i] = false
256
- end
251
+ in_use.fill false
257
252
 
258
253
  16.times do |i|
259
254
  if (in_use16 & (1 << i)) != 0
@@ -275,19 +270,18 @@ class RBzip2::Decompressor
275
270
  while bit
276
271
  j += 1
277
272
  end
278
- selector_mtf[i] = j
273
+ selector_mtf[i] = j & 0xff
279
274
  end
280
275
 
281
- groups.downto(0) do |v|
282
- pos[v] = v
283
- end
276
+ pos.fill(0..groups) { |v| v & 0xff }
284
277
 
285
278
  selectors.times do |i|
286
- v = selector_mtf[i] & 0xff
279
+ v = selector_mtf[i]
287
280
  tmp = pos[v]
288
281
 
289
282
  while v > 0 do
290
- pos[v] = pos[v -= 1]
283
+ v -= 1
284
+ pos[v + 1] = pos[v]
291
285
  end
292
286
 
293
287
  pos[0] = tmp
@@ -349,30 +343,26 @@ class RBzip2::Decompressor
349
343
  perm = @data.perm
350
344
  limit_last = @block_size * BASEBLOCKSIZE
351
345
 
352
- 256.downto(0) do |i|
353
- yy[i] = i
354
- unzftab[i] = 0
355
- end
346
+ yy.fill(0..256) { |i| i }
347
+ unzftab.fill 0
356
348
 
357
349
  group_no = 0
358
350
  group_pos = G_SIZE - 1
359
351
  eob = @n_in_use + 1
360
352
  next_sym = get_and_move_to_front_decode0 0
361
- buff_shadow = @buff
362
- live_shadow = @live
363
- last_shadow = -1
364
- zt = selector[group_no] & 0xff
353
+ @last = -1
354
+ zt = selector[group_no]
365
355
  base_zt = base[zt]
366
356
  limit_zt = limit[zt]
367
357
  perm_zt = perm[zt]
368
358
  min_lens_zt = min_lens[zt]
369
359
 
370
360
  while next_sym != eob
371
- if (next_sym == RUNA) || (next_sym == RUNB)
361
+ if next_sym == RUNA || next_sym == RUNB
372
362
  s = -1
373
363
 
374
364
  n = 1
375
- loop do
365
+ while true do
376
366
  if next_sym == RUNA
377
367
  s += n
378
368
  elsif next_sym == RUNB
@@ -384,7 +374,7 @@ class RBzip2::Decompressor
384
374
  if group_pos == 0
385
375
  group_pos = G_SIZE - 1
386
376
  group_no += 1
387
- zt = selector[group_no] & 0xff
377
+ zt = selector[group_no]
388
378
  base_zt = base[zt]
389
379
  limit_zt = limit[zt]
390
380
  perm_zt = perm[zt]
@@ -395,32 +385,32 @@ class RBzip2::Decompressor
395
385
 
396
386
  zn = min_lens_zt
397
387
 
398
- while live_shadow < zn
399
- thech = @io.read(1)[0].ord
388
+ while @live < zn
389
+ thech = @io.readbyte
400
390
 
401
391
  raise 'unexpected end of stream' if thech < 0
402
392
 
403
- buff_shadow = (buff_shadow << 8) | thech
404
- live_shadow += 8
393
+ @buff = ((@buff << 8) & 0xffffffff) | thech
394
+ @live += 8
405
395
  end
406
396
 
407
- zvec = (buff_shadow >> (live_shadow - zn)) & ((1 << zn) - 1)
408
- live_shadow -= zn
397
+ zvec = ((@buff >> (@live - zn)) & 0xffffffff) & ((1 << zn) - 1)
398
+ @live -= zn
409
399
 
410
400
  while zvec > limit_zt[zn]
411
401
  zn += 1
412
402
 
413
- while live_shadow < 1
414
- thech = @io.read(1)[0].ord
403
+ while @live < 1
404
+ thech = @io.readbyte
415
405
 
416
406
  raise 'unexpected end of stream' if thech < 0
417
407
 
418
- buff_shadow = (buff_shadow << 8) | thech
419
- live_shadow += 8
408
+ @buff = ((@buff << 8) & 0xffffffff) | thech
409
+ @live += 8
420
410
  end
421
411
 
422
- live_shadow -= 1
423
- zvec = (zvec << 1) | ((buff_shadow >> live_shadow) & 1)
412
+ @live -= 1
413
+ zvec = (zvec << 1) | ((@buff >> @live) & 1)
424
414
  end
425
415
 
426
416
  next_sym = perm_zt[zvec - base_zt[zn]]
@@ -432,19 +422,19 @@ class RBzip2::Decompressor
432
422
  unzftab[ch & 0xff] += s + 1
433
423
 
434
424
  while s >= 0
435
- last_shadow += 1
436
- ll8[last_shadow] = ch
425
+ @last += 1
426
+ ll8[@last] = ch
437
427
  s -= 1
438
428
  end
439
429
 
440
- raise 'block overrun' if last_shadow >= limit_last
430
+ raise 'block overrun' if @last >= limit_last
441
431
  else
442
- last_shadow += 1
443
- raise 'block overrun' if last_shadow >= limit_last
432
+ @last += 1
433
+ raise 'block overrun' if @last >= limit_last
444
434
 
445
435
  tmp = yy[next_sym - 1]
446
- unzftab[seq_to_unseq[tmp] & 0xff] += 1
447
- ll8[last_shadow] = seq_to_unseq[tmp]
436
+ unzftab[seq_to_unseq[tmp]] += 1
437
+ ll8[@last] = seq_to_unseq[tmp]
448
438
 
449
439
  yy[1, next_sym - 1] = yy[0, next_sym - 1]
450
440
  yy[0] = tmp
@@ -452,7 +442,7 @@ class RBzip2::Decompressor
452
442
  if group_pos == 0
453
443
  group_pos = G_SIZE - 1
454
444
  group_no += 1
455
- zt = selector[group_no] & 0xff
445
+ zt = selector[group_no]
456
446
  base_zt = base[zt]
457
447
  limit_zt = limit[zt]
458
448
  perm_zt = perm[zt]
@@ -463,67 +453,58 @@ class RBzip2::Decompressor
463
453
 
464
454
  zn = min_lens_zt
465
455
 
466
- while live_shadow < zn
467
- thech = @io.read(1)[0].ord
456
+ while @live < zn
457
+ thech = @io.readbyte
468
458
 
469
459
  raise 'unexpected end of stream' if thech < 0
470
460
 
471
- buff_shadow = (buff_shadow << 8) | thech
472
- live_shadow += 8
461
+ @buff = ((@buff << 8) & 0xffffffff) | thech
462
+ @live += 8
473
463
  end
474
- zvec = (buff_shadow >> (live_shadow - zn)) & ((1 << zn) - 1)
475
- live_shadow -= zn
464
+ zvec = (@buff >> (@live - zn)) & ((1 << zn) - 1)
465
+ @live -= zn
476
466
 
477
467
  while zvec > limit_zt[zn]
478
468
  zn += 1
479
- while live_shadow < 1
480
- thech = @io.read(1)[0].ord
469
+ while @live < 1
470
+ thech = @io.readbyte
481
471
 
482
472
  raise 'unexpected end of stream' if thech < 0
483
473
 
484
- buff_shadow = (buff_shadow << 8) | thech
485
- live_shadow += 8
474
+ @buff = ((@buff << 8) & 0xffffffff) | thech
475
+ @live += 8
486
476
  end
487
- live_shadow -= 1
488
- zvec = (zvec << 1) | ((buff_shadow >> live_shadow) & 1)
477
+ @live -= 1
478
+ zvec = (zvec << 1) | ((@buff >> @live) & 1)
489
479
  end
490
480
 
491
481
  next_sym = perm_zt[zvec - base_zt[zn]]
492
482
  end
493
483
  end
494
-
495
- @last = last_shadow
496
- @live = live_shadow
497
- @buff = buff_shadow
498
484
  end
499
485
 
500
486
  def get_and_move_to_front_decode0(group_no)
501
- zt = @data.selector[group_no] & 0xff
487
+ zt = @data.selector[group_no]
502
488
  limit_zt = @data.limit[zt]
503
489
  zn = @data.min_lens[zt]
504
490
  zvec = r zn
505
- live_shadow = @live
506
- buff_shadow = @buff
507
491
 
508
492
  while zvec > limit_zt[zn]
509
493
  zn += 1
510
494
 
511
- while live_shadow < 1
512
- thech = @io.read(1)[0].ord
495
+ while @live < 1
496
+ thech = @io.readbyte
513
497
 
514
498
  raise 'unexpected end of stream' if thech < 0
515
499
 
516
- buff_shadow = (buff_shadow << 8) | thech
517
- live_shadow += 8
500
+ @buff = ((@buff << 8) & 0xffffffff) | thech
501
+ @live += 8
518
502
  end
519
503
 
520
- live_shadow -=1
521
- zvec = (zvec << 1) | ((buff_shadow >> live_shadow) & 1)
504
+ @live -=1
505
+ zvec = (zvec << 1) | ((@buff >> @live) & 1)
522
506
  end
523
507
 
524
- @live = live_shadow
525
- @buff = buff_shadow
526
-
527
508
  @data.perm[zt][zvec - @data.base[zt][zn]]
528
509
  end
529
510
 
@@ -536,15 +517,14 @@ class RBzip2::Decompressor
536
517
  cftab[0] = 0
537
518
  cftab[1, 256] = @data.unzftab[0, 256]
538
519
 
539
- c = cftab[0]
520
+ c = 0
540
521
  1.upto(256) do |i|
541
522
  c += cftab[i]
542
523
  cftab[i] = c
543
524
  end
544
525
 
545
- last_shadow = @last
546
- (last_shadow + 1).times do |i|
547
- cftab_i = ll8[i] & 0xff
526
+ (@last + 1).times do |i|
527
+ cftab_i = ll8[i]
548
528
  tt[cftab[cftab_i]] = i
549
529
  cftab[cftab_i] += 1
550
530
  end
@@ -569,7 +549,7 @@ class RBzip2::Decompressor
569
549
  def setup_rand_part_a
570
550
  if @su_i2 <= @last
571
551
  @su_ch_prev = @su_ch2
572
- su_ch2_shadow = @data.ll8[@su_t_pos] & 0xff
552
+ su_ch2_shadow = @data.ll8[@su_t_pos]
573
553
  @su_t_pos = @data.tt[@su_t_pos]
574
554
 
575
555
  if @su_r_n_to_go == 0
@@ -595,7 +575,7 @@ class RBzip2::Decompressor
595
575
  def setup_no_rand_part_a
596
576
  if @su_i2 <= @last
597
577
  @su_ch_prev = @su_ch2
598
- su_ch2_shadow = @data.ll8[@su_t_pos] & 0xff
578
+ su_ch2_shadow = @data.ll8[@su_t_pos]
599
579
  @su_ch2 = su_ch2_shadow
600
580
  @su_t_pos = @data.tt[@su_t_pos]
601
581
  @su_i2 += 1
@@ -618,7 +598,7 @@ class RBzip2::Decompressor
618
598
  else
619
599
  @su_count += 1
620
600
  if @su_count >= 4
621
- @su_z = @data.ll8[@su_t_pos] & 0xff
601
+ @su_z = @data.ll8[@su_t_pos]
622
602
  @su_t_pos = @data.tt[@su_t_pos]
623
603
 
624
604
  if @su_r_n_to_go == 0
@@ -660,7 +640,7 @@ class RBzip2::Decompressor
660
640
  else
661
641
  @su_count += 1
662
642
  if @su_count >= 4
663
- @su_z = @data.ll8[@su_t_pos] & 0xff
643
+ @su_z = @data.ll8[@su_t_pos]
664
644
  @su_t_pos = @data.tt[@su_t_pos]
665
645
  @su_j2 = 0
666
646
  setup_no_rand_part_c