yaz0 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/ext/yaz0/ext_yaz0.c +165 -0
- data/ext/yaz0/ext_yaz0.h +8 -0
- data/ext/yaz0/extconf.rb +11 -1
- data/lib/yaz0/version.rb +1 -1
- data/lib/yaz0/yaz0.bundle +0 -0
- data/lib/yaz0.rb +42 -0
- data/libyaz0/include/yaz0.h +34 -0
- data/libyaz0/src/libyaz0/CMakeLists.txt +3 -0
- data/libyaz0/src/libyaz0/compress.c +434 -0
- data/libyaz0/src/libyaz0/decompress.c +197 -0
- data/libyaz0/src/libyaz0/libyaz0.c +64 -0
- data/libyaz0/src/libyaz0/libyaz0.h +49 -0
- data/libyaz0/src/libyaz0/util.c +6 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/yaz0_spec.rb +39 -0
- data/yaz0.gemspec +13 -3
- metadata +19 -16
- data/.gitignore +0 -19
- data/.travis.yml +0 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/ext/yaz0/buffer.c +0 -29
- data/ext/yaz0/compress.c +0 -319
- data/ext/yaz0/decompress.c +0 -65
- data/ext/yaz0/yaz0.c +0 -48
- data/ext/yaz0/yaz0.h +0 -38
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4dea3dd6f151a4a0aeebb87258fd9ca033d92a91462ebe2ad9e121777c23aea5
         | 
| 4 | 
            +
              data.tar.gz: c9885eb2142c21af2026b226c3c2a4175e8b7f3f1ac745d013135b282c963703
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 483a8e9de03d2c6f0e5fea0a0be1b048a2b46641528e3b00e165effc7a2794d3b04aa84d8aa5d07c9509baee680ee7783cba3fd0fa44b2e9435c44fd03011904
         | 
| 7 | 
            +
              data.tar.gz: 243f77ffbd66fe1c0df94e474dcf92297e792bfb02fb3481e5518a5627c733c505cf5f282ff338a9d6a692ccd5d39e9c6f5b3984f364ac390d99976be454b572
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/ext/yaz0/ext_yaz0.c
    ADDED
    
    | @@ -0,0 +1,165 @@ | |
| 1 | 
            +
            #include "ext_yaz0.h"
         | 
| 2 | 
            +
            #include <stdio.h>
         | 
| 3 | 
            +
            #include <stdint.h>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            #define BUFSIZE 0x4000
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            static void ext_yaz0_stream_free(void*);
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            static VALUE class_yaz0_stream;
         | 
| 10 | 
            +
            static VALUE class_yaz0_error;
         | 
| 11 | 
            +
            static VALUE class_yaz0_error_bad_magic;
         | 
| 12 | 
            +
            static VALUE class_yaz0_error_end_of_file;
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            static struct rb_data_type_struct type_yaz0_stream = {
         | 
| 15 | 
            +
                "yaz0_stream",
         | 
| 16 | 
            +
                { NULL, ext_yaz0_stream_free, NULL },
         | 
| 17 | 
            +
                NULL,
         | 
| 18 | 
            +
                NULL,
         | 
| 19 | 
            +
                RUBY_TYPED_FREE_IMMEDIATELY
         | 
| 20 | 
            +
            };
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            static void
         | 
| 23 | 
            +
            ext_yaz0_stream_free(void* s)
         | 
| 24 | 
            +
            {
         | 
| 25 | 
            +
                yaz0Destroy((Yaz0Stream*)s);
         | 
| 26 | 
            +
            }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            static VALUE
         | 
| 29 | 
            +
            ext_yaz0_stream_alloc(VALUE klass)
         | 
| 30 | 
            +
            {
         | 
| 31 | 
            +
                Yaz0Stream* s;
         | 
| 32 | 
            +
                int ret;
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                ret = yaz0Init(&s);
         | 
| 35 | 
            +
                if (ret == YAZ0_OUT_OF_MEMORY)
         | 
| 36 | 
            +
                    rb_raise(rb_eNoMemError, "Out of memory");
         | 
| 37 | 
            +
                return TypedData_Wrap_Struct(klass, &type_yaz0_stream, s);
         | 
| 38 | 
            +
            }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            static void*
         | 
| 41 | 
            +
            run_NoGVL(void* arg)
         | 
| 42 | 
            +
            {
         | 
| 43 | 
            +
                return (void*)(intptr_t)yaz0Run((Yaz0Stream*)arg);
         | 
| 44 | 
            +
            }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            static VALUE
         | 
