libbin 1.0.4 → 1.0.8
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 +4 -4
- data/ext/libbin/data_types.c +466 -0
- data/ext/libbin/data_types.h +15 -0
- data/ext/libbin/libbin_c.c +1450 -41
- data/ext/libbin/libbin_c.h +12 -0
- data/ext/libbin/libbin_endian.h +126 -0
- data/lib/libbin/data_types.rb +64 -309
- data/lib/libbin.rb +13 -319
- data/libbin.gemspec +2 -3
- metadata +8 -5
data/lib/libbin.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
module LibBin
|
2
|
-
end
|
3
1
|
require "libbin_c.so"
|
4
2
|
|
5
3
|
require_relative 'libbin/alignment'
|
@@ -7,12 +5,17 @@ require_relative 'libbin/data_types'
|
|
7
5
|
|
8
6
|
module LibBin
|
9
7
|
|
10
|
-
|
8
|
+
BIG_ARCHITECTURE = [0x12345678].pack("i") == "\x12\x34\x56\x78"
|
11
9
|
@__big = nil
|
10
|
+
@__output = $stderr
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :__output
|
14
|
+
end
|
12
15
|
|
13
16
|
def self.default_big?
|
14
17
|
if @__big.nil?
|
15
|
-
|
18
|
+
BIG_ARCHITECTURE
|
16
19
|
else
|
17
20
|
@__big
|
18
21
|
end
|
@@ -25,329 +28,20 @@ module LibBin
|
|
25
28
|
to_s
|
26
29
|
end
|
27
30
|
|
28
|
-
attr_reader :__parent
|
29
|
-
attr_reader :__index
|
30
|
-
attr_reader :__iterator
|
31
|
-
attr_reader :__position
|
32
|
-
def __set_convert_type(input, output, input_big, output_big, parent, index)
|
33
|
-
@__input_big = input_big
|
34
|
-
@__output_big = output_big
|
35
|
-
@__input = input
|
36
|
-
@__output = output
|
37
|
-
@__parent = parent
|
38
|
-
@__index = index
|
39
|
-
@__position = input.tell
|
40
|
-
@__cur_position = @__position
|
41
|
-
end
|
42
|
-
|
43
|
-
def __set_size_type(position, parent, index)
|
44
|
-
@__parent = parent
|
45
|
-
@__index = index
|
46
|
-
@__position = position
|
47
|
-
@__cur_position = @__position
|
48
|
-
end
|
49
|
-
|
50
|
-
def __set_load_type(input, input_big, parent, index)
|
51
|
-
@__input_big = input_big
|
52
|
-
@__input = input
|
53
|
-
@__parent = parent
|
54
|
-
@__index = index
|
55
|
-
@__position = input.tell
|
56
|
-
@__cur_position = @__position
|
57
|
-
end
|
58
|
-
|
59
|
-
def __set_dump_type(output, output_big, parent, index)
|
60
|
-
@__output_big = output_big
|
61
|
-
@__output = output
|
62
|
-
@__parent = parent
|
63
|
-
@__index = index
|
64
|
-
@__position = output.tell
|
65
|
-
@__cur_position = @__position
|
66
|
-
end
|
67
|
-
|
68
|
-
def __unset_convert_type
|
69
|
-
@__input_big = nil
|
70
|
-
@__output_big = nil
|
71
|
-
@__input = nil
|
72
|
-
@__output = nil
|
73
|
-
@__parent = nil
|
74
|
-
@__index = nil
|
75
|
-
@__position = nil
|
76
|
-
@__cur_position = nil
|
77
|
-
end
|
78
|
-
|
79
|
-
def __unset_size_type
|
80
|
-
@__parent = nil
|
81
|
-
@__index = nil
|
82
|
-
@__position = nil
|
83
|
-
@__cur_position = nil
|
84
|
-
end
|
85
|
-
|
86
|
-
def __unset_load_type
|
87
|
-
@__input_big = nil
|
88
|
-
@__input = nil
|
89
|
-
@__parent = nil
|
90
|
-
@__index = nil
|
91
|
-
@__position = nil
|
92
|
-
@__cur_position = nil
|
93
|
-
end
|
94
|
-
|
95
|
-
def __unset_dump_type
|
96
|
-
@__output_big = nil
|
97
|
-
@__output = nil
|
98
|
-
@__parent = nil
|
99
|
-
@__index = nil
|
100
|
-
@__position = nil
|
101
|
-
@__cur_position = nil
|
102
|
-
end
|
103
|
-
|
104
31
|
def self.inherited(subclass)
|
105
32
|
subclass.instance_variable_set(:@fields, [])
|
106
33
|
end
|
107
34
|
|
108
|
-
def __decode_expression(sym)
|
109
|
-
case sym
|
110
|
-
when Proc
|
111
|
-
return sym.call
|
112
|
-
when String
|
113
|
-
exp = sym.gsub("..","__parent").gsub("\\",".")
|
114
|
-
return eval(exp)
|
115
|
-
else
|
116
|
-
return sym
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def __decode_seek_offset(offset, relative_offset)
|
121
|
-
return nil unless offset
|
122
|
-
offset = __decode_expression(offset)
|
123
|
-
return false if offset == 0x0
|
124
|
-
offset += @__position if relative_offset
|
125
|
-
@__cur_position = offset
|
126
|
-
@__input.seek(offset) if @__input
|
127
|
-
@__output.seek(offset) if @__output
|
128
|
-
offset
|
129
|
-
end
|
130
|
-
|
131
|
-
def __decode_condition(condition)
|
132
|
-
return true unless condition
|
133
|
-
__decode_expression(condition)
|
134
|
-
end
|
135
|
-
|
136
|
-
def __decode_count(count)
|
137
|
-
return 1 unless count
|
138
|
-
__decode_expression(count)
|
139
|
-
end
|
140
|
-
|
141
|
-
def __decode_type(type)
|
142
|
-
return __decode_expression(type)
|
143
|
-
end
|
144
|
-
|
145
|
-
def __decode_static_conditions(field)
|
146
|
-
@__offset = nil
|
147
|
-
@__condition = nil
|
148
|
-
@__type = nil
|
149
|
-
@__count = nil
|
150
|
-
unless field.sequence?
|
151
|
-
@__offset = __decode_seek_offset(field.offset, field.relative_offset?)
|
152
|
-
throw :ignored, nil if @__offset == false
|
153
|
-
@__condition = __decode_condition(field.condition)
|
154
|
-
throw :ignored, nil unless @__condition
|
155
|
-
@__type = __decode_type(field.type)
|
156
|
-
end
|
157
|
-
@__count = __decode_count(field.count)
|
158
|
-
end
|
159
|
-
|
160
|
-
def __decode_dynamic_conditions(field)
|
161
|
-
return true unless field.sequence?
|
162
|
-
@__offset = nil
|
163
|
-
@__condition = nil
|
164
|
-
@__type = nil
|
165
|
-
@__offset = __decode_seek_offset(field.offset, field.relative_offset?)
|
166
|
-
return false if @__offset == false
|
167
|
-
@__condition = __decode_condition(field.condition)
|
168
|
-
return false unless @__condition
|
169
|
-
@__type = __decode_type(field.type)
|
170
|
-
return true
|
171
|
-
end
|
172
|
-
|
173
|
-
def __restore_context
|
174
|
-
@__iterator = nil
|
175
|
-
@__type = nil
|
176
|
-
@__count = nil
|
177
|
-
@__offset = nil
|
178
|
-
@__condition = nil
|
179
|
-
end
|
180
|
-
|
181
|
-
def __convert_field(field)
|
182
|
-
__decode_static_conditions(field)
|
183
|
-
vs = @__count.times.collect do |it|
|
184
|
-
@__iterator = it
|
185
|
-
if __decode_dynamic_conditions(field)
|
186
|
-
@__type::convert(@__input, @__output, @__input_big, @__output_big, self, it)
|
187
|
-
else
|
188
|
-
nil
|
189
|
-
end
|
190
|
-
end
|
191
|
-
__restore_context
|
192
|
-
vs = vs.first unless field.count
|
193
|
-
vs
|
194
|
-
end
|
195
|
-
|
196
|
-
def __load_field(field)
|
197
|
-
__decode_static_conditions(field)
|
198
|
-
vs = @__count.times.collect do |it|
|
199
|
-
@__iterator = it
|
200
|
-
if __decode_dynamic_conditions(field)
|
201
|
-
@__type::load(@__input, @__input_big, self, it)
|
202
|
-
else
|
203
|
-
nil
|
204
|
-
end
|
205
|
-
end
|
206
|
-
__restore_context
|
207
|
-
vs = vs.first unless field.count
|
208
|
-
vs
|
209
|
-
end
|
210
|
-
|
211
|
-
def __dump_field(vs, field)
|
212
|
-
__decode_static_conditions(field)
|
213
|
-
vs = [vs] unless field.count
|
214
|
-
vs.each_with_index do |v, it|
|
215
|
-
@__iterator = it
|
216
|
-
if __decode_dynamic_conditions(field)
|
217
|
-
@__type::dump(v, @__output, @__output_big, self, it)
|
218
|
-
end
|
219
|
-
end
|
220
|
-
__restore_context
|
221
|
-
end
|
222
|
-
|
223
|
-
def __shape_field(vs, previous_offset, kind, field)
|
224
|
-
__decode_static_conditions(field)
|
225
|
-
vs = [vs] unless field.count
|
226
|
-
vs = vs.each_with_index.collect do |v, it|
|
227
|
-
@__iterator = it
|
228
|
-
if __decode_dynamic_conditions(field)
|
229
|
-
sh = @__type::shape(v, @__cur_position, self, it, kind)
|
230
|
-
@__cur_position = sh.last + 1 if sh.last && sh.last >= 0
|
231
|
-
sh
|
232
|
-
end
|
233
|
-
end
|
234
|
-
__restore_context
|
235
|
-
vs = vs.first unless field.count
|
236
|
-
vs
|
237
|
-
end
|
238
|
-
|
239
35
|
def __size(previous_offset = 0, parent = nil, index = nil)
|
240
36
|
__shape(previous_offset, parent, index, DataRange).size
|
241
37
|
end
|
242
38
|
|
243
|
-
def
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
member = catch(:ignored) do
|
250
|
-
__shape_field(vs, previous_offset, kind, field)
|
251
|
-
end
|
252
|
-
members[field.name] = member
|
253
|
-
rescue
|
254
|
-
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
255
|
-
raise
|
256
|
-
end
|
257
|
-
}
|
258
|
-
__unset_size_type
|
259
|
-
return nil if members.values.flatten.compact.size <= 0
|
260
|
-
kind::new(members)
|
261
|
-
end
|
262
|
-
|
263
|
-
def __convert_fields
|
264
|
-
self.class.instance_variable_get(:@fields).each { |field|
|
265
|
-
begin
|
266
|
-
vs = catch(:ignored) do
|
267
|
-
__convert_field(field)
|
268
|
-
end
|
269
|
-
send("#{field.name}=", vs)
|
270
|
-
rescue
|
271
|
-
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
272
|
-
raise
|
273
|
-
end
|
274
|
-
}
|
275
|
-
self
|
276
|
-
end
|
277
|
-
|
278
|
-
def __load_fields
|
279
|
-
self.class.instance_variable_get(:@fields).each { |field|
|
280
|
-
begin
|
281
|
-
vs = catch(:ignored) do
|
282
|
-
__load_field(field)
|
283
|
-
end
|
284
|
-
send("#{field.name}=", vs)
|
285
|
-
rescue
|
286
|
-
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
287
|
-
raise
|
288
|
-
end
|
289
|
-
}
|
290
|
-
self
|
291
|
-
end
|
292
|
-
|
293
|
-
def __dump_fields
|
294
|
-
self.class.instance_variable_get(:@fields).each { |field|
|
295
|
-
begin
|
296
|
-
vs = send(field.name)
|
297
|
-
catch(:ignored) do
|
298
|
-
__dump_field(vs, field)
|
299
|
-
end
|
300
|
-
rescue
|
301
|
-
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
302
|
-
raise
|
303
|
-
end
|
304
|
-
}
|
305
|
-
self
|
306
|
-
end
|
307
|
-
|
308
|
-
def __convert(input, output, input_big, output_big, parent = nil, index = nil)
|
309
|
-
__set_convert_type(input, output, input_big, output_big, parent, index)
|
310
|
-
__convert_fields
|
311
|
-
__unset_convert_type
|
312
|
-
self
|
313
|
-
end
|
314
|
-
|
315
|
-
def __load(input, input_big, parent = nil, index = nil)
|
316
|
-
__set_load_type(input, input_big, parent, index)
|
317
|
-
__load_fields
|
318
|
-
__unset_load_type
|
319
|
-
self
|
320
|
-
end
|
321
|
-
|
322
|
-
def __dump(output, output_big, parent = nil, index = nil)
|
323
|
-
__set_dump_type(output, output_big, parent, index)
|
324
|
-
__dump_fields
|
325
|
-
__unset_dump_type
|
326
|
-
self
|
327
|
-
end
|
328
|
-
|
329
|
-
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big?, parent = nil, index = nil)
|
330
|
-
h = self::new
|
331
|
-
h.__convert(input, output, input_big, output_big, parent, index)
|
332
|
-
h
|
333
|
-
end
|
334
|
-
|
335
|
-
def self.load(input, input_big = LibBin::default_big?, parent = nil, index = nil)
|
336
|
-
h = self::new
|
337
|
-
h.__load(input, input_big, parent, index)
|
338
|
-
h
|
339
|
-
end
|
340
|
-
|
341
|
-
def self.dump(value, output, output_big = LibBin::default_big?, parent = nil, index = nil)
|
342
|
-
value.__dump(output, output_big, parent, index)
|
343
|
-
end
|
344
|
-
|
345
|
-
def self.size(value, previous_offset = 0, parent = nil, index = nil)
|
346
|
-
value.__shape(previous_offset, parent, index).size
|
347
|
-
end
|
348
|
-
|
349
|
-
def self.shape(value, previous_offset = 0, parent = nil, index = nil, kind = DataShape)
|
350
|
-
value.__shape(previous_offset, parent, index, kind)
|
39
|
+
def self.size(value, previous_offset = 0, parent = nil, index = nil, length = nil)
|
40
|
+
if length
|
41
|
+
shape(value, previous_offset, parent, index, length).size
|
42
|
+
else
|
43
|
+
value.__shape(previous_offset, parent, index).size
|
44
|
+
end
|
351
45
|
end
|
352
46
|
|
353
47
|
end
|
data/libbin.gemspec
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'libbin'
|
3
|
-
s.version = "1.0.
|
3
|
+
s.version = "1.0.8"
|
4
4
|
s.author = "Brice Videau"
|
5
|
-
s.email = "brice.videau@
|
5
|
+
s.email = "brice.videau@gmail.com"
|
6
6
|
s.homepage = "https://github.com/kerilk/libbin"
|
7
7
|
s.summary = "Library for loading and converting binary files"
|
8
8
|
s.description = "Read, write and convert Binary data in Ruby."
|
9
9
|
s.files = Dir[ 'libbin.gemspec', 'LICENSE', 'lib/**/*.rb', 'ext/libbin/extconf.rb', 'ext/libbin/*.c', 'ext/libbin/*.h' ]
|
10
10
|
s.extensions << 'ext/libbin/extconf.rb'
|
11
|
-
s.has_rdoc = false
|
12
11
|
s.license = 'BSD-2-Clause'
|
13
12
|
s.required_ruby_version = '>= 2.0.0'
|
14
13
|
s.add_dependency 'float-formats', '~> 0.3', '>=0.3.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libbin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice Videau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: float-formats
|
@@ -31,17 +31,21 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.3.0
|
33
33
|
description: Read, write and convert Binary data in Ruby.
|
34
|
-
email: brice.videau@
|
34
|
+
email: brice.videau@gmail.com
|
35
35
|
executables: []
|
36
36
|
extensions:
|
37
37
|
- ext/libbin/extconf.rb
|
38
38
|
extra_rdoc_files: []
|
39
39
|
files:
|
40
40
|
- LICENSE
|
41
|
+
- ext/libbin/data_types.c
|
42
|
+
- ext/libbin/data_types.h
|
41
43
|
- ext/libbin/extconf.rb
|
42
44
|
- ext/libbin/half.c
|
43
45
|
- ext/libbin/half.h
|
44
46
|
- ext/libbin/libbin_c.c
|
47
|
+
- ext/libbin/libbin_c.h
|
48
|
+
- ext/libbin/libbin_endian.h
|
45
49
|
- ext/libbin/pghalf.c
|
46
50
|
- ext/libbin/pghalf.h
|
47
51
|
- lib/libbin.rb
|
@@ -67,8 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
71
|
- !ruby/object:Gem::Version
|
68
72
|
version: '0'
|
69
73
|
requirements: []
|
70
|
-
|
71
|
-
rubygems_version: 2.7.6
|
74
|
+
rubygems_version: 3.1.2
|
72
75
|
signing_key:
|
73
76
|
specification_version: 4
|
74
77
|
summary: Library for loading and converting binary files
|