binaryparse 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/examples/voter.rb +9 -5
  2. data/lib/blocker.rb +53 -41
  3. metadata +9 -6
data/examples/voter.rb CHANGED
@@ -52,12 +52,16 @@ File.open("voter1.txt", "wb") do |vinfo|
52
52
  vinfo.print "Hurley Susan 82 "
53
53
  end
54
54
 
55
- File.open("voter1.txt") do |vinfo|
55
+ start = Time.new
56
+ count = 0
57
+ File.open("v.txt") do |vinfo|
56
58
  until vinfo.eof
57
59
  voter = Voter.new(vinfo)
58
-
60
+ count += 1
59
61
  # You might want to do something more interesting here...
60
- puts voter.last_name
61
- puts voter.first_name
62
+ #puts voter.last_name
63
+ #puts voter.first_name
62
64
  end
63
- end
65
+ end
66
+ stop = Time.new
67
+ puts "Processed #{count} records in #{stop - start} seconds"
data/lib/blocker.rb CHANGED
@@ -19,7 +19,7 @@ module BinaryBlocker
19
19
  def klasses
20
20
  @klasses ||= {}
21
21
  end
22
-
22
+
23
23
  # To simplify naming of classes and laying out fields in your structures
24
24
  # they can be registered:
25
25
  #
@@ -28,7 +28,7 @@ module BinaryBlocker
28
28
  @klasses ||= {}
29
29
  @klasses[sym] = klass
30
30
  end
31
-
31
+
32
32
  # Handy helper method that returns the size of a given pack/unpack format
33
33
  # string
34
34
  def sizeof_format(format)
@@ -53,7 +53,7 @@ module BinaryBlocker
53
53
 
54
54
  length
55
55
  end
56
-
56
+
57
57
  def pack_symbols
58
58
  {
59
59
  :int8 => 'c',
@@ -66,7 +66,7 @@ module BinaryBlocker
66
66
  :uint64 => 'Q'
67
67
  }
68
68
  end
69
-
69
+
70
70
  # As we have to process some fields to determine what type they are
71
71
  # (that is we sometimes start and half to backup), this routine takes
72
72
  # any io (that can be repositioned) and yields to a block -- if the
@@ -97,7 +97,7 @@ module BinaryBlocker
97
97
  # It also supports either a string or io parameter which will be used to
98
98
  # initialize the class
99
99
  class Encoder
100
-
100
+
101
101
  # Parameters: (io | buf, options_hash)
102
102
  #
103
103
  # Options (lambda):
@@ -130,7 +130,7 @@ module BinaryBlocker
130
130
  io.write(result) if io
131
131
  result
132
132
  end
133
-
133
+
134
134
  # This routine takes an io and will parse the stream
135
135
  # on success it returns the object, on failure it
136
136
  # returns a nil
@@ -148,19 +148,19 @@ module BinaryBlocker
148
148
  self.value || self.valid?
149
149
  end
150
150
  end
151
-
151
+
152
152
  def key_value?
153
153
  @opts[:key]
154
154
  end
155
-
155
+
156
156
  protected
157
-
157
+
158
158
  # Override valid? to allow check constraints on a particular
159
159
  # record type, on failure
160
160
  def valid?
161
161
  true
162
162
  end
163
-
163
+
164
164
  def value
165
165
  v = @value
166
166
  if @get_filter
@@ -197,7 +197,7 @@ module BinaryBlocker
197
197
  if data.respond_to? :to_str
198
198
  raise "Unable to parse block" unless deblock(StringIO.new(data))
199
199
  elsif data.respond_to? :read
200
- raise "Unable to parse block" unless deblock(data)
200
+ raise "Unable to parse block" unless deblock(data)
201
201
  end
202
202
  end
203
203
 
@@ -208,7 +208,7 @@ module BinaryBlocker
208
208
  valid?
209
209
  end && result
210
210
  end
211
-
211
+
212
212
  def internal_block(value)
213
213
  value
214
214
  end
@@ -217,7 +217,7 @@ module BinaryBlocker
217
217
  ''
218
218
  end
219
219
  end
220
-
220
+
221
221
  # All Encoders that store multiple items subclass from
222
222
  # here.
223
223
  class GroupEncoder < Encoder
@@ -237,7 +237,7 @@ module BinaryBlocker
237
237
  def lookup=(l)
238
238
  @lookup=l
239
239
  end
240
-
240
+
241
241
  def klasses
