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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2d5b2692b4a9c6b2bb5be201074f80779039f881
4
- data.tar.gz: 0e6c1da7ab3aa2ca1f8e79150c34262ec08a4772
3
+ metadata.gz: 329750cafce1313147ce33ce73a6ead4622c7463
4
+ data.tar.gz: 810050523f1e4f013877ce96cca963424501b048
5
5
  SHA512:
6
- metadata.gz: 1c59d35586e0f044ebdef155ef191169a4cf3dd65ba2743d9c19974759aefd55e27d93bb1121443a81c350617b7b75ca17cc9b6d9e05de522f4e9e300f650e7b
7
- data.tar.gz: def0d9f155a7af845d78ce08b87555acca72c11e1f63ae41b716c0fcbc94536e8d66148d1946d2be9e174ec648b0948ebe67df2216be9199d0c9d2a727aa9259
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 method to choose structures from the stream.
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
 
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module BinaryParser
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
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 == :__rest
67
- length = @abstract_binary.bit_length - eval_bit_position(name)
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|
@@ -92,11 +92,26 @@ module BinaryParser
92
92
  end
93
93
 
94
94
  def var(name)
95
- return @var[name] ||= Expression.new([name])
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 var(:__rest)
114
+ return Expression.new([:__rest])
100
115
  end
101
116
 
102
117
  def [](name)
@@ -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.0.0
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-06 00:00:00.000000000 Z
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: '0'
96
+ version: 2.0.0
97
97
  required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - '>='