ruby-lzws 1.4.2 → 1.4.3
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/README.md +9 -8
- data/lib/lzws/error.rb +9 -4
- data/lib/lzws/file.rb +12 -35
- data/lib/lzws/option.rb +36 -0
- data/lib/lzws/stream/raw/compressor.rb +11 -53
- data/lib/lzws/stream/raw/decompressor.rb +11 -35
- data/lib/lzws/stream/reader.rb +6 -185
- data/lib/lzws/stream/writer.rb +6 -164
- data/lib/lzws/string.rb +12 -16
- data/lib/lzws/validation.rb +4 -24
- data/lib/lzws/version.rb +1 -1
- metadata +39 -17
- data/lib/lzws/stream/abstract.rb +0 -156
- data/lib/lzws/stream/delegates.rb +0 -36
- data/lib/lzws/stream/raw/abstract.rb +0 -63
- data/lib/lzws/stream/reader_helpers.rb +0 -194
- data/lib/lzws/stream/stat.rb +0 -78
- data/lib/lzws/stream/writer_helpers.rb +0 -91
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0125a2586e06a3882d077fc746873c1376eeafb7393de58ee28e84eace30763b
|
|
4
|
+
data.tar.gz: a68ceee328f8ea19195c7c75cc5cfb72893d536bb3e14859f4021faa7c934391
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 849991f7d18e0e8449e7f1e6b96ca66a4c5545db67b918c3c6f59d5071113e035122b6a3b2620c81e7ed32a5a7adaa682654df0456141e20e941c8757d727c27
|
|
7
|
+
data.tar.gz: acdcb9d6175e7285b0deb2324925cc9a8cdd1a59c51385c311b4c1a0c794fc3a010f588644a8986fe51e2e4188e6e32c83d5dfe0f8a48d22b32c4398fd9f668c
|
data/README.md
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Ruby bindings for lzws library
|
|
2
2
|
|
|
3
|
-
| AppVeyor |
|
|
4
|
-
| :------: |
|
|
5
|
-
| [](https://ci.appveyor.com/project/andrew-aladev/ruby-lzws/branch/master) | [](https://ci.appveyor.com/project/andrew-aladev/ruby-lzws/branch/master) | [](http://37.187.122.190:58182/job/ruby-lzws) | [](https://github.com/andrew-aladev/ruby-lzws/actions) | [](https://codecov.io/gh/andrew-aladev/ruby-lzws) | [](https://rubygems.org/gems/ruby-lzws) |
|
|
6
6
|
|
|
7
7
|
See [lzws library](https://github.com/andrew-aladev/lzws).
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
11
|
-
Operating systems: GNU/Linux, FreeBSD, OSX
|
|
11
|
+
Operating systems: GNU/Linux, FreeBSD, OSX.
|
|
12
12
|
|
|
13
13
|
Dependencies: [lzws](https://github.com/andrew-aladev/lzws) 1.4.0+ version.
|
|
14
14
|
|
|
@@ -110,6 +110,10 @@ Parallel.each large_datas do |large_data|
|
|
|
110
110
|
end
|
|
111
111
|
```
|
|
112
112
|
|
|
113
|
+
# Docs
|
|
114
|
+
|
|
115
|
+
Please review [rdoc generated docs](https://andrew-aladev.github.io/ruby-lzws).
|
|
116
|
+
|
|
113
117
|
## Options
|
|
114
118
|
|
|
115
119
|
| Option | Values | Default | Description |
|
|
@@ -255,14 +259,11 @@ Special asynchronous methods missing in `Zlib::GzipWriter`.
|
|
|
255
259
|
So it is possible to have asynchronous variants for these synchronous methods.
|
|
256
260
|
Behaviour is the same as `IO#write_nonblock` method.
|
|
257
261
|
|
|
258
|
-
All nonblock operations for file will raise `EBADF` error on Windows.
|
|
259
|
-
Setting file into nonblocking mode is [not available on Windows](https://github.com/ruby/ruby/blob/master/win32/win32.c#L4388).
|
|
260
|
-
|
|
261
262
|
```
|
|
262
263
|
#<<(object)
|
|
263
264
|
#print(*objects)
|
|
264
265
|
#printf(*args)
|
|
265
|
-
#putc(object, encoding
|
|
266
|
+
#putc(object, :encoding => 'ASCII-8BIT')
|
|
266
267
|
#puts(*objects)
|
|
267
268
|
```
|
|
268
269
|
|
data/lib/lzws/error.rb
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
# Ruby bindings for lzws library.
|
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
|
3
3
|
|
|
4
|
+
require "adsp"
|
|
5
|
+
|
|
4
6
|
module LZWS
|
|
5
7
|
class BaseError < ::StandardError; end
|
|
6
8
|
|
|
7
9
|
class AllocateError < BaseError; end
|
|
8
|
-
class ValidateError < BaseError; end
|
|
9
10
|
|
|
10
|
-
class UsedAfterCloseError < BaseError; end
|
|
11
11
|
class NotEnoughSourceBufferError < BaseError; end
|
|
12
12
|
class NotEnoughDestinationBufferError < BaseError; end
|
|
13
|
-
class NotEnoughDestinationError < BaseError; end
|
|
14
13
|
class DecompressorCorruptedSourceError < BaseError; end
|
|
15
14
|
|
|
16
15
|
class AccessIOError < BaseError; end
|
|
17
16
|
class ReadIOError < BaseError; end
|
|
18
17
|
class WriteIOError < BaseError; end
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
ValidateError = ADSP::ValidateError
|
|
20
|
+
|
|
21
|
+
NotEnoughDestinationError = ADSP::NotEnoughDestinationError
|
|
22
|
+
UsedAfterCloseError = ADSP::UsedAfterCloseError
|
|
23
|
+
|
|
24
|
+
NotImplementedError = ADSP::NotImplementedError
|
|
25
|
+
UnexpectedError = ADSP::UnexpectedError
|
|
21
26
|
end
|
data/lib/lzws/file.rb
CHANGED
|
@@ -1,48 +1,25 @@
|
|
|
1
1
|
# Ruby bindings for lzws library.
|
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
|
3
3
|
|
|
4
|
+
require "adsp/file"
|
|
4
5
|
require "lzws_ext"
|
|
5
6
|
|
|
6
|
-
require_relative "error"
|
|
7
7
|
require_relative "option"
|
|
8
|
-
require_relative "validation"
|
|
9
8
|
|
|
10
9
|
module LZWS
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
open_files source, destination do |source_io, destination_io|
|
|
21
|
-
LZWS._native_compress_io source_io, destination_io, options
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
nil
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def self.decompress(source, destination, options = {})
|
|
28
|
-
Validation.validate_string source
|
|
29
|
-
Validation.validate_string destination
|
|
30
|
-
|
|
31
|
-
options = Option.get_decompressor_options options, BUFFER_LENGTH_NAMES
|
|
32
|
-
|
|
33
|
-
open_files source, destination do |source_io, destination_io|
|
|
34
|
-
LZWS._native_decompress_io source_io, destination_io, options
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
nil
|
|
10
|
+
# LZWS::File class.
|
|
11
|
+
class File < ADSP::File
|
|
12
|
+
# Current option class.
|
|
13
|
+
Option = LZWS::Option
|
|
14
|
+
|
|
15
|
+
# Bypass native compress.
|
|
16
|
+
def self.native_compress_io(*args)
|
|
17
|
+
LZWS._native_compress_io(*args)
|
|
38
18
|
end
|
|
39
19
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
yield source_io, destination_io
|
|
44
|
-
end
|
|
45
|
-
end
|
|
20
|
+
# Bypass native decompress.
|
|
21
|
+
def self.native_decompress_io(*args)
|
|
22
|
+
LZWS._native_decompress_io(*args)
|
|
46
23
|
end
|
|
47
24
|
end
|
|
48
25
|
end
|
data/lib/lzws/option.rb
CHANGED
|
@@ -7,29 +7,56 @@ require_relative "error"
|
|
|
7
7
|
require_relative "validation"
|
|
8
8
|
|
|
9
9
|
module LZWS
|
|
10
|
+
# LZWS::Option module.
|
|
10
11
|
module Option
|
|
12
|
+
# Current default buffer length.
|
|
11
13
|
DEFAULT_BUFFER_LENGTH = 0
|
|
12
14
|
|
|
15
|
+
# Current compressor defaults.
|
|
13
16
|
COMPRESSOR_DEFAULTS = {
|
|
17
|
+
# Enables global VM lock where possible.
|
|
14
18
|
:gvl => false,
|
|
19
|
+
# Max code bit length.
|
|
15
20
|
:max_code_bit_length => nil,
|
|
21
|
+
# Disables magic header.
|
|
16
22
|
:without_magic_header => nil,
|
|
23
|
+
# Enables block mode.
|
|
17
24
|
:block_mode => nil,
|
|
25
|
+
# Enables most significant bit mode.
|
|
18
26
|
:msb => nil,
|
|
27
|
+
# Enables unaligned bit groups.
|
|
19
28
|
:unaligned_bit_groups => nil,
|
|
29
|
+
# Disables lzws library logging.
|
|
20
30
|
:quiet => nil
|
|
21
31
|
}
|
|
22
32
|
.freeze
|
|
23
33
|
|
|
34
|
+
# Current decompressor defaults.
|
|
24
35
|
DECOMPRESSOR_DEFAULTS = {
|
|
36
|
+
# Enables global VM lock where possible.
|
|
25
37
|
:gvl => false,
|
|
38
|
+
# Disables magic header.
|
|
26
39
|
:without_magic_header => nil,
|
|
40
|
+
# Enables most significant bit mode.
|
|
27
41
|
:msb => nil,
|
|
42
|
+
# Enables unaligned bit groups.
|
|
28
43
|
:unaligned_bit_groups => nil,
|
|
44
|
+
# Disables lzws library logging.
|
|
29
45
|
:quiet => nil
|
|
30
46
|
}
|
|
31
47
|
.freeze
|
|
32
48
|
|
|
49
|
+
# Processes compressor +options+ and +buffer_length_names+.
|
|
50
|
+
# Option: +:source_buffer_length+ source buffer length.
|
|
51
|
+
# Option: +:destination_buffer_length+ destination buffer length.
|
|
52
|
+
# Option: +:gvl+ enables global VM lock where possible.
|
|
53
|
+
# Option: +:max_code_bit_length+ max code bit length.
|
|
54
|
+
# Option: +:block_mode+ enables block mode.
|
|
55
|
+
# Option: +:without_magic_header+ disables magic header.
|
|
56
|
+
# Option: +:msb+ enables most significant bit mode.
|
|
57
|
+
# Option: +:unaligned_bit_groups+ enables unaligned bit groups.
|
|
58
|
+
# Option: +:quiet+ disables lzws library logging.
|
|
59
|
+
# Returns processed compressor options.
|
|
33
60
|
def self.get_compressor_options(options, buffer_length_names)
|
|
34
61
|
Validation.validate_hash options
|
|
35
62
|
|
|
@@ -68,6 +95,15 @@ module LZWS
|
|
|
68
95
|
options
|
|
69
96
|
end
|
|
70
97
|
|
|
98
|
+
# Processes decompressor +options+ and +buffer_length_names+.
|
|
99
|
+
# Option: +:source_buffer_length+ source buffer length.
|
|
100
|
+
# Option: +:destination_buffer_length+ destination buffer length.
|
|
101
|
+
# Option: +:gvl+ enables global VM lock where possible.
|
|
102
|
+
# Option: +:without_magic_header+ disables magic header.
|
|
103
|
+
# Option: +:msb+ enables most significant bit mode.
|
|
104
|
+
# Option: +:unaligned_bit_groups+ enables unaligned bit groups.
|
|
105
|
+
# Option: +:quiet+ disables lzws library logging.
|
|
106
|
+
# Returns processed decompressor options.
|
|
71
107
|
def self.get_decompressor_options(options, buffer_length_names)
|
|
72
108
|
Validation.validate_hash options
|
|
73
109
|
|
|
@@ -1,74 +1,32 @@
|
|
|
1
1
|
# Ruby bindings for lzws library.
|
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
|
3
3
|
|
|
4
|
+
require "adsp/stream/raw/compressor"
|
|
4
5
|
require "lzws_ext"
|
|
5
6
|
|
|
6
|
-
require_relative "abstract"
|
|
7
|
-
require_relative "../../error"
|
|
8
7
|
require_relative "../../option"
|
|
9
8
|
require_relative "../../validation"
|
|
10
9
|
|
|
11
10
|
module LZWS
|
|
12
11
|
module Stream
|
|
13
12
|
module Raw
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
# LZWS::Stream::Raw::Compressor class.
|
|
14
|
+
class Compressor < ADSP::Stream::Raw::Compressor
|
|
15
|
+
# Current native compressor class.
|
|
16
|
+
NativeCompressor = Stream::NativeCompressor
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
native_stream = NativeCompressor.new options
|
|
18
|
+
# Current option class.
|
|
19
|
+
Option = LZWS::Option
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def write(source, &writer)
|
|
21
|
+
# Flushes raw stream and writes next result using +writer+ proc.
|
|
22
|
+
def flush(&writer)
|
|
25
23
|
do_not_use_after_close
|
|
26
24
|
|
|
27
|
-
Validation.validate_string source
|
|
28
|
-
Validation.validate_proc writer
|
|
29
|
-
|
|
30
|
-
total_bytes_written = 0
|
|
31
|
-
|
|
32
|
-
loop do
|
|
33
|
-
bytes_written, need_more_destination = @native_stream.write source
|
|
34
|
-
total_bytes_written += bytes_written
|
|
35
|
-
|
|
36
|
-
if need_more_destination
|
|
37
|
-
source = source.byteslice bytes_written, source.bytesize - bytes_written
|
|
38
|
-
more_destination(&writer)
|
|
39
|
-
next
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
unless bytes_written == source.bytesize
|
|
43
|
-
# :nocov:
|
|
44
|
-
# Compressor write should eat all provided "source" without remainder.
|
|
45
|
-
raise UnexpectedError, "unexpected error"
|
|
46
|
-
# :nocov:
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
break
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
total_bytes_written
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def close(&writer)
|
|
56
|
-
return nil if closed?
|
|
57
|
-
|
|
58
25
|
Validation.validate_proc writer
|
|
59
26
|
|
|
60
|
-
|
|
61
|
-
need_more_destination = @native_stream.finish
|
|
62
|
-
|
|
63
|
-
if need_more_destination
|
|
64
|
-
more_destination(&writer)
|
|
65
|
-
next
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
break
|
|
69
|
-
end
|
|
27
|
+
write_result(&writer)
|
|
70
28
|
|
|
71
|
-
|
|
29
|
+
nil
|
|
72
30
|
end
|
|
73
31
|
end
|
|
74
32
|
end
|
|
@@ -1,56 +1,32 @@
|
|
|
1
1
|
# Ruby bindings for lzws library.
|
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
|
3
3
|
|
|
4
|
+
require "adsp/stream/raw/decompressor"
|
|
4
5
|
require "lzws_ext"
|
|
5
6
|
|
|
6
|
-
require_relative "abstract"
|
|
7
7
|
require_relative "../../option"
|
|
8
8
|
require_relative "../../validation"
|
|
9
9
|
|
|
10
10
|
module LZWS
|
|
11
11
|
module Stream
|
|
12
12
|
module Raw
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
# LZWS::Stream::Raw::Decompressor class.
|
|
14
|
+
class Decompressor < ADSP::Stream::Raw::Decompressor
|
|
15
|
+
# Current native decompressor class.
|
|
16
|
+
NativeDecompressor = Stream::NativeDecompressor
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
native_stream = NativeDecompressor.new options
|
|
18
|
+
# Current option class.
|
|
19
|
+
Option = LZWS::Option
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def read(source, &writer)
|
|
21
|
+
# Flushes raw stream and writes next result using +writer+ proc.
|
|
22
|
+
def flush(&writer)
|
|
24
23
|
do_not_use_after_close
|
|
25
24
|
|
|
26
|
-
Validation.validate_string source
|
|
27
25
|
Validation.validate_proc writer
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
loop do
|
|
32
|
-
bytes_read, need_more_destination = @native_stream.read source
|
|
33
|
-
total_bytes_read += bytes_read
|
|
34
|
-
|
|
35
|
-
if need_more_destination
|
|
36
|
-
source = source.byteslice bytes_read, source.bytesize - bytes_read
|
|
37
|
-
more_destination(&writer)
|
|
38
|
-
next
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
break
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Please remember that "total_bytes_read" can not be equal to "source.bytesize".
|
|
45
|
-
total_bytes_read
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def close(&writer)
|
|
49
|
-
return nil if closed?
|
|
50
|
-
|
|
51
|
-
Validation.validate_proc writer
|
|
27
|
+
write_result(&writer)
|
|
52
28
|
|
|
53
|
-
|
|
29
|
+
nil
|
|
54
30
|
end
|
|
55
31
|
end
|
|
56
32
|
end
|
data/lib/lzws/stream/reader.rb
CHANGED
|
@@ -1,195 +1,16 @@
|
|
|
1
1
|
# Ruby bindings for lzws library.
|
|
2
2
|
# Copyright (c) 2019 AUTHORS, MIT License.
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
require "adsp/stream/reader"
|
|
5
|
+
|
|
5
6
|
require_relative "raw/decompressor"
|
|
6
|
-
require_relative "reader_helpers"
|
|
7
|
-
require_relative "../validation"
|
|
8
7
|
|
|
9
8
|
module LZWS
|
|
10
9
|
module Stream
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def initialize(source_io, options = {}, *args)
|
|
17
|
-
@options = options
|
|
18
|
-
|
|
19
|
-
super source_io, *args
|
|
20
|
-
|
|
21
|
-
initialize_source_buffer_length
|
|
22
|
-
reset_io_remainder
|
|
23
|
-
reset_need_to_flush
|
|
24
|
-
|
|
25
|
-
@lineno = 0
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
protected def create_raw_stream
|
|
29
|
-
Raw::Decompressor.new @options
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
protected def initialize_source_buffer_length
|
|
33
|
-
source_buffer_length = @options[:source_buffer_length]
|
|
34
|
-
Validation.validate_not_negative_integer source_buffer_length unless source_buffer_length.nil?
|
|
35
|
-
|
|
36
|
-
if source_buffer_length.nil? || source_buffer_length.zero?
|
|
37
|
-
source_buffer_length = Buffer::DEFAULT_SOURCE_BUFFER_LENGTH_FOR_DECOMPRESSOR
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
@source_buffer_length = source_buffer_length
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
protected def reset_io_remainder
|
|
44
|
-
@io_remainder = ::String.new :encoding => ::Encoding::BINARY
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
protected def reset_need_to_flush
|
|
48
|
-
@need_to_flush = false
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# -- synchronous --
|
|
52
|
-
|
|
53
|
-
def read(bytes_to_read = nil, out_buffer = nil)
|
|
54
|
-
Validation.validate_not_negative_integer bytes_to_read unless bytes_to_read.nil?
|
|
55
|
-
Validation.validate_string out_buffer unless out_buffer.nil?
|
|
56
|
-
|
|
57
|
-
raise ValidateError, "io should be responsible to read and eof" unless
|
|
58
|
-
@io.respond_to?(:read) && @io.respond_to?(:eof?)
|
|
59
|
-
|
|
60
|
-
unless bytes_to_read.nil?
|
|
61
|
-
return ::String.new :encoding => ::Encoding::BINARY if bytes_to_read.zero?
|
|
62
|
-
return nil if eof?
|
|
63
|
-
|
|
64
|
-
append_io_data @io.read(@source_buffer_length) while @buffer.bytesize < bytes_to_read && !@io.eof?
|
|
65
|
-
flush_io_data if @buffer.bytesize < bytes_to_read
|
|
66
|
-
|
|
67
|
-
return read_bytes_from_buffer bytes_to_read, out_buffer
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
append_io_data @io.read(@source_buffer_length) until @io.eof?
|
|
71
|
-
flush_io_data
|
|
72
|
-
|
|
73
|
-
read_buffer out_buffer
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def rewind
|
|
77
|
-
raw_wrapper :close
|
|
78
|
-
|
|
79
|
-
reset_io_remainder
|
|
80
|
-
reset_need_to_flush
|
|
81
|
-
|
|
82
|
-
super
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def close
|
|
86
|
-
raw_wrapper :close
|
|
87
|
-
|
|
88
|
-
super
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def eof?
|
|
92
|
-
raise ValidateError, "io should be responsible to eof" unless @io.respond_to? :eof?
|
|
93
|
-
|
|
94
|
-
empty? && @io.eof?
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# -- asynchronous --
|
|
98
|
-
|
|
99
|
-
def readpartial(bytes_to_read, out_buffer = nil)
|
|
100
|
-
raise ValidateError, "io should be responsible to readpartial" unless @io.respond_to? :readpartial
|
|
101
|
-
|
|
102
|
-
read_more_nonblock(bytes_to_read, out_buffer) { @io.readpartial @source_buffer_length }
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def read_nonblock(bytes_to_read, out_buffer = nil, *options)
|
|
106
|
-
raise ValidateError, "io should be responsible to read nonblock" unless @io.respond_to? :read_nonblock
|
|
107
|
-
|
|
108
|
-
read_more_nonblock(bytes_to_read, out_buffer) { @io.read_nonblock(@source_buffer_length, *options) }
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
protected def read_more_nonblock(bytes_to_read, out_buffer, &_block)
|
|
112
|
-
Validation.validate_not_negative_integer bytes_to_read
|
|
113
|
-
Validation.validate_string out_buffer unless out_buffer.nil?
|
|
114
|
-
|
|
115
|
-
return ::String.new :encoding => ::Encoding::BINARY if bytes_to_read.zero?
|
|
116
|
-
|
|
117
|
-
io_provided_eof_error = false
|
|
118
|
-
|
|
119
|
-
if @buffer.bytesize < bytes_to_read
|
|
120
|
-
begin
|
|
121
|
-
append_io_data yield
|
|
122
|
-
rescue ::EOFError
|
|
123
|
-
io_provided_eof_error = true
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
flush_io_data if @buffer.bytesize < bytes_to_read
|
|
128
|
-
raise ::EOFError if empty? && io_provided_eof_error
|
|
129
|
-
|
|
130
|
-
read_bytes_from_buffer bytes_to_read, out_buffer
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# -- common --
|
|
134
|
-
|
|
135
|
-
protected def append_io_data(io_data)
|
|
136
|
-
io_portion = @io_remainder + io_data
|
|
137
|
-
bytes_read = raw_wrapper :read, io_portion
|
|
138
|
-
@io_remainder = io_portion.byteslice bytes_read, io_portion.bytesize - bytes_read
|
|
139
|
-
|
|
140
|
-
# Even empty io data may require flush.
|
|
141
|
-
@need_to_flush = true
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
protected def flush_io_data
|
|
145
|
-
raw_wrapper :flush
|
|
146
|
-
|
|
147
|
-
@need_to_flush = false
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
protected def empty?
|
|
151
|
-
!@need_to_flush && @buffer.bytesize.zero?
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
protected def read_bytes_from_buffer(bytes_to_read, out_buffer)
|
|
155
|
-
bytes_read = [@buffer.bytesize, bytes_to_read].min
|
|
156
|
-
|
|
157
|
-
# Result uses buffer binary encoding.
|
|
158
|
-
result = @buffer.byteslice 0, bytes_read
|
|
159
|
-
@buffer = @buffer.byteslice bytes_read, @buffer.bytesize - bytes_read
|
|
160
|
-
@pos += bytes_read
|
|
161
|
-
|
|
162
|
-
result = out_buffer.replace result unless out_buffer.nil?
|
|
163
|
-
result
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
protected def read_buffer(out_buffer)
|
|
167
|
-
result = @buffer
|
|
168
|
-
reset_buffer
|
|
169
|
-
@pos += result.bytesize
|
|
170
|
-
|
|
171
|
-
result.force_encoding @external_encoding unless @external_encoding.nil?
|
|
172
|
-
result = transcode_to_internal result
|
|
173
|
-
|
|
174
|
-
result = out_buffer.replace result unless out_buffer.nil?
|
|
175
|
-
result
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
protected def transcode_to_internal(data)
|
|
179
|
-
data = data.encode @internal_encoding, **@transcode_options unless @internal_encoding.nil?
|
|
180
|
-
data
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
# We should be able to return data back to buffer.
|
|
184
|
-
# We won't use any transcode options because transcoded data should be backward compatible.
|
|
185
|
-
protected def transcode_to_external(data)
|
|
186
|
-
data = data.encode @external_encoding unless @external_encoding.nil?
|
|
187
|
-
data
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
protected def raw_wrapper(method_name, *args)
|
|
191
|
-
@raw_stream.send(method_name, *args) { |portion| @buffer << portion }
|
|
192
|
-
end
|
|
10
|
+
# LZWS::Stream::Reader class.
|
|
11
|
+
class Reader < ADSP::Stream::Reader
|
|
12
|
+
# Current raw stream class.
|
|
13
|
+
RawDecompressor = Raw::Decompressor
|
|
193
14
|
end
|
|
194
15
|
end
|
|
195
16
|
end
|