sanderjd-bitch 0.0.1

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.
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
+