binary_parser 1.0.0 → 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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/binary_parser.gemspec +2 -1
- data/lib/binary_parser/version.rb +1 -1
- data/lib/scope.rb +19 -4
- data/lib/structure_definition.rb +17 -2
- data/unit_test/test_scope.rb +32 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 329750cafce1313147ce33ce73a6ead4622c7463
|
4
|
+
data.tar.gz: 810050523f1e4f013877ce96cca963424501b048
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1dd40df83f438b9ca90c6bc15ad056868d1f62d5523e0209a3b71d4122a9b661748bdba897f24a75c72edaf8b94e6894b983b56ff7117c213bfa928e8d9b55b
|
7
|
+
data.tar.gz: 4f20fb77279fc8caac2d3512647dfefd17f597cc8a7e7b03886a982476fe24c6d4c23b85b0ca78a589f47a89161d1c6a5190d30c6c8c36876ad425f77f435a57
|
data/README.md
CHANGED
@@ -218,7 +218,7 @@ And then, get structures from the stream as follows.
|
|
218
218
|
stream.get_next.show(true)
|
219
219
|
end
|
220
220
|
|
221
|
-
StreamTemplateBase has many useful
|
221
|
+
StreamTemplateBase has many useful methods to choose structures from the stream.
|
222
222
|
If you want to know detail of these methods, please read documentation or concerned source-files.
|
223
223
|
|
224
224
|
|
data/binary_parser.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ["rokugats(u)"]
|
11
11
|
spec.email = ["sasasawada@gmail.com"]
|
12
12
|
spec.summary = "An elegant DSL library for parsing binary-data."
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/rokugats/ruby-binary-parser"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.0.0'
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
23
|
spec.add_development_dependency "rake"
|
23
24
|
|
data/lib/scope.rb
CHANGED
@@ -23,6 +23,7 @@ module BinaryParser
|
|
23
23
|
raise UndefinedError, "Undefined data-name '#{name}'." unless @definition[name]
|
24
24
|
end
|
25
25
|
|
26
|
+
# * Unsatisfactory memorized method (little obfuscated? : need refactoring?)
|
26
27
|
def load_var(name)
|
27
28
|
return @parent_scope.load_var(name) if !@definition[name] && @parent_scope
|
28
29
|
check_name_defined(name)
|
@@ -49,6 +50,7 @@ module BinaryParser
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
53
|
+
# * memorized method (little obfuscated? : need refactoring?)
|
52
54
|
def eval_bit_position(name)
|
53
55
|
check_name_defined(name)
|
54
56
|
return @ebs[name] ||= @definition[name].bit_position.eval do |name|
|
@@ -56,6 +58,7 @@ module BinaryParser
|
|
56
58
|
end
|
57
59
|
end
|
58
60
|
|
61
|
+
# * memorized method (little obfuscated? : need refactoring?)
|
59
62
|
def eval_bit_length(name)
|
60
63
|
check_name_defined(name)
|
61
64
|
return @ebl[name] if @ebl[name]
|
@@ -63,10 +66,8 @@ module BinaryParser
|
|
63
66
|
cond.eval{|name| load_var(name)}
|
64
67
|
end
|
65
68
|
return @ebl[name] ||= @definition[name].bit_length.eval do |var_name|
|
66
|
-
if var_name ==
|
67
|
-
|
68
|
-
raise ParsingError, "Binary is too short. (So, 'rest' is failed.)" if length < 0
|
69
|
-
length
|
69
|
+
if var_name[0..1] == "__"
|
70
|
+
bit_length_control_variable_resolution(name, var_name)
|
70
71
|
else
|
71
72
|
val = load_var(var_name)
|
72
73
|
unless val
|
@@ -77,6 +78,20 @@ module BinaryParser
|
|
77
78
|
end
|
78
79
|
end
|
79
80
|
end
|
81
|
+
|
82
|
+
def bit_length_control_variable_resolution(name, var_name)
|
83
|
+
if var_name == :__rest
|
84
|
+
length = @abstract_binary.bit_length - eval_bit_position(name)
|
85
|
+
raise ParsingError, "Binary is too short. (So, 'rest' is failed.)" if length < 0
|
86
|
+
return length
|
87
|
+
elsif var_name == :__position
|
88
|
+
return eval_bit_position(name)
|
89
|
+
elsif var_name[0..6] == "__LEN__"
|
90
|
+
return eval_bit_length(var_name[7..(var_name.length - 1)].to_sym)
|
91
|
+
else
|
92
|
+
raise ProgramAssertionError, "Unknown Control-Variable '#{var_name}'."
|
93
|
+
end
|
94
|
+
end
|
80
95
|
|
81
96
|
def eval_entire_bit_length
|
82
97
|
return @definition.bit_at.eval do |name|
|
data/lib/structure_definition.rb
CHANGED
@@ -92,11 +92,26 @@ module BinaryParser
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def var(name)
|
95
|
-
|
95
|
+
unless name_solvable?(name)
|
96
|
+
raise DefinitionError, "Unsolvable variable #{name} is used."
|
97
|
+
end
|
98
|
+
return Expression.new([name])
|
99
|
+
end
|
100
|
+
|
101
|
+
def len(name)
|
102
|
+
unless name_solvable?(name)
|
103
|
+
raise DefinitionError, "Unsolvable variable #{name} is used."
|
104
|
+
end
|
105
|
+
symbol = ("__LEN__" + name.to_s).to_sym
|
106
|
+
return Expression.new([symbol])
|
107
|
+
end
|
108
|
+
|
109
|
+
def position
|
110
|
+
return Expression.new([:__position])
|
96
111
|
end
|
97
112
|
|
98
113
|
def rest
|
99
|
-
return
|
114
|
+
return Expression.new([:__rest])
|
100
115
|
end
|
101
116
|
|
102
117
|
def [](name)
|
data/unit_test/test_scope.rb
CHANGED
@@ -181,6 +181,38 @@ module BinaryParser
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
184
|
+
# TEST CASE STRUCTURE 6
|
185
|
+
# * len test
|
186
|
+
class ST6 < TemplateBase
|
187
|
+
Def do
|
188
|
+
data :id, UInt, 8
|
189
|
+
data :whole_length, UInt, 8
|
190
|
+
data :rest_binary, Binary, var(:whole_length) - len(:id) - len(:whole_length)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_ST6_CASE1
|
195
|
+
i = ST6.new(gen_bin(0, 32, 0x41, 0x42, 0x43))
|
196
|
+
assert_equal(16, i.rest_binary.binary_bit_length)
|
197
|
+
assert_equal("AB", i.rest_binary.to_s)
|
198
|
+
end
|
199
|
+
|
200
|
+
# TEST CASE STRUCTURE 7
|
201
|
+
# * position
|
202
|
+
class ST7 < TemplateBase
|
203
|
+
Def do
|
204
|
+
data :id, UInt, 8
|
205
|
+
data :whole_length, UInt, 8
|
206
|
+
data :rest_binary, Binary, var(:whole_length) - position
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_ST7_CASE1
|
211
|
+
i = ST7.new(gen_bin(0, 32, 0x41, 0x42, 0x43))
|
212
|
+
assert_equal(16, i.rest_binary.binary_bit_length)
|
213
|
+
assert_equal("AB", i.rest_binary.to_s)
|
214
|
+
end
|
215
|
+
|
184
216
|
# helpers
|
185
217
|
def gen_bin(*chars)
|
186
218
|
return AbstractBinary.new(chars.pack("C*"))
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: binary_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rokugats(u)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -81,7 +81,7 @@ files:
|
|
81
81
|
- unit_test/test_stream_template_base.rb
|
82
82
|
- unit_test/test_structure_definition.rb
|
83
83
|
- unit_test/test_template_base.rb
|
84
|
-
homepage:
|
84
|
+
homepage: https://github.com/rokugats/ruby-binary-parser
|
85
85
|
licenses:
|
86
86
|
- MIT
|
87
87
|
metadata: {}
|
@@ -93,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
94
94
|
- - '>='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 2.0.0
|
97
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
98
|
requirements:
|
99
99
|
- - '>='
|