| 47 | 
            +
            run(VALUE self, VALUE io_in, VALUE io_out, int compress, int size, int level)
         | 
| 48 | 
            +
            {
         | 
| 49 | 
            +
                Yaz0Stream* s;
         | 
| 50 | 
            +
                VALUE buffer_in;
         | 
| 51 | 
            +
                VALUE buffer_out;
         | 
| 52 | 
            +
                VALUE tmp;
         | 
| 53 | 
            +
                int in_is_str;
         | 
| 54 | 
            +
                int ret;
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                in_is_str = TYPE(io_in) == T_STRING;
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                TypedData_Get_Struct(self, Yaz0Stream, &type_yaz0_stream, s);
         | 
| 59 | 
            +
                if (compress)
         | 
| 60 | 
            +
                    yaz0ModeCompress(s, size, level);
         | 
| 61 | 
            +
                else
         | 
| 62 | 
            +
                    yaz0ModeDecompress(s);
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                /* Init the buffers */
         | 
| 65 | 
            +
                if (!in_is_str)
         | 
| 66 | 
            +
                {
         | 
| 67 | 
            +
                    buffer_in = rb_str_new(NULL, 0);
         | 
| 68 | 
            +
                    rb_str_resize(buffer_in, BUFSIZE);
         | 
| 69 | 
            +
                    rb_gc_register_address(&buffer_in);
         | 
| 70 | 
            +
                    rb_funcall(io_in, rb_intern("read"), 2, INT2FIX(BUFSIZE), buffer_in);
         | 
| 71 | 
            +
                }
         | 
| 72 | 
            +
                else
         | 
| 73 | 
            +
                {
         | 
| 74 | 
            +
                    buffer_in = rb_obj_dup(io_in);
         | 
| 75 | 
            +
                    rb_gc_register_address(&buffer_in);
         | 
| 76 | 
            +
                }
         | 
| 77 | 
            +
                yaz0Input(s, RSTRING_PTR(buffer_in), (uint32_t)RSTRING_LEN(buffer_in));
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                buffer_out = rb_str_new(NULL, 0);
         | 
| 80 | 
            +
                rb_str_resize(buffer_out, BUFSIZE);
         | 
| 81 | 
            +
                rb_gc_register_address(&buffer_out);
         | 
| 82 | 
            +
                yaz0Output(s, RSTRING_PTR(buffer_out), BUFSIZE);
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                for (;;)
         | 
| 85 | 
            +
                {
         | 
| 86 | 
            +
                    ret = (int)(intptr_t)rb_thread_call_without_gvl(run_NoGVL, s, RUBY_UBF_IO, NULL);
         | 
| 87 | 
            +
                    switch (ret)
         | 
| 88 | 
            +
                    {
         | 
| 89 | 
            +
                    case YAZ0_NEED_AVAIL_IN:
         | 
| 90 | 
            +
                        /* Need more input */
         | 
| 91 | 
            +
                        if (in_is_str)
         | 
| 92 | 
            +
                        {
         | 
| 93 | 
            +
                            rb_gc_unregister_address(&buffer_in);
         | 
| 94 | 
            +
                            rb_gc_unregister_address(&buffer_out);
         | 
| 95 | 
            +
                            rb_raise(class_yaz0_error_end_of_file, "Unexpected end of file");
         | 
| 96 | 
            +
                        }
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                        tmp = rb_funcall(io_in, rb_intern("read"), 2, INT2FIX(BUFSIZE), buffer_in);
         | 
| 99 | 
            +
                        if (tmp == Qnil)
         | 
| 100 | 
            +
                        {
         | 
| 101 | 
            +
                            rb_gc_unregister_address(&buffer_in);
         | 
| 102 | 
            +
                            rb_gc_unregister_address(&buffer_out);
         | 
| 103 | 
            +
                            rb_raise(class_yaz0_error_end_of_file, "Unexpected end of file");
         | 
| 104 | 
            +
                        }
         | 
| 105 | 
            +
                        yaz0Input(s, RSTRING_PTR(buffer_in), (uint32_t)RSTRING_LEN(buffer_in));
         | 
| 106 | 
            +
                        break;
         | 
| 107 | 
            +
                    case YAZ0_NEED_AVAIL_OUT:
         | 
| 108 | 
            +
                        /* Need more output */
         | 
| 109 | 
            +
                        rb_str_set_len(buffer_out, yaz0OutputChunkSize(s));
         | 
| 110 | 
            +
                        rb_funcall(io_out, rb_intern("write"), 1, buffer_out);
         | 
| 111 | 
            +
                        rb_str_set_len(buffer_out, BUFSIZE);
         | 
| 112 | 
            +
                        yaz0Output(s, RSTRING_PTR(buffer_out), BUFSIZE);
         | 
| 113 | 
            +
                        break;
         | 
| 114 | 
            +
                    case YAZ0_BAD_MAGIC:
         | 
| 115 | 
            +
                        rb_gc_unregister_address(&buffer_in);
         | 
| 116 | 
            +
                        rb_gc_unregister_address(&buffer_out);
         | 
| 117 | 
            +
                        rb_raise(class_yaz0_error_bad_magic, "Bad magic");
         | 
| 118 | 
            +
                        break;
         | 
| 119 | 
            +
                    case YAZ0_OK:
         | 
| 120 | 
            +
                        goto end;
         | 
| 121 | 
            +
                    }
         | 
| 122 | 
            +
                }
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            end:
         | 
| 125 | 
            +
                /* There might still be unflushed output */
         | 
| 126 | 
            +
                rb_str_set_len(buffer_out, yaz0OutputChunkSize(s));
         | 
| 127 | 
            +
                rb_funcall(io_out, rb_intern("write"), 1, buffer_out);
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                rb_gc_unregister_address(&buffer_in);
         | 
| 130 | 
            +
                rb_gc_unregister_address(&buffer_out);
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                return Qnil;
         | 
| 133 | 
            +
            }
         | 
