pr-zlib 1.0.5 → 1.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/{CHANGES → CHANGES.md} +19 -6
  4. data/Gemfile +6 -0
  5. data/MANIFEST.md +20 -0
  6. data/{README → README.md} +29 -12
  7. data/Rakefile +11 -61
  8. data/bin/{minizip.rb → minirbgzip} +77 -65
  9. data/lib/pr/rbzlib/bytef.rb +16 -0
  10. data/lib/pr/rbzlib/bytef_arr.rb +29 -0
  11. data/lib/pr/rbzlib/bytef_str.rb +52 -0
  12. data/lib/pr/rbzlib/posf.rb +33 -0
  13. data/lib/pr/rbzlib.rb +1758 -1855
  14. data/lib/pr/zlib/deflate.rb +99 -0
  15. data/lib/pr/zlib/errors.rb +27 -0
  16. data/lib/pr/zlib/gzipfile.rb +315 -0
  17. data/lib/pr/zlib/gzipfile_errors.rb +19 -0
  18. data/lib/pr/zlib/gzipreader.rb +338 -0
  19. data/lib/pr/zlib/gzipwriter.rb +167 -0
  20. data/lib/pr/zlib/inflate.rb +114 -0
  21. data/lib/pr/zlib/zstream.rb +417 -0
  22. data/lib/pr/zlib.rb +25 -1466
  23. data/pr-zlib.gemspec +15 -15
  24. data/profile/bench_pr_zlib.rb +7 -5
  25. data/profile/bench_zlib.rb +7 -5
  26. data/profile/profile_pr_zlib_read.rb +3 -3
  27. data/profile/profile_pr_zlib_write.rb +3 -3
  28. data/spec/README.md +46 -0
  29. data/spec/rbzlib/bytef_arr_spec.rb +82 -0
  30. data/spec/rbzlib/bytef_spec.rb +72 -0
  31. data/spec/rbzlib/bytef_str_spec.rb +113 -0
  32. data/spec/rbzlib/posf_spec.rb +83 -0
  33. data/spec/rbzlib_spec.rb +170 -0
  34. data/spec/spec_helper.rb +27 -0
  35. data/spec/zlib/deflate_spec.rb +44 -0
  36. data/spec/zlib/gzip_file_spec.rb +86 -0
  37. data/spec/zlib/gzip_reader_spec.rb +276 -0
  38. data/spec/zlib/gzip_writer_spec.rb +275 -0
  39. data/spec/zlib/inflate_spec.rb +44 -0
  40. data/spec/zlib/zstream_spec.rb +156 -0
  41. data/spec/zlib_spec.rb +195 -0
  42. data.tar.gz.sig +0 -0
  43. metadata +68 -55
  44. metadata.gz.sig +0 -0
  45. data/MANIFEST +0 -20
  46. data/test/test_rbzlib.rb +0 -133
  47. data/test/test_rbzlib_bytef.rb +0 -76
  48. data/test/test_rbzlib_posf.rb +0 -56
  49. data/test/test_zlib.rb +0 -162
  50. data/test/test_zlib_deflate.rb +0 -55
  51. data/test/test_zlib_gzip_file.rb +0 -93
  52. data/test/test_zlib_gzip_reader.rb +0 -183
  53. data/test/test_zlib_gzip_writer.rb +0 -186
  54. data/test/test_zlib_inflate.rb +0 -55
  55. data/test/test_zlib_zstream.rb +0 -146
data/lib/pr/zlib.rb CHANGED
@@ -6,39 +6,23 @@
6
6
  # Ruby translation by Park Heesob
7
7
 
8
8
  require_relative 'rbzlib'
9
+ require_relative 'zlib/errors'
10
+ require_relative 'zlib/zstream'
11
+ require_relative 'zlib/deflate'
12
+ require_relative 'zlib/inflate'
13
+ require_relative 'zlib/gzipfile'
14
+ require_relative 'zlib/gzipwriter'
15
+ require_relative 'zlib/gzipreader'
16
+
9
17
  include Rbzlib
10
18
 
11
19
  module Zlib
12
20
 
13
21
  RUBY_ZLIB_VERSION = '0.6.0'.freeze
14
- PR_ZLIB_VERSION = '1.0.5'.freeze
15
-
16
- class Error < StandardError
17
- end
18
-
19
- class StreamEnd < Error
20
- end
21
-
22
- class NeedDict < Error
23
- end
24
-
25
- class DataError < Error
26
- end
27
-
28
- class StreamError < Error
29
- end
30
-
31
- class MemError < Error
32
- end
33
-
34
- class BufError < Error
35
- end
36
-
37
- class VersionError < Error
38
- end
22
+ PR_ZLIB_VERSION = '1.1.0'.freeze
39
23
 
40
24
  VERSION = RUBY_ZLIB_VERSION
41
- ZLIB_VERSION = ZLIB_VERSION
25
+ ZLIB_VERSION = Rbzlib::ZLIB_VERSION
42
26
 
43
27
  BINARY = Z_BINARY
44
28
  ASCII = Z_ASCII
@@ -52,15 +36,15 @@ module Zlib
52
36
  FILTERED = Z_FILTERED
53
37
  HUFFMAN_ONLY = Z_HUFFMAN_ONLY
54
38
  DEFAULT_STRATEGY = Z_DEFAULT_STRATEGY
55
- MAX_WBITS = MAX_WBITS
56
- DEF_MEM_LEVEL = DEF_MEM_LEVEL
57
- MAX_MEM_LEVEL = MAX_MEM_LEVEL
39
+ MAX_WBITS = Rbzlib::MAX_WBITS
40
+ DEF_MEM_LEVEL = Rbzlib::DEF_MEM_LEVEL
41
+ MAX_MEM_LEVEL = Rbzlib::MAX_MEM_LEVEL
58
42
  NO_FLUSH = Z_NO_FLUSH
59
43
  SYNC_FLUSH = Z_SYNC_FLUSH
60
44
  FULL_FLUSH = Z_FULL_FLUSH
61
45
  FINISH = Z_FINISH
62
46
 
63
- OS_CODE = OS_CODE
47
+ OS_CODE = Rbzlib::OS_CODE
64
48
  OS_MSDOS = 0x00
65
49
  OS_AMIGA = 0x01
66
50
  OS_VMS = 0x02
@@ -77,1477 +61,52 @@ module Zlib
77
61
  ZSTREAM_FLAG_CLOSING = 0x8
78
62
  ZSTREAM_FLAG_UNUSED = 0x10
79
63
 
80
- ZSTREAM_INITIAL_BUFSIZE = 1024
81
- ZSTREAM_AVAIL_OUT_STEP_MAX = 16384
82
- ZSTREAM_AVAIL_OUT_STEP_MIN = 2048
64
+ ZSTREAM_INITIAL_BUFSIZE = 1024
65
+ ZSTREAM_AVAIL_OUT_STEP_MAX = 16384
66
+ ZSTREAM_AVAIL_OUT_STEP_MIN = 2048
83
67
 
84
68
  ZStreamFuncs = Struct.new(:reset, :end, :run)
85
69
  DeflateFuncs = ZStreamFuncs.new(:deflateReset, :deflateEnd, :deflate)
86
70
  InflateFuncs = ZStreamFuncs.new(:inflateReset, :inflateEnd, :inflate)
87
71
 
88
- class ZStream
89
- attr_accessor :flags, :buf, :input, :stream, :func
90
-
91
- def raise_zlib_error(err, msg)
92
- msg = zError(err) if msg.nil? || msg==''
93
-
94
- case err
95
- when Z_STREAM_END
96
- raise StreamEnd, msg
97
- when Z_NEED_DICT
98
- raise NeedDict, msg
99
- when Z_STREAM_ERROR
100
- raise StreamError, msg
101
- when Z_DATA_ERROR
102
- raise DataError, msg
103
- when Z_BUF_ERROR
104
- raise BufError, msg
105
- when Z_VERSION_ERROR
106
- raise VersionError, msg
107
- when Z_MEM_ERROR
108
- raise MemError, msg
109
- when Z_ERRNO
110
- raise SystemCallError, msg
111
- else
112
- raise Error, "unknown zlib error #errend: #msgend"
113
- end
114
- end
115
-
116
- def zstream_expand_buffer()
117
- if @buf.nil?
118
- @buf = Bytef.new(0.chr * ZSTREAM_INITIAL_BUFSIZE)
119
- @stream.next_out = Bytef.new(@buf)
120
- @stream.avail_out = ZSTREAM_INITIAL_BUFSIZE
121
- return
122
- end
123
-
124
- if (@buf.length - @buf.offset >= ZSTREAM_AVAIL_OUT_STEP_MAX)
125
- @stream.avail_out = ZSTREAM_AVAIL_OUT_STEP_MAX
126
- else
127
- inc = @buf.offset / 2
128
- if (inc < ZSTREAM_AVAIL_OUT_STEP_MIN)
129
- inc = ZSTREAM_AVAIL_OUT_STEP_MIN
130
- end
131
- if @buf.length < @buf.offset + inc
132
- @buf.buffer << 0.chr * (@buf.offset + inc - @buf.length)
133
- end
134
- @stream.avail_out = (inc < ZSTREAM_AVAIL_OUT_STEP_MAX) ?
135
- inc : ZSTREAM_AVAIL_OUT_STEP_MAX
136
- end
137
- @stream.next_out = Bytef.new(@buf,@buf.offset)
138
- end
139
-
140
- def zstream_append_buffer(src, len)
141
- if @buf.nil?
142
- @buf = Bytef.new(src[0,len],len)
143
- @stream.next_out = Bytef.new(@buf)
144
- @stream.avail_out = 0
145
- return
146
- end
147
- if (@buf.length < @buf.offset + len)
148
- @buf.buffer << (0.chr * (@buf.offset + len - @buf.length))
149
- @stream.avail_out = 0
150
- else
151
- if (@stream.avail_out >= len)
152
- @stream.avail_out -= len
153
- else
154
- @stream.avail_out = 0
155
- end
156
- end
157
- @buf.buffer[@buf.offset,len] = src[0,len]
158
- @buf += len
159
- @stream.next_out = Bytef.new(@buf, @buf.offset)
160
- end
161
-
162
- def zstream_detach_buffer()
163
- if @buf.nil?
164
- dst = ''
165
- else
166
- dst = @buf.buffer[0,@buf.offset]
167
- end
168
-
169
- @buf = Bytef.new(0.chr * ZSTREAM_INITIAL_BUFSIZE)
170
- @stream.next_out = Bytef.new(@buf)
171
- @stream.avail_out = ZSTREAM_INITIAL_BUFSIZE
172
- @buf_filled = 0
173
-
174
- return dst
175
- end
176
-
177
- def zstream_shift_buffer(len)
178
- if (@buf.offset <= len)
179
- return zstream_detach_buffer()
180
- end
181
-
182
- dst = @buf.buffer[0, len]
183
- @buf -= len
184
- @buf.buffer[0,@buf.offset] = @buf.buffer[len,@buf.offset]
185
- @stream.next_out = Bytef.new(@buf,@buf.offset)
186
- @stream.avail_out = @buf.length - @buf.offset
187
- if (@stream.avail_out > ZSTREAM_AVAIL_OUT_STEP_MAX)
188
- @stream.avail_out = ZSTREAM_AVAIL_OUT_STEP_MAX
189
- end
190
- return dst
191
- end
192
-
193
- def zstream_buffer_ungetc(c)
194
- if (@buf.nil? || (@buf.length - @buf.offset).zero?)
195
- zstream_expand_buffer()
196
- end
197
- @buf.buffer[0,0] = c.chr
198
- @buf += 1
199
- if (@stream.avail_out > 0)
200
- @stream.next_out+=1
201
- @stream.avail_out-=1
202
- end
203
- end
204
-
205
- def zstream_append_input(src, len)
206
- return if (len <= 0)
207
- src = src.current if src.class != String
208
- if @input.nil?
209
- @input = src[0,len]
210
- else
211
- @input << src[0,len]
212
- end
213
- end
214
-
215
- def zstream_discard_input(len)
216
- if (@input.nil? || @input.length <= len)
217
- @input = nil
218
- else
219
- @input[0,len] = ''
220
- end
221
- end
222
-
223
- def zstream_reset_input()
224
- @input = nil
225
- end
226
-
227
- def zstream_passthrough_input()
228
- if @input
229
- zstream_append_buffer(@input,@input.length)
230
- @input = nil
231
- end
232
- end
233
-
234
- def zstream_detach_input()
235
- if @input.nil?
236
- dst = ''
237
- else
238
- dst = @input
239
- end
240
- @input = nil
241
- return dst
242
- end
243
-
244
- def zstream_reset()
245
- err = send(@func.reset,@stream)
246
- if (err != Z_OK)
247
- raise_zlib_error(err, @stream.msg)
248
- end
249
- @flags = ZSTREAM_FLAG_READY
250
- @buf = nil
251
- @buf_filled = 0
252
- @stream.next_out = 0
253
- @stream.avail_out = 0
254
- zstream_reset_input()
255
- end
256
-
257
- def zstream_end()
258
- if (!ZSTREAM_IS_READY())
259
- warn("attempt to close uninitialized zstream; ignored.")
260
- return nil
261
- end
262
- if (@flags & ZSTREAM_FLAG_IN_STREAM).nonzero?
263
- warn("attempt to close unfinished zstream; reset forced.")
264
- zstream_reset()
265
- end
266
-
267
- zstream_reset_input()
268
- err = send(@func.end,@stream)
269
- if (err != Z_OK)
270
- raise_zlib_error(err, @stream.msg)
271
- end
272
- @flags = 0
273
- return nil
274
- end
275
-
276
- def zstream_sync(src, len)
277
- if @input
278
- @stream.next_in = Bytef.new(@input)
279
- @stream.avail_in = @input.length
280
- err = inflateSync(@stream)
281
- if (err == Z_OK)
282
- zstream_discard_input(@input.length - @stream.avail_in)
283
- zstream_append_input(src, len)
284
- return true
285
- end
286
- zstream_reset_input()
287
- if (err != Z_DATA_ERROR)
288
- rest = @stream.next_in.buffer[0,@stream.avail_in]
289
- raise_zlib_error(err, @stream.msg)
290
- end
291
- end
292
-
293
- return false if (len <= 0)
294
-
295
- @stream.next_in = src
296
- @stream.avail_in = len
297
- err = inflateSync(@stream)
298
- if (err == Z_OK)
299
- zstream_append_input(@stream.next_in, @stream.avail_in)
300
- return true
301
- end
302
- if (err != Z_DATA_ERROR)
303
- rest = @stream.next_in.buffer[0,@stream.avail_in]
304
- raise_zlib_error(err, @stream.msg)
305
- end
306
- return false
307
- end
308
-
309
- def zstream_init(func)
310
- @flags = 0
311
- @buf = nil
312
- @input = nil
313
- @stream = Z_stream.new
314
- @stream.msg = ''
315
- @stream.next_in = nil
316
- @stream.avail_in = 0
317
- @stream.next_out = nil
318
- @stream.avail_out = 0
319
- @func = func
320
- end
321
-
322
- def zstream_run(src, len, flush)
323
- if(@input.nil? && len==0)
324
- @stream.next_in = ''
325
- @stream.avail_in = 0
326
- else
327
- zstream_append_input(src,len)
328
- @stream.next_in = Bytef.new(@input)
329
- @stream.avail_in = @input.length
330
- guard = @input
331
- end
332
- if(@stream.avail_out.zero?)
333
- zstream_expand_buffer()
334
- end
335
-
336
- loop do
337
- n = @stream.avail_out
338
- err = send(@func.run,@stream,flush)
339
- @buf += n - @stream.avail_out
340
- if(err == Z_STREAM_END)
341
- @flags &= ~ZSTREAM_FLAG_IN_STREAM
342
- @flags |= ZSTREAM_FLAG_FINISHED
343
- break
344
- end
345
- if (err != Z_OK)
346
- if (flush != Z_FINISH && err == Z_BUF_ERROR && @stream.avail_out > 0)
347
- @flags |= ZSTREAM_FLAG_IN_STREAM
348
- break
349
- end
350
- @input = nil
351
- if (@stream.avail_in > 0)
352
- zstream_append_input(@stream.next_in, @stream.avail_in)
353
- end
354
- raise_zlib_error(err, @stream.msg)
355
- end
356
- if (@stream.avail_out > 0)
357
- @flags |= ZSTREAM_FLAG_IN_STREAM
358
- break
359
- end
360
- zstream_expand_buffer()
361
- end
362
-
363
- @input = nil
364
- if (@stream.avail_in > 0)
365
- zstream_append_input(@stream.next_in, @stream.avail_in)
366
- guard = nil
367
- end
368
- end
369
-
370
- def ZSTREAM_READY()
371
- (@flags |= ZSTREAM_FLAG_READY)
372
- end
373
-
374
- def ZSTREAM_IS_READY()
375
- !(@flags & ZSTREAM_FLAG_READY).zero?
376
- end
377
-
378
- def ZSTREAM_IS_FINISHED()
379
- !(@flags & ZSTREAM_FLAG_FINISHED).zero?
380
- end
381
-
382
- def ZSTREAM_IS_CLOSING()
383
- !(@flags & ZSTREAM_FLAG_CLOSING).zero?
384
- end
385
-
386
- end
387
-
388
- class ZStream
389
- @@final = proc do |z|
390
- proc do
391
- if z && z.ZSTREAM_IS_READY()
392
- err = send(z.func.end, z.stream)
393
- if (err == Z_STREAM_ERROR)
394
- warn("the stream state was inconsistent.")
395
- end
396
- if (err == Z_DATA_ERROR)
397
- warn("the stream was freed prematurely.")
398
- end
399
- end
400
- end
401
- end
402
-
403
- attr_reader :z
404
-
405
- def avail_out()
406
- @z.stream.avail_out
407
- end
408
-
409
- def avail_out=(size)
410
- if @z.buf.nil?
411
- @z.buf = Bytef.new(0.chr * size)
412
- @z.stream.next_out = Bytef.new(@z.buf)
413
- @z.stream.avail_out = size
414
- elsif @z.stream.avail_out != size
415
- if @z.buf.offset + size > @z.buf.length
416
- @z.buf.buffer << 0.chr * (@z.buf.offset + size - @z.buf.length)
417
- end
418
- @z.stream.next_out = Bytef.new(@z.buf,@z.buf.offset)
419
- @z.stream.avail_out = size
420
- end
421
- end
422
-
423
- def avail_in
424
- @z.input.nil? ? 0 : @z.input.length
425
- end
426
-
427
- def total_in
428
- raise GzipFile::Error,"closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
429
- @z.stream.total_in
430
- end
431
-
432
- def total_out
433
- raise GzipFile::Error,"closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
434
- @z.stream.total_out
435
- end
436
-
437
- def data_type
438
- @z.stream.data_type
439
- end
440
-
441
- def adler
442
- @z.stream.adler
443
- end
444
-
445
- def finished?
446
- @z.ZSTREAM_IS_FINISHED()
447
- end
448
- alias stream_end? :finished?
449
-
450
- def closed?
451
- @z.ZSTREAM_IS_READY()
452
- end
453
- alias ended? :closed?
454
-
455
- def close()
456
- if (!@z.ZSTREAM_IS_READY())
457
- warn("attempt to close uninitialized zstream ignored.")
458
- return nil
459
- end
460
- if (@z.flags & ZSTREAM_FLAG_IN_STREAM).nonzero?
461
- warn("attempt to close unfinished zstream reset forced.")
462
- @z.input = nil
463
- end
464
-
465
- @z.input = nil
466
- err = send(@z.func.end,@z.stream)
467
- if (err != Z_OK)
468
- raise_zlib_error(err, @z.stream.msg)
469
- end
470
- @z.flags = 0
471
- end
472
- alias end :close
473
-
474
- def reset()
475
- err = send(@z.func.reset,@z.stream)
476
- if err != Z_OK
477
- raise_zlib_error(err, @z.stream.msg)
478
- end
479
- @z.flags = ZSTREAM_FLAG_READY
480
- @z.buf = nil
481
- @z.stream.next_out = 0
482
- @z.stream.avail_out = 0
483
- @z.input = nil
484
- end
485
-
486
- def finish()
487
- @z.zstream_run("", 0, Z_FINISH)
488
- @z.zstream_detach_buffer()
489
- end
490
-
491
- def flush_next_in
492
- @z.zstream_detach_input
493
- end
494
-
495
- def flush_next_out
496
- @z.zstream_detach_buffer
497
- end
498
-
499
- def initialize
500
- @z = nil
501
- ObjectSpace.define_finalizer self, @@final.call(@z)
502
- end
503
-
504
- end
505
-
506
- class Deflate < ZStream
507
-
508
- def self.deflate_run(src)
509
- @z.zstream_run(src,src.length,Z_FINISH)
510
- return @z.zstream_detach_buffer()
511
- end
512
-
513
- def self.deflate(src,level=Z_DEFAULT_COMPRESSION)
514
- @z = ZStream.new
515
- @z.zstream_init(DeflateFuncs)
516
- err = deflateInit(@z.stream, level)
517
- if (err != Z_OK)
518
- raise_zlib_error(err, @z.stream.msg)
519
- end
520
- @z.ZSTREAM_READY()
521
-
522
- begin
523
- dst = deflate_run(src)
524
- ensure
525
- @z.zstream_end()
526
- end
527
- dst
528
- end
529
-
530
- def initialize(level=Z_DEFAULT_COMPRESSION,wbits=MAX_WBITS,memlevel=DEF_MEM_LEVEL,strategy=Z_DEFAULT_STRATEGY)
531
- @z = ZStream.new
532
- @z.zstream_init(DeflateFuncs)
533
- err = deflateInit2(@z.stream,level,Z_DEFLATED,wbits,memlevel,strategy)
534
- if (err != Z_OK)
535
- raise_zlib_error(err, @z.stream.msg)
536
- end
537
- @z.ZSTREAM_READY()
538
- end
539
-
540
- def initialize_copy(orig)
541
- z1 = @z
542
- z2 = orig.z
543
- err = deflateCopy(z1.stream, z2.stream)
544
- if (err != Z_OK)
545
- raise_zlib_error(err, 0)
546
- end
547
- z1.flags = z2.flags
548
- end
549
-
550
- def do_deflate(src,flush)
551
- if src.nil?
552
- @z.zstream_run('',0,Z_FINISH)
553
- return
554
- end
555
- if (flush != Z_NO_FLUSH || (src && src.length>0))
556
- @z.zstream_run(src,src.length,flush)
557
- end
558
- end
559
- private :do_deflate
560
-
561
- def deflate(src,flush=Z_NO_FLUSH)
562
- do_deflate(src,flush)
563
- @z.zstream_detach_buffer
564
- end
565
-
566
- def <<(src)
567
- do_deflate(src,Z_NO_FLUSH)
568
- self
569
- end
570
-
571
- def flush(v_flush)
572
- if(v_flush != Z_NO_FLUSH)
573
- @z.zstream_run("", 0, flush)
574
- end
575
- @z.zstream_detach_buffer()
576
- end
577
-
578
- def params(level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY)
579
- err = deflateParams(@z.stream, level, strategy)
580
- while (err == Z_BUF_ERROR)
581
- warn("deflateParams() returned Z_BUF_ERROR")
582
- @z.zstream_expand_buffer()
583
- err = deflateParams(@z.stream, level, strategy)
584
- end
585
- if (err != Z_OK)
586
- raise_zlib_error(err, @z.stream.msg)
587
- end
588
-
589
- nil
590
- end
591
-
592
- def set_dictionary(dic)
593
- err = deflateSetDictionary(@z.stream,dic,dic.length)
594
- if (err != Z_OK)
595
- raise_zlib_error(err, @z.stream.msg)
596
- end
597
- end
598
-
599
- end
600
-
601
- class Inflate < ZStream
602
-
603
- def self.inflate_run(src)
604
- @z.zstream_run(src,src.length,Z_SYNC_FLUSH)
605
- @z.zstream_run('',0,Z_FINISH)
606
- @z.zstream_detach_buffer()
607
- end
608
-
609
- def self.inflate(src)
610
- @z = ZStream.new
611
- @z.zstream_init(InflateFuncs)
612
- err = inflateInit(@z.stream)
613
- if (err != Z_OK)
614
- raise_zlib_error(err, @z.stream.msg)
615
- end
616
- @z.ZSTREAM_READY()
617
- begin
618
- dst = inflate_run(src)
619
- ensure
620
- @z.zstream_end
621
- end
622
- dst
623
- end
624
-
625
- def do_inflate(src)
626
- if(src.nil?)
627
- @z.zstream_run("", 0, Z_FINISH)
628
- return
629
- end
630
- if (src.length>0)
631
- @z.zstream_run(src,src.length,Z_SYNC_FLUSH)
632
- end
633
- end
634
- private :do_inflate
635
-
636
- def initialize(wbits=MAX_WBITS)
637
- @z = ZStream.new
638
- @z.zstream_init(InflateFuncs)
639
- err = inflateInit2(@z.stream, wbits)
640
- if (err != Z_OK)
641
- raise_zlib_error(err, @z.stream.msg)
642
- end
643
- @z.ZSTREAM_READY()
644
- end
645
-
646
- def inflate(src)
647
- if (@z.ZSTREAM_IS_FINISHED())
648
- if src.nil?
649
- dst = @z.zstream_detach_buffer()
650
- else
651
- @z.zstream_append_buffer(src,src.lenth)
652
- dst = ''
653
- end
654
- else
655
- do_inflate(src)
656
- dst = @z.zstream_detach_buffer()
657
- if (@z.ZSTREAM_IS_FINISHED())
658
- @z.zstream_passthrough_input()
659
- end
660
- end
661
- if block_given?
662
- yield dst
663
- else
664
- dst
665
- end
666
- end
667
-
668
- def <<(src)
669
- if @z.ZSTREAM_IS_FINISHED()
670
- if src
671
- @z.zstream_append_buffer(src,src.length)
672
- end
673
- else
674
- do_inflate(src)
675
- if @z.ZSTREAM_IS_FINISHED()
676
- @z.zstream_passthrough_input()
677
- end
678
- end
679
- self
680
- end
681
-
682
- def sync
683
- raise GzipFile::Error,"closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
684
- return @z.zstream_sync(src,src.length)
685
- end
686
-
687
- def sync_point?()
688
- err = inflateSyncPoint(@z.stream)
689
- return true if err == 1
690
-
691
- if err != Z_OK
692
- raise_zlib_error(err, @z.stream.msg)
693
- end
694
-
695
- false
696
- end
697
-
698
- def set_dictionary(dic)
699
- src = dic
700
- err = inflateSetDictionary(@z.stream,src,src.length)
701
-
702
- if err != Z_OK
703
- raise_zlib_error(err, @z.stream.msg)
704
- end
705
-
706
- dic
707
- end
708
-
709
- end
710
-
711
- class GzipFile
712
- GZ_MAGIC1 = 0x1f
713
- GZ_MAGIC2 = 0x8b
714
- GZ_METHOD_DEFLATE = 8
715
- GZ_FLAG_MULTIPART = 0x2
716
- GZ_FLAG_EXTRA = 0x4
717
- GZ_FLAG_ORIG_NAME = 0x8
718
- GZ_FLAG_COMMENT = 0x10
719
- GZ_FLAG_ENCRYPT = 0x20
720
- GZ_FLAG_UNKNOWN_MASK = 0xc0
721
-
722
- GZ_EXTRAFLAG_FAST = 0x4
723
- GZ_EXTRAFLAG_SLOW = 0x2
724
-
725
- OS_CODE = OS_UNIX
726
-
727
- GZFILE_FLAG_SYNC = ZSTREAM_FLAG_UNUSED
728
- GZFILE_FLAG_HEADER_FINISHED = (ZSTREAM_FLAG_UNUSED << 1)
729
- GZFILE_FLAG_FOOTER_FINISHED = (ZSTREAM_FLAG_UNUSED << 2)
730
-
731
- def GZFILE_IS_FINISHED(gz)
732
- gz.z.ZSTREAM_IS_FINISHED() && (gz.z.buf.nil? || gz.z.buf.offset.zero?)
733
- end
734
-
735
- GZFILE_READ_SIZE = 2048
736
-
737
- class Error < Zlib::Error
738
- end
739
-
740
- class NoFooter < Error
741
- end
742
-
743
- class CRCError < Error
744
- end
745
-
746
- class LengthError < Error
747
- end
748
-
749
- Gzfile = Struct.new(:z,:io,:level,:mtime,:os_code,:orig_name,:comment,:crc,:lineno,:ungetc,:end)
750
-
751
- def gzfile_close(closeflag)
752
- io = @gz.io
753
- send(@gz.end)
754
-
755
- @gz.io = nil
756
- @gz.orig_name = nil
757
- @gz.comment = nil
758
-
759
- if closeflag && defined?(io.close)
760
- io.close
761
- end
762
- end
763
-
764
- def gzfile_ensure_close()
765
- if @gz.z.ZSTREAM_IS_READY()
766
- gzfile_close(true)
767
- end
768
- nil
769
- end
770
-
771
- def self.wrap(io, level=Z_DEFAULT_COMPRESSION, strategy=Z_DEFAULT_STRATEGY)
772
- obj = new(io,level,strategy)
773
- if block_given?
774
- begin
775
- yield(obj)
776
- ensure
777
- obj.gzfile_ensure_close()
778
- end
779
- else
780
- return obj
781
- end
782
- end
783
-
784
- def to_io
785
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
786
- @gz.io
787
- end
788
-
789
- def crc
790
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
791
- @gz.crc
792
- end
793
-
794
- def mtime
795
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
796
- Time.at(@gz.mtime)
797
- end
798
-
799
- def level
800
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
801
- @gz.level
802
- end
803
-
804
- def os_code
805
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
806
- @gz.os_code
807
- end
808
-
809
- def orig_name
810
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
811
- @gz.orig_name ? @gz.orig_name.dup : nil
812
- end
813
-
814
- def comment
815
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
816
- @gz.comment ? @gz.comment.dup : nil
817
- end
818
-
819
- def close
820
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
821
- gzfile_close(true)
822
- @gz.io
823
- end
824
-
825
- def finish
826
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
827
- gzfile_close(false)
828
- @gz.io
829
- end
830
-
831
- def closed?
832
- @gz.io.nil?
833
- end
834
-
835
- def sync
836
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
837
- !(@gz.z.flags & GZFILE_FLAG_SYNC).zero?
838
- end
839
-
840
- def sync=(mode)
841
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
842
- if(mode)
843
- @gz.z.flags |= GZFILE_FLAG_SYNC
844
- else
845
- @gz.z.flags &= ~GZFILE_FLAG_SYNC
846
- end
847
- mode
848
- end
849
-
850
- def self.gzfile_s_open(filename,mode,level,strategy,&blk)
851
- io = File.open(filename,mode)
852
- self.wrap(io,level,strategy,&blk)
853
- end
854
-
855
- private
856
-
857
- def gzfile_new(funcs,endfunc)
858
- @gz = Gzfile.new
859
- @gz.z = ZStream.new
860
- @gz.z.zstream_init(funcs)
861
- @gz.io = nil
862
- @gz.level = 0
863
- @gz.mtime = 0
864
- @gz.os_code = OS_CODE
865
- @gz.orig_name = nil
866
- @gz.comment = nil
867
- @gz.crc = crc32(0,nil,0)
868
- @gz.lineno = 0
869
- @gz.ungetc = 0
870
- @gz.end = endfunc
871
- self
872
- end
873
-
874
- def gzfile_reset()
875
- @gz.z.zstream_reset
876
- @gz.crc = crc32(0,nil,0)
877
- @gz.lineno = 0
878
- @gz.ungetc = 0
879
- end
880
-
881
- def gzfile_get16(src)
882
- src.unpack('v').first
883
- end
884
-
885
- def gzfile_get32(src)
886
- src.unpack('V').first
887
- end
888
-
889
- def gzfile_set32(n)
890
- [n].pack('V')
891
- end
892
-
893
- def gzfile_make_header
894
- buf = 0.chr * 10
895
- flags = 0
896
- extraflags = 0
897
- if @gz.orig_name
898
- flags |= GZ_FLAG_ORIG_NAME
899
- end
900
- if @gz.comment
901
- flags |= GZ_FLAG_COMMENT
902
- end
903
- if @gz.mtime.zero?
904
- @gz.mtime = Time.now.to_i
905
- end
906
- if (@gz.level == Z_BEST_SPEED)
907
- extraflags |= GZ_EXTRAFLAG_FAST
908
- elsif (@gz.level == Z_BEST_COMPRESSION)
909
- extraflags |= GZ_EXTRAFLAG_SLOW
910
- end
911
- buf[0] = GZ_MAGIC1.chr
912
- buf[1] = GZ_MAGIC2.chr
913
- buf[2] = GZ_METHOD_DEFLATE.chr
914
- buf[3] = flags.chr
915
- buf[4,4] = gzfile_set32(@gz.mtime)
916
- buf[8] = extraflags.chr
917
- buf[9] = @gz.os_code.chr
918
- @gz.z.zstream_append_buffer(buf,buf.length)
919
-
920
- if @gz.orig_name
921
- @gz.z.zstream_append_buffer(@gz.orig_name,@gz.orig_name.length)
922
- @gz.z.zstream_append_buffer("\0", 1)
923
- end
924
- if @gz.comment
925
- @gz.z.zstream_append_buffer(@gz.comment,@gz.comment.length)
926
- @gz.z.zstream_append_buffer("\0", 1)
927
- end
928
-
929
- @gz.z.flags |= GZFILE_FLAG_HEADER_FINISHED
930
- end
931
-
932
- def gzfile_make_footer()
933
- buf = 0.chr * 8
934
- buf[0,4] = gzfile_set32(@gz.crc)
935
- buf[4,4] = gzfile_set32(@gz.z.stream.total_in)
936
- @gz.z.zstream_append_buffer(buf, buf.length)
937
- @gz.z.flags |= GZFILE_FLAG_FOOTER_FINISHED
938
- end
939
-
940
- def gzfile_read_header()
941
- if !gzfile_read_raw_ensure(10)
942
- raise GzipFile::Error, "not in gzip format"
943
- end
944
-
945
- head = @gz.z.input
946
-
947
- if (head[0].ord != GZ_MAGIC1 || head[1].ord != GZ_MAGIC2)
948
- raise GzipFile::Error, "not in gzip format"
949
- end
950
- if (head[2].ord != GZ_METHOD_DEFLATE)
951
- raise GzipFile::Error, "unsupported compression method #{head[2].ord}"
952
- end
953
-
954
- flags = head[3].ord
955
- if (flags & GZ_FLAG_MULTIPART).nonzero?
956
- raise GzipFile::Error, "multi-part gzip file is not supported"
957
- elsif (flags & GZ_FLAG_ENCRYPT).nonzero?
958
- raise GzipFile::Error, "encrypted gzip file is not supported"
959
- elsif (flags & GZ_FLAG_UNKNOWN_MASK).nonzero?
960
- raise GzipFile::Error, "unknown flags 0x%02x" % flags
961
- end
962
-
963
- if (head[8].ord & GZ_EXTRAFLAG_FAST).nonzero?
964
- @gz.level = Z_BEST_SPEED
965
- elsif (head[8].ord & GZ_EXTRAFLAG_SLOW).nonzero?
966
- @gz.level = Z_BEST_COMPRESSION
967
- else
968
- @gz.level = Z_DEFAULT_COMPRESSION
969
- end
970
-
971
- @gz.mtime = gzfile_get32(head[4,4])
972
- @gz.os_code = head[9].ord
973
- @gz.z.zstream_discard_input(10)
974
-
975
- if (flags & GZ_FLAG_EXTRA).nonzero?
976
- if !gzfile_read_raw_ensure(2)
977
- raise GzipFile::Error, "unexpected end of file"
978
- end
979
- len = gzfile_get16(@gz.z.input)
980
- if !gzfile_read_raw_ensure(2 + len)
981
- raise GzipFile::Error, "unexpected end of file"
982
- end
983
- @gz.z.zstream_discard_input(2 + len)
984
- end
985
- if (flags & GZ_FLAG_ORIG_NAME).nonzero?
986
- ap = gzfile_read_raw_until_zero(0)
987
- len = ap
988
- @gz.orig_name = @gz.z.input[0,len]
989
- @gz.z.zstream_discard_input(len + 1)
990
- end
991
- if (flags & GZ_FLAG_COMMENT).nonzero?
992
- ap = gzfile_read_raw_until_zero(0)
993
- len = ap
994
- @gz.comment = @gz.z.input[0,len]
995
- @gz.z.zstream_discard_input(len + 1)
996
- end
997
-
998
- if (@gz.z.input && @gz.z.input.length > 0)
999
- @gz.z.zstream_run(0, 0, Z_SYNC_FLUSH)
1000
- end
1001
- end
1002
-
1003
- def gzfile_check_footer()
1004
- @gz.z.flags |= GZFILE_FLAG_FOOTER_FINISHED
1005
-
1006
- if (!gzfile_read_raw_ensure(8))
1007
- raise NoFooter, "footer is not found"
1008
- end
1009
- crc = gzfile_get32(@gz.z.input)
1010
- length = gzfile_get32(@gz.z.input[4,4])
1011
- @gz.z.stream.total_in += 8
1012
- @gz.z.zstream_discard_input(8)
1013
- if (@gz.crc != crc)
1014
- raise CRCError, "invalid compressed data -- crc error"
1015
- end
1016
- if (@gz.z.stream.total_out != length)
1017
- raise LengthError, "invalid compressed data -- length error"
1018
- end
1019
- end
1020
-
1021
- def gzfile_calc_crc(str)
1022
- if (str.length <= @gz.ungetc)
1023
- @gz.ungetc -= str.length
1024
- else
1025
- @gz.crc = crc32(@gz.crc, str[@gz.ungetc,str.length - @gz.ungetc],
1026
- str.length - @gz.ungetc)
1027
- @gz.ungetc = 0
1028
- end
1029
- end
1030
-
1031
- end
1032
-
1033
- class GzipWriter < GzipFile
1034
-
1035
- def mtime=(mtime)
1036
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1037
-
1038
- if (@gz.z.flags & GZFILE_FLAG_HEADER_FINISHED).nonzero?
1039
- raise GzipFile::Error,"header is already written"
1040
- end
1041
-
1042
- @gz.mtime = mtime.to_i
1043
- end
1044
-
1045
- def orig_name=(str)
1046
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1047
-
1048
- if (@gz.z.flags & GZFILE_FLAG_HEADER_FINISHED).nonzero?
1049
- raise GzipFile::Error,"header is already written"
1050
- end
1051
-
1052
- ap = str[0.chr]
1053
- @gz.orig_name = ap ? str[0,ap] : str.dup
1054
- end
1055
-
1056
- def comment=(str)
1057
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1058
-
1059
- if (@gz.z.flags & GZFILE_FLAG_HEADER_FINISHED).nonzero?
1060
- raise GzipFile::Error,"header is already written"
1061
- end
1062
-
1063
- @gz.comment = str.dup
1064
- end
1065
-
1066
- def pos
1067
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1068
- @gz.z.stream.total_in
1069
- end
1070
-
1071
- alias tell :pos
1072
-
1073
- def self.open(filename, level=Z_DEFAULT_COMPRESSION, strategy=Z_DEFAULT_STRATEGY, &blk)
1074
- GzipWriter.gzfile_s_open(filename, 'wb', level, strategy, &blk)
1075
- end
1076
-
1077
- def initialize(io, level=nil, strategy=nil)
1078
- level = Z_DEFAULT_COMPRESSION if level.nil?
1079
- strategy = Z_DEFAULT_STRATEGY if strategy.nil?
1080
-
1081
- gzfile_new(DeflateFuncs, :gzfile_writer_end)
1082
- @gz.level = level
1083
-
1084
- err = deflateInit2(
1085
- @gz.z.stream,
1086
- @gz.level,
1087
- Z_DEFLATED,
1088
- -MAX_WBITS,
1089
- DEF_MEM_LEVEL,
1090
- strategy
1091
- )
1092
-
1093
- if err != Z_OK
1094
- raise_zlib_error(err, @gz.stream.msg)
1095
- end
1096
-
1097
- @gz.io = io
1098
- @gz.z.ZSTREAM_READY()
1099
- end
1100
-
1101
- def flush(v_flush=Z_SYNC_FLUSH)
1102
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1103
-
1104
- if v_flush != Z_NO_FLUSH
1105
- @gz.z.zstream_run("", 0, v_flush)
1106
- end
1107
-
1108
- gzfile_write_raw()
1109
-
1110
- if defined?(@gz.io.flush)
1111
- @gz.io.flush()
1112
- end
1113
-
1114
- self
1115
- end
1116
-
1117
- def write(str)
1118
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1119
- str = str.to_s
1120
- gzfile_write(str, str.length)
1121
- str.length
1122
- end
1123
-
1124
- def putc(ch)
1125
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1126
- gzfile_write(ch.chr, 1)
1127
- ch
1128
- end
1129
-
1130
- def <<(str)
1131
- @gz.io << str
1132
- end
1133
-
1134
- def printf(*arg)
1135
- @gz.io.printf(*arg)
1136
- end
1137
-
1138
- def print(*arg)
1139
- @gz.io.print(*arg)
1140
- end
1141
-
1142
- def puts(str)
1143
- @gz.io.puts(str)
1144
- end
1145
-
1146
- def gzfile_write_raw
1147
- if (@gz.z.buf.offset > 0)
1148
- str = @gz.z.zstream_detach_buffer()
1149
- @gz.io.write(str)
1150
- if ((@gz.z.flags & GZFILE_FLAG_SYNC).nonzero? && defined?(@gz.io.flush))
1151
- @gz.io.flush()
1152
- end
1153
- end
1154
- end
1155
-
1156
- private :gzfile_write_raw
1157
-
1158
- def gzfile_write(str,len)
1159
- if (@gz.z.flags & GZFILE_FLAG_HEADER_FINISHED).zero?
1160
- gzfile_make_header()
1161
- end
1162
-
1163
- if (len > 0 || (@gz.z.flags & GZFILE_FLAG_SYNC))
1164
- @gz.crc = crc32(@gz.crc, str, len)
1165
- @gz.z.zstream_run(str, len, (@gz.z.flags & GZFILE_FLAG_SYNC).nonzero? ?
1166
- Z_SYNC_FLUSH : Z_NO_FLUSH)
1167
- end
1168
- gzfile_write_raw()
1169
- end
1170
-
1171
- private :gzfile_write
1172
-
1173
- def gzfile_writer_end_run
1174
- if (@gz.z.flags & GZFILE_FLAG_HEADER_FINISHED).zero?
1175
- gzfile_make_header()
1176
- end
1177
- @gz.z.zstream_run("", 0, Z_FINISH)
1178
- gzfile_make_footer()
1179
- gzfile_write_raw()
1180
-
1181
- return nil
1182
- end
1183
-
1184
- def gzfile_writer_end
1185
- return if @gz.z.ZSTREAM_IS_CLOSING()
1186
- @gz.z.flags |= ZSTREAM_FLAG_CLOSING
1187
- begin
1188
- gzfile_writer_end_run()
1189
- ensure
1190
- @gz.z.zstream_end()
1191
- end
1192
- end
1193
- end
1194
-
1195
- class GzipReader < GzipFile
1196
- include Enumerable
1197
-
1198
- def lineno
1199
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1200
- @gz.lineno
1201
- end
1202
-
1203
- def lineno=(lineno)
1204
- raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1205
- @gz.lineno = lineno
1206
- end
1207
-
1208
- def eof
1209
- raise GzipFile::Error,"closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
1210
- GZFILE_IS_FINISHED(@gz)
1211
- end
1212
- alias eof? :eof
1213
-
1214
- def pos
1215
- if @gz.z.buf.nil?
1216
- @gz.z.stream.total_out
1217
- else
1218
- @gz.z.stream.total_out - @gz.z.buf.offset
1219
- end
1220
- end
1221
- alias tell :pos
1222
-
1223
- def self.open(filename,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY,&blk)
1224
- GzipReader.gzfile_s_open(filename,"rb",level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY,&blk)
1225
- end
1226
-
1227
- def initialize(io,level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY)
1228
- gzfile_new(InflateFuncs, :gzfile_reader_end)
1229
- @gz.level = level
1230
- err = inflateInit2(@gz.z.stream, -MAX_WBITS)
1231
- if (err != Z_OK)
1232
- raise_zlib_error(err, @gz.stream.msg)
1233
- end
1234
- @gz.io = io
1235
- @gz.z.ZSTREAM_READY()
1236
- gzfile_read_header()
1237
- self
1238
- end
1239
-
1240
- def rewind()
1241
- gzfile_reader_rewind()
1242
- return 0
1243
- end
1244
-
1245
- def unused()
1246
- gzfile_reader_get_unused()
1247
- end
1248
-
1249
- def read(len=nil)
1250
- if len.nil?
1251
- return gzfile_read_all()
1252
- end
1253
-
1254
- if len < 0
1255
- raise ArgumentError, "negative length #{len} given"
1256
- end
1257
-
1258
- return gzfile_read(len)
1259
- end
1260
-
1261
- def getc()
1262
- dst = gzfile_read(1)
1263
- dst ? dst[0] : dst
1264
- end
1265
-
1266
- def readchar()
1267
- dst = getc()
1268
- if dst.nil?
1269
- raise EOFError, "end of file reached"
1270
- end
1271
- dst
1272
- end
1273
-
1274
- def each_byte()
1275
- while (c = getc)
1276
- yield(c)
1277
- end
1278
- nil
1279
- end
1280
-
1281
- def ungetc(ch)
1282
- gzfile_ungetc(ch)
1283
- nil
1284
- end
1285
-
1286
- def gets(rs=$/)
1287
- dst = gzreader_gets(rs)
1288
- $_ = dst if dst
1289
- dst
1290
- end
1291
-
1292
- def readline(rs=$/)
1293
- gets(rs)
1294
- end
1295
-
1296
- def each(rs=$/)
1297
- while (str = gzreader_gets(rs))
1298
- yield(str)
1299
- end
1300
- self
1301
- end
1302
- alias each_line :each
1303
-
1304
- def readlines(rs=$/)
1305
- dst = []
1306
- while str = gzreader_gets(rs)
1307
- dst.push(str)
1308
- end
1309
- dst
1310
- end
1311
-
1312
- private
1313
-
1314
- def gzfile_reader_end_run()
1315
- if (GZFILE_IS_FINISHED(@gz) && (@gz.z.flags &
1316
- GZFILE_FLAG_FOOTER_FINISHED).zero?)
1317
- gzfile_check_footer()
1318
- end
1319
- nil
1320
- end
1321
-
1322
- def gzfile_reader_end()
1323
- return if @gz.z.ZSTREAM_IS_CLOSING()
1324
- @gz.z.flags |= ZSTREAM_FLAG_CLOSING
1325
- begin
1326
- gzfile_reader_end_run()
1327
- ensure
1328
- @gz.z.zstream_end()
1329
- end
1330
- end
1331
-
1332
- def gzfile_ungetc(c)
1333
- @gz.z.zstream_buffer_ungetc(c)
1334
- @gz.ungetc+=1
1335
- end
1336
-
1337
- def gzfile_reader_rewind
1338
- n = @gz.z.stream.total_in
1339
- if @gz.z.input
1340
- n += @gz.z.input.length
1341
- end
1342
- @gz.io.seek(-n,1)
1343
- gzfile_reset()
1344
- end
1345
-
1346
- def gzfile_reader_get_unused()
1347
- return nil if (!@gz.z.ZSTREAM_IS_READY())
1348
- return nil if (!GZFILE_IS_FINISHED(@gz))
1349
- if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
1350
- gzfile_check_footer()
1351
- end
1352
- return nil if @gz.z.input.nil?
1353
- @gz.z.input.dup
1354
- end
1355
-
1356
- def rscheck(rsptr,rslen,rs)
1357
- raise RuntimeError, "rs modified" if rs != rsptr
1358
- end
1359
-
1360
- def gzreader_gets(rs=$/)
1361
- if rs && rs.class != String
1362
- raise TypeError,"wrong argument type #{rs.class} (expected String)"
1363
- end
1364
- if rs.nil?
1365
- dst = gzfile_read_all()
1366
- @gz.lineno += 1 if dst.length.nonzero?
1367
- return dst
1368
- end
1369
- if rs.length.zero?
1370
- rsptr = "\n\n"
1371
- rslen = 2
1372
- rspara = true
1373
- else
1374
- rsptr = rs
1375
- rslen = rs.length
1376
- rspara = false
1377
- end
1378
- if rspara
1379
- gzreader_skip_linebreaks
1380
- end
1381
- while (@gz.z.buf.offset < rslen)
1382
- if (@gz.z.ZSTREAM_IS_FINISHED())
1383
- @gz.lineno+=1 if (@gz.z.buf.offset > 0)
1384
- return gzfile_read(rslen)
1385
- end
1386
- gzfile_read_more()
1387
- end
1388
-
1389
- ap = 0
1390
- n = rslen
1391
- loop do
1392
- if (n > @gz.z.buf.offset)
1393
- break if (@gz.z.ZSTREAM_IS_FINISHED())
1394
- gzfile_read_more()
1395
- ap = n - rslen
1396
- end
1397
-
1398
- rscheck(rsptr, rslen, rs) if (!rspara)
1399
- res = @gz.z.buf.buffer[ap,@gz.z.buf.offset - n + 1].index(rsptr[0])
1400
-
1401
- if res.nil?
1402
- n = @gz.z.buf.offset + 1
1403
- else
1404
- n += (res - ap)
1405
- ap = res
1406
- break if (rslen == 1 || @gz.z.buf.buffer[ap,rslen]==rsptr)
1407
- ap+=1
1408
- n+=1
1409
- end
1410
- end
1411
-
1412
- @gz.lineno+=1
1413
- dst = gzfile_read(n)
1414
- if (rspara)
1415
- gzreader_skip_linebreaks()
1416
- end
1417
- dst
1418
- end
1419
-
1420
- def gzfile_read(len)
1421
- if len < 0
1422
- raise ArgumentError, "negative length #{len} given"
1423
- end
1424
-
1425
- if len.zero?
1426
- return ""
1427
- end
1428
-
1429
- while (!@gz.z.ZSTREAM_IS_FINISHED() && @gz.z.buf.offset < len)
1430
- gzfile_read_more()
1431
- end
1432
-
1433
- if (GZFILE_IS_FINISHED(@gz))
1434
- if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
1435
- gzfile_check_footer()
1436
- end
1437
- return nil
1438
- end
1439
-
1440
- dst = @gz.z.zstream_shift_buffer(len)
1441
- gzfile_calc_crc(dst)
1442
- dst
1443
- end
1444
-
1445
- def gzfile_read_all()
1446
- while (!@gz.z.ZSTREAM_IS_FINISHED())
1447
- gzfile_read_more()
1448
- end
1449
- if (GZFILE_IS_FINISHED(@gz))
1450
- if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
1451
- gzfile_check_footer()
1452
- end
1453
- return ''
1454
- end
1455
-
1456
- dst = @gz.z.zstream_detach_buffer()
1457
- gzfile_calc_crc(dst)
1458
- dst
1459
- end
1460
-
1461
- def gzfile_read_raw()
1462
- str = @gz.io.read(GZFILE_READ_SIZE)
1463
- if str && str.class != String
1464
- raise TypeError,"wrong argument type #{rs.class} (expected String)"
1465
- end
1466
- str
1467
- end
1468
-
1469
- def gzfile_read_raw_ensure(size)
1470
- while @gz.z.input.nil? || @gz.z.input.length < size
1471
- str = gzfile_read_raw()
1472
- return false if str.nil?
1473
- @gz.z.zstream_append_input(str,str.length)
1474
- end
1475
- true
1476
- end
1477
-
1478
- def gzfile_read_raw_until_zero(offset)
1479
- ap = nil
1480
-
1481
- loop do
1482
- ap = @gz.z.input[offset, @gz.z.input.length-offset].index(0.chr)
1483
- break if ap
1484
- str = gzfile_read_raw()
1485
-
1486
- raise Error, "unexpected end of file" if str.nil?
1487
-
1488
- offset = @gz.z.input.length
1489
- @gz.z.zstream_append_input(str,str.length)
1490
- end
1491
-
1492
- ap
1493
- end
1494
-
1495
- def gzfile_read_more
1496
- while (!@gz.z.ZSTREAM_IS_FINISHED())
1497
- str = gzfile_read_raw()
1498
- if str.nil?
1499
- if (!@gz.z.ZSTREAM_IS_FINISHED())
1500
- raise Error, "unexpected end of file"
1501
- end
1502
- break
1503
- end
1504
- if (str.length > 0)
1505
- @gz.z.zstream_run(str, str.length,Z_SYNC_FLUSH)
1506
- end
1507
- break if (@gz.z.buf.offset > 0)
1508
- end
1509
- @gz.z.buf.offset
1510
- end
1511
- end
1512
-
1513
72
  module_function
