rbstruct 0.0.2 → 0.0.3

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 (4) hide show
  1. checksums.yaml +8 -8
  2. data/lib/rbstruct/rbstruct.rb +122 -143
  3. data/lib/rbstruct.rb +5 -2
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NzZkZWFjNmJlNjAyZDg5M2IzNzQyZDhkZWFhYThlNWE5MWJiMDA3Nw==
4
+ ZGVmMDNiYzAyNzU1MmRjZGM0ZGMzNWQ5YWJlYWI4ZTJhYmMzZGZiZQ==
5
5
  data.tar.gz: !binary |-
6
- NDdjMjI0M2EyZjQ5NGVkMjliNzI3OGQxNDBiMmE4YjhkY2FlN2EwYQ==
6
+ OWIzYzU1MGY0ZTZiYTliNzc5ZDFjZmQ0YjU3ZGQ0MDhmZmQxNDc3Yw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjI5MmYzOTkzMmY5ZTU2ZjdmZDNlYzkxM2UxYzA4OTNkNTQwNTBjZjcyMTJj
10
- Njc5NzdhNWQ0Y2VkMzRhYmE2Y2VmYTQzZjY5NTg3YzY1NWY0MjMyZDJjMzE5
11
- YWExODAyODAwOWI2ZDZkMTM4ZDJkNGJkMzk2YTFjYWZhMTcxOTM=
9
+ NzUxZmU1NmZjYmU4YjcyYjkxNWRhNGRhNGVjM2UxNjg0ZmZmOGQxZjMyOGVm
10
+ NjQ3NjMwOTQ0NTAwZTc4ODA4OWFiYzBmODllNDYyZmVkODAyYWY5NWQ4NTIw
11
+ NWExMjhiOTlhNzI1NGYxMzRjZmI0MDJiOTczM2JmOWRhM2U3MmU=
12
12
  data.tar.gz: !binary |-
13
- MWE2Nzg1MGY3NDU5YjRkMTJlN2NhNzk0OTFkYzVjYWFmNmQ0MjIyM2Y4YjMx
14
- MWE4NTM1Nzk0NzE3N2ZiYmRhMjJkZDg0ZmExZDg3YTg4MzUyNTI3Zjc2NWM4
15
- MWQwZWQ1YmZmMDI2NmNmY2QyNjQ5OTcyNjdlN2ViMWY3MTEzZjg=
13
+ Mzk4MDgzYTI5YjAyMDMzYTYxOTdjZWU1Y2FmOTk5ZTUyZThjOTk4NTA1YTVk
14
+ YzhhOGEwZTNjNzYyNjEzZjk4NWNkYTFiNGEyNTkxMTRiYTIyZGFkYTZhZmZm
15
+ NTgzYjc3ZjE1NGJmZDJhNjQwZmVhNzlkMTdhZTI2OWVjZDg0MmU=
@@ -1,153 +1,132 @@
1
1
  module RbStruct
2
2
 