| 134 | 
            +
             | 
| 135 | 
            +
            static VALUE
         | 
| 136 | 
            +
            ext_yaz0_stream_raw_decompress(VALUE self, VALUE io_in, VALUE io_out)
         | 
| 137 | 
            +
            {
         | 
| 138 | 
            +
                return run(self, io_in, io_out, 0, 0, 0);
         | 
| 139 | 
            +
            }
         | 
| 140 | 
            +
             | 
| 141 | 
            +
            static VALUE
         | 
| 142 | 
            +
            ext_yaz0_stream_raw_compress(VALUE self, VALUE io_in, VALUE io_out, VALUE size, VALUE level)
         | 
| 143 | 
            +
            {
         | 
| 144 | 
            +
                Check_Type(size, T_FIXNUM);
         | 
| 145 | 
            +
                Check_Type(level, T_FIXNUM);
         | 
| 146 | 
            +
                return run(self, io_in, io_out, 1, FIX2INT(size), FIX2INT(level));
         | 
| 147 | 
            +
            }
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            void
         | 
| 150 | 
            +
            Init_yaz0(void)
         | 
| 151 | 
            +
            {
         | 
| 152 | 
            +
                VALUE mod;
         | 
| 153 | 
            +
                mod = rb_define_module("Yaz0");
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                /* Error classes */
         | 
| 156 | 
            +
                class_yaz0_error = rb_define_class_under(mod, "Error", rb_eStandardError);
         | 
| 157 | 
            +
                class_yaz0_error_bad_magic = rb_define_class_under(mod, "BadMagicError", class_yaz0_error);
         | 
| 158 | 
            +
                class_yaz0_error_end_of_file = rb_define_class_under(mod, "EndOfFileError", class_yaz0_error);
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                /* Stream */
         | 
| 161 | 
            +
                class_yaz0_stream = rb_define_class_under(mod, "Stream", rb_cObject);
         | 
| 162 | 
            +
                rb_define_alloc_func(class_yaz0_stream, ext_yaz0_stream_alloc);
         | 
| 163 | 
            +
                rb_define_method(class_yaz0_stream, "raw_decompress", ext_yaz0_stream_raw_decompress, 2);
         | 
| 164 | 
            +
                rb_define_method(class_yaz0_stream, "raw_compress", ext_yaz0_stream_raw_compress, 4);
         | 
| 165 | 
            +
            }
         | 
    
        data/ext/yaz0/ext_yaz0.h
    ADDED
    
    
    
        data/ext/yaz0/extconf.rb
    CHANGED
    
    | @@ -1,3 +1,13 @@ | |
| 1 1 | 
             
            require "mkmf"
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            extension_name = 'yaz0/yaz0'
         | 
| 4 | 
            +
            dir_config(extension_name)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            libyaz0_src = Dir[File.join(__dir__, "../../libyaz0/src/libyaz0/**/*.c")].map{|x| File.expand_path(x)}
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            $srcs = libyaz0_src + ["ext_yaz0.c"]
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            $VPATH << File.expand_path(File.join(__dir__, "../../libyaz0/src/libyaz0"))
         | 
