libbin 1.0.2 → 1.0.6
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/LICENSE +0 -0
- data/ext/libbin/extconf.rb +0 -0
- data/ext/libbin/half.c +0 -0
- data/ext/libbin/half.h +0 -0
- data/ext/libbin/libbin_c.c +8 -8
- data/ext/libbin/pghalf.c +28 -28
- data/ext/libbin/pghalf.h +0 -0
- data/lib/libbin/alignment.rb +0 -0
- data/lib/libbin/data_types.rb +143 -64
- data/lib/libbin.rb +103 -64
- data/libbin.gemspec +1 -2
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3a9557a12a5d4ef9ed048592358290c19bebb42cb55d5dacf5d234e62aee6c0
|
4
|
+
data.tar.gz: 319fffa88af207c7613209e632b10e1c16a70bea0b5ddfbf7de6b1f54bb74cbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a07e150714b61ea44cb2a7df3442e6ed7257d4b601bc8e2353e2329fc9eaaddcef56318dac85c2277a1eff3e8f6407919b4f43320e4e9d02506cce2bcea6bf35
|
7
|
+
data.tar.gz: 2d4ef297ce1c616ce464d2b3a667061959965ba8ca63113e699348e6313f3ab8ba15165c3041cc84cded5dc70ba5b5e5f31bcf338221f5a2a4bb725440636fad
|
data/LICENSE
CHANGED
File without changes
|
data/ext/libbin/extconf.rb
CHANGED
File without changes
|
data/ext/libbin/half.c
CHANGED
File without changes
|
data/ext/libbin/half.h
CHANGED
File without changes
|
data/ext/libbin/libbin_c.c
CHANGED
@@ -11,7 +11,7 @@ static VALUE pghalf_from_string_p(VALUE self, VALUE str, VALUE pack_str) {
|
|
11
11
|
Check_Type(str, T_STRING);
|
12
12
|
Check_Type(pack_str, T_STRING);
|
13
13
|
VALUE arr = rb_funcall(str, rb_intern("unpack"), 1, pack_str);
|
14
|
-
|
14
|
+
uint16_t val = NUM2USHORT(rb_funcall(arr, rb_intern("first"), 0));
|
15
15
|
union float_u res;
|
16
16
|
|
17
17
|
res.i = pghalf_to_float(val);
|
@@ -22,7 +22,7 @@ static VALUE half_from_string_p(VALUE self, VALUE str, VALUE pack_str) {
|
|
22
22
|
Check_Type(str, T_STRING);
|
23
23
|
Check_Type(pack_str, T_STRING);
|
24
24
|
VALUE arr = rb_funcall(str, rb_intern("unpack"), 1, pack_str);
|
25
|
-
|
25
|
+
uint16_t val = NUM2USHORT(rb_funcall(arr, rb_intern("first"), 0));
|
26
26
|
union float_u res;
|
27
27
|
|
28
28
|
res.i = half_to_float(val);
|
@@ -32,25 +32,25 @@ static VALUE half_from_string_p(VALUE self, VALUE str, VALUE pack_str) {
|
|
32
32
|
static VALUE pghalf_to_string_p(VALUE self, VALUE number, VALUE pack_str) {
|
33
33
|
Check_Type(number, T_FLOAT);
|
34
34
|
union float_u val;
|
35
|
-
|
35
|
+
uint16_t res;
|
36
36
|
|
37
37
|
val.f = NUM2DBL(number);
|
38
38
|
res = pghalf_from_float(val.i);
|
39
|
-
|
39
|
+
VALUE arr = rb_ary_new3(1, UINT2NUM(res) );
|
40
40
|
|
41
|
-
|
41
|
+
return rb_funcall(arr, rb_intern("pack"), 1, pack_str);
|
42
42
|
}
|
43
43
|
|
44
44
|
static VALUE half_to_string_p(VALUE self, VALUE number, VALUE pack_str) {
|
45
45
|
Check_Type(number, T_FLOAT);
|
46
46
|
union float_u val;
|
47
|
-
|
47
|
+
uint16_t res;
|
48
48
|
|
49
49
|
val.f = NUM2DBL(number);
|
50
50
|
res = half_from_float(val.i);
|
51
|
-
|
51
|
+
VALUE arr = rb_ary_new3(1, UINT2NUM(res) );
|
52
52
|
|
53
|
-
|
53
|
+
return rb_funcall(arr, rb_intern("pack"), 1, pack_str);
|
54
54
|
}
|
55
55
|
|
56
56
|
void Init_libbin_c() {
|
data/ext/libbin/pghalf.c
CHANGED
@@ -339,22 +339,22 @@ uint16_t
|
|
339
339
|
pghalf_from_float( uint32_t f )
|
340
340
|
{
|
341
341
|
const uint32_t one = _uint32_li( 0x00000001 );
|
342
|
-
const uint32_t f_s_mask = _uint32_li( 0x80000000 );
|
343
|
-
const uint32_t f_e_mask = _uint32_li( 0x7f800000 );
|
344
|
-
const uint32_t f_m_mask = _uint32_li( 0x007fffff );
|
345
|
-
const uint32_t f_m_hidden_bit = _uint32_li( 0x00800000 );
|
346
|
-
const uint32_t f_m_round_bit = _uint32_li(
|
347
|
-
const uint32_t f_snan_mask = _uint32_li( 0x7fc00000 );
|
348
|
-
const uint32_t f_e_pos = _uint32_li( 0x00000017 );
|
349
|
-
const uint32_t h_e_pos = _uint32_li( 0x00000009 );
|
350
|
-
const uint32_t h_e_mask = _uint32_li( 0x00007e00 );
|
351
|
-
const uint32_t h_snan_mask = _uint32_li( 0x00007f00 );
|
352
|
-
const uint32_t h_e_mask_value = _uint32_li( 0x0000003f );
|
353
|
-
const uint32_t f_h_s_pos_offset = _uint32_li( 0x00000010 );
|
354
|
-
const uint32_t f_h_bias_offset = _uint32_li( 0x00000050 );
|
355
|
-
const uint32_t f_h_m_pos_offset = _uint32_li( 0x0000000e );
|
356
|
-
const uint32_t h_nan_min = _uint32_li( 0x00007e01 );
|
357
|
-
const uint32_t f_h_e_biased_flag = _uint32_li( 0x000000af );
|
342
|
+
const uint32_t f_s_mask = _uint32_li( 0x80000000 ); //bit 31
|
343
|
+
const uint32_t f_e_mask = _uint32_li( 0x7f800000 ); //bits 30-23
|
344
|
+
const uint32_t f_m_mask = _uint32_li( 0x007fffff ); //bits 22-0
|
345
|
+
const uint32_t f_m_hidden_bit = _uint32_li( 0x00800000 ); //1<<f_e_pos
|
346
|
+
const uint32_t f_m_round_bit = _uint32_li( 0x00002000 ); //1<<(f_e_pos - h_e_pos - 1)
|
347
|
+
const uint32_t f_snan_mask = _uint32_li( 0x7fc00000 ); //f_e_mask + 1 << (f_e_pos - 1)
|
348
|
+
const uint32_t f_e_pos = _uint32_li( 0x00000017 ); //23
|
349
|
+
const uint32_t h_e_pos = _uint32_li( 0x00000009 ); //9
|
350
|
+
const uint32_t h_e_mask = _uint32_li( 0x00007e00 ); //bits 14-9
|
351
|
+
const uint32_t h_snan_mask = _uint32_li( 0x00007f00 ); //h_e_mask + 1 << (h_e_pos - 1)
|
352
|
+
const uint32_t h_e_mask_value = _uint32_li( 0x0000003f ); //h_e_mask >> 9
|
353
|
+
const uint32_t f_h_s_pos_offset = _uint32_li( 0x00000010 ); //f_s_pos - h_s_pos
|
354
|
+
const uint32_t f_h_bias_offset = _uint32_li( 0x00000050 ); //f_bias - h_bias
|
355
|
+
const uint32_t f_h_m_pos_offset = _uint32_li( 0x0000000e ); //f_e_pos - h_e_pos
|
356
|
+
const uint32_t h_nan_min = _uint32_li( 0x00007e01 ); //h_e_mask + 1
|
357
|
+
const uint32_t f_h_e_biased_flag = _uint32_li( 0x000000af ); //f_bias + h_bias + 1
|
358
358
|
const uint32_t f_s = _uint32_and( f, f_s_mask );
|
359
359
|
const uint32_t f_e = _uint32_and( f, f_e_mask );
|
360
360
|
const uint16_t h_s = _uint32_srl( f_s, f_h_s_pos_offset );
|
@@ -403,18 +403,18 @@ pghalf_from_float( uint32_t f )
|
|
403
403
|
uint32_t
|
404
404
|
pghalf_to_float( uint16_t h )
|
405
405
|
{
|
406
|
-
const uint32_t h_e_mask = _uint32_li( 0x00007e00 );
|
407
|
-
const uint32_t h_m_mask = _uint32_li( 0x000001ff );
|
408
|
-
const uint32_t h_s_mask = _uint32_li( 0x00008000 );
|
409
|
-
const uint32_t h_f_s_pos_offset = _uint32_li( 0x00000010 );
|
410
|
-
const uint32_t h_f_e_pos_offset = _uint32_li( 0x0000000e );
|
411
|
-
const uint32_t h_f_bias_offset = _uint32_li( 0x0000a000 );
|
412
|
-
const uint32_t f_e_mask = _uint32_li( 0x7f800000 );
|
413
|
-
const uint32_t f_m_mask = _uint32_li( 0x007fffff );
|
414
|
-
const uint32_t h_f_e_denorm_bias = _uint32_li( 0x0000005f );
|
415
|
-
const uint32_t h_f_m_denorm_sa_bias = _uint32_li( 0x00000008 );
|
416
|
-
const uint32_t f_e_pos = _uint32_li( 0x00000017 );
|
417
|
-
const uint32_t h_e_mask_minus_one = _uint32_li( 0x00007dff );
|
406
|
+
const uint32_t h_e_mask = _uint32_li( 0x00007e00 ); //bits 14-9
|
407
|
+
const uint32_t h_m_mask = _uint32_li( 0x000001ff ); //bits 8-0
|
408
|
+
const uint32_t h_s_mask = _uint32_li( 0x00008000 ); //bit 15
|
409
|
+
const uint32_t h_f_s_pos_offset = _uint32_li( 0x00000010 ); //f_s_pos - h_s_pos
|
410
|
+
const uint32_t h_f_e_pos_offset = _uint32_li( 0x0000000e ); //f_m_bitcount - h_m_bitcount
|
411
|
+
const uint32_t h_f_bias_offset = _uint32_li( 0x0000a000 ); //(f_bias - h_bias) << 9
|
412
|
+
const uint32_t f_e_mask = _uint32_li( 0x7f800000 ); //bits 30-23
|
413
|
+
const uint32_t f_m_mask = _uint32_li( 0x007fffff ); //bits 22-0
|
414
|
+
const uint32_t h_f_e_denorm_bias = _uint32_li( 0x0000005f ); //h_f_e_pos_offset + 1 + (f_bias - h_bias)
|
415
|
+
const uint32_t h_f_m_denorm_sa_bias = _uint32_li( 0x00000008 ); //float exp bit count
|
416
|
+
const uint32_t f_e_pos = _uint32_li( 0x00000017 ); //23
|
417
|
+
const uint32_t h_e_mask_minus_one = _uint32_li( 0x00007dff ); //h_e_mask + h_m_mask - 1<<h_e_pos
|
418
418
|
const uint32_t h_e = _uint32_and( h, h_e_mask );
|
419
419
|
const uint32_t h_m = _uint32_and( h, h_m_mask );
|
420
420
|
const uint32_t h_s = _uint32_and( h, h_s_mask );
|
data/ext/libbin/pghalf.h
CHANGED
File without changes
|
data/lib/libbin/alignment.rb
CHANGED
File without changes
|
data/lib/libbin/data_types.rb
CHANGED
@@ -70,14 +70,52 @@ module LibBin
|
|
70
70
|
|
71
71
|
end
|
72
72
|
|
73
|
+
class Field
|
74
|
+
attr_reader :name,
|
75
|
+
:type,
|
76
|
+
:length,
|
77
|
+
:count,
|
78
|
+
:offset,
|
79
|
+
:sequence,
|
80
|
+
:condition
|
81
|
+
|
82
|
+
def sequence?
|
83
|
+
@sequence
|
84
|
+
end
|
85
|
+
|
86
|
+
def relative_offset?
|
87
|
+
@relative_offset
|
88
|
+
end
|
89
|
+
|
90
|
+
def initialize(name, type, length, count, offset, sequence, condition, relative_offset)
|
91
|
+
@name = name
|
92
|
+
@type = type
|
93
|
+
@length = length
|
94
|
+
@count = count
|
95
|
+
@offset = offset
|
96
|
+
@sequence = sequence
|
97
|
+
@condition = condition
|
98
|
+
@relative_offset = relative_offset
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
73
103
|
class DataConverter
|
74
104
|
|
75
|
-
rl = lambda { |type, str|
|
76
|
-
|
105
|
+
rl = lambda { |type, str, number = nil|
|
106
|
+
if number
|
107
|
+
str.unpack(type.to_s+number.to_s)
|
108
|
+
else
|
109
|
+
str.unpack(type.to_s).first
|
110
|
+
end
|
77
111
|
}
|
78
112
|
|
79
|
-
sl = lambda { |type, value|
|
80
|
-
|
113
|
+
sl = lambda { |type, value, number = nil|
|
114
|
+
if number
|
115
|
+
value.pack(type.to_s+number.to_s)
|
116
|
+
else
|
117
|
+
[value].pack(type.to_s)
|
118
|
+
end
|
81
119
|
}
|
82
120
|
|
83
121
|
l = lambda { |type|
|
@@ -161,6 +199,7 @@ module LibBin
|
|
161
199
|
:D => 8,
|
162
200
|
:E => 8,
|
163
201
|
:G => 8,
|
202
|
+
:a => 1,
|
164
203
|
:"a*" => -1,
|
165
204
|
:half => 2,
|
166
205
|
:half_le => 2,
|
@@ -186,6 +225,50 @@ module LibBin
|
|
186
225
|
}
|
187
226
|
}
|
188
227
|
|
228
|
+
rhl = lambda { |type, str, number = nil|
|
229
|
+
if number
|
230
|
+
number.times.collect { |i| LibBin::half_from_string(str[i*2,2], type) }
|
231
|
+
else
|
232
|
+
LibBin::half_from_string(str, type)
|
233
|
+
end
|
234
|
+
}
|
235
|
+
|
236
|
+
shl = lambda { |type, value, number = nil|
|
237
|
+
if number
|
238
|
+
str = ""
|
239
|
+
number.times { |i| str << LibBin::half_to_string(value[i], type) }
|
240
|
+
str
|
241
|
+
else
|
242
|
+
LibBin::half_to_string(value, type)
|
243
|
+
end
|
244
|
+
}
|
245
|
+
|
246
|
+
hl = lambda { |type|
|
247
|
+
[rhl.curry[type], shl.curry[type]]
|
248
|
+
}
|
249
|
+
|
250
|
+
rpghl = lambda { |type, str, number = nil|
|
251
|
+
if number
|
252
|
+
number.times.collect { |i| LibBin::pghalf_from_string(str[i*2,2], type) }
|
253
|
+
else
|
254
|
+
LibBin::pghalf_from_string(str, type)
|
255
|
+
end
|
256
|
+
}
|
257
|
+
|
258
|
+
spghl = lambda { |type, value, number = nil|
|
259
|
+
if number
|
260
|
+
str = ""
|
261
|
+
number.times { |i| str << LibBin::pghalf_to_string(value[i], type) }
|
262
|
+
str
|
263
|
+
else
|
264
|
+
LibBin::pghalf_to_string(value, type)
|
265
|
+
end
|
266
|
+
}
|
267
|
+
|
268
|
+
pghl = lambda { |type|
|
269
|
+
[rpghl.curry[type], spghl.curry[type]]
|
270
|
+
}
|
271
|
+
|
189
272
|
DATA_ENDIAN[true].merge!( {
|
190
273
|
:c => l["c"],
|
191
274
|
:C => l["C"],
|
@@ -217,19 +300,12 @@ module LibBin
|
|
217
300
|
:D => l["G"],
|
218
301
|
:E => l["E"],
|
219
302
|
:G => l["G"],
|
220
|
-
:
|
221
|
-
:
|
222
|
-
|
223
|
-
:
|
224
|
-
|
225
|
-
:
|
226
|
-
lambda { |v| LibBin::half_to_string(v, "S>") } ],
|
227
|
-
:pghalf => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
|
228
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S>") } ],
|
229
|
-
:pghalf_le => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
|
230
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
|
231
|
-
:pghalf_be => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
|
232
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S>") } ]
|
303
|
+
:half => hl["S>"],
|
304
|
+
:half_le => hl["S<"],
|
305
|
+
:half_be => hl["S>"],
|
306
|
+
:pghalf => pghl["S>"],
|
307
|
+
:pghalf_le => pghl["S<"],
|
308
|
+
:pghalf_be => pghl["S>"]
|
233
309
|
} )
|
234
310
|
DATA_ENDIAN[false].merge!( {
|
235
311
|
:c => l["c"],
|
@@ -262,19 +338,12 @@ module LibBin
|
|
262
338
|
:D => l["E"],
|
263
339
|
:E => l["E"],
|
264
340
|
:G => l["G"],
|
265
|
-
:
|
266
|
-
:
|
267
|
-
|
268
|
-
:
|
269
|
-
|
270
|
-
:
|
271
|
-
lambda { |v| LibBin::half_to_string(v, "S>") } ],
|
272
|
-
:pghalf => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
|
273
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
|
274
|
-
:pghalf_le => [ lambda { |str| LibBin::pghalf_from_string(str, "S<") },
|
275
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S<") } ],
|
276
|
-
:pghalf_be => [ lambda { |str| LibBin::pghalf_from_string(str, "S>") },
|
277
|
-
lambda { |v| LibBin::pghalf_to_string(v, "S>") } ]
|
341
|
+
:half => hl["S<"],
|
342
|
+
:half_le => hl["S<"],
|
343
|
+
:half_be => hl["S>"],
|
344
|
+
:pghalf => pghl["S<"],
|
345
|
+
:pghalf_le => pghl["S<"],
|
346
|
+
:pghalf_be => pghl["S>"]
|
278
347
|
} )
|
279
348
|
|
280
349
|
|
@@ -284,8 +353,9 @@ module LibBin
|
|
284
353
|
@size
|
285
354
|
end
|
286
355
|
|
287
|
-
def self.shape(value, previous_offset = 0, _ = nil, _ = nil, kind = DataShape)
|
288
|
-
|
356
|
+
def self.shape(value, previous_offset = 0, _ = nil, _ = nil, kind = DataShape, length = nil)
|
357
|
+
length = 1 unless length
|
358
|
+
kind::new(previous_offset, previous_offset - 1 + length * @size)
|
289
359
|
end
|
290
360
|
|
291
361
|
def self.init(symbol)
|
@@ -295,20 +365,22 @@ module LibBin
|
|
295
365
|
@rl_le, @sl_le = DATA_ENDIAN[false][symbol]
|
296
366
|
end
|
297
367
|
|
298
|
-
def self.load(input, input_big = LibBin::default_big?, _ = nil, _ = nil)
|
299
|
-
|
300
|
-
|
368
|
+
def self.load(input, input_big = LibBin::default_big?, _ = nil, _ = nil, length = nil)
|
369
|
+
l = (length ? length : 1)
|
370
|
+
str = input.read(@size*l)
|
371
|
+
input_big ? @rl_be[str, length] : @rl_le[str, length]
|
301
372
|
end
|
302
373
|
|
303
|
-
def self.dump(value, output, output_big = LibBin::default_big?, _ = nil, _ = nil)
|
304
|
-
str = (output_big ? @sl_be[value] : @sl_le[value])
|
374
|
+
def self.dump(value, output, output_big = LibBin::default_big?, _ = nil, _ = nil, length = nil)
|
375
|
+
str = (output_big ? @sl_be[value, length] : @sl_le[value, length])
|
305
376
|
output.write(str)
|
306
377
|
end
|
307
378
|
|
308
|
-
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !input_big, _ = nil, _ = nil)
|
309
|
-
|
310
|
-
|
311
|
-
|
379
|
+
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !input_big, _ = nil, _ = nil, length = nil)
|
380
|
+
l = (length ? length : 1)
|
381
|
+
str = input.read(@size*l)
|
382
|
+
value = (input_big ? @rl_be[str, length] : @rl_le[str, length])
|
383
|
+
str = (output_big ? @sl_be[value, length] : @sl_le[value, length])
|
312
384
|
output.write(str)
|
313
385
|
value
|
314
386
|
end
|
@@ -317,40 +389,48 @@ module LibBin
|
|
317
389
|
|
318
390
|
class Str < Scalar
|
319
391
|
|
320
|
-
def self.
|
321
|
-
|
322
|
-
|
392
|
+
def self.size(value, previous_offset = 0, parent = nil, index = nil, length = nil)
|
393
|
+
length ? length : value.size
|
394
|
+
end
|
395
|
+
|
396
|
+
def self.load(input, input_big = LibBin::default_big?, _ = nil, _ = nil, length = nil)
|
397
|
+
str = (length ? input.read(length) : input.readline("\x00"))
|
323
398
|
end
|
324
399
|
|
325
|
-
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big, _ = nil, _ = nil)
|
326
|
-
str = (
|
327
|
-
value = (input_big ? @rl_be[str] : @rl_le[str])
|
328
|
-
str = (output_big ? @sl_be[value] : @sl_le[value])
|
400
|
+
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big, _ = nil, _ = nil, length = nil)
|
401
|
+
str = (length ? input.read(length) : input.readline("\x00"))
|
329
402
|
output.write(str)
|
330
|
-
|
403
|
+
str
|
331
404
|
end
|
332
405
|
|
333
|
-
def self.shape(value, previous_offset = 0, _ = nil, _ = nil, kind = DataShape)
|
334
|
-
if
|
335
|
-
kind::new(previous_offset, previous_offset +
|
406
|
+
def self.shape(value, previous_offset = 0, _ = nil, _ = nil, kind = DataShape, length = nil)
|
407
|
+
if length
|
408
|
+
kind::new(previous_offset, previous_offset + length - 1)
|
336
409
|
else
|
337
|
-
kind::new(previous_offset, previous_offset +
|
410
|
+
kind::new(previous_offset, previous_offset + value.size - 1)
|
338
411
|
end
|
339
412
|
end
|
340
413
|
|
414
|
+
def self.dump(value, output, output_big = LibBin::default_big?, _ = nil, _ = nil, length = nil)
|
415
|
+
if length
|
416
|
+
output.write([value].pack("Z#{length}"))
|
417
|
+
else
|
418
|
+
output.write(value)
|
419
|
+
end
|
420
|
+
end
|
341
421
|
end
|
342
422
|
|
343
|
-
def self.register_field(field, type, count: nil, offset: nil, sequence: false, condition: nil)
|
423
|
+
def self.register_field(field, type, length: nil, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
|
344
424
|
if type.kind_of?(Symbol)
|
345
425
|
if type[0] == 'a'
|
346
|
-
|
347
|
-
@fields.push([field, c, count, offset, sequence, condition])
|
426
|
+
real_type = Class::new(Str) do init(sym) end
|
348
427
|
else
|
349
|
-
|
428
|
+
real_type = const_get(SCALAR_TYPES[type][0])
|
350
429
|
end
|
351
430
|
else
|
352
|
-
|
431
|
+
real_type = type
|
353
432
|
end
|
433
|
+
@fields.push(Field::new(field, real_type, length, count, offset, sequence, condition, relative_offset))
|
354
434
|
attr_accessor field
|
355
435
|
end
|
356
436
|
|
@@ -361,8 +441,8 @@ module LibBin
|
|
361
441
|
init(#{symbol.inspect})
|
362
442
|
end
|
363
443
|
|
364
|
-
def self.#{name}(field, count: nil, offset: nil, sequence: false, condition: nil)
|
365
|
-
@fields.push(
|
444
|
+
def self.#{name}(field, length: nil, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
|
445
|
+
@fields.push(Field::new(field, #{klassname}, length, count, offset, sequence, condition, relative_offset))
|
366
446
|
attr_accessor field
|
367
447
|
end
|
368
448
|
EOF
|
@@ -401,16 +481,15 @@ EOF
|
|
401
481
|
create_scalar_type(:pghalf_le)
|
402
482
|
create_scalar_type(:pghalf_be)
|
403
483
|
|
404
|
-
def self.string( field, length = nil, count: nil, offset: nil, sequence: false, condition: nil)
|
405
|
-
sym = (length ? :"a
|
484
|
+
def self.string( field, length = nil, count: nil, offset: nil, sequence: false, condition: nil, relative_offset: false)
|
485
|
+
sym = (length ? :"a" : :"a*")
|
406
486
|
c = Class::new(Str) do
|
407
487
|
init(sym)
|
408
488
|
end
|
409
|
-
@fields.push(
|
489
|
+
@fields.push(Field::new(field, c, length, count, offset, sequence, condition, relative_offset))
|
410
490
|
attr_accessor field
|
411
491
|
end
|
412
492
|
|
413
|
-
|
414
493
|
end
|
415
494
|
|
416
495
|
end
|
data/lib/libbin.rb
CHANGED
@@ -117,10 +117,11 @@ module LibBin
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
def __decode_seek_offset(offset)
|
120
|
+
def __decode_seek_offset(offset, relative_offset)
|
121
121
|
return nil unless offset
|
122
122
|
offset = __decode_expression(offset)
|
123
123
|
return false if offset == 0x0
|
124
|
+
offset += @__position if relative_offset
|
124
125
|
@__cur_position = offset
|
125
126
|
@__input.seek(offset) if @__input
|
126
127
|
@__output.seek(offset) if @__output
|
@@ -141,97 +142,106 @@ module LibBin
|
|
141
142
|
return __decode_expression(type)
|
142
143
|
end
|
143
144
|
|
144
|
-
def
|
145
|
+
def __decode_length(length)
|
146
|
+
__decode_expression(length)
|
147
|
+
end
|
148
|
+
|
149
|
+
def __decode_static_conditions(field)
|
145
150
|
@__offset = nil
|
146
151
|
@__condition = nil
|
147
152
|
@__type = nil
|
153
|
+
@__length = nil
|
148
154
|
@__count = nil
|
149
|
-
unless sequence
|
150
|
-
@__offset = __decode_seek_offset(offset)
|
155
|
+
unless field.sequence?
|
156
|
+
@__offset = __decode_seek_offset(field.offset, field.relative_offset?)
|
151
157
|
throw :ignored, nil if @__offset == false
|
152
|
-
@__condition = __decode_condition(condition)
|
158
|
+
@__condition = __decode_condition(field.condition)
|
153
159
|
throw :ignored, nil unless @__condition
|
154
|
-
@__type = __decode_type(type)
|
160
|
+
@__type = __decode_type(field.type)
|
161
|
+
@__length = __decode_length(field.length)
|
155
162
|
end
|
156
|
-
@__count = __decode_count(count)
|
163
|
+
@__count = __decode_count(field.count)
|
157
164
|
end
|
158
165
|
|
159
|
-
def __decode_dynamic_conditions(
|
160
|
-
return true unless sequence
|
166
|
+
def __decode_dynamic_conditions(field)
|
167
|
+
return true unless field.sequence?
|
161
168
|
@__offset = nil
|
162
169
|
@__condition = nil
|
163
170
|
@__type = nil
|
164
|
-
@
|
171
|
+
@__length = nil
|
172
|
+
@__offset = __decode_seek_offset(field.offset, field.relative_offset?)
|
165
173
|
return false if @__offset == false
|
166
|
-
@__condition = __decode_condition(condition)
|
174
|
+
@__condition = __decode_condition(field.condition)
|
167
175
|
return false unless @__condition
|
168
|
-
@__type = __decode_type(type)
|
176
|
+
@__type = __decode_type(field.type)
|
177
|
+
@__length = __decode_length(field.length)
|
169
178
|
return true
|
170
179
|
end
|
171
180
|
|
172
181
|
def __restore_context
|
173
182
|
@__iterator = nil
|
174
183
|
@__type = nil
|
184
|
+
@__length = nil
|
175
185
|
@__count = nil
|
176
186
|
@__offset = nil
|
177
187
|
@__condition = nil
|
178
188
|
end
|
179
189
|
|
180
|
-
def __convert_field(field
|
181
|
-
__decode_static_conditions(
|
190
|
+
def __convert_field(field)
|
191
|
+
__decode_static_conditions(field)
|
182
192
|
vs = @__count.times.collect do |it|
|
183
193
|
@__iterator = it
|
184
|
-
if __decode_dynamic_conditions(
|
185
|
-
@__type::convert(@__input, @__output, @__input_big, @__output_big, self, it)
|
194
|
+
if __decode_dynamic_conditions(field)
|
195
|
+
@__type::convert(@__input, @__output, @__input_big, @__output_big, self, it, @__length)
|
186
196
|
else
|
187
197
|
nil
|
188
198
|
end
|
189
199
|
end
|
190
200
|
__restore_context
|
191
|
-
vs = vs.first unless count
|
201
|
+
vs = vs.first unless field.count
|
192
202
|
vs
|
193
203
|
end
|
194
204
|
|
195
|
-
def __load_field(field
|
196
|
-
__decode_static_conditions(
|
205
|
+
def __load_field(field)
|
206
|
+
__decode_static_conditions(field)
|
197
207
|
vs = @__count.times.collect do |it|
|
198
208
|
@__iterator = it
|
199
|
-
if __decode_dynamic_conditions(
|
200
|
-
@__type::load(@__input, @__input_big, self, it)
|
209
|
+
if __decode_dynamic_conditions(field)
|
210
|
+
@__type::load(@__input, @__input_big, self, it, @__length)
|
201
211
|
else
|
202
212
|
nil
|
203
213
|
end
|
204
214
|
end
|
205
215
|
__restore_context
|
206
|
-
vs = vs.first unless count
|
216
|
+
vs = vs.first unless field.count
|
207
217
|
vs
|
208
218
|
end
|
209
219
|
|
210
|
-
def __dump_field(vs, field
|
211
|
-
__decode_static_conditions(
|
212
|
-
vs = [vs] unless count
|
220
|
+
def __dump_field(vs, field)
|
221
|
+
__decode_static_conditions(field)
|
222
|
+
vs = [vs] unless field.count
|
213
223
|
vs.each_with_index do |v, it|
|
214
224
|
@__iterator = it
|
215
|
-
if __decode_dynamic_conditions(
|
216
|
-
@__type::dump(v, @__output, @__output_big, self, it)
|
225
|
+
if __decode_dynamic_conditions(field)
|
226
|
+
@__type::dump(v, @__output, @__output_big, self, it, @__length)
|
217
227
|
end
|
218
228
|
end
|
219
229
|
__restore_context
|
220
230
|
end
|
221
231
|
|
222
|
-
def __shape_field(vs, previous_offset, kind, field
|
223
|
-
__decode_static_conditions(
|
224
|
-
vs = [vs] unless count
|
232
|
+
def __shape_field(vs, previous_offset, kind, field)
|
233
|
+
__decode_static_conditions(field)
|
234
|
+
vs = [vs] unless field.count
|
225
235
|
vs = vs.each_with_index.collect do |v, it|
|
226
236
|
@__iterator = it
|
227
|
-
if __decode_dynamic_conditions(
|
228
|
-
sh = @__type::shape(v, @__cur_position, self, it, kind)
|
237
|
+
if __decode_dynamic_conditions(field)
|
238
|
+
sh = @__type::shape(v, @__cur_position, self, it, kind, @__length)
|
229
239
|
@__cur_position = sh.last + 1 if sh.last && sh.last >= 0
|
230
240
|
sh
|
231
241
|
end
|
232
242
|
end
|
233
243
|
__restore_context
|
234
|
-
vs = vs.first unless count
|
244
|
+
vs = vs.first unless field.count
|
235
245
|
vs
|
236
246
|
end
|
237
247
|
|
@@ -242,15 +252,15 @@ module LibBin
|
|
242
252
|
def __shape(previous_offset = 0, parent = nil, index = nil, kind = DataShape)
|
243
253
|
__set_size_type(previous_offset, parent, index)
|
244
254
|
members = {}
|
245
|
-
self.class.instance_variable_get(:@fields).each { |
|
255
|
+
self.class.instance_variable_get(:@fields).each { |field|
|
246
256
|
begin
|
247
|
-
vs = send(name)
|
257
|
+
vs = send(field.name)
|
248
258
|
member = catch(:ignored) do
|
249
|
-
__shape_field(vs, previous_offset, kind,
|
259
|
+
__shape_field(vs, previous_offset, kind, field)
|
250
260
|
end
|
251
|
-
members[name] = member
|
261
|
+
members[field.name] = member
|
252
262
|
rescue
|
253
|
-
STDERR.puts "#{self.class}: #{name}(#{type})"
|
263
|
+
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
254
264
|
raise
|
255
265
|
end
|
256
266
|
}
|
@@ -260,14 +270,14 @@ module LibBin
|
|
260
270
|
end
|
261
271
|
|
262
272
|
def __convert_fields
|
263
|
-
self.class.instance_variable_get(:@fields).each { |
|
273
|
+
self.class.instance_variable_get(:@fields).each { |field|
|
264
274
|
begin
|
265
275
|
vs = catch(:ignored) do
|
266
|
-
__convert_field(
|
276
|
+
__convert_field(field)
|
267
277
|
end
|
268
|
-
send("#{name}=", vs)
|
278
|
+
send("#{field.name}=", vs)
|
269
279
|
rescue
|
270
|
-
STDERR.puts "#{self.class}: #{name}(#{type})"
|
280
|
+
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
271
281
|
raise
|
272
282
|
end
|
273
283
|
}
|
@@ -275,14 +285,14 @@ module LibBin
|
|
275
285
|
end
|
276
286
|
|
277
287
|
def __load_fields
|
278
|
-
self.class.instance_variable_get(:@fields).each { |
|
288
|
+
self.class.instance_variable_get(:@fields).each { |field|
|
279
289
|
begin
|
280
290
|
vs = catch(:ignored) do
|
281
|
-
__load_field(
|
291
|
+
__load_field(field)
|
282
292
|
end
|
283
|
-
send("#{name}=", vs)
|
293
|
+
send("#{field.name}=", vs)
|
284
294
|
rescue
|
285
|
-
STDERR.puts "#{self.class}: #{name}(#{type})"
|
295
|
+
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
286
296
|
raise
|
287
297
|
end
|
288
298
|
}
|
@@ -290,14 +300,14 @@ module LibBin
|
|
290
300
|
end
|
291
301
|
|
292
302
|
def __dump_fields
|
293
|
-
self.class.instance_variable_get(:@fields).each { |
|
303
|
+
self.class.instance_variable_get(:@fields).each { |field|
|
294
304
|
begin
|
295
|
-
vs = send(name)
|
305
|
+
vs = send(field.name)
|
296
306
|
catch(:ignored) do
|
297
|
-
__dump_field(vs,
|
307
|
+
__dump_field(vs, field)
|
298
308
|
end
|
299
309
|
rescue
|
300
|
-
STDERR.puts "#{self.class}: #{name}(#{type})"
|
310
|
+
STDERR.puts "#{self.class}: #{field.name}(#{field.type})"
|
301
311
|
raise
|
302
312
|
end
|
303
313
|
}
|
@@ -325,28 +335,57 @@ module LibBin
|
|
325
335
|
self
|
326
336
|
end
|
327
337
|
|
328
|
-
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big?, parent = nil, index = nil)
|
329
|
-
|
330
|
-
|
331
|
-
|
338
|
+
def self.convert(input, output, input_big = LibBin::default_big?, output_big = !LibBin::default_big?, parent = nil, index = nil, length = nil)
|
339
|
+
if length
|
340
|
+
length.times.collect {
|
341
|
+
h = self::new
|
342
|
+
h.__load(input, input_big, parent, index)
|
343
|
+
}
|
344
|
+
else
|
345
|
+
h = self::new
|
346
|
+
h.__convert(input, output, input_big, output_big, parent, index)
|
347
|
+
end
|
332
348
|
end
|
333
349
|
|
334
|
-
def self.load(input, input_big = LibBin::default_big?, parent = nil, index = nil)
|
335
|
-
|
336
|
-
|
337
|
-
|
350
|
+
def self.load(input, input_big = LibBin::default_big?, parent = nil, index = nil, length = nil)
|
351
|
+
if length
|
352
|
+
length.times.collect {
|
353
|
+
h = self::new
|
354
|
+
h.__load(input, input_big, parent, index)
|
355
|
+
}
|
356
|
+
else
|
357
|
+
h = self::new
|
358
|
+
h.__load(input, input_big, parent, index)
|
359
|
+
end
|
338
360
|
end
|
339
361
|
|
340
|
-
def self.dump(value, output, output_big = LibBin::default_big?, parent = nil, index = nil)
|
341
|
-
|
362
|
+
def self.dump(value, output, output_big = LibBin::default_big?, parent = nil, index = nil, length = nil)
|
363
|
+
if length
|
364
|
+
length.times.collect { |i|
|
365
|
+
value[i].__dump(output, output_big, parent, index)
|
366
|
+
}
|
367
|
+
value
|
368
|
+
else
|
369
|
+
value.__dump(output, output_big, parent, index)
|
370
|
+
end
|
342
371
|
end
|
343
372
|
|
344
|
-
def self.size(value, previous_offset = 0, parent = nil, index = nil)
|
345
|
-
|
373
|
+
def self.size(value, previous_offset = 0, parent = nil, index = nil, length = nil)
|
374
|
+
if length
|
375
|
+
shape(value, previous_offset, parent, index, length).size
|
376
|
+
else
|
377
|
+
value.__shape(previous_offset, parent, index).size
|
378
|
+
end
|
346
379
|
end
|
347
380
|
|
348
|
-
def self.shape(value, previous_offset = 0, parent = nil, index = nil, kind = DataShape)
|
349
|
-
|
381
|
+
def self.shape(value, previous_offset = 0, parent = nil, index = nil, kind = DataShape, length = nil)
|
382
|
+
if length
|
383
|
+
kind::new(length.times.collect { |i|
|
384
|
+
value[i].__shape(previous_offset, parent, index, kind)
|
385
|
+
})
|
386
|
+
else
|
387
|
+
value.__shape(previous_offset, parent, index, kind)
|
388
|
+
end
|
350
389
|
end
|
351
390
|
|
352
391
|
end
|
data/libbin.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'libbin'
|
3
|
-
s.version = "1.0.
|
3
|
+
s.version = "1.0.6"
|
4
4
|
s.author = "Brice Videau"
|
5
5
|
s.email = "brice.videau@imag.fr"
|
6
6
|
s.homepage = "https://github.com/kerilk/libbin"
|
@@ -8,7 +8,6 @@ Gem::Specification.new do |s|
|
|
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.6
|
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-10-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: float-formats
|
@@ -67,8 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
requirements: []
|
70
|
-
|
71
|
-
rubygems_version: 2.7.6
|
70
|
+
rubygems_version: 3.1.2
|
72
71
|
signing_key:
|
73
72
|
specification_version: 4
|
74
73
|
summary: Library for loading and converting binary files
|