242
242
  @klasses
243
243
  end
@@ -245,7 +245,7 @@ module BinaryBlocker
245
245
  def klasses=(k)
246
246
  @klasses = k
247
247
  end
248
-
248
+
249
249
  def inherited(obj)
250
250
  obj.instance_eval do
251
251
  self.klasses = self.klasses || BinaryBlocker.klasses.clone
@@ -254,7 +254,7 @@ module BinaryBlocker
254
254
  end
255
255
  super
256
256
  end
257
-
257
+
258
258
  # One and only one (this is the easiest :-)
259
259
  def has_one(sym, klass, *opts)
260
260
  klass = self.klasses[klass] if self.klasses[klass]
@@ -278,7 +278,7 @@ module BinaryBlocker
278
278
  self.lookup[sym] = self.attributes.size
279
279
  self.attributes << lambda { OneOfEncoder.new(klasses, *opts) }
280
280
  end
281
-
281
+
282
282
  def has_counted_array(sym, count_type, klasses, *opts)
283
283
  klasses = include_klasses(klasses, *opts)
284
284
  self.lookup[sym] = self.attributes.size
@@ -290,13 +290,13 @@ module BinaryBlocker
290
290
  self.lookup[sym] = self.attributes.size
291
291
  self.attributes << lambda { FixedArrayEncoder.new(count, klasses, *opts) }
292
292
  end
293
-
293
+
294
294
  def has_bit_field(sym, type, bit_info, *opts)
295
295
  self.lookup[sym] = self.attributes.size
296
296
  self.attributes << lambda { BitFieldEncoder.new(type, bit_info, *opts) }
297
297
  end
298
-
299
- def has_list_of(sym, klasses, *opts)
298
+
299
+ def has_list_of(sym, klasses, *opts)
300
300
  klasses = include_klasses(klasses, *opts)
301
301
  self.lookup[sym] = self.attributes.size
302
302
  self.attributes << lambda { ListOfEncoder.new(klasses, *opts) }
@@ -315,7 +315,19 @@ module BinaryBlocker
315
315
  def initialize(*opts)
316
316
  @lookup = self.class.lookup.clone
317
317
  @value = self.class.attributes.map { |a| a.call }
318
- super
318
+ super
319
+
320
+ opts.each do |o|
321
+ if o.respond_to? :to_hash
322
+ o.keys.each do |key|
323
+ if pos = @lookup[key.to_sym]
324
+ unless @value[pos].key_value?
325
+ @value[pos].value = o[key]
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
319
331
  end
320
332
 
321
333
  def block
@@ -345,7 +357,7 @@ module BinaryBlocker
345
357
  end
346
358
  super
347
359
  end
348
-
360
+
349
361
  def value
350
362
  self
351
363
  end
@@ -358,14 +370,14 @@ module BinaryBlocker
358
370
  @value.all? { |a| a.valid? }
359
371
  end
360
372
  end
361
-
373
+
362
374
  class SimpleEncoder < Encoder
363
-
375
+
364
376
  def self.register(sym, fmt, *opts)
365
377
  klass = Class.new(SimpleEncoder)
366
378
  klass.send(:define_method,:initialize) do |*opts|
367
379
  initialize_options(*opts)
368
-
380
+
369
381
  @format = fmt
370
382
  @length = BinaryBlocker.sizeof_format(@format)
371
383
 
@@ -474,7 +486,7 @@ module BinaryBlocker
474
486
  end
475
487
  BinaryBlocker.register_klass(:utf16_string, FixedUTF16StringEncoder)
476
488
  BinaryBlocker.register_klass(:utf16, FixedUTF16StringEncoder)
477
-
489
+
478
490
  class PackedNumberEncoder < SimpleEncoder
479
491
  def initialize(*opts)
480
492
  initialize_options(*opts)
@@ -502,7 +514,7 @@ module BinaryBlocker
502
514
  end
503
515
  end
504
516
  BinaryBlocker.register_klass(:packed, PackedNumberEncoder)
505
-
517
+
506
518
  class PackedDateEncoder < PackedNumberEncoder
507
519
  def initialize_options(*opts)
508
520
  super
@@ -565,7 +577,7 @@ module BinaryBlocker
565
577
  Time.local(year, month, day, hour, min, sec)
566
578
  end
567
579
  end
568
-
580
+
569
581
  def valid?
570
582
  case @value
571
583
  when Time : true
