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.
- checksums.yaml +8 -8
- data/lib/rbstruct/rbstruct.rb +122 -143
- data/lib/rbstruct.rb +5 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZGVmMDNiYzAyNzU1MmRjZGM0ZGMzNWQ5YWJlYWI4ZTJhYmMzZGZiZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OWIzYzU1MGY0ZTZiYTliNzc5ZDFjZmQ0YjU3ZGQ0MDhmZmQxNDc3Yw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NzUxZmU1NmZjYmU4YjcyYjkxNWRhNGRhNGVjM2UxNjg0ZmZmOGQxZjMyOGVm
|
10
|
+
NjQ3NjMwOTQ0NTAwZTc4ODA4OWFiYzBmODllNDYyZmVkODAyYWY5NWQ4NTIw
|
11
|
+
NWExMjhiOTlhNzI1NGYxMzRjZmI0MDJiOTczM2JmOWRhM2U3MmU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
Mzk4MDgzYTI5YjAyMDMzYTYxOTdjZWU1Y2FmOTk5ZTUyZThjOTk4NTA1YTVk
|
14
|
+
YzhhOGEwZTNjNzYyNjEzZjk4NWNkYTFiNGEyNTkxMTRiYTIyZGFkYTZhZmZm
|
15
|
+
NTgzYjc3ZjE1NGJmZDJhNjQwZmVhNzlkMTdhZTI2OWVjZDg0MmU=
|
data/lib/rbstruct/rbstruct.rb
CHANGED
@@ -1,153 +1,132 @@
|
|
1
1
|
module RbStruct
|
2
2
|
|
3
|
-
TYPES = {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
class StructBase < Array
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
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
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
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
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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
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.
|
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-
|
11
|
+
date: 2016-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|