Bug #9790 ยป zlib-gzreader-each_file-9790.patch
| ext/zlib/zlib.c | ||
|---|---|---|
| 
         return gzfile_s_open(argc, argv, klass, "rb"); 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| 
      * Document-method: Zlib::GzipReader.each_file 
   | 
||
| 
      * 
   | 
||
| 
      * call-seq: 
   | 
||
| 
      *   Zlib::GzipReader.each_file(io, options = {}, &block) => nil 
   | 
||
| 
      * 
   | 
||
| 
      * Many gzip handling utilities support multiple concatenated files 
   | 
||
| 
      * in a single .gz file. Zlib::GzipReader instances only support 
   | 
||
| 
      * a single compressed file in .gz file, starting at the current 
   | 
||
| 
      * position in the .gz file.  Zlib::GzipReader.each_file yields 
   | 
||
| 
      * Zlib::GzipReader instances, one per file in the .gz file. 
   | 
||
| 
      * Example: 
   | 
||
| 
      * 
   | 
||
| 
      *   Zlib::GzipReader.each_file(io) do |gz| 
   | 
||
| 
      *     puts gz.read 
   | 
||
| 
      *   end 
   | 
||
| 
      */ 
   | 
||
| 
     static VALUE 
   | 
||
| 
     rb_gzreader_s_each_file(int argc, VALUE *argv, VALUE klass) 
   | 
||
| 
     { 
   | 
||
| 
         VALUE io, unused, obj; 
   | 
||
| 
         long pos; 
   | 
||
| 
         rb_check_arity(argc, 1, 2); 
   | 
||
| 
         io = argv[0]; 
   | 
||
| 
         do { 
   | 
||
| 
             obj = rb_funcallv(klass, rb_intern("new"), argc, argv); 
   | 
||
| 
             rb_yield(obj); 
   | 
||
| 
             rb_gzreader_read(0, 0, obj); 
   | 
||
| 
             pos = NUM2LONG(rb_funcall(io, rb_intern("pos"), 0)); 
   | 
||
| 
             unused = rb_gzreader_unused(obj); 
   | 
||
| 
             rb_gzfile_finish(obj); 
   | 
||
| 
             if (!NIL_P(unused)) { 
   | 
||
| 
                 pos -= NUM2LONG(rb_funcall(unused, rb_intern("length"), 0)); 
   | 
||
| 
                 rb_funcall(io, rb_intern("pos="), 1, LONG2NUM(pos)); 
   | 
||
| 
             } 
   | 
||
| 
         } while (pos < NUM2LONG(rb_funcall(io, rb_intern("size"), 0))); 
   | 
||
| 
         return Qnil; 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| 
      * Document-method: Zlib::GzipReader.new 
   | 
||
| 
      * 
   | 
||
| ... | ... | |
| 
         rb_define_method(cGzipWriter, "puts", rb_gzwriter_puts, -1); 
   | 
||
| 
         rb_define_singleton_method(cGzipReader, "open", rb_gzreader_s_open,-1); 
   | 
||
| 
         rb_define_singleton_method(cGzipReader, "each_file", rb_gzreader_s_each_file, -1); 
   | 
||
| 
         rb_define_alloc_func(cGzipReader, rb_gzreader_s_allocate); 
   | 
||
| 
         rb_define_method(cGzipReader, "initialize", rb_gzreader_initialize, -1); 
   | 
||
| 
         rb_define_method(cGzipReader, "rewind", rb_gzreader_rewind, 0); 
   | 
||
| test/zlib/test_zlib.rb | ||
|---|---|---|
| 
       end 
   | 
||
| 
       class TestZlibGzipFile < Test::Unit::TestCase 
   | 
||
| 
         def test_gzip_reader_each_file 
   | 
||
| 
           Tempfile.create("test_zlib_gzip_file_to_io") {|t| 
   | 
||
| 
             gz = Zlib::GzipWriter.new(t) 
   | 
||
| 
             gz.print("foo") 
   | 
||
| 
             gz.close 
   | 
||
| 
             t = File.open(t.path, 'ab') 
   | 
||
| 
             gz = Zlib::GzipWriter.new(t) 
   | 
||
| 
             gz.print("bar") 
   | 
||
| 
             gz.close 
   | 
||
| 
             results = [] 
   | 
||
| 
             t = File.open(t.path) 
   | 
||
| 
             Zlib::GzipReader.each_file(t) do |f| 
   | 
||
| 
               results << f.read 
   | 
||
| 
             end 
   | 
||
| 
             assert_equal(["foo", "bar"], results) 
   | 
||
| 
             t.close 
   | 
||
| 
           } 
   | 
||
| 
         end 
   | 
||
| 
         def test_to_io 
   | 
||
| 
           Tempfile.create("test_zlib_gzip_file_to_io") {|t| 
   | 
||
| 
             t.close 
   | 
||