@@ -580,7 +592,7 @@ module BinaryBlocker
580
592
  BinaryBlocker.register_klass(:datetime, PackedDateTimeEncoder)
581
593
 
582
594
  class OneOfEncoder < Encoder
583
-
595
+
584
596
  def inspect
585
597
  "OneOf #{@classes.join(',')} -> #{@obj.class} -> #{@obj.inspect}"
586
598
  end
@@ -620,12 +632,12 @@ module BinaryBlocker
620
632
  super
621
633
  end
622
634
  end
623
-
635
+
624
636
  def valid?
625
637
  @obj && @obj.valid?
626
638
  end
627
639
  end
628
-
640
+
629
641
  class FixedArrayEncoder < GroupEncoder
630
642
  def initialize(count, classes, *opts)
631
643
  initialize_options(*opts)
@@ -648,7 +660,7 @@ module BinaryBlocker
648
660
  @value = result
649
661
  end
650
662
  end
651
-
663
+
652
664
  def [](offset)
653
665
  raise RangeError.new("Access (#{offset}) out of range (#{@count})") unless (0...@count) === offset
654
666
  @value[offset]
@@ -659,7 +671,7 @@ module BinaryBlocker
659
671
  @value[offset] = val
660
672
  end
661
673
  end
662
-
674
+
663
675
  class ListOfEncoder < GroupEncoder
664
676
  def initialize(classes, *opts)
665
677
  initialize_options(*opts)
@@ -684,7 +696,7 @@ module BinaryBlocker
684
696
  end
685
697
  @value = result
686
698
  end
687
-
699
+
688
700
  def [](offset)
689
701
  raise RangeError.new("Access (#{offset}) out of range (#{@value.size})") unless (0...@value.size) === offset
690
702
  @value[offset]
@@ -708,7 +720,7 @@ module BinaryBlocker
708
720
  end
709
721
  alias length size
710
722
  end
711
-
723
+
712
724
  class CountedArrayEncoder < GroupEncoder
713
725
  def initialize(count_type, classes, *opts)
714
726
  # this is dynamic now, but we init to zero for the range checking
@@ -736,7 +748,7 @@ module BinaryBlocker
736
748
  end
737
749
  @value = result
738
750
  end
739
-
751
+
740
752
  def [](offset)
741
753
  raise RangeError.new("Access (#{offset}) out of range (#{@count})") unless (0...@count) === offset
742
754
  @value[offset]
@@ -757,7 +769,7 @@ module BinaryBlocker
757
769
  end
758
770
  alias length size
759
771
  end
760
-
772
+
761
773
  class BitFieldEncoder < Encoder
762
774
  def initialize(type, bit_info, *opts)
763
775
  @type = BinaryBlocker.pack_symbols[type] || type
@@ -782,7 +794,7 @@ module BinaryBlocker
782
794
  initialize_options(*opts)
783
795
  initialize_data(*opts)
784
796
  end
785
-
797
+
786
798
  def internal_block(val)
787
799
  [val.raw_value || 0].pack(@type)
788
800
  end
@@ -792,7 +804,7 @@ module BinaryBlocker
792
804
  result = buffer.unpack(@type)
793
805
  result.first
794
806
  end
795
-
807
+
796
808
  def value
797
809
  self
798
810
  end
@@ -820,9 +832,9 @@ module BinaryBlocker
820
832
  # which seemed wrong, not sure why
821
833
  end
822
834
  end
823
-
835
+
824
836
  end
825
-
837
+
826
838
  class Blocker < GroupEncoder
827
839
  def inspect
828
840
  "Blocker: #{@value.inspect} (index: #{@lookup})"
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.2.0
7
- date: 2006-09-30 00:00:00 -04:00
6
+ version: 0.2.2
7
+ date: 2006-11-03 00:00:00 -05: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
@@ -29,12 +29,15 @@ post_install_message:
29
29
  authors:
30
30
  - Patrick Hurley
31
31
  files:
32
- - test/test_blocker.rb
33
- - lib/buffered_io.rb
34
- - lib/blocker.rb
32
+ - examples
33
+ - lib
34
+ - test
35
35
  - examples/cmasqls.rb
36
- - examples/voter.rb
37
36
  - examples/readme.txt
37
+ - examples/voter.rb
38
+ - lib/blocker.rb
39
+ - lib/buffered_io.rb
40
+ - test/test_blocker.rb
38
41
  test_files: []
39
42
 
40
43
  rdoc_options: []