| 11 | 
            +
            $INCFLAGS << " -I#{File.expand_path(File.join(__dir__, "../../libyaz0/include"))}"
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            create_makefile(extension_name)
         | 
    
        data/lib/yaz0/version.rb
    CHANGED
    
    
| Binary file | 
    
        data/lib/yaz0.rb
    CHANGED
    
    | @@ -1,5 +1,47 @@ | |
| 1 | 
            +
            require "stringio"
         | 
| 1 2 | 
             
            require "yaz0/version"
         | 
| 2 3 | 
             
            require "yaz0/yaz0"
         | 
| 3 4 |  | 
| 4 5 | 
             
            module Yaz0
         | 
| 6 | 
            +
              class Stream
         | 
| 7 | 
            +
                def decompress(src, dst = nil)
         | 
| 8 | 
            +
                  if dst
         | 
| 9 | 
            +
                    raw_decompress(src, dst)
         | 
| 10 | 
            +
                    nil
         | 
| 11 | 
            +
                  else
         | 
| 12 | 
            +
                    dst = StringIO.new
         | 
| 13 | 
            +
                    raw_decompress(src, dst)
         | 
| 14 | 
            +
                    dst.string
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def compress(src, dst_or_opts = nil, opts = {})
         | 
| 19 | 
            +
                  if dst_or_opts.is_a?(Hash)
         | 
| 20 | 
            +
                    opts = dst_or_opts
         | 
| 21 | 
            +
                    dst = nil
         | 
| 22 | 
            +
                  else
         | 
| 23 | 
            +
                    dst = dst_or_opts
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  level = opts[:level] || 6
         | 
| 27 | 
            +
                  size = opts[:size] || src.size
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  if dst
         | 
| 30 | 
            +
                    raw_compress(src, dst, size, level)
         | 
| 31 | 
            +
                    nil
         | 
| 32 | 
            +
                  else
         | 
| 33 | 
            +
                    dst = StringIO.new
         | 
| 34 | 
            +
                    raw_compress(src, dst, size, level)
         | 
| 35 | 
            +
                    dst.string
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              def self.decompress(*args)
         | 
| 41 | 
            +
                Yaz0::Stream.new.decompress(*args)
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def self.compress(*args)
         | 
| 45 | 
            +
                Yaz0::Stream.new.compress(*args)
         | 
| 46 | 
            +
              end
         | 
| 5 47 | 
             
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            #ifndef YAZ0_H
         | 
| 2 | 
            +
            #define YAZ0_H
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            #include <stddef.h>
         | 
| 5 | 
            +
            #include <stdint.h>
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #if defined(__cplusplus)
         | 
| 8 | 
            +
            # define YAZ0_API extern "C"
         | 
| 9 | 
            +
            #else
         | 
| 10 | 
            +
            # define YAZ0_API
         | 
| 11 | 
            +
            #endif
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #define YAZ0_OK             0
         | 
| 14 | 
            +
            #define YAZ0_NEED_AVAIL_IN  1
         | 
| 15 | 
            +
            #define YAZ0_NEED_AVAIL_OUT 2
         | 
| 16 | 
            +
            #define YAZ0_BAD_MAGIC      (-1)
         | 
| 17 | 
            +
            #define YAZ0_OUT_OF_MEMORY  (-2)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            #define YAZ0_DEFAULT_LEVEL  6
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            typedef struct Yaz0Stream Yaz0Stream;
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            YAZ0_API int yaz0Init(Yaz0Stream** stream);
         | 
| 24 | 
            +
            YAZ0_API int yaz0Destroy(Yaz0Stream* stream);
         | 
| 25 | 
            +
            YAZ0_API int yaz0ModeDecompress(Yaz0Stream* stream);
         | 
| 26 | 
            +
            YAZ0_API int yaz0ModeCompress(Yaz0Stream* stream, uint32_t size, int level);
         | 
| 27 | 
            +
            YAZ0_API int yaz0Run(Yaz0Stream* stream);
         | 
| 28 | 
            +
            YAZ0_API int yaz0Input(Yaz0Stream* stream, const void* data, uint32_t size);
         | 
| 29 | 
            +
            YAZ0_API int yaz0Output(Yaz0Stream* stream, void* data, uint32_t size);
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            YAZ0_API uint32_t yaz0OutputChunkSize(const Yaz0Stream* stream);
         | 
| 32 | 
            +
            YAZ0_API uint32_t yaz0DecompressedSize(const Yaz0Stream* stream);
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            #endif /* YAZ0_H */
         |