1514
73
 
1515
74
  def zlib_version
1516
75
  zlibVersion()
1517
76
  end
1518
77
 
1519
- def adler32(string=nil, adler=nil)
78
+ def adler32(string = nil, adler = nil)
1520
79
  if adler
1521
80
  check_long_range adler
1522
81
  sum = adler
1523
82
  elsif string.nil?
1524
83
  sum = 0
1525
84
  else
1526
- sum = Rbzlib.adler32(0,nil)
85
+ sum = Rbzlib.adler32(0, nil)
1527
86
  end
1528
87
 
1529
88
  if string.nil?
1530
- sum = Rbzlib.adler32(sum,nil)
89
+ sum = Rbzlib.adler32(sum, nil)
1531
90
  else
1532
- sum = Rbzlib.adler32(sum,string,string.length)
91
+ sum = Rbzlib.adler32(sum, string, string.length)
1533
92
  end
1534
93
  sum
1535
94
  end
1536
95
 
1537
- def crc32(string=nil, crc=nil)
96
+ def crc32(string = nil, crc = nil)
1538
97
  if crc
1539
98
  check_long_range crc
1540
99
  sum = crc
1541
100
  elsif string.nil?
1542
101
  sum = 0
1543
102
  else
1544
- sum = Rbzlib.crc32(0,nil)
103
+ sum = Rbzlib.crc32(0, nil)
1545
104
  end
1546
105
 
1547
106
  if string.nil?
1548
- sum = Rbzlib.crc32(sum,nil)
107
+ sum = Rbzlib.crc32(sum, nil)
1549
108
  else
1550
- sum = Rbzlib.crc32(sum,string,string.length)
109
+ sum = Rbzlib.crc32(sum, string, string.length)
1551
110
  end
1552
111
  sum
1553
112
  end