binary_parser 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
- - '>='
|