libbin 1.0.8 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/libbin/data_types.c +107 -16
- data/ext/libbin/data_types.h +2 -1
- data/ext/libbin/libbin_c.c +1145 -679
- data/lib/libbin/data_types.rb +655 -132
- data/lib/libbin.rb +83 -17
- data/libbin.gemspec +1 -1
- metadata +2 -3
- data/lib/libbin/alignment.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a0a92cec0fde131c6254ad8b5f8a405e68c2a9bd7699a11e7cd24d7e5d0c110
|
4
|
+
data.tar.gz: 17732019c6941e79fcfaf233aba722e08b6470e851adae24a01b9e36c90608ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2caa512271ce77e4f23ad01d5eb9a1c4a9049eefd8578dcc8b69730183b25311a60a0a1ae97674b9f87778f9e9dad09b5fdcb2acb7a4a3d50110b388f03e106a
|
7
|
+
data.tar.gz: 600b1878941b3fa53cc9191bc7de026b9f205ce36520915925a6d4664ddba00d92bcdd4c035424d35eb4b97d2eaf732c2339aad785c603ada01790026f1f0f63
|
data/ext/libbin/data_types.c
CHANGED
@@ -2,30 +2,42 @@
|
|
2
2
|
#include "./libbin_c.h"
|
3
3
|
|
4
4
|
VALUE cDataShape;
|
5
|
+
VALUE cDataRange;
|
5
6
|
VALUE cScalar;
|
6
7
|
|
7
8
|
static ID id_read, id_write;
|
8
9
|
|
9
|
-
|
10
|
+
static VALUE cScalar_always_align(VALUE self) {
|
11
|
+
return Qfalse;
|
12
|
+
}
|
13
|
+
|
14
|
+
/* align() */
|
15
|
+
#define MAKE_TYPE_ALIGN(CLASS, MAPPED_TYPE) \
|
16
|
+
static VALUE CLASS ## _align(VALUE self) { \
|
17
|
+
(void)self; \
|
18
|
+
return INT2FIX(sizeof(MAPPED_TYPE)); \
|
19
|
+
}
|
20
|
+
|
21
|
+
/* size(value = nil, previous_offset = 0, parent = nil, index = nil, length = nil) */
|
10
22
|
#define MAKE_TYPE_SIZE(CLASS, MAPPED_TYPE) \
|
11
23
|
static VALUE CLASS ## _size(int argc, VALUE* argv, VALUE self) { \
|
12
24
|
(void)self; \
|
13
25
|
VALUE length; \
|
14
|
-
rb_scan_args(argc, argv, "
|
26
|
+
rb_scan_args(argc, argv, "05", NULL, NULL, NULL, NULL, &length); \
|
15
27
|
if (RTEST(length)) \
|
16
28
|
return ULL2NUM(sizeof(MAPPED_TYPE)*NUM2ULL(length)); \
|
17
29
|
else \
|
18
30
|
return INT2FIX(sizeof(MAPPED_TYPE)); \
|
19
31
|
}
|
20
32
|
|
21
|
-
/* shape(value, previous_offset = 0, parent = nil, index = nil, kind = DataShape, length = nil) */
|
33
|
+
/* shape(value = nil, previous_offset = 0, parent = nil, index = nil, kind = DataShape, length = nil) */
|
22
34
|
#define MAKE_TYPE_SHAPE(CLASS, MAPPED_TYPE) \
|
23
35
|
static VALUE CLASS ## _shape(int argc, VALUE* argv, VALUE self) { \
|
24
36
|
(void)self; \
|
25
37
|
VALUE previous_offset; \
|
26
38
|
VALUE kind; \
|
27
39
|
VALUE length; \
|
28
|
-
rb_scan_args(argc, argv, "
|
40
|
+
rb_scan_args(argc, argv, "06", NULL, &previous_offset, NULL, NULL, &kind, &length); \
|
29
41
|
if (NIL_P(previous_offset)) \
|
30
42
|
previous_offset = INT2FIX(0); \
|
31
43
|
if (NIL_P(kind)) \
|
@@ -179,28 +191,30 @@ static VALUE CLASS ## _convert(int argc, VALUE* argv, VALUE self) {
|
|
179
191
|
VALUE str = rb_funcall(input, id_read, 1, ULL2NUM(cnt)); \
|
180
192
|
if (NIL_P(str) || RSTRING_LEN(str) < (long)cnt) \
|
181
193
|
rb_raise(rb_eRuntimeError, "could not read enough data: got %ld needed %zu", \
|
182
|
-
NIL_P(str) ? 0 : RSTRING_LEN(str), cnt);
|
194
|
+
NIL_P(str) ? 0 : RSTRING_LEN(str), cnt); \
|
183
195
|
MAPPED_TYPE *data = (MAPPED_TYPE *)RSTRING_PTR(str); \
|
184
196
|
CONVERT(MAPPED_TYPE, MAPPED_SWAP, RUBY_CONVERT, NATIVE_CONVERT); \
|
185
197
|
rb_funcall(output, id_write, 1, str); \
|
186
198
|
return res; \
|
187
199
|
}
|
188
200
|
|
189
|
-
#define MAKE_CLASS_DEFINE(CLASS_NAME, CLASS)
|
190
|
-
static void define_ ## CLASS() {
|
191
|
-
CLASS = rb_define_class_under(
|
192
|
-
rb_define_singleton_method(CLASS, "
|
193
|
-
rb_define_singleton_method(CLASS, "
|
194
|
-
rb_define_singleton_method(CLASS, "
|
195
|
-
rb_define_singleton_method(CLASS, "
|
196
|
-
rb_define_singleton_method(CLASS, "
|
201
|
+
#define MAKE_CLASS_DEFINE(CLASS_NAME, CLASS) \
|
202
|
+
static void define_ ## CLASS() { \
|
203
|
+
CLASS = rb_define_class_under(cStructure, #CLASS_NAME, cScalar); \
|
204
|
+
rb_define_singleton_method(CLASS, "align", CLASS ## _align, 0); \
|
205
|
+
rb_define_singleton_method(CLASS, "size", CLASS ## _size, -1); \
|
206
|
+
rb_define_singleton_method(CLASS, "shape", CLASS ## _shape, -1); \
|
207
|
+
rb_define_singleton_method(CLASS, "load", CLASS ## _load, -1); \
|
208
|
+
rb_define_singleton_method(CLASS, "dump", CLASS ## _dump, -1); \
|
209
|
+
rb_define_singleton_method(CLASS, "convert", CLASS ## _convert, -1); \
|
197
210
|
}
|
198
211
|
|
199
212
|
#define MAKE_STATIC_OBJECT(CLASS) \
|
200
213
|
static VALUE CLASS;
|
201
214
|
|
202
215
|
#define MAKE_CLASS_TYPE_ENDIAN_EX(CLASS_NAME, CLASS, MAPPED_TYPE, MAPPED_SWAP, RUBY_CONVERT_TO, RUBY_CONVERT_FROM, NATIVE_CONVERT_TO, NATIVE_CONVERT_FROM, ENDIAN) \
|
203
|
-
MAKE_STATIC_OBJECT(CLASS)
|
216
|
+
MAKE_STATIC_OBJECT(CLASS) \
|
217
|
+
MAKE_TYPE_ALIGN(CLASS, MAPPED_TYPE) \
|
204
218
|
MAKE_TYPE_SIZE(CLASS, MAPPED_TYPE) \
|
205
219
|
MAKE_TYPE_SHAPE(CLASS, MAPPED_TYPE) \
|
206
220
|
MAKE_TYPE_LOAD(CLASS, MAPPED_TYPE, RUBY_CONVERT_TO, NATIVE_CONVERT_TO, MAKE_LOAD ## ENDIAN) \
|
@@ -344,6 +358,11 @@ MAKE_CLASSES(Double, 64, DBL2NUM, NUM2DBL, unpack_double, pack_double)
|
|
344
358
|
|
345
359
|
static VALUE cStr;
|
346
360
|
|
361
|
+
static VALUE cStr_align(VALUE self) {
|
362
|
+
(void)self;
|
363
|
+
return INT2FIX(sizeof(char));
|
364
|
+
}
|
365
|
+
|
347
366
|
static VALUE cStr_size(int argc, VALUE* argv, VALUE self) {
|
348
367
|
(void)self;
|
349
368
|
VALUE value;
|
@@ -436,18 +455,90 @@ static VALUE cStr_convert(int argc, VALUE* argv, VALUE self) {
|
|
436
455
|
}
|
437
456
|
|
438
457
|
static void define_cStr() {
|
439
|
-
cStr = rb_define_class_under(
|
458
|
+
cStr = rb_define_class_under(cStructure, "Str", cScalar);
|
459
|
+
/**
|
460
|
+
* Returns the alignement of the underlying character type.
|
461
|
+
* @return [Integer]
|
462
|
+
*/
|
463
|
+
rb_define_singleton_method(cStr, "align", cStr_align, 0);
|
464
|
+
/**
|
465
|
+
* @overload size(value, offset = 0, parent = nil, index = nil, length = nil)
|
466
|
+
* Returns the size of a string.
|
467
|
+
* @param value [Object] string to dump.
|
468
|
+
* @param offset [Integer] ignored.
|
469
|
+
* @param parent [Structure] ignored.
|
470
|
+
* @param index [Integer] ignored.
|
471
|
+
* @param length [Integer] if given the length of the vector. Else
|
472
|
+
* the size of the string.
|
473
|
+
* @return [Integer] the size of the string or <tt>sizeof(char) * length</tt>.
|
474
|
+
*/
|
440
475
|
rb_define_singleton_method(cStr, "size", cStr_size, -1);
|
476
|
+
/**
|
477
|
+
* @overload shape(value, offset = 0, parent = nil, index = nil, kind = DataShape, length = nil)
|
478
|
+
* Returns the shape of a string field
|
479
|
+
* @param value [Object] ignored.
|
480
|
+
* @param offset [Integer] start of the shape.
|
481
|
+
* @param parent [Structure] ignored.
|
482
|
+
* @param index [Integer] ignored.
|
483
|
+
* @param kind [Class] shape class. Will be instantiated through
|
484
|
+
* new with the +offset+ and <tt>offset + sizeof($3) * length - 1</tt>.
|
485
|
+
* @param length [Integer] if given the length of the string to
|
486
|
+
* consider. Else the length is the size of the string.
|
487
|
+
* @return [kind] a new instance of +kind+
|
488
|
+
*/
|
441
489
|
rb_define_singleton_method(cStr, "shape", cStr_shape, -1);
|
490
|
+
/**
|
491
|
+
* @overload load(input, input_big = LibBin::default_big?, parent = nil, index = nil, length = nil)
|
492
|
+
* Load a string field from +input+, and return it.
|
493
|
+
* @param input [IO] the stream to load the field from.
|
494
|
+
* @param input_big [Boolean] the endianness of +input+
|
495
|
+
* @param parent [Structure] ignored.
|
496
|
+
* @param index [Integer] ignored.
|
497
|
+
* @param length [Integer] if given the length of the string. Else
|
498
|
+
* the string is considered NULL terminated.
|
499
|
+
* @return [String] the Ruby representation of the string.
|
500
|
+
*/
|
442
501
|
rb_define_singleton_method(cStr, "load", cStr_load, -1);
|
502
|
+
/**
|
503
|
+
* @overload dump(value, output, output_big = LibBin::default_big?, parent = nil, index = nil, length = nil)
|
504
|
+
* Dump a string field to +output+.
|
505
|
+
* @param value [Numeric, Array<Numeric>] the Ruby representation
|
506
|
+
* of the string.
|
507
|
+
* @param output [IO] the stream to dump the field to.
|
508
|
+
* @param output_big [Boolean] the endianness of +output+.
|
509
|
+
* @param parent [Structure] ignored.
|
510
|
+
* @param index [Integer] ignored.
|
511
|
+
* @param length [Integer] if given the length of the string to dump. Else
|
512
|
+
* the length is the size of the string.
|
513
|
+
* @return [nil]
|
514
|
+
*/
|
443
515
|
rb_define_singleton_method(cStr, "dump", cStr_dump, -1);
|
516
|
+
/**
|
517
|
+
* @overload convert(input, output, input_big = LibBin::default_big?, output_big = !input_big, parent = nil, index = nil, length = nil)
|
518
|
+
* Convert a string field by loading it from +input+,
|
519
|
+
* dumping it to +output+, and returning the loaded field.
|
520
|
+
* @param input [IO] the stream to load the field from.
|
521
|
+
* @param output [IO] the stream to dump the field to.
|
522
|
+
* @param input_big [Boolean] the endianness of +input+
|
523
|
+
* @param output_big [Boolean] the endianness of +output+.
|
524
|
+
* @param parent [Structure] ignored.
|
525
|
+
* @param index [Integer] ignored.
|
526
|
+
* @param length [Integer] if given the length of the string to reqd. Else
|
527
|
+
* the string is considered NULL terminated.
|
528
|
+
* @return [String] the Ruby representation of the string.
|
529
|
+
*/
|
444
530
|
rb_define_singleton_method(cStr, "convert", cStr_convert, -1);
|
445
531
|
}
|
446
532
|
|
447
533
|
void define_cScalar() {
|
448
534
|
id_read = rb_intern("read");
|
449
535
|
id_write = rb_intern("write");
|
450
|
-
cScalar = rb_define_class_under(
|
536
|
+
cScalar = rb_define_class_under(cStructure, "Scalar", rb_cObject);
|
537
|
+
/**
|
538
|
+
* Returns false as scalars are not required to be aligned.
|
539
|
+
* @return [false] return false.
|
540
|
+
*/
|
541
|
+
rb_define_singleton_method(cScalar, "always_align", cScalar_always_align, 0);
|
451
542
|
MAKE_CALL_DEFINES(Half);
|
452
543
|
MAKE_CALL_DEFINES(PGHalf);
|
453
544
|
MAKE_CALL_DEFINES(Int8);
|