3
- TYPES = {
4
- :float => {:size => 4, :str => 'f'},
5
- :int => {:size => 4, :str => 'i'},
6
- :short => {:size => 2, :str => 's'},
7
- :char => {:size => 1, :str => 'c'},
8
- :unsigned_char => {:size => 1, :str => "C"},
9
- :unsigned_short => {:size => 2, :str => "S"},
10
- :unsigned_int => {:size => 4, :str => "I"},
11
- :unsigned_long => {:size => 8, :str => "L_"}
12
- }
13
-
14
-
15
-
16
- class StructBase < Array
17
- class << self; attr_reader :format_string, :fields, :bsize, :size end
18
-
19
- protected
20
-
21
- TYPES.each_key do |type|
22
- class_eval %{
23
- def self.#{type}(name, size=1)
24
- field_add(:#{type}, name, size)
25
- end
26
- }
27
- end
28
-
29
- # def initialize(*args)
30
- # unless args.size > 0
31
- # super self.class.size,0
32
- # else
33
- # super *args
34
- # end
35
- # end
36
-
37
- def self.field_add(type, name, length)
38
- @fields ||= Array.new
39
- @bsize ||= 0
40
- @size ||= 0
41
- @format_string ||= String.new
42
-
43
- #calculate offset in array
44
- f = @fields.last
45
- if f == nil
46
- offset = 0
47
- elsif f[:type].class == Symbol
48
- offset = f[:offset] + f[:length]
49
- else
50
- offset = f[:offset] + f[:type].size * f[:length]
51
- end
52
-
53
-
54
- @fields << { :name => name, :type => type,
55
- :length => length, :offset => offset }
56
- if type.class == Symbol
57
- @size += length
58
- @bsize += TYPES[type][:size]*length
59
- @format_string += "#{TYPES[type][:str]}#{length}"
60
- else
61
- @size += length * type.size
62
- @bsize += type.bsize*length
63
- @format_string += "#{type.format_string}"*length
64
- end
65
-
66
- #create getter/setters
67
- class_eval %{
68
- def #{name}()
69
- get_field(#{@fields.size-1})
70
- end
71
-
72
- def #{name}=(val)
73
- set_field(#{@fields.size-1}, val)
74
- end
75
- }
76
- end
77
-
78
- def self.struct(type, name, size=1)
79
- self.field_add(type, name, size)
80
- end
81
-
82
- def get_field(index)
83
- type = self.class.fields[index][:type]
84
- length = self.class.fields[index][:length]
85
- offset = self.class.fields[index][:offset]
86
-
87
- if type.class == Symbol
88
- return self[offset] if length == 1
89
- return self[offset...offset+length].to_a
90
- else
91
- return type.new(self[offset...offset+type.size]) if length == 1
92
- return (0...length).collect {|i|
93
- type.new(self[offset+i*type.size...offset+(1+i)*type.size])
3
+ TYPES = {
4
+ :float => {:size => 4, :str => 'f'},
5
+ :int => {:size => 4, :str => 'i'},
6
+ :short => {:size => 2, :str => 's'},
7
+ :char => {:size => 1, :str => 'c'},
8
+ :unsigned_char => {:size => 1, :str => "C"},
9
+ :unsigned_short => {:size => 2, :str => "S"},
10
+ :unsigned_int => {:size => 4, :str => "I"},
11
+ :unsigned_long => {:size => 8, :str => "L_"}
12
+ }
13
+
14
+
15
+
16
+ class StructBase < Array
17
+ class << self; attr_reader :format_string, :fields, :bsize, :size end
18
+
19
+ protected
20
+
21
+ TYPES.each_key do |type|
22
+ class_eval %{
23
+ def self.#{type}(name, size=1)
24
+ field_add(:#{type}, name, size)
25
+ end
94
26
  }
95
- end
96
- end
97
-
98
- def set_field(index, val)
99
- type = self.class.fields[index][:type]
100
- length = self.class.fields[index][:length]
101
- offset = self.class.fields[index][:offset]
102
- if type.class == Symbol
103
- self[offset...offset+length] = val
104
- else
105
- self[offset...offset+length*type.size] = val
106
- end
107
- end
108
- public
109
- def to_s
110
- pack(self.class.format_string)
111
- end
112
- def inspect(d=0)
113
- self.class.to_s + " {\n" +
114
- self.class.fields.each_with_index.map {|f,n|
115
- field = self.get_field(n)
116
- "\t"*(d+1) + "#{f[:type]} #{f[:name]} = " +
117
- case field
118
- when StructBase
119
- "#{field.inspect(d+1)}"
27
+ end
28
+
29
+ def self.field_add(type, name, length)
30
+ @fields ||= Array.new
31
+ @bsize ||= 0
32
+ @size ||= 0
33
+ @format_string ||= String.new
34
+
35
+ #calculate offset in array
36
+ f = @fields.last
37
+ if f == nil
38
+ offset = 0
39
+ elsif f[:type].class == Symbol
40
+ offset = f[:offset] + f[:length]
120
41
  else
121
- field.inspect
42
+ offset = f[:offset] + f[:type].size * f[:length]
122
43
  end
123
44
 
124
- }.join("\n") +
125
- "\n" + "\t"*d + "}"
126
- end
127
-
128
- def write
129
- end
130
- end
131
-
132
- def self.Struct(&block)
133
- c = Class.new(StructBase)
134
- c.class_eval &block
135
- return c
136
- end
137
45
 
138
- def self.write_struct(f, *structs)
139
- structs.each do |struct|
140
- f.write(struct.pack(struct.class.format_string))
141
- end
142
- end
46
+ @fields << { :name => name, :type => type,
47
+ :length => length, :offset => offset }
48
+ if type.class == Symbol
49
+ @size += length
50
+ @bsize += TYPES[type][:size]*length
51
+ @format_string += "#{TYPES[type][:str]}#{length}"
52
+ else
53
+ @size += length * type.size
54
+ @bsize += type.bsize*length
55
+ @format_string += "#{type.format_string}"*length
56
+ end
57
+
58
+ #create getter/setters
59
+ class_eval %{
60
+ def #{name}()
61
+ get_field(#{@fields.size-1})
62
+ end
143
63
 
144
- def self.read_struct(f, type, n=1)
145
- format = type.format_string*n
146
- len = type.bsize*n
147
- array = f.read(len).unpack(format)
148
- return Array.new(n) {
149
- type.new(array.slice!(0, type.size))
150
- }
64
+ def #{name}=(val)
65
+ set_field(#{@fields.size-1}, val)
66
+ end
67
+ }
68
+ end
69
+
70
+ def self.struct(type, name, size=1)
71
+ self.field_add(type, name, size)
72
+ end
73
+
74
+ def get_field(index)
75
+ type = self.class.fields[index][:type]
76
+ length = self.class.fields[index][:length]
77
+ offset = self.class.fields[index][:offset]
78
+
79
+ if type.class == Symbol
80
+ return self[offset] if length == 1
81
+ return self[offset...offset+length].to_a
82
+ else
83
+ return type.new(self[offset...offset+type.size]) if length == 1
84
+ return (0...length).collect {|i|
85
+ type.new(self[offset+i*type.size...offset+(1+i)*type.size])
86
+ }
87
+ end
88
+ end
89
+
90
+ def set_field(index, val)
91
+ type = self.class.fields[index][:type]
92
+ length = self.class.fields[index][:length]
93
+ offset = self.class.fields[index][:offset]
94
+ if type.class == Symbol
95
+ self[offset...offset+length] = val
96
+ else
97
+ self[offset...offset+length*type.size] = val
98
+ end
99
+ end
100
+
101
+ public
102
+
103
+ def to_s
104
+ pack(self.class.format_string)
105
+ end
106
+
107
+ def self.read(f, n=1)
108
+ format = self.format_string*n
109
+ len = self.bsize*n
110
+ array = f.read(len).unpack(format)
111
+ return array.first if n == 1
112
+ return Array.new(n) { self.new(array.slice!(0, self.size)) }
113
+ end
114
+
115
+ def inspect(d=0)
116
+ self.class.to_s + " {\n" +
117
+ self.class.fields.each_with_index.map {|f,n|
118
+ field = self.get_field(n)
119
+ "\t"*(d+1) + "#{f[:type]} #{f[:name]} = " +
120
+ case field
121
+ when StructBase
122
+ "#{field.inspect(d+1)}"
123
+ else
124
+ field.inspect
125
+ end
126
+
127
+ }.join("\n") +
128
+ "\n" + "\t"*d + "}"
129
+ end
130
+ end
151
131
  end
152
132
 
153
- end
data/lib/rbstruct.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require "rbstruct/rbstruct"
2
- def RbStruct &block
3
- RbStruct.Struct &block
2
+
3
+ def RbStruct(&block)
4
+ c = Class.new(RbStruct::StructBase)
5
+ c.class_eval &block if block_given?
6
+ return c
4
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrik Pettersson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-26 00:00:00.000000000 Z
11
+ date: 2016-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler