sanderjd-bitch 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/README +0 -0
  2. data/bitch.gemspec +16 -0
  3. data/demo.rb +21 -0
  4. data/lib/bitch.rb +54 -0
  5. data/lib/bits.rb +57 -0
  6. metadata +57 -0
data/README ADDED
File without changes
@@ -0,0 +1,16 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "bitch"
3
+ s.version = "0.0.1"
4
+ s.date = "2009-01-02"
5
+ s.authors = ["James Sanders"]
6
+ s.email = "sanderjd@gmail.com"
7
+ s.summary = "Bitch provides simple composition of bit fields"
8
+ s.homepage = "http://github.com/sanderjd/bitch"
9
+ s.description = "Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields"
10
+ s.has_rdoc = true
11
+ s.files = ["README",
12
+ "bitch.gemspec",
13
+ "demo.rb",
14
+ "lib/bits.rb",
15
+ "lib/bitch.rb"]
16
+ end
data/demo.rb ADDED
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/lib/bitch'
2
+
3
+ message = Bitch.compose do |m|
4
+ m.bits :beginning, :length => 10, :value => 0b1010101010
5
+ m.bits :middle, :length => 5
6
+ m.bits :end, :length => 10, :value => 1
7
+ end
8
+
9
+ # 1010101010000000000000001
10
+ puts message.get_bits.bit_string
11
+
12
+ message[:middle] = 31
13
+
14
+ # 1010101010111110000000001
15
+ puts message.get_bits.bit_string
16
+ # 1557c01
17
+ puts message.get_bits.hex_string
18
+ # 125276001
19
+ puts message.get_bits.oct_string
20
+ # 22379521
21
+ puts message.get_bits.integer
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/bits'
2
+
3
+ class Bitch
4
+ def self.fields(name, &block)
5
+ formats[name] = self.new
6
+ yield formats[name]
7
+ end
8
+
9
+ def self.compose(&block)
10
+ composition = self.new
11
+ yield composition
12
+ composition
13
+ end
14
+
15
+ def bring(name, params = {})
16
+ format = Bitch.formats[name]
17
+ params.each_pair { |field, value| format[field] = value }
18
+ field_array << { name => format.get_bits }
19
+ end
20
+
21
+ def bits(name, params)
22
+ value = params.key?(:value) ? params[:value] : 0
23
+ length = params.key?(:length) ? params[:length] : 0
24
+ field_array << { name => Bits.new(value, length) }
25
+ end
26
+
27
+ def get_bits
28
+ field_array.inject(nil) do |fields, field|
29
+ bits = field.values.first
30
+ fields ? fields + bits : bits
31
+ end
32
+ end
33
+
34
+ def [](name)
35
+ field_array.select { |field| field.key?(name) }.first.values.first
36
+ end
37
+
38
+ def []=(name, value)
39
+ element_array = field_array.select { |field| field.key?(name) }
40
+ element = element_array.first.values.first unless element_array.empty?
41
+ element.set(value) unless element.nil?
42
+ end
43
+
44
+ private
45
+
46
+ def field_array
47
+ @field_array ||= Array.new
48
+ end
49
+
50
+ def self.formats
51
+ @@formats ||= Hash.new
52
+ end
53
+ end
54
+
@@ -0,0 +1,57 @@
1
+ # Bits provides an easy way to store and access sequences of bits,
2
+ # allowing input and output in multiple formats
3
+
4
+ class Bits
5
+
6
+ # +bits+:: The bit field to store
7
+ # +length+:: Length of the bit field - default to calculated length, 0-pad on
8
+ # MSB
9
+
10
+ def initialize(bits, length = 0)
11
+ @length = length
12
+ @bits = bit_string_from_input(bits, length)
13
+ end
14
+
15
+ def +(bits)
16
+ Bits.new("0b#{@bits}" + bit_string_from_input(bits))
17
+ end
18
+
19
+ def bit_string
20
+ @bits
21
+ end
22
+
23
+ def hex_string
24
+ @bits.to_i(2).to_s(16)
25
+ end
26
+
27
+ def oct_string
28
+ @bits.to_i(2).to_s(8)
29
+ end
30
+
31
+ def integer
32
+ @bits.to_i(2)
33
+ end
34
+
35
+ def set(bits)
36
+ @bits = bit_string_from_input(bits, @length)
37
+ end
38
+
39
+ protected
40
+
41
+ attr_reader :bits
42
+
43
+ private
44
+
45
+ def bit_string_from_input(bits, length = 0)
46
+ case bits
47
+ when Integer, Fixnum, Bignum
48
+ "%0#{length}b" % bits
49
+ when String
50
+ "%0#{length}b" % Integer(bits)
51
+ when Bits
52
+ bits.bits
53
+ else
54
+ raise TypeError, "Unsupported data type #{bits.class}"
55
+ end
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sanderjd-bitch
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - James Sanders
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-02 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Spurred by unneeded complexity in projects such as BinData, Bitch provides dead-simple composition and naming of bit fields
17
+ email: sanderjd@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - README
26
+ - bitch.gemspec
27
+ - demo.rb
28
+ - lib/bits.rb
29
+ - lib/bitch.rb
30
+ has_rdoc: true
31
+ homepage: http://github.com/sanderjd/bitch
32
+ post_install_message:
33
+ rdoc_options: []
34
+
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ requirements: []
50
+
51
+ rubyforge_project:
52
+ rubygems_version: 1.2.0
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: Bitch provides simple composition of bit fields
56
+ test_files: []
57
+