binaryparse 0.1.6 → 0.2.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.
- data/lib/blocker.rb +53 -29
- data/test/test_blocker.rb +47 -0
- metadata +7 -11
- data/binaryparse.gemspec +0 -19
data/lib/blocker.rb
CHANGED
@@ -6,10 +6,11 @@
|
|
6
6
|
# (BinaryBlocker::PackedNumberEncoder) and date fields
|
7
7
|
# (BinaryBlocker::PackedDateEncoder)
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
begin
|
10
|
+
require 'uconv'
|
11
|
+
rescue LoadError
|
12
|
+
end
|
11
13
|
|
12
|
-
require 'uconv'
|
13
14
|
require 'date'
|
14
15
|
require 'time'
|
15
16
|
|
@@ -221,20 +222,44 @@ module BinaryBlocker
|
|
221
222
|
# here.
|
222
223
|
class GroupEncoder < Encoder
|
223
224
|
class << self
|
225
|
+
def attributes
|
226
|
+
@attributes
|
227
|
+
end
|
228
|
+
|
229
|
+
def attributes=(a)
|
230
|
+
@attributes=a
|
231
|
+
end
|
232
|
+
|
233
|
+
def lookup
|
234
|
+
@lookup
|
235
|
+
end
|
236
|
+
|
237
|
+
def lookup=(l)
|
238
|
+
@lookup=l
|
239
|
+
end
|
240
|
+
|
241
|
+
def klasses
|
242
|
+
@klasses
|
243
|
+
end
|
244
|
+
|
245
|
+
def klasses=(k)
|
246
|
+
@klasses = k
|
247
|
+
end
|
248
|
+
|
224
249
|
def inherited(obj)
|
225
250
|
obj.instance_eval do
|
226
|
-
|
227
|
-
|
228
|
-
|
251
|
+
self.klasses = self.klasses || BinaryBlocker.klasses.clone
|
252
|
+
self.attributes = self.attributes || []
|
253
|
+
self.lookup = self.lookup || {}
|
229
254
|
end
|
230
255
|
super
|
231
256
|
end
|
232
257
|
|
233
258
|
# One and only one (this is the easiest :-)
|
234
259
|
def has_one(sym, klass, *opts)
|
235
|
-
klass =
|
236
|
-
|
237
|
-
|
260
|
+
klass = self.klasses[klass] if self.klasses[klass]
|
261
|
+
self.lookup[sym] = self.attributes.size
|
262
|
+
self.attributes << lambda { klass.new(*opts) }
|
238
263
|
end
|
239
264
|
|
240
265
|
def include_klasses(klasses, *opts)
|
@@ -250,31 +275,31 @@ module BinaryBlocker
|
|
250
275
|
|
251
276
|
def has_one_of(sym, klasses, *opts)
|
252
277
|
klasses = include_klasses(klasses, *opts)
|
253
|
-
|
254
|
-
|
278
|
+
self.lookup[sym] = self.attributes.size
|
279
|
+
self.attributes << lambda { OneOfEncoder.new(klasses, *opts) }
|
255
280
|
end
|
256
281
|
|
257
282
|
def has_counted_array(sym, count_type, klasses, *opts)
|
258
283
|
klasses = include_klasses(klasses, *opts)
|
259
|
-
|
260
|
-
|
284
|
+
self.lookup[sym] = self.attributes.size
|
285
|
+
self.attributes << lambda { CountedArrayEncoder.new(count_type, klasses, *opts) }
|
261
286
|
end
|
262
287
|
|
263
288
|
def has_fixed_array(sym, count, klasses, *opts)
|
264
289
|
klasses = include_klasses(klasses, *opts)
|
265
|
-
|
266
|
-
|
290
|
+
self.lookup[sym] = self.attributes.size
|
291
|
+
self.attributes << lambda { FixedArrayEncoder.new(count, klasses, *opts) }
|
267
292
|
end
|
268
293
|
|
269
294
|
def has_bit_field(sym, type, bit_info, *opts)
|
270
|
-
|
271
|
-
|
295
|
+
self.lookup[sym] = self.attributes.size
|
296
|
+
self.attributes << lambda { BitFieldEncoder.new(type, bit_info, *opts) }
|
272
297
|
end
|
273
298
|
|
274
299
|
def has_list_of(sym, klasses, *opts)
|
275
300
|
klasses = include_klasses(klasses, *opts)
|
276
|
-
|
277
|
-
|
301
|
+
self.lookup[sym] = self.attributes.size
|
302
|
+
self.attributes << lambda { ListOfEncoder.new(klasses, *opts) }
|
278
303
|
end
|
279
304
|
|
280
305
|
def register_klass(sym, klass)
|
@@ -285,14 +310,6 @@ module BinaryBlocker
|
|
285
310
|
def clear_registered_klasses
|
286
311
|
@klasses = {}
|
287
312
|
end
|
288
|
-
|
289
|
-
def attributes
|
290
|
-
@attributes
|
291
|
-
end
|
292
|
-
|
293
|
-
def lookup
|
294
|
-
@lookup
|
295
|
-
end
|
296
313
|
end
|
297
314
|
|
298
315
|
def initialize(*opts)
|
@@ -302,7 +319,9 @@ module BinaryBlocker
|
|
302
319
|
end
|
303
320
|
|
304
321
|
def block
|
305
|
-
@value.inject("")
|
322
|
+
@value.inject("") do |a,b|
|
323
|
+
a + b.block
|
324
|
+
end
|
306
325
|
end
|
307
326
|
|
308
327
|
def deblock(io)
|
@@ -408,6 +427,7 @@ module BinaryBlocker
|
|
408
427
|
|
409
428
|
initialize_data(*opts)
|
410
429
|
end
|
430
|
+
|
411
431
|
end
|
412
432
|
BinaryBlocker.register_klass(:string, FixedStringEncoder)
|
413
433
|
|
@@ -572,7 +592,11 @@ module BinaryBlocker
|
|
572
592
|
end
|
573
593
|
|
574
594
|
def internal_block(val)
|
575
|
-
|
595
|
+
if val
|
596
|
+
val.block
|
597
|
+
else
|
598
|
+
@classes.first.block
|
599
|
+
end
|
576
600
|
end
|
577
601
|
|
578
602
|
def internal_deblock(io)
|
data/test/test_blocker.rb
CHANGED
@@ -440,6 +440,43 @@ class TestBlocker < Test::Unit::TestCase
|
|
440
440
|
assert_nil(t2.t)
|
441
441
|
end
|
442
442
|
|
443
|
+
class BBPackNumRecord < BinaryBlocker::Blocker
|
444
|
+
has_one :p, :packed, :length => 2
|
445
|
+
end
|
446
|
+
|
447
|
+
def test_null_packed
|
448
|
+
t = BBPackNumRecord.new
|
449
|
+
assert(buf = t.block)
|
450
|
+
|
451
|
+
t2 = BBPackNumRecord.new(buf)
|
452
|
+
assert(t2)
|
453
|
+
assert_equal(0, t2.p)
|
454
|
+
end
|
455
|
+
|
456
|
+
def test_big_packed
|
457
|
+
t = BBPackNumRecord.new
|
458
|
+
t.p = 200
|
459
|
+
assert(buf = t.block)
|
460
|
+
assert_equal(1, buf.size)
|
461
|
+
|
462
|
+
t2 = BBPackNumRecord.new(buf)
|
463
|
+
assert(t2)
|
464
|
+
assert(t2.p < 100)
|
465
|
+
end
|
466
|
+
|
467
|
+
class Filler < BinaryBlocker::Blocker
|
468
|
+
has_one :f, :uint8
|
469
|
+
end
|
470
|
+
|
471
|
+
class NullFillerTest < BinaryBlocker::Blocker
|
472
|
+
has_fixed_array :fooboo, 3, [Filler]
|
473
|
+
end
|
474
|
+
|
475
|
+
def test_null_filler
|
476
|
+
t = NullFillerTest.new
|
477
|
+
assert(buf = t.block)
|
478
|
+
end
|
479
|
+
|
443
480
|
class BBSpaceString < BinaryBlocker::Blocker
|
444
481
|
has_one :name, :sstring, :length => 10
|
445
482
|
has_one :last, :string, :length => 5
|
@@ -451,4 +488,14 @@ class TestBlocker < Test::Unit::TestCase
|
|
451
488
|
assert(ss)
|
452
489
|
assert_equal("Name", ss.name)
|
453
490
|
end
|
491
|
+
|
492
|
+
class BBSubClass < BBSpaceString
|
493
|
+
end
|
494
|
+
|
495
|
+
def test_subclass
|
496
|
+
buf = "Name Last "
|
497
|
+
ss = BBSubClass.new(buf)
|
498
|
+
assert(ss)
|
499
|
+
#assert_equal("Name", ss.name)
|
500
|
+
end
|
454
501
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: binaryparse
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-09-
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2006-09-30 00:00:00 -04:00
|
8
8
|
summary: Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -15,7 +15,7 @@ description: Binaryparse is a simple Ruby DSL to parse semi-complicated binary s
|
|
15
15
|
autorequire: binaryparse
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
18
|
-
has_rdoc:
|
18
|
+
has_rdoc: true
|
19
19
|
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
20
|
requirements:
|
21
21
|
- - ">"
|
@@ -29,16 +29,12 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Patrick Hurley
|
31
31
|
files:
|
32
|
-
-
|
33
|
-
-
|
34
|
-
- lib
|
35
|
-
- test
|
32
|
+
- test/test_blocker.rb
|
33
|
+
- lib/buffered_io.rb
|
34
|
+
- lib/blocker.rb
|
36
35
|
- examples/cmasqls.rb
|
37
|
-
- examples/readme.txt
|
38
36
|
- examples/voter.rb
|
39
|
-
-
|
40
|
-
- lib/buffered_io.rb
|
41
|
-
- test/test_blocker.rb
|
37
|
+
- examples/readme.txt
|
42
38
|
test_files: []
|
43
39
|
|
44
40
|
rdoc_options: []
|
data/binaryparse.gemspec
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
spec = Gem::Specification.new do |s|
|
4
|
-
s.name = "binaryparse"
|
5
|
-
s.version = "0.1.6"
|
6
|
-
s.author = "Patrick Hurley"
|
7
|
-
s.email = "phurley@gmail.com"
|
8
|
-
s.homepage = "http://binaryparse.rubyforge.org/"
|
9
|
-
s.platform = Gem::Platform::RUBY
|
10
|
-
s.summary = "Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx."
|
11
|
-
s.description = "Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx."
|
12
|
-
s.files = Dir["**/*"]
|
13
|
-
s.autorequire = "binaryparse"
|
14
|
-
end
|
15
|
-
|
16
|
-
if __FILE__ == $PROGRAM_NAME
|
17
|
-
Gem::manage_gems
|
18
|
-
Gem::Builder.new(spec).build
|
19
|
-
end
|