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 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
  - - '>='