bin_utils 0.0.1

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.
@@ -0,0 +1,1928 @@
1
+ #include <ruby.h>
2
+
3
+ #if HAVE_STDINT_H
4
+ #include "stdint.h"
5
+ #elif defined(_MSC_VER)
6
+ typedef __int8 int8_t;
7
+ typedef unsigned __int8 uint8_t;
8
+ typedef __int16 int16_t;
9
+ typedef unsigned __int16 uint16_t;
10
+ typedef __int32 int32_t;
11
+ typedef unsigned __int32 uint32_t;
12
+ typedef __int64 int64_t;
13
+ typedef unsigned __int64 uint64_t;
14
+ #else
15
+ typedef char int8_t;
16
+ typedef unsigned char uint8_t;
17
+ typedef short int16_t;
18
+ typedef unsigned short uint16_t;
19
+ typedef int int32_t;
20
+ typedef unsigned int uint32_t;
21
+ #if SIZEOF_LONG==8
22
+ typedef long int64_t;
23
+ typedef unsigned long uint64_t;
24
+ #else
25
+ typedef long long int64_t;
26
+ typedef unsigned long long uint64_t;
27
+ #endif
28
+ #endif
29
+
30
+ #ifdef __GNUC__
31
+ #define FORCE_INLINE __attribute__((always_inline))
32
+ #elif defined(_MSC_VER)
33
+ #define FORCE_INLINE __forceinline
34
+ #else
35
+ #define FORCE_INLINE
36
+ #endif
37
+
38
+ #if defined(_MSC_VER)
39
+ #define LL(x) (x)
40
+ #define LLU(x) (x)
41
+ #else
42
+ #define LL(x) (x##LL)
43
+ #define LLU(x) (x##LLU)
44
+ #endif
45
+
46
+ #if SIZEOF_LONG == 8
47
+ #define I642NUM(v) LONG2NUM(v)
48
+ #define U642NUM(v) ULONG2NUM(v)
49
+ #define NUM2I64(v) NUM2LONG(v)
50
+ #define NUM2U64(v) NUM2ULONG(v)
51
+ #else
52
+ #define I642NUM(v) LL2NUM(v)
53
+ #define U642NUM(v) ULL2NUM(v)
54
+ #define NUM2I64(v) NUM2LL(v)
55
+ #define NUM2U64(v) NUM2ULL(v)
56
+ #endif
57
+
58
+ ID rshft;
59
+ ID band;
60
+
61
+ static long
62
+ check_size(long i, long strlen, long ilen)
63
+ {
64
+ if (i < 0) { i += strlen; }
65
+ if (i > strlen - ilen || i < 0) {
66
+ rb_raise(rb_eArgError, "index %ld be in range 0..%ld or in range -%ld..-%ld for string of size %ld", i, strlen-ilen, strlen, -ilen, strlen);
67
+ }
68
+ return i;
69
+ }
70
+
71
+ static int32_t
72
+ get_int8(VALUE rstr, VALUE ri)
73
+ {
74
+ long i = NUM2LONG(ri);
75
+ StringValue(rstr);
76
+ i = check_size(i, RSTRING_LEN(rstr), 1);
77
+ return (uint8_t)(RSTRING_PTR(rstr)[i]);
78
+ }
79
+
80
+ static int32_t
81
+ get_sint8(VALUE rstr, VALUE ri)
82
+ {
83
+ long i = NUM2LONG(ri);
84
+ StringValue(rstr);
85
+ i = check_size(i, RSTRING_LEN(rstr), 1);
86
+ return (int8_t)(RSTRING_PTR(rstr)[i]);
87
+ }
88
+
89
+ static int32_t
90
+ get_int16_le(VALUE rstr, VALUE ri)
91
+ {
92
+ long i = NUM2LONG(ri);
93
+ const uint8_t *ptr;
94
+ uint32_t byte0, byte1;
95
+ int32_t res;
96
+ StringValue(rstr);
97
+ i = check_size(i, RSTRING_LEN(rstr), 2);
98
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
99
+ byte0 = ptr[i];
100
+ byte1 = ptr[i+1];
101
+ return byte0 + (byte1 << 8);
102
+ }
103
+
104
+ static int32_t
105
+ get_sint16_le(VALUE rstr, VALUE ri)
106
+ {
107
+ int32_t res = get_int16_le(rstr, ri);
108
+ return res - ((res >> 15)<<16);
109
+ }
110
+
111
+ static int32_t
112
+ get_int16_be(VALUE rstr, VALUE ri)
113
+ {
114
+ long i = NUM2LONG(ri);
115
+ const uint8_t *ptr;
116
+ uint32_t byte0, byte1;
117
+ StringValue(rstr);
118
+ i = check_size(i, RSTRING_LEN(rstr), 2);
119
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
120
+ byte0 = ptr[i+1];
121
+ byte1 = ptr[i];
122
+ return byte0 + (byte1 << 8);
123
+ }
124
+
125
+ static int32_t
126
+ get_sint16_be(VALUE rstr, VALUE ri)
127
+ {
128
+ int32_t res = get_int16_be(rstr, ri);
129
+ return res - ((res >> 15) << 16);
130
+ }
131
+
132
+ static int32_t
133
+ get_int24_le(VALUE rstr, VALUE ri)
134
+ {
135
+ long i = NUM2LONG(ri);
136
+ const uint8_t *ptr;
137
+ uint32_t byte0, byte1, byte2;
138
+ StringValue(rstr);
139
+ i = check_size(i, RSTRING_LEN(rstr), 3);
140
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
141
+ byte0 = ptr[i];
142
+ byte1 = ptr[i+1];
143
+ byte2 = ptr[i+2];
144
+ return byte0 + (byte1 << 8) + (byte2 << 16);
145
+ }
146
+
147
+ static int32_t
148
+ get_sint24_le(VALUE rstr, VALUE ri)
149
+ {
150
+ int32_t res = get_int24_le(rstr, ri);
151
+ return res - ((res >> 23) << 24);
152
+ }
153
+
154
+ static int32_t
155
+ get_int24_be(VALUE rstr, VALUE ri)
156
+ {
157
+ long i = NUM2LONG(ri);
158
+ const uint8_t *ptr;
159
+ uint32_t byte0, byte1, byte2;
160
+ StringValue(rstr);
161
+ i = check_size(i, RSTRING_LEN(rstr), 3);
162
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
163
+ byte0 = ptr[i+2];
164
+ byte1 = ptr[i+1];
165
+ byte2 = ptr[i];
166
+ return byte0 + (byte1 << 8) + (byte2 << 16);
167
+ }
168
+
169
+ static int32_t
170
+ get_sint24_be(VALUE rstr, VALUE ri)
171
+ {
172
+ int32_t res = get_int24_be(rstr, ri);
173
+ return res - ((res >> 23) << 24);
174
+ }
175
+
176
+ static uint32_t
177
+ get_int32_le(VALUE rstr, VALUE ri)
178
+ {
179
+ long i = NUM2LONG(ri);
180
+ const uint8_t *ptr;
181
+ uint32_t byte0, byte1, byte2, byte3;
182
+ StringValue(rstr);
183
+ i = check_size(i, RSTRING_LEN(rstr), 4);
184
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
185
+
186
+ byte0 = ptr[i];
187
+ byte1 = ptr[i+1];
188
+ byte2 = ptr[i+2];
189
+ byte3 = ptr[i+3];
190
+ return byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
191
+ }
192
+
193
+ static int32_t
194
+ get_sint32_le(VALUE rstr, VALUE ri)
195
+ {
196
+ return (int32_t)get_int32_le(rstr, ri);
197
+ }
198
+
199
+ static uint32_t
200
+ get_int32_be(VALUE rstr, VALUE ri)
201
+ {
202
+ long i = NUM2LONG(ri);
203
+ const uint8_t *ptr;
204
+ uint32_t byte0, byte1, byte2, byte3;
205
+ StringValue(rstr);
206
+ i = check_size(i, RSTRING_LEN(rstr), 4);
207
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
208
+ byte0 = ptr[i+3];
209
+ byte1 = ptr[i+2];
210
+ byte2 = ptr[i+1];
211
+ byte3 = ptr[i+0];
212
+ return byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
213
+ }
214
+
215
+ static int32_t
216
+ get_sint32_be(VALUE rstr, VALUE ri)
217
+ {
218
+ return (int32_t)get_int32_be(rstr, ri);
219
+ }
220
+
221
+ static int64_t
222
+ get_int40_le(VALUE rstr, VALUE ri)
223
+ {
224
+ long i = NUM2LONG(ri);
225
+ const uint8_t *ptr;
226
+ uint32_t byte0, byte1, byte2, byte3;
227
+ int64_t res;
228
+ StringValue(rstr);
229
+ i = check_size(i, RSTRING_LEN(rstr), 5);
230
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
231
+
232
+ byte0 = ptr[i];
233
+ byte1 = ptr[i+1];
234
+ byte2 = ptr[i+2];
235
+ byte3 = ptr[i+3];
236
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
237
+ byte0 = ptr[i+4];
238
+ return res + ((int64_t)byte0 << 32);
239
+ }
240
+
241
+ static int64_t
242
+ get_sint40_le(VALUE rstr, VALUE ri)
243
+ {
244
+ int64_t res = get_int40_le(rstr, ri);
245
+ return res - ((res >> 39) << 40);
246
+ }
247
+
248
+ static int64_t
249
+ get_int40_be(VALUE rstr, VALUE ri)
250
+ {
251
+ long i = NUM2LONG(ri);
252
+ const uint8_t *ptr;
253
+ uint32_t byte0, byte1, byte2, byte3;
254
+ int64_t res;
255
+ StringValue(rstr);
256
+ i = check_size(i, RSTRING_LEN(rstr), 5);
257
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
258
+
259
+ byte0 = ptr[i+4];
260
+ byte1 = ptr[i+3];
261
+ byte2 = ptr[i+2];
262
+ byte3 = ptr[i+1];
263
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
264
+ byte0 = ptr[i];
265
+ return res + ((int64_t)byte0 << 32);
266
+ }
267
+
268
+ static int64_t
269
+ get_sint40_be(VALUE rstr, VALUE ri)
270
+ {
271
+ int64_t res = get_int40_be(rstr, ri);
272
+ return res - ((res >> 39) << 40);
273
+ }
274
+
275
+ static int64_t
276
+ get_int48_le(VALUE rstr, VALUE ri)
277
+ {
278
+ long i = NUM2LONG(ri);
279
+ const uint8_t *ptr;
280
+ uint32_t byte0, byte1, byte2, byte3;
281
+ int64_t res, res1;
282
+ StringValue(rstr);
283
+ i = check_size(i, RSTRING_LEN(rstr), 6);
284
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
285
+
286
+ byte0 = ptr[i];
287
+ byte1 = ptr[i+1];
288
+ byte2 = ptr[i+2];
289
+ byte3 = ptr[i+3];
290
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
291
+ byte0 = ptr[i+4];
292
+ byte1 = ptr[i+5];
293
+ res1 = byte0 + (byte1 << 8);
294
+ return res + (res1 << 32);
295
+ }
296
+
297
+ static int64_t
298
+ get_sint48_le(VALUE rstr, VALUE ri)
299
+ {
300
+ int64_t res = get_int48_le(rstr, ri);
301
+ return res - ((res >> 47) << 48);
302
+ }
303
+
304
+ static int64_t
305
+ get_int48_be(VALUE rstr, VALUE ri)
306
+ {
307
+ long i = NUM2LONG(ri);
308
+ const uint8_t *ptr;
309
+ uint32_t byte0, byte1, byte2, byte3;
310
+ int64_t res, res1;
311
+ StringValue(rstr);
312
+ i = check_size(i, RSTRING_LEN(rstr), 6);
313
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
314
+
315
+ byte0 = ptr[i+5];
316
+ byte1 = ptr[i+4];
317
+ byte2 = ptr[i+3];
318
+ byte3 = ptr[i+2];
319
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
320
+ byte0 = ptr[i+1];
321
+ byte1 = ptr[i+0];
322
+ res1 = byte0 + (byte1 << 8);
323
+ return res + (res1 << 32);
324
+ }
325
+
326
+ static int64_t
327
+ get_sint48_be(VALUE rstr, VALUE ri)
328
+ {
329
+ int64_t res = get_int48_be(rstr, ri);
330
+ return res - ((res >> 47) << 48);
331
+ }
332
+
333
+ static int64_t
334
+ get_int56_le(VALUE rstr, VALUE ri)
335
+ {
336
+ long i = NUM2LONG(ri);
337
+ const uint8_t *ptr;
338
+ uint32_t byte0, byte1, byte2, byte3;
339
+ int64_t res, res1;
340
+ StringValue(rstr);
341
+ i = check_size(i, RSTRING_LEN(rstr), 7);
342
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
343
+
344
+ byte0 = ptr[i];
345
+ byte1 = ptr[i+1];
346
+ byte2 = ptr[i+2];
347
+ byte3 = ptr[i+3];
348
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
349
+ byte0 = ptr[i+4];
350
+ byte1 = ptr[i+5];
351
+ byte2 = ptr[i+6];
352
+ res1 = byte0 + (byte1 << 8) + (byte2 << 16);
353
+ return res + (res1 << 32);
354
+ }
355
+
356
+ static int64_t
357
+ get_sint56_le(VALUE rstr, VALUE ri)
358
+ {
359
+ int64_t res = get_int56_le(rstr, ri);
360
+ return res - ((res >> 55) << 56);
361
+ }
362
+
363
+ static int64_t
364
+ get_int56_be(VALUE rstr, VALUE ri)
365
+ {
366
+ long i = NUM2LONG(ri);
367
+ const uint8_t *ptr;
368
+ uint32_t byte0, byte1, byte2, byte3;
369
+ int64_t res, res1;
370
+ StringValue(rstr);
371
+ i = check_size(i, RSTRING_LEN(rstr), 7);
372
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
373
+
374
+ byte0 = ptr[i+6];
375
+ byte1 = ptr[i+5];
376
+ byte2 = ptr[i+4];
377
+ byte3 = ptr[i+3];
378
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
379
+ byte0 = ptr[i+2];
380
+ byte1 = ptr[i+1];
381
+ byte2 = ptr[i];
382
+ res1 = byte0 + (byte1 << 8) + (byte2 << 16);
383
+ return res + (res1 << 32);
384
+ }
385
+
386
+ static int64_t
387
+ get_sint56_be(VALUE rstr, VALUE ri)
388
+ {
389
+ int64_t res = get_int56_be(rstr, ri);
390
+ return res - ((res >> 55) << 56);
391
+ }
392
+
393
+ static uint64_t
394
+ get_int64_le(VALUE rstr, VALUE ri)
395
+ {
396
+ long i = NUM2LONG(ri);
397
+ const uint8_t *ptr;
398
+ uint32_t byte0, byte1, byte2, byte3;
399
+ int64_t res, res1;
400
+ StringValue(rstr);
401
+ i = check_size(i, RSTRING_LEN(rstr), 8);
402
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
403
+
404
+ byte0 = ptr[i];
405
+ byte1 = ptr[i+1];
406
+ byte2 = ptr[i+2];
407
+ byte3 = ptr[i+3];
408
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
409
+ byte0 = ptr[i+4];
410
+ byte1 = ptr[i+5];
411
+ byte2 = ptr[i+6];
412
+ byte3 = ptr[i+7];
413
+ res1 = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
414
+ return res + (res1 << 32);
415
+ }
416
+
417
+ static int64_t
418
+ get_sint64_le(VALUE rstr, VALUE ri)
419
+ {
420
+ return (int64_t)get_int64_le(rstr, ri);
421
+ }
422
+
423
+ static uint64_t
424
+ get_int64_be(VALUE rstr, VALUE ri)
425
+ {
426
+ long i = NUM2LONG(ri);
427
+ const uint8_t *ptr;
428
+ uint32_t byte0, byte1, byte2, byte3;
429
+ int64_t res, res1;
430
+ StringValue(rstr);
431
+ i = check_size(i, RSTRING_LEN(rstr), 8);
432
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
433
+
434
+ byte0 = ptr[i+7];
435
+ byte1 = ptr[i+6];
436
+ byte2 = ptr[i+5];
437
+ byte3 = ptr[i+4];
438
+ res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
439
+ byte0 = ptr[i+3];
440
+ byte1 = ptr[i+2];
441
+ byte2 = ptr[i+1];
442
+ byte3 = ptr[i];
443
+ res1 = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
444
+ return res + (res1 << 32);
445
+ }
446
+
447
+ static int64_t
448
+ get_sint64_be(VALUE rstr, VALUE ri)
449
+ {
450
+ return (int64_t)get_int64_be(rstr, ri);
451
+ }
452
+
453
+ static uint64_t
454
+ parse_ber(const uint8_t *ptr, long max, long *i)
455
+ {
456
+ uint64_t res = 0;
457
+ while (1) {
458
+ if (*ptr < 128) {
459
+ res += *ptr;
460
+ break;
461
+ }
462
+ if (res > LLU(0xFFFFFFFFFFFFFFFF) / 128) {
463
+ rb_raise(rb_eArgError, "BER integer is greater then 2**64, could not parse such big");
464
+ }
465
+ res = (res + ((*ptr) - 128)) * 128;
466
+ ptr++;
467
+ if (++(*i) >= max) {
468
+ rb_raise(rb_eArgError, "String unexpectedly finished while parsing BER integer");
469
+ }
470
+ }
471
+ return res;
472
+ }
473
+
474
+ static uint64_t
475
+ get_ber(VALUE rstr, VALUE ri)
476
+ {
477
+ long i = NUM2LONG(ri), len;
478
+ const uint8_t *ptr;
479
+ StringValue(rstr);
480
+ len = RSTRING_LEN(rstr);
481
+ i = check_size(i, len, 1);
482
+ ptr = RSTRING_PTR(rstr) + i;
483
+ return parse_ber(ptr, len, &i);
484
+ }
485
+
486
+ static int64_t
487
+ safe_int64_t(VALUE i)
488
+ {
489
+ if (FIXNUM_P(i)) {
490
+ return NUM2I64(i);
491
+ }
492
+ else {
493
+ VALUE argm = UINT2NUM(0xffffffff);
494
+ VALUE arg32 = INT2FIX(32);
495
+ uint64_t i0 = NUM2I64(rb_funcall2(i, band, 1, &argm));
496
+ i = rb_funcall2(i, rshft, 1, &arg32);
497
+ return i0 + (NUM2I64(rb_funcall2(i, band, 1, &argm)) << 32);
498
+ }
499
+ }
500
+
501
+ static VALUE
502
+ check_argc(int argc, VALUE *argv)
503
+ {
504
+ if (argc == 0 || argc > 2) {
505
+ rb_raise(rb_eArgError, "accepts 1 or 2 arguments: (string[, offset=0])");
506
+ }
507
+ return argc == 2 ? argv[1] : INT2FIX(0);
508
+ }
509
+
510
+ /**** GET ****/
511
+ /**** 32bit ***/
512
+ static VALUE
513
+ rb_get_int8(int argc, VALUE *argv, VALUE self)
514
+ {
515
+ return INT2FIX(get_int8(argv[0], check_argc(argc, argv)));
516
+ }
517
+
518
+ static VALUE
519
+ rb_get_sint8(int argc, VALUE *argv, VALUE self)
520
+ {
521
+ return INT2FIX(get_sint8(argv[0], check_argc(argc, argv)));
522
+ }
523
+
524
+ static VALUE
525
+ rb_get_int16_le(int argc, VALUE *argv, VALUE self)
526
+ {
527
+ return INT2FIX(get_int16_le(argv[0], check_argc(argc, argv)));
528
+ }
529
+
530
+ static VALUE
531
+ rb_get_sint16_le(int argc, VALUE *argv, VALUE self)
532
+ {
533
+ return INT2FIX(get_sint16_le(argv[0], check_argc(argc, argv)));
534
+ }
535
+
536
+ static VALUE
537
+ rb_get_int16_be(int argc, VALUE *argv, VALUE self)
538
+ {
539
+ return INT2FIX(get_int16_be(argv[0], check_argc(argc, argv)));
540
+ }
541
+
542
+ static VALUE
543
+ rb_get_sint16_be(int argc, VALUE *argv, VALUE self)
544
+ {
545
+ return INT2FIX(get_sint16_be(argv[0], check_argc(argc, argv)));
546
+ }
547
+
548
+ static VALUE
549
+ rb_get_int24_le(int argc, VALUE *argv, VALUE self)
550
+ {
551
+ return INT2FIX(get_int24_le(argv[0], check_argc(argc, argv)));
552
+ }
553
+
554
+ static VALUE
555
+ rb_get_sint24_le(int argc, VALUE *argv, VALUE self)
556
+ {
557
+ return INT2FIX(get_sint24_le(argv[0], check_argc(argc, argv)));
558
+ }
559
+
560
+ static VALUE
561
+ rb_get_int24_be(int argc, VALUE *argv, VALUE self)
562
+ {
563
+ return INT2FIX(get_int24_be(argv[0], check_argc(argc, argv)));
564
+ }
565
+
566
+ static VALUE
567
+ rb_get_sint24_be(int argc, VALUE *argv, VALUE self)
568
+ {
569
+ return INT2FIX(get_sint24_be(argv[0], check_argc(argc, argv)));
570
+ }
571
+
572
+ static VALUE
573
+ rb_get_int32_le(int argc, VALUE *argv, VALUE self)
574
+ {
575
+ return UINT2NUM(get_int32_le(argv[0], check_argc(argc, argv)));
576
+ }
577
+
578
+ static VALUE
579
+ rb_get_sint32_le(int argc, VALUE *argv, VALUE self)
580
+ {
581
+ return INT2NUM(get_sint32_le(argv[0], check_argc(argc, argv)));
582
+ }
583
+
584
+ static VALUE
585
+ rb_get_int32_be(int argc, VALUE *argv, VALUE self)
586
+ {
587
+ return UINT2NUM(get_int32_be(argv[0], check_argc(argc, argv)));
588
+ }
589
+
590
+ static VALUE
591
+ rb_get_sint32_be(int argc, VALUE *argv, VALUE self)
592
+ {
593
+ return INT2NUM(get_sint32_be(argv[0], check_argc(argc, argv)));
594
+ }
595
+ /*** 32BIT END ***/
596
+
597
+ /*** 64BIT ***/
598
+ static VALUE
599
+ rb_get_int40_le(int argc, VALUE *argv, VALUE self)
600
+ {
601
+ return I642NUM(get_int40_le(argv[0], check_argc(argc, argv)));
602
+ }
603
+
604
+ static VALUE
605
+ rb_get_sint40_le(int argc, VALUE *argv, VALUE self)
606
+ {
607
+ return I642NUM(get_sint40_le(argv[0], check_argc(argc, argv)));
608
+ }
609
+
610
+ static VALUE
611
+ rb_get_int40_be(int argc, VALUE *argv, VALUE self)
612
+ {
613
+ return I642NUM(get_int40_be(argv[0], check_argc(argc, argv)));
614
+ }
615
+
616
+ static VALUE
617
+ rb_get_sint40_be(int argc, VALUE *argv, VALUE self)
618
+ {
619
+ return I642NUM(get_sint40_be(argv[0], check_argc(argc, argv)));
620
+ }
621
+
622
+ static VALUE
623
+ rb_get_int48_le(int argc, VALUE *argv, VALUE self)
624
+ {
625
+ return I642NUM(get_int48_le(argv[0], check_argc(argc, argv)));
626
+ }
627
+
628
+ static VALUE
629
+ rb_get_sint48_le(int argc, VALUE *argv, VALUE self)
630
+ {
631
+ return I642NUM(get_sint48_le(argv[0], check_argc(argc, argv)));
632
+ }
633
+
634
+ static VALUE
635
+ rb_get_int48_be(int argc, VALUE *argv, VALUE self)
636
+ {
637
+ return I642NUM(get_int48_be(argv[0], check_argc(argc, argv)));
638
+ }
639
+
640
+ static VALUE
641
+ rb_get_sint48_be(int argc, VALUE *argv, VALUE self)
642
+ {
643
+ return I642NUM(get_sint48_be(argv[0], check_argc(argc, argv)));
644
+ }
645
+
646
+ static VALUE
647
+ rb_get_int56_le(int argc, VALUE *argv, VALUE self)
648
+ {
649
+ return I642NUM(get_int56_le(argv[0], check_argc(argc, argv)));
650
+ }
651
+
652
+ static VALUE
653
+ rb_get_sint56_le(int argc, VALUE *argv, VALUE self)
654
+ {
655
+ return I642NUM(get_sint56_le(argv[0], check_argc(argc, argv)));
656
+ }
657
+
658
+ static VALUE
659
+ rb_get_int56_be(int argc, VALUE *argv, VALUE self)
660
+ {
661
+ return I642NUM(get_int56_be(argv[0], check_argc(argc, argv)));
662
+ }
663
+
664
+ static VALUE
665
+ rb_get_sint56_be(int argc, VALUE *argv, VALUE self)
666
+ {
667
+ return I642NUM(get_sint56_be(argv[0], check_argc(argc, argv)));
668
+ }
669
+
670
+ static VALUE
671
+ rb_get_int64_le(int argc, VALUE *argv, VALUE self)
672
+ {
673
+ return U642NUM(get_int64_le(argv[0], check_argc(argc, argv)));
674
+ }
675
+
676
+ static VALUE
677
+ rb_get_sint64_le(int argc, VALUE *argv, VALUE self)
678
+ {
679
+ return I642NUM(get_sint64_le(argv[0], check_argc(argc, argv)));
680
+ }
681
+
682
+ static VALUE
683
+ rb_get_int64_be(int argc, VALUE *argv, VALUE self)
684
+ {
685
+ return U642NUM(get_int64_be(argv[0], check_argc(argc, argv)));
686
+ }
687
+
688
+ static VALUE
689
+ rb_get_sint64_be(int argc, VALUE *argv, VALUE self)
690
+ {
691
+ return I642NUM(get_sint64_be(argv[0], check_argc(argc, argv)));
692
+ }
693
+ /*** 64BIT END ***/
694
+
695
+ static VALUE
696
+ rb_get_ber(int argc, VALUE *argv, VALUE self)
697
+ {
698
+ return U642NUM(get_ber(argv[0], check_argc(argc, argv)));
699
+ }
700
+ /** GET END **/
701
+
702
+ /** SLICE **/
703
+ /*** 32BIT ***/
704
+ static VALUE
705
+ rb_slice_int8(VALUE self, VALUE rstr)
706
+ {
707
+ int32_t res = get_int8(rstr, INT2FIX(0));
708
+ rb_str_drop_bytes(rstr, 1);
709
+ return INT2FIX(res);
710
+ }
711
+
712
+ static VALUE
713
+ rb_slice_sint8(VALUE self, VALUE rstr)
714
+ {
715
+ int32_t res = get_sint8(rstr, INT2FIX(0));
716
+ rb_str_drop_bytes(rstr, 1);
717
+ return INT2FIX(res);
718
+ }
719
+
720
+ static VALUE
721
+ rb_slice_int16_le(VALUE self, VALUE rstr)
722
+ {
723
+ int32_t res = get_int16_le(rstr, INT2FIX(0));
724
+ rb_str_drop_bytes(rstr, 2);
725
+ return INT2FIX(res);
726
+ }
727
+
728
+ static VALUE
729
+ rb_slice_sint16_le(VALUE self, VALUE rstr)
730
+ {
731
+ int32_t res = get_sint16_le(rstr, INT2FIX(0));
732
+ rb_str_drop_bytes(rstr, 2);
733
+ return INT2FIX(res);
734
+ }
735
+
736
+ static VALUE
737
+ rb_slice_int16_be(VALUE self, VALUE rstr)
738
+ {
739
+ int32_t res = get_int16_be(rstr, INT2FIX(0));
740
+ rb_str_drop_bytes(rstr, 2);
741
+ return INT2FIX(res);
742
+ }
743
+
744
+ static VALUE
745
+ rb_slice_sint16_be(VALUE self, VALUE rstr)
746
+ {
747
+ int32_t res = get_sint16_be(rstr, INT2FIX(0));
748
+ rb_str_drop_bytes(rstr, 2);
749
+ return INT2FIX(res);
750
+ }
751
+
752
+ static VALUE
753
+ rb_slice_int24_le(VALUE self, VALUE rstr)
754
+ {
755
+ int32_t res = get_int24_le(rstr, INT2FIX(0));
756
+ rb_str_drop_bytes(rstr, 3);
757
+ return INT2FIX(res);
758
+ }
759
+
760
+ static VALUE
761
+ rb_slice_sint24_le(VALUE self, VALUE rstr)
762
+ {
763
+ int32_t res = get_sint24_le(rstr, INT2FIX(0));
764
+ rb_str_drop_bytes(rstr, 3);
765
+ return INT2FIX(res);
766
+ }
767
+
768
+ static VALUE
769
+ rb_slice_int24_be(VALUE self, VALUE rstr)
770
+ {
771
+ int32_t res = get_int24_be(rstr, INT2FIX(0));
772
+ rb_str_drop_bytes(rstr, 3);
773
+ return INT2FIX(res);
774
+ }
775
+
776
+ static VALUE
777
+ rb_slice_sint24_be(VALUE self, VALUE rstr)
778
+ {
779
+ int32_t res = get_sint24_be(rstr, INT2FIX(0));
780
+ rb_str_drop_bytes(rstr, 3);
781
+ return INT2FIX(res);
782
+ }
783
+
784
+ static VALUE
785
+ rb_slice_int32_le(VALUE self, VALUE rstr)
786
+ {
787
+ uint32_t res = get_int32_le(rstr, INT2FIX(0));
788
+ rb_str_drop_bytes(rstr, 4);
789
+ return UINT2NUM(res);
790
+ }
791
+
792
+ static VALUE
793
+ rb_slice_sint32_le(VALUE self, VALUE rstr)
794
+ {
795
+ int32_t res = get_sint32_le(rstr, INT2FIX(0));
796
+ rb_str_drop_bytes(rstr, 4);
797
+ return INT2NUM(res);
798
+ }
799
+
800
+ static VALUE
801
+ rb_slice_int32_be(VALUE self, VALUE rstr)
802
+ {
803
+ uint32_t res = get_int32_be(rstr, INT2FIX(0));
804
+ rb_str_drop_bytes(rstr, 4);
805
+ return UINT2NUM(res);
806
+ }
807
+
808
+ static VALUE
809
+ rb_slice_sint32_be(VALUE self, VALUE rstr)
810
+ {
811
+ int32_t res = get_sint32_be(rstr, INT2FIX(0));
812
+ rb_str_drop_bytes(rstr, 4);
813
+ return INT2NUM(res);
814
+ }
815
+ /*** 32BIT END ***/
816
+
817
+ /*** 64BIT ***/
818
+ static VALUE
819
+ rb_slice_int40_le(VALUE self, VALUE rstr)
820
+ {
821
+ int64_t res = get_int40_le(rstr, INT2FIX(0));
822
+ rb_str_drop_bytes(rstr, 5);
823
+ return I642NUM(res);
824
+ }
825
+
826
+ static VALUE
827
+ rb_slice_sint40_le(VALUE self, VALUE rstr)
828
+ {
829
+ int64_t res = get_sint40_le(rstr, INT2FIX(0));
830
+ rb_str_drop_bytes(rstr, 5);
831
+ return I642NUM(res);
832
+ }
833
+
834
+ static VALUE
835
+ rb_slice_int40_be(VALUE self, VALUE rstr)
836
+ {
837
+ int64_t res = get_int40_be(rstr, INT2FIX(0));
838
+ rb_str_drop_bytes(rstr, 5);
839
+ return I642NUM(res);
840
+ }
841
+
842
+ static VALUE
843
+ rb_slice_sint40_be(VALUE self, VALUE rstr)
844
+ {
845
+ int64_t res = get_sint40_be(rstr, INT2FIX(0));
846
+ rb_str_drop_bytes(rstr, 5);
847
+ return I642NUM(res);
848
+ }
849
+
850
+ static VALUE
851
+ rb_slice_int48_le(VALUE self, VALUE rstr)
852
+ {
853
+ int64_t res = get_int48_le(rstr, INT2FIX(0));
854
+ rb_str_drop_bytes(rstr, 6);
855
+ return I642NUM(res);
856
+ }
857
+
858
+ static VALUE
859
+ rb_slice_sint48_le(VALUE self, VALUE rstr)
860
+ {
861
+ int64_t res = get_sint48_le(rstr, INT2FIX(0));
862
+ rb_str_drop_bytes(rstr, 6);
863
+ return I642NUM(res);
864
+ }
865
+
866
+ static VALUE
867
+ rb_slice_int48_be(VALUE self, VALUE rstr)
868
+ {
869
+ int64_t res = get_int48_be(rstr, INT2FIX(0));
870
+ rb_str_drop_bytes(rstr, 6);
871
+ return I642NUM(res);
872
+ }
873
+
874
+ static VALUE
875
+ rb_slice_sint48_be(VALUE self, VALUE rstr)
876
+ {
877
+ int64_t res = get_sint48_be(rstr, INT2FIX(0));
878
+ rb_str_drop_bytes(rstr, 6);
879
+ return I642NUM(res);
880
+ }
881
+
882
+ static VALUE
883
+ rb_slice_int56_le(VALUE self, VALUE rstr)
884
+ {
885
+ int64_t res = get_int56_le(rstr, INT2FIX(0));
886
+ rb_str_drop_bytes(rstr, 7);
887
+ return I642NUM(res);
888
+ }
889
+
890
+ static VALUE
891
+ rb_slice_sint56_le(VALUE self, VALUE rstr)
892
+ {
893
+ int64_t res = get_sint56_le(rstr, INT2FIX(0));
894
+ rb_str_drop_bytes(rstr, 7);
895
+ return I642NUM(res);
896
+ }
897
+
898
+ static VALUE
899
+ rb_slice_int56_be(VALUE self, VALUE rstr)
900
+ {
901
+ int64_t res = get_int56_be(rstr, INT2FIX(0));
902
+ rb_str_drop_bytes(rstr, 7);
903
+ return I642NUM(res);
904
+ }
905
+
906
+ static VALUE
907
+ rb_slice_sint56_be(VALUE self, VALUE rstr)
908
+ {
909
+ int64_t res = get_sint56_be(rstr, INT2FIX(0));
910
+ rb_str_drop_bytes(rstr, 7);
911
+ return I642NUM(res);
912
+ }
913
+
914
+ static VALUE
915
+ rb_slice_int64_le(VALUE self, VALUE rstr)
916
+ {
917
+ uint64_t res = get_int64_le(rstr, INT2FIX(0));
918
+ rb_str_drop_bytes(rstr, 8);
919
+ return U642NUM(res);
920
+ }
921
+
922
+ static VALUE
923
+ rb_slice_sint64_le(VALUE self, VALUE rstr)
924
+ {
925
+ int64_t res = get_sint64_le(rstr, INT2FIX(0));
926
+ rb_str_drop_bytes(rstr, 8);
927
+ return I642NUM(res);
928
+ }
929
+
930
+ static VALUE
931
+ rb_slice_int64_be(VALUE self, VALUE rstr)
932
+ {
933
+ uint64_t res = get_int64_be(rstr, INT2FIX(0));
934
+ rb_str_drop_bytes(rstr, 8);
935
+ return U642NUM(res);
936
+ }
937
+
938
+ static VALUE
939
+ rb_slice_sint64_be(VALUE self, VALUE rstr)
940
+ {
941
+ int64_t res = get_sint64_be(rstr, INT2FIX(0));
942
+ rb_str_drop_bytes(rstr, 8);
943
+ return I642NUM(res);
944
+ }
945
+ /*** 64BIT END ***/
946
+
947
+ static uint64_t
948
+ slice_ber(VALUE rstr, long *i)
949
+ {
950
+ long len;
951
+ const uint8_t *ptr;
952
+ StringValue(rstr);
953
+ len = RSTRING_LEN(rstr);
954
+ ptr = RSTRING_PTR(rstr);
955
+ return parse_ber(ptr, len, i);
956
+ }
957
+
958
+ static VALUE
959
+ rb_slice_ber(VALUE self, VALUE rstr)
960
+ {
961
+ long i = 0;
962
+ int64_t res = slice_ber(rstr, &i);
963
+ rb_str_drop_bytes(rstr, i+1);
964
+ return U642NUM(res);
965
+ }
966
+ /** SLICE END **/
967
+
968
+ /** APPEND **/
969
+ static void
970
+ append_int8(VALUE rstr, int32_t v)
971
+ {
972
+ char a[1] = {v & 255};
973
+ rb_str_cat(rstr, a, 1);
974
+ }
975
+
976
+ static void
977
+ append_int16_le(VALUE rstr, int32_t v)
978
+ {
979
+ char a[2] = {v & 255, (v >> 8) & 255};
980
+ rb_str_cat(rstr, a, 2);
981
+ }
982
+
983
+ static void
984
+ append_int16_be(VALUE rstr, int32_t v)
985
+ {
986
+ char a[2] = {(v >> 8) & 255, v & 255};
987
+ rb_str_cat(rstr, a, 2);
988
+ }
989
+
990
+ static void
991
+ append_int24_le(VALUE rstr, int32_t v)
992
+ {
993
+ char a[3] = {v & 255, (v >> 8) & 255, (v >> 16) & 255};
994
+ rb_str_cat(rstr, a, 3);
995
+ }
996
+
997
+ static void
998
+ append_int24_be(VALUE rstr, int32_t v)
999
+ {
1000
+ char a[3] = {(v >> 16) & 255, (v >> 8) & 255, v & 255};
1001
+ rb_str_cat(rstr, a, 3);
1002
+ }
1003
+
1004
+ static void
1005
+ append_int32_le(VALUE rstr, int32_t v)
1006
+ {
1007
+ char a[4] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255};
1008
+ rb_str_cat(rstr, a, 4);
1009
+ }
1010
+
1011
+ static void
1012
+ append_int32_be(VALUE rstr, int32_t v)
1013
+ {
1014
+ char a[4] = {(v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1015
+ rb_str_cat(rstr, a, 4);
1016
+ }
1017
+
1018
+ static void
1019
+ append_int40_le(VALUE rstr, int64_t v)
1020
+ {
1021
+ char a[5] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1022
+ (v >> 32) & 255};
1023
+ rb_str_cat(rstr, a, 5);
1024
+ }
1025
+
1026
+ static void
1027
+ append_int40_be(VALUE rstr, int64_t v)
1028
+ {
1029
+ char a[5] = {(v >> 32) & 255,
1030
+ (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1031
+ rb_str_cat(rstr, a, 5);
1032
+ }
1033
+
1034
+ static void
1035
+ append_int48_le(VALUE rstr, int64_t v)
1036
+ {
1037
+ char a[6] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1038
+ (v >> 32) & 255, (v >> 40) & 255};
1039
+ rb_str_cat(rstr, a, 6);
1040
+ }
1041
+
1042
+ static void
1043
+ append_int48_be(VALUE rstr, int64_t v)
1044
+ {
1045
+ char a[6] = {(v >> 40) & 255, (v >> 32) & 255,
1046
+ (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1047
+ rb_str_cat(rstr, a, 6);
1048
+ }
1049
+
1050
+ static void
1051
+ append_int56_le(VALUE rstr, int64_t v)
1052
+ {
1053
+ char a[7] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1054
+ (v >> 32) & 255, (v >> 40) & 255, (v >> 48) & 255};
1055
+ rb_str_cat(rstr, a, 7);
1056
+ }
1057
+
1058
+ static void
1059
+ append_int56_be(VALUE rstr, int64_t v)
1060
+ {
1061
+ char a[7] = {(v >> 48) & 255, (v >> 40) & 255, (v >> 32) & 255,
1062
+ (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1063
+ rb_str_cat(rstr, a, 7);
1064
+ }
1065
+
1066
+ static void
1067
+ append_int64_le(VALUE rstr, int64_t v)
1068
+ {
1069
+ char a[8] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1070
+ (v >> 32) & 255, (v >> 40) & 255, (v >> 48) & 255, (v >> 56) & 255};
1071
+ rb_str_cat(rstr, a, 8);
1072
+ }
1073
+
1074
+ static void
1075
+ append_int64_be(VALUE rstr, int64_t v)
1076
+ {
1077
+ char a[8] = {(v >> 56) & 255, (v >> 48) & 255, (v >> 40) & 255, (v >> 32) & 255,
1078
+ (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1079
+ rb_str_cat(rstr, a, 8);
1080
+ }
1081
+
1082
+ static int
1083
+ append_ber(VALUE rstr, uint64_t ber)
1084
+ {
1085
+ int i = 10;
1086
+ char a[12] = {128, 128, 128, 128,
1087
+ 128, 128 ,128 ,128,
1088
+ 128, 128, 0};
1089
+ do {
1090
+ a[i] += ber % 128;
1091
+ ber /= 128;
1092
+ i--;
1093
+ } while (ber);
1094
+ i++;
1095
+ rb_str_cat(rstr, a+i, 11-i);
1096
+
1097
+ return 11-i;
1098
+ }
1099
+
1100
+ /*** 32BIT **/
1101
+ static VALUE
1102
+ rb_append_int8(VALUE self, VALUE str, VALUE i)
1103
+ {
1104
+ append_int8(str, NUM2INT(i));
1105
+ return str;
1106
+ }
1107
+
1108
+ static VALUE
1109
+ rb_append_int16_le(VALUE self, VALUE str, VALUE i)
1110
+ {
1111
+ append_int16_le(str, NUM2INT(i));
1112
+ return str;
1113
+ }
1114
+
1115
+ static VALUE
1116
+ rb_append_int16_be(VALUE self, VALUE str, VALUE i)
1117
+ {
1118
+ append_int16_be(str, NUM2INT(i));
1119
+ return str;
1120
+ }
1121
+
1122
+ static VALUE
1123
+ rb_append_int24_le(VALUE self, VALUE str, VALUE i)
1124
+ {
1125
+ append_int24_le(str, NUM2INT(i));
1126
+ return str;
1127
+ }
1128
+
1129
+ static VALUE
1130
+ rb_append_int24_be(VALUE self, VALUE str, VALUE i)
1131
+ {
1132
+ append_int24_be(str, NUM2INT(i));
1133
+ return str;
1134
+ }
1135
+
1136
+ static VALUE
1137
+ rb_append_int32_le(VALUE self, VALUE str, VALUE i)
1138
+ {
1139
+ append_int32_le(str, (int32_t)NUM2I64(i));
1140
+ return str;
1141
+ }
1142
+
1143
+ static VALUE
1144
+ rb_append_int32_be(VALUE self, VALUE str, VALUE i)
1145
+ {
1146
+ append_int32_be(str, (int32_t)NUM2I64(i));
1147
+ return str;
1148
+ }
1149
+ /*** 32BIT END ***/
1150
+
1151
+ /*** 64BIT ***/
1152
+ static VALUE
1153
+ rb_append_int40_le(VALUE self, VALUE str, VALUE i)
1154
+ {
1155
+ append_int40_le(str, NUM2I64(i));
1156
+ return str;
1157
+ }
1158
+
1159
+ static VALUE
1160
+ rb_append_int40_be(VALUE self, VALUE str, VALUE i)
1161
+ {
1162
+ append_int40_be(str, NUM2I64(i));
1163
+ return str;
1164
+ }
1165
+
1166
+ static VALUE
1167
+ rb_append_int48_le(VALUE self, VALUE str, VALUE i)
1168
+ {
1169
+ append_int48_le(str, NUM2I64(i));
1170
+ return str;
1171
+ }
1172
+
1173
+ static VALUE
1174
+ rb_append_int48_be(VALUE self, VALUE str, VALUE i)
1175
+ {
1176
+ append_int48_be(str, NUM2I64(i));
1177
+ return str;
1178
+ }
1179
+
1180
+ static VALUE
1181
+ rb_append_int56_le(VALUE self, VALUE str, VALUE i)
1182
+ {
1183
+ append_int56_le(str, NUM2I64(i));
1184
+ return str;
1185
+ }
1186
+
1187
+ static VALUE
1188
+ rb_append_int56_be(VALUE self, VALUE str, VALUE i)
1189
+ {
1190
+ append_int56_be(str, NUM2I64(i));
1191
+ return str;
1192
+ }
1193
+
1194
+ static VALUE
1195
+ rb_append_int64_le(VALUE self, VALUE str, VALUE i)
1196
+ {
1197
+ append_int64_le(str, safe_int64_t(i));
1198
+ return str;
1199
+ }
1200
+
1201
+ static VALUE
1202
+ rb_append_int64_be(VALUE self, VALUE str, VALUE i)
1203
+ {
1204
+ append_int64_be(str, safe_int64_t(i));
1205
+ return str;
1206
+ }
1207
+ /*** 64BIT END **/
1208
+
1209
+ static VALUE
1210
+ rb_append_ber(VALUE self, VALUE str, VALUE i)
1211
+ {
1212
+ append_ber(str, safe_int64_t(i));
1213
+ return str;
1214
+ }
1215
+
1216
+ /** APPEND END **/
1217
+
1218
+ /** APPEND BERSIZE **/
1219
+ /*** 32BIT **/
1220
+ static VALUE
1221
+ rb_append_bersize_int8(VALUE self, VALUE str, VALUE i)
1222
+ {
1223
+ char sz = 1;
1224
+ rb_str_cat(str, &sz, 1);
1225
+ append_int8(str, NUM2INT(i));
1226
+ return str;
1227
+ }
1228
+
1229
+ static VALUE
1230
+ rb_append_bersize_int16_le(VALUE self, VALUE str, VALUE i)
1231
+ {
1232
+ char sz = 2;
1233
+ rb_str_cat(str, &sz, 1);
1234
+ append_int16_le(str, NUM2INT(i));
1235
+ return str;
1236
+ }
1237
+
1238
+ static VALUE
1239
+ rb_append_bersize_int16_be(VALUE self, VALUE str, VALUE i)
1240
+ {
1241
+ char sz = 2;
1242
+ rb_str_cat(str, &sz, 1);
1243
+ append_int16_be(str, NUM2INT(i));
1244
+ return str;
1245
+ }
1246
+
1247
+ static VALUE
1248
+ rb_append_bersize_int24_le(VALUE self, VALUE str, VALUE i)
1249
+ {
1250
+ char sz = 3;
1251
+ rb_str_cat(str, &sz, 1);
1252
+ append_int24_le(str, NUM2INT(i));
1253
+ return str;
1254
+ }
1255
+
1256
+ static VALUE
1257
+ rb_append_bersize_int24_be(VALUE self, VALUE str, VALUE i)
1258
+ {
1259
+ char sz = 3;
1260
+ rb_str_cat(str, &sz, 1);
1261
+ append_int24_be(str, NUM2INT(i));
1262
+ return str;
1263
+ }
1264
+
1265
+ static VALUE
1266
+ rb_append_bersize_int32_le(VALUE self, VALUE str, VALUE i)
1267
+ {
1268
+ char sz = 4;
1269
+ rb_str_cat(str, &sz, 1);
1270
+ append_int32_le(str, (int32_t)NUM2I64(i));
1271
+ return str;
1272
+ }
1273
+
1274
+ static VALUE
1275
+ rb_append_bersize_int32_be(VALUE self, VALUE str, VALUE i)
1276
+ {
1277
+ char sz = 4;
1278
+ rb_str_cat(str, &sz, 1);
1279
+ append_int32_be(str, (int32_t)NUM2I64(i));
1280
+ return str;
1281
+ }
1282
+ /*** 32BIT END ***/
1283
+
1284
+ /*** 64BIT ***/
1285
+ static VALUE
1286
+ rb_append_bersize_int40_le(VALUE self, VALUE str, VALUE i)
1287
+ {
1288
+ char sz = 5;
1289
+ rb_str_cat(str, &sz, 1);
1290
+ append_int40_le(str, NUM2I64(i));
1291
+ return str;
1292
+ }
1293
+
1294
+ static VALUE
1295
+ rb_append_bersize_int40_be(VALUE self, VALUE str, VALUE i)
1296
+ {
1297
+ char sz = 5;
1298
+ rb_str_cat(str, &sz, 1);
1299
+ append_int40_be(str, NUM2I64(i));
1300
+ return str;
1301
+ }
1302
+
1303
+ static VALUE
1304
+ rb_append_bersize_int48_le(VALUE self, VALUE str, VALUE i)
1305
+ {
1306
+ char sz = 6;
1307
+ rb_str_cat(str, &sz, 1);
1308
+ append_int48_le(str, NUM2I64(i));
1309
+ return str;
1310
+ }
1311
+
1312
+ static VALUE
1313
+ rb_append_bersize_int48_be(VALUE self, VALUE str, VALUE i)
1314
+ {
1315
+ char sz = 6;
1316
+ rb_str_cat(str, &sz, 1);
1317
+ append_int48_be(str, NUM2I64(i));
1318
+ return str;
1319
+ }
1320
+
1321
+ static VALUE
1322
+ rb_append_bersize_int56_le(VALUE self, VALUE str, VALUE i)
1323
+ {
1324
+ char sz = 7;
1325
+ rb_str_cat(str, &sz, 1);
1326
+ append_int56_le(str, NUM2I64(i));
1327
+ return str;
1328
+ }
1329
+
1330
+ static VALUE
1331
+ rb_append_bersize_int56_be(VALUE self, VALUE str, VALUE i)
1332
+ {
1333
+ char sz = 7;
1334
+ rb_str_cat(str, &sz, 1);
1335
+ append_int56_be(str, NUM2I64(i));
1336
+ return str;
1337
+ }
1338
+
1339
+ static VALUE
1340
+ rb_append_bersize_int64_le(VALUE self, VALUE str, VALUE i)
1341
+ {
1342
+ char sz = 8;
1343
+ rb_str_cat(str, &sz, 1);
1344
+ append_int64_le(str, safe_int64_t(i));
1345
+ return str;
1346
+ }
1347
+
1348
+ static VALUE
1349
+ rb_append_bersize_int64_be(VALUE self, VALUE str, VALUE i)
1350
+ {
1351
+ char sz = 8;
1352
+ rb_str_cat(str, &sz, 1);
1353
+ append_int64_be(str, safe_int64_t(i));
1354
+ return str;
1355
+ }
1356
+ /*** 64BIT END **/
1357
+
1358
+ static VALUE
1359
+ rb_append_bersize_ber(VALUE self, VALUE str, VALUE i)
1360
+ {
1361
+ char c=0;
1362
+ int sl, bl;
1363
+ rb_str_cat(str, &c, 1);
1364
+ sl = RSTRING_LEN(str)-1;
1365
+ bl = append_ber(str, safe_int64_t(i));
1366
+ RSTRING_PTR(str)[sl] = bl;
1367
+ return str;
1368
+ }
1369
+
1370
+ /** APPEND BERSIZE END **/
1371
+
1372
+ /** APPEND INT32LESIZE **/
1373
+ /*** 32BIT **/
1374
+ static VALUE
1375
+ rb_append_int32lesize_int8(VALUE self, VALUE str, VALUE i)
1376
+ {
1377
+ char sz[4] = {1, 0, 0, 0};
1378
+ rb_str_cat(str, sz, 4);
1379
+ append_int8(str, NUM2INT(i));
1380
+ return str;
1381
+ }
1382
+
1383
+ static VALUE
1384
+ rb_append_int32lesize_int16_le(VALUE self, VALUE str, VALUE i)
1385
+ {
1386
+ char sz[4] = {2, 0, 0, 0};
1387
+ rb_str_cat(str, sz, 4);
1388
+ append_int16_le(str, NUM2INT(i));
1389
+ return str;
1390
+ }
1391
+
1392
+ static VALUE
1393
+ rb_append_int32lesize_int16_be(VALUE self, VALUE str, VALUE i)
1394
+ {
1395
+ char sz[4] = {2, 0, 0, 0};
1396
+ rb_str_cat(str, sz, 4);
1397
+ append_int16_be(str, NUM2INT(i));
1398
+ return str;
1399
+ }
1400
+
1401
+ static VALUE
1402
+ rb_append_int32lesize_int24_le(VALUE self, VALUE str, VALUE i)
1403
+ {
1404
+ char sz[4] = {3, 0, 0, 0};
1405
+ rb_str_cat(str, sz, 4);
1406
+ append_int24_le(str, NUM2INT(i));
1407
+ return str;
1408
+ }
1409
+
1410
+ static VALUE
1411
+ rb_append_int32lesize_int24_be(VALUE self, VALUE str, VALUE i)
1412
+ {
1413
+ char sz[4] = {3, 0, 0, 0};
1414
+ rb_str_cat(str, sz, 4);
1415
+ append_int24_be(str, NUM2INT(i));
1416
+ return str;
1417
+ }
1418
+
1419
+ static VALUE
1420
+ rb_append_int32lesize_int32_le(VALUE self, VALUE str, VALUE i)
1421
+ {
1422
+ char sz[4] = {4, 0, 0, 0};
1423
+ rb_str_cat(str, sz, 4);
1424
+ append_int32_le(str, (int32_t)NUM2I64(i));
1425
+ return str;
1426
+ }
1427
+
1428
+ static VALUE
1429
+ rb_append_int32lesize_int32_be(VALUE self, VALUE str, VALUE i)
1430
+ {
1431
+ char sz[4] = {4, 0, 0, 0};
1432
+ rb_str_cat(str, sz, 4);
1433
+ append_int32_be(str, (int32_t)NUM2I64(i));
1434
+ return str;
1435
+ }
1436
+ /*** 32BIT END ***/
1437
+
1438
+ /*** 64BIT ***/
1439
+ static VALUE
1440
+ rb_append_int32lesize_int40_le(VALUE self, VALUE str, VALUE i)
1441
+ {
1442
+ char sz[4] = {5, 0, 0, 0};
1443
+ rb_str_cat(str, sz, 4);
1444
+ append_int40_le(str, NUM2I64(i));
1445
+ return str;
1446
+ }
1447
+
1448
+ static VALUE
1449
+ rb_append_int32lesize_int40_be(VALUE self, VALUE str, VALUE i)
1450
+ {
1451
+ char sz[4] = {5, 0, 0, 0};
1452
+ rb_str_cat(str, sz, 4);
1453
+ append_int40_be(str, NUM2I64(i));
1454
+ return str;
1455
+ }
1456
+
1457
+ static VALUE
1458
+ rb_append_int32lesize_int48_le(VALUE self, VALUE str, VALUE i)
1459
+ {
1460
+ char sz[4] = {6, 0, 0, 0};
1461
+ rb_str_cat(str, sz, 4);
1462
+ append_int48_le(str, NUM2I64(i));
1463
+ return str;
1464
+ }
1465
+
1466
+ static VALUE
1467
+ rb_append_int32lesize_int48_be(VALUE self, VALUE str, VALUE i)
1468
+ {
1469
+ char sz[4] = {6, 0, 0, 0};
1470
+ rb_str_cat(str, sz, 4);
1471
+ append_int48_be(str, NUM2I64(i));
1472
+ return str;
1473
+ }
1474
+
1475
+ static VALUE
1476
+ rb_append_int32lesize_int56_le(VALUE self, VALUE str, VALUE i)
1477
+ {
1478
+ char sz[4] = {7, 0, 0, 0};
1479
+ rb_str_cat(str, sz, 4);
1480
+ append_int56_le(str, NUM2I64(i));
1481
+ return str;
1482
+ }
1483
+
1484
+ static VALUE
1485
+ rb_append_int32lesize_int56_be(VALUE self, VALUE str, VALUE i)
1486
+ {
1487
+ char sz[4] = {7, 0, 0, 0};
1488
+ rb_str_cat(str, sz, 4);
1489
+ append_int56_be(str, NUM2I64(i));
1490
+ return str;
1491
+ }
1492
+
1493
+ static VALUE
1494
+ rb_append_int32lesize_int64_le(VALUE self, VALUE str, VALUE i)
1495
+ {
1496
+ char sz[4] = {8, 0, 0, 0};
1497
+ rb_str_cat(str, sz, 4);
1498
+ append_int64_le(str, safe_int64_t(i));
1499
+ return str;
1500
+ }
1501
+
1502
+ static VALUE
1503
+ rb_append_int32lesize_int64_be(VALUE self, VALUE str, VALUE i)
1504
+ {
1505
+ char sz[4] = {8, 0, 0, 0};
1506
+ rb_str_cat(str, sz, 4);
1507
+ append_int64_be(str, safe_int64_t(i));
1508
+ return str;
1509
+ }
1510
+ /*** 64BIT END **/
1511
+
1512
+ static VALUE
1513
+ rb_append_int32lesize_ber(VALUE self, VALUE str, VALUE i)
1514
+ {
1515
+ char sz[4] = {0,0,0,0};
1516
+ int sl, bl;
1517
+ rb_str_cat(str, sz, 4);
1518
+ sl = RSTRING_LEN(str)-4;
1519
+ bl = append_ber(str, safe_int64_t(i));
1520
+ RSTRING_PTR(str)[sl] = bl;
1521
+ return str;
1522
+ }
1523
+
1524
+ /** APPEND INT32LESIZE END **/
1525
+
1526
+ /** APPEND INT32BESIZE **/
1527
+ /*** 32BIT **/
1528
+ static VALUE
1529
+ rb_append_int32besize_int8(VALUE self, VALUE str, VALUE i)
1530
+ {
1531
+ char sz[4] = {0, 0, 0, 1};
1532
+ rb_str_cat(str, sz, 4);
1533
+ append_int8(str, NUM2INT(i));
1534
+ return str;
1535
+ }
1536
+
1537
+ static VALUE
1538
+ rb_append_int32besize_int16_le(VALUE self, VALUE str, VALUE i)
1539
+ {
1540
+ char sz[4] = {0, 0, 0, 2};
1541
+ rb_str_cat(str, sz, 4);
1542
+ append_int16_le(str, NUM2INT(i));
1543
+ return str;
1544
+ }
1545
+
1546
+ static VALUE
1547
+ rb_append_int32besize_int16_be(VALUE self, VALUE str, VALUE i)
1548
+ {
1549
+ char sz[4] = {0, 0, 0, 2};
1550
+ rb_str_cat(str, sz, 4);
1551
+ append_int16_be(str, NUM2INT(i));
1552
+ return str;
1553
+ }
1554
+
1555
+ static VALUE
1556
+ rb_append_int32besize_int24_le(VALUE self, VALUE str, VALUE i)
1557
+ {
1558
+ char sz[4] = {0, 0, 0, 3};
1559
+ rb_str_cat(str, sz, 4);
1560
+ append_int24_le(str, NUM2INT(i));
1561
+ return str;
1562
+ }
1563
+
1564
+ static VALUE
1565
+ rb_append_int32besize_int24_be(VALUE self, VALUE str, VALUE i)
1566
+ {
1567
+ char sz[4] = {0, 0, 0, 3};
1568
+ rb_str_cat(str, sz, 4);
1569
+ append_int24_be(str, NUM2INT(i));
1570
+ return str;
1571
+ }
1572
+
1573
+ static VALUE
1574
+ rb_append_int32besize_int32_le(VALUE self, VALUE str, VALUE i)
1575
+ {
1576
+ char sz[4] = {0, 0, 0, 4};
1577
+ rb_str_cat(str, sz, 4);
1578
+ append_int32_le(str, (int32_t)NUM2I64(i));
1579
+ return str;
1580
+ }
1581
+
1582
+ static VALUE
1583
+ rb_append_int32besize_int32_be(VALUE self, VALUE str, VALUE i)
1584
+ {
1585
+ char sz[4] = {0, 0, 0, 4};
1586
+ rb_str_cat(str, sz, 4);
1587
+ append_int32_be(str, (int32_t)NUM2I64(i));
1588
+ return str;
1589
+ }
1590
+ /*** 32BIT END ***/
1591
+
1592
+ /*** 64BIT ***/
1593
+ static VALUE
1594
+ rb_append_int32besize_int40_le(VALUE self, VALUE str, VALUE i)
1595
+ {
1596
+ char sz[4] = {0, 0, 0, 5};
1597
+ rb_str_cat(str, sz, 4);
1598
+ append_int40_le(str, NUM2I64(i));
1599
+ return str;
1600
+ }
1601
+
1602
+ static VALUE
1603
+ rb_append_int32besize_int40_be(VALUE self, VALUE str, VALUE i)
1604
+ {
1605
+ char sz[4] = {0, 0, 0, 5};
1606
+ rb_str_cat(str, sz, 4);
1607
+ append_int40_be(str, NUM2I64(i));
1608
+ return str;
1609
+ }
1610
+
1611
+ static VALUE
1612
+ rb_append_int32besize_int48_le(VALUE self, VALUE str, VALUE i)
1613
+ {
1614
+ char sz[4] = {0, 0, 0, 6};
1615
+ rb_str_cat(str, sz, 4);
1616
+ append_int48_le(str, NUM2I64(i));
1617
+ return str;
1618
+ }
1619
+
1620
+ static VALUE
1621
+ rb_append_int32besize_int48_be(VALUE self, VALUE str, VALUE i)
1622
+ {
1623
+ char sz[4] = {0, 0, 0, 6};
1624
+ rb_str_cat(str, sz, 4);
1625
+ append_int48_be(str, NUM2I64(i));
1626
+ return str;
1627
+ }
1628
+
1629
+ static VALUE
1630
+ rb_append_int32besize_int56_le(VALUE self, VALUE str, VALUE i)
1631
+ {
1632
+ char sz[4] = {0, 0, 0, 7};
1633
+ rb_str_cat(str, sz, 4);
1634
+ append_int56_le(str, NUM2I64(i));
1635
+ return str;
1636
+ }
1637
+
1638
+ static VALUE
1639
+ rb_append_int32besize_int56_be(VALUE self, VALUE str, VALUE i)
1640
+ {
1641
+ char sz[4] = {0, 0, 0, 7};
1642
+ rb_str_cat(str, sz, 4);
1643
+ append_int56_be(str, NUM2I64(i));
1644
+ return str;
1645
+ }
1646
+
1647
+ static VALUE
1648
+ rb_append_int32besize_int64_le(VALUE self, VALUE str, VALUE i)
1649
+ {
1650
+ char sz[4] = {0, 0, 0, 8};
1651
+ rb_str_cat(str, sz, 4);
1652
+ append_int64_le(str, safe_int64_t(i));
1653
+ return str;
1654
+ }
1655
+
1656
+ static VALUE
1657
+ rb_append_int32besize_int64_be(VALUE self, VALUE str, VALUE i)
1658
+ {
1659
+ char sz[4] = {0, 0, 0, 8};
1660
+ rb_str_cat(str, sz, 4);
1661
+ append_int64_be(str, safe_int64_t(i));
1662
+ return str;
1663
+ }
1664
+ /*** 64BIT END **/
1665
+
1666
+ static VALUE
1667
+ rb_append_int32besize_ber(VALUE self, VALUE str, VALUE i)
1668
+ {
1669
+ char sz[4] = {0,0,0,0};
1670
+ int sl, bl;
1671
+ rb_str_cat(str, sz, 4);
1672
+ sl = RSTRING_LEN(str)-1;
1673
+ bl = append_ber(str, safe_int64_t(i));
1674
+ RSTRING_PTR(str)[sl] = bl;
1675
+ return str;
1676
+ }
1677
+
1678
+ /** APPEND INT32BESIZE END **/
1679
+
1680
+ /** APPEND STRING **/
1681
+ static VALUE
1682
+ rb_append_string(VALUE self, VALUE str, VALUE add)
1683
+ {
1684
+ StringValue(add);
1685
+ rb_str_cat(str, RSTRING_PTR(add), RSTRING_LEN(add));
1686
+ RB_GC_GUARD(add);
1687
+ return str;
1688
+ }
1689
+
1690
+ static VALUE
1691
+ rb_append_bersize_string(VALUE self, VALUE str, VALUE add)
1692
+ {
1693
+ StringValue(add);
1694
+ append_ber(str, RSTRING_LEN(add));
1695
+ rb_str_cat(str, RSTRING_PTR(add), RSTRING_LEN(add));
1696
+ RB_GC_GUARD(add);
1697
+ return str;
1698
+ }
1699
+
1700
+ static VALUE
1701
+ rb_append_int32lesize_string(VALUE self, VALUE str, VALUE add)
1702
+ {
1703
+ StringValue(add);
1704
+ append_int32_le(str, RSTRING_LEN(add));
1705
+ rb_str_cat(str, RSTRING_PTR(add), RSTRING_LEN(add));
1706
+ RB_GC_GUARD(add);
1707
+ return str;
1708
+ }
1709
+
1710
+ static VALUE
1711
+ rb_append_int32besize_string(VALUE self, VALUE str, VALUE add)
1712
+ {
1713
+ StringValue(add);
1714
+ append_int32_be(str, RSTRING_LEN(add));
1715
+ rb_str_cat(str, RSTRING_PTR(add), RSTRING_LEN(add));
1716
+ RB_GC_GUARD(add);
1717
+ return str;
1718
+ }
1719
+
1720
+ /** APPEND STRING END **/
1721
+
1722
+ void
1723
+ Init_native_bin_utils()
1724
+ {
1725
+ VALUE mod_bin_utils = rb_define_module("BinUtils");
1726
+ VALUE mod_native = rb_define_module_under(mod_bin_utils, "Native");
1727
+ CONST_ID(rshft, ">>");
1728
+ CONST_ID(band, "&");
1729
+
1730
+ rb_define_method(mod_native, "get_ber", rb_get_ber, -1);
1731
+ rb_define_method(mod_native, "get_int8", rb_get_int8, -1);
1732
+ rb_define_method(mod_native, "get_sint8", rb_get_sint8, -1);
1733
+ rb_define_method(mod_native, "get_int16_le", rb_get_int16_le, -1);
1734
+ rb_define_method(mod_native, "get_sint16_le", rb_get_sint16_le, -1);
1735
+ rb_define_method(mod_native, "get_int16_be", rb_get_int16_be, -1);
1736
+ rb_define_method(mod_native, "get_sint16_be", rb_get_sint16_be, -1);
1737
+ rb_define_method(mod_native, "get_int24_le", rb_get_int24_le, -1);
1738
+ rb_define_method(mod_native, "get_sint24_le", rb_get_sint24_le, -1);
1739
+ rb_define_method(mod_native, "get_int24_be", rb_get_int24_be, -1);
1740
+ rb_define_method(mod_native, "get_sint24_be", rb_get_sint24_be, -1);
1741
+ rb_define_method(mod_native, "get_int32_le", rb_get_int32_le, -1);
1742
+ rb_define_method(mod_native, "get_sint32_le", rb_get_sint32_le, -1);
1743
+ rb_define_method(mod_native, "get_int32_be", rb_get_int32_be, -1);
1744
+ rb_define_method(mod_native, "get_sint32_be", rb_get_sint32_be, -1);
1745
+ rb_define_method(mod_native, "get_int40_le", rb_get_int40_le, -1);
1746
+ rb_define_method(mod_native, "get_sint40_le", rb_get_sint40_le, -1);
1747
+ rb_define_method(mod_native, "get_int40_be", rb_get_int40_be, -1);
1748
+ rb_define_method(mod_native, "get_sint40_be", rb_get_sint40_be, -1);
1749
+ rb_define_method(mod_native, "get_int48_le", rb_get_int48_le, -1);
1750
+ rb_define_method(mod_native, "get_sint48_le", rb_get_sint48_le, -1);
1751
+ rb_define_method(mod_native, "get_int48_be", rb_get_int48_be, -1);
1752
+ rb_define_method(mod_native, "get_sint48_be", rb_get_sint48_be, -1);
1753
+ rb_define_method(mod_native, "get_int56_le", rb_get_int56_le, -1);
1754
+ rb_define_method(mod_native, "get_sint56_le", rb_get_sint56_le, -1);
1755
+ rb_define_method(mod_native, "get_int56_be", rb_get_int56_be, -1);
1756
+ rb_define_method(mod_native, "get_sint56_be", rb_get_sint56_be, -1);
1757
+ rb_define_method(mod_native, "get_int64_le", rb_get_int64_le, -1);
1758
+ rb_define_method(mod_native, "get_sint64_le", rb_get_sint64_le, -1);
1759
+ rb_define_method(mod_native, "get_int64_be", rb_get_int64_be, -1);
1760
+ rb_define_method(mod_native, "get_sint64_be", rb_get_sint64_be, -1);
1761
+
1762
+ rb_define_method(mod_native, "slice_ber!", rb_slice_ber, 1);
1763
+ rb_define_method(mod_native, "slice_int8!", rb_slice_int8, 1);
1764
+ rb_define_method(mod_native, "slice_sint8!", rb_slice_sint8, 1);
1765
+ rb_define_method(mod_native, "slice_int16_le!", rb_slice_int16_le, 1);
1766
+ rb_define_method(mod_native, "slice_sint16_le!", rb_slice_sint16_le, 1);
1767
+ rb_define_method(mod_native, "slice_int16_be!", rb_slice_int16_be, 1);
1768
+ rb_define_method(mod_native, "slice_sint16_be!", rb_slice_sint16_be, 1);
1769
+ rb_define_method(mod_native, "slice_int24_le!", rb_slice_int24_le, 1);
1770
+ rb_define_method(mod_native, "slice_sint24_le!", rb_slice_sint24_le, 1);
1771
+ rb_define_method(mod_native, "slice_int24_be!", rb_slice_int24_be, 1);
1772
+ rb_define_method(mod_native, "slice_sint24_be!", rb_slice_sint24_be, 1);
1773
+ rb_define_method(mod_native, "slice_int32_le!", rb_slice_int32_le, 1);
1774
+ rb_define_method(mod_native, "slice_sint32_le!", rb_slice_sint32_le, 1);
1775
+ rb_define_method(mod_native, "slice_int32_be!", rb_slice_int32_be, 1);
1776
+ rb_define_method(mod_native, "slice_sint32_be!", rb_slice_sint32_be, 1);
1777
+ rb_define_method(mod_native, "slice_int40_le!", rb_slice_int40_le, 1);
1778
+ rb_define_method(mod_native, "slice_sint40_le!", rb_slice_sint40_le, 1);
1779
+ rb_define_method(mod_native, "slice_int40_be!", rb_slice_int40_be, 1);
1780
+ rb_define_method(mod_native, "slice_sint40_be!", rb_slice_sint40_be, 1);
1781
+ rb_define_method(mod_native, "slice_int48_le!", rb_slice_int48_le, 1);
1782
+ rb_define_method(mod_native, "slice_sint48_le!", rb_slice_sint48_le, 1);
1783
+ rb_define_method(mod_native, "slice_int48_be!", rb_slice_int48_be, 1);
1784
+ rb_define_method(mod_native, "slice_sint48_be!", rb_slice_sint48_be, 1);
1785
+ rb_define_method(mod_native, "slice_int56_le!", rb_slice_int56_le, 1);
1786
+ rb_define_method(mod_native, "slice_sint56_le!", rb_slice_sint56_le, 1);
1787
+ rb_define_method(mod_native, "slice_int56_be!", rb_slice_int56_be, 1);
1788
+ rb_define_method(mod_native, "slice_sint56_be!", rb_slice_sint56_be, 1);
1789
+ rb_define_method(mod_native, "slice_int64_le!", rb_slice_int64_le, 1);
1790
+ rb_define_method(mod_native, "slice_sint64_le!", rb_slice_sint64_le, 1);
1791
+ rb_define_method(mod_native, "slice_int64_be!", rb_slice_int64_be, 1);
1792
+ rb_define_method(mod_native, "slice_sint64_be!", rb_slice_sint64_be, 1);
1793
+
1794
+ rb_define_method(mod_native, "append_ber!", rb_append_ber, 2);
1795
+ rb_define_method(mod_native, "append_int8!", rb_append_int8, 2);
1796
+ rb_define_method(mod_native, "append_sint8!", rb_append_int8, 2);
1797
+ rb_define_method(mod_native, "append_int16_le!", rb_append_int16_le, 2);
1798
+ rb_define_method(mod_native, "append_sint16_le!", rb_append_int16_le, 2);
1799
+ rb_define_method(mod_native, "append_int16_be!", rb_append_int16_be, 2);
1800
+ rb_define_method(mod_native, "append_sint16_be!", rb_append_int16_be, 2);
1801
+ rb_define_method(mod_native, "append_int24_le!", rb_append_int24_le, 2);
1802
+ rb_define_method(mod_native, "append_sint24_le!", rb_append_int24_le, 2);
1803
+ rb_define_method(mod_native, "append_int24_be!", rb_append_int24_be, 2);
1804
+ rb_define_method(mod_native, "append_sint24_be!", rb_append_int24_be, 2);
1805
+ rb_define_method(mod_native, "append_int32_le!", rb_append_int32_le, 2);
1806
+ rb_define_method(mod_native, "append_sint32_le!", rb_append_int32_le, 2);
1807
+ rb_define_method(mod_native, "append_int32_be!", rb_append_int32_be, 2);
1808
+ rb_define_method(mod_native, "append_sint32_be!", rb_append_int32_be, 2);
1809
+ rb_define_method(mod_native, "append_int40_le!", rb_append_int40_le, 2);
1810
+ rb_define_method(mod_native, "append_sint40_le!", rb_append_int40_le, 2);
1811
+ rb_define_method(mod_native, "append_int40_be!", rb_append_int40_be, 2);
1812
+ rb_define_method(mod_native, "append_sint40_be!", rb_append_int40_be, 2);
1813
+ rb_define_method(mod_native, "append_int48_le!", rb_append_int48_le, 2);
1814
+ rb_define_method(mod_native, "append_sint48_le!", rb_append_int48_le, 2);
1815
+ rb_define_method(mod_native, "append_int48_be!", rb_append_int48_be, 2);
1816
+ rb_define_method(mod_native, "append_sint48_be!", rb_append_int48_be, 2);
1817
+ rb_define_method(mod_native, "append_int56_le!", rb_append_int56_le, 2);
1818
+ rb_define_method(mod_native, "append_sint56_le!", rb_append_int56_le, 2);
1819
+ rb_define_method(mod_native, "append_int56_be!", rb_append_int56_be, 2);
1820
+ rb_define_method(mod_native, "append_sint56_be!", rb_append_int56_be, 2);
1821
+ rb_define_method(mod_native, "append_int64_le!", rb_append_int64_le, 2);
1822
+ rb_define_method(mod_native, "append_sint64_le!", rb_append_int64_le, 2);
1823
+ rb_define_method(mod_native, "append_int64_be!", rb_append_int64_be, 2);
1824
+ rb_define_method(mod_native, "append_sint64_be!", rb_append_int64_be, 2);
1825
+
1826
+ rb_define_method(mod_native, "append_bersize_ber!", rb_append_bersize_ber, 2);
1827
+ rb_define_method(mod_native, "append_bersize_int8!", rb_append_bersize_int8, 2);
1828
+ rb_define_method(mod_native, "append_bersize_sint8!", rb_append_bersize_int8, 2);
1829
+ rb_define_method(mod_native, "append_bersize_int16_le!", rb_append_bersize_int16_le, 2);
1830
+ rb_define_method(mod_native, "append_bersize_sint16_le!", rb_append_bersize_int16_le, 2);
1831
+ rb_define_method(mod_native, "append_bersize_int16_be!", rb_append_bersize_int16_be, 2);
1832
+ rb_define_method(mod_native, "append_bersize_sint16_be!", rb_append_bersize_int16_be, 2);
1833
+ rb_define_method(mod_native, "append_bersize_int24_le!", rb_append_bersize_int24_le, 2);
1834
+ rb_define_method(mod_native, "append_bersize_sint24_le!", rb_append_bersize_int24_le, 2);
1835
+ rb_define_method(mod_native, "append_bersize_int24_be!", rb_append_bersize_int24_be, 2);
1836
+ rb_define_method(mod_native, "append_bersize_sint24_be!", rb_append_bersize_int24_be, 2);
1837
+ rb_define_method(mod_native, "append_bersize_int32_le!", rb_append_bersize_int32_le, 2);
1838
+ rb_define_method(mod_native, "append_bersize_sint32_le!", rb_append_bersize_int32_le, 2);
1839
+ rb_define_method(mod_native, "append_bersize_int32_be!", rb_append_bersize_int32_be, 2);
1840
+ rb_define_method(mod_native, "append_bersize_sint32_be!", rb_append_bersize_int32_be, 2);
1841
+ rb_define_method(mod_native, "append_bersize_int40_le!", rb_append_bersize_int40_le, 2);
1842
+ rb_define_method(mod_native, "append_bersize_sint40_le!", rb_append_bersize_int40_le, 2);
1843
+ rb_define_method(mod_native, "append_bersize_int40_be!", rb_append_bersize_int40_be, 2);
1844
+ rb_define_method(mod_native, "append_bersize_sint40_be!", rb_append_bersize_int40_be, 2);
1845
+ rb_define_method(mod_native, "append_bersize_int48_le!", rb_append_bersize_int48_le, 2);
1846
+ rb_define_method(mod_native, "append_bersize_sint48_le!", rb_append_bersize_int48_le, 2);
1847
+ rb_define_method(mod_native, "append_bersize_int48_be!", rb_append_bersize_int48_be, 2);
1848
+ rb_define_method(mod_native, "append_bersize_sint48_be!", rb_append_bersize_int48_be, 2);
1849
+ rb_define_method(mod_native, "append_bersize_int56_le!", rb_append_bersize_int56_le, 2);
1850
+ rb_define_method(mod_native, "append_bersize_sint56_le!", rb_append_bersize_int56_le, 2);
1851
+ rb_define_method(mod_native, "append_bersize_int56_be!", rb_append_bersize_int56_be, 2);
1852
+ rb_define_method(mod_native, "append_bersize_sint56_be!", rb_append_bersize_int56_be, 2);
1853
+ rb_define_method(mod_native, "append_bersize_int64_le!", rb_append_bersize_int64_le, 2);
1854
+ rb_define_method(mod_native, "append_bersize_sint64_le!", rb_append_bersize_int64_le, 2);
1855
+ rb_define_method(mod_native, "append_bersize_int64_be!", rb_append_bersize_int64_be, 2);
1856
+ rb_define_method(mod_native, "append_bersize_sint64_be!", rb_append_bersize_int64_be, 2);
1857
+
1858
+ rb_define_method(mod_native, "append_int32lesize_ber!", rb_append_int32lesize_ber, 2);
1859
+ rb_define_method(mod_native, "append_int32lesize_int8!", rb_append_int32lesize_int8, 2);
1860
+ rb_define_method(mod_native, "append_int32lesize_sint8!", rb_append_int32lesize_int8, 2);
1861
+ rb_define_method(mod_native, "append_int32lesize_int16_le!", rb_append_int32lesize_int16_le, 2);
1862
+ rb_define_method(mod_native, "append_int32lesize_sint16_le!", rb_append_int32lesize_int16_le, 2);
1863
+ rb_define_method(mod_native, "append_int32lesize_int16_be!", rb_append_int32lesize_int16_be, 2);
1864
+ rb_define_method(mod_native, "append_int32lesize_sint16_be!", rb_append_int32lesize_int16_be, 2);
1865
+ rb_define_method(mod_native, "append_int32lesize_int24_le!", rb_append_int32lesize_int24_le, 2);
1866
+ rb_define_method(mod_native, "append_int32lesize_sint24_le!", rb_append_int32lesize_int24_le, 2);
1867
+ rb_define_method(mod_native, "append_int32lesize_int24_be!", rb_append_int32lesize_int24_be, 2);
1868
+ rb_define_method(mod_native, "append_int32lesize_sint24_be!", rb_append_int32lesize_int24_be, 2);
1869
+ rb_define_method(mod_native, "append_int32lesize_int32_le!", rb_append_int32lesize_int32_le, 2);
1870
+ rb_define_method(mod_native, "append_int32lesize_sint32_le!", rb_append_int32lesize_int32_le, 2);
1871
+ rb_define_method(mod_native, "append_int32lesize_int32_be!", rb_append_int32lesize_int32_be, 2);
1872
+ rb_define_method(mod_native, "append_int32lesize_sint32_be!", rb_append_int32lesize_int32_be, 2);
1873
+ rb_define_method(mod_native, "append_int32lesize_int40_le!", rb_append_int32lesize_int40_le, 2);
1874
+ rb_define_method(mod_native, "append_int32lesize_sint40_le!", rb_append_int32lesize_int40_le, 2);
1875
+ rb_define_method(mod_native, "append_int32lesize_int40_be!", rb_append_int32lesize_int40_be, 2);
1876
+ rb_define_method(mod_native, "append_int32lesize_sint40_be!", rb_append_int32lesize_int40_be, 2);
1877
+ rb_define_method(mod_native, "append_int32lesize_int48_le!", rb_append_int32lesize_int48_le, 2);
1878
+ rb_define_method(mod_native, "append_int32lesize_sint48_le!", rb_append_int32lesize_int48_le, 2);
1879
+ rb_define_method(mod_native, "append_int32lesize_int48_be!", rb_append_int32lesize_int48_be, 2);
1880
+ rb_define_method(mod_native, "append_int32lesize_sint48_be!", rb_append_int32lesize_int48_be, 2);
1881
+ rb_define_method(mod_native, "append_int32lesize_int56_le!", rb_append_int32lesize_int56_le, 2);
1882
+ rb_define_method(mod_native, "append_int32lesize_sint56_le!", rb_append_int32lesize_int56_le, 2);
1883
+ rb_define_method(mod_native, "append_int32lesize_int56_be!", rb_append_int32lesize_int56_be, 2);
1884
+ rb_define_method(mod_native, "append_int32lesize_sint56_be!", rb_append_int32lesize_int56_be, 2);
1885
+ rb_define_method(mod_native, "append_int32lesize_int64_le!", rb_append_int32lesize_int64_le, 2);
1886
+ rb_define_method(mod_native, "append_int32lesize_sint64_le!", rb_append_int32lesize_int64_le, 2);
1887
+ rb_define_method(mod_native, "append_int32lesize_int64_be!", rb_append_int32lesize_int64_be, 2);
1888
+ rb_define_method(mod_native, "append_int32lesize_sint64_be!", rb_append_int32lesize_int64_be, 2);
1889
+
1890
+ rb_define_method(mod_native, "append_int32besize_ber!", rb_append_int32besize_ber, 2);
1891
+ rb_define_method(mod_native, "append_int32besize_int8!", rb_append_int32besize_int8, 2);
1892
+ rb_define_method(mod_native, "append_int32besize_sint8!", rb_append_int32besize_int8, 2);
1893
+ rb_define_method(mod_native, "append_int32besize_int16_le!", rb_append_int32besize_int16_le, 2);
1894
+ rb_define_method(mod_native, "append_int32besize_sint16_le!", rb_append_int32besize_int16_le, 2);
1895
+ rb_define_method(mod_native, "append_int32besize_int16_be!", rb_append_int32besize_int16_be, 2);
1896
+ rb_define_method(mod_native, "append_int32besize_sint16_be!", rb_append_int32besize_int16_be, 2);
1897
+ rb_define_method(mod_native, "append_int32besize_int24_le!", rb_append_int32besize_int24_le, 2);
1898
+ rb_define_method(mod_native, "append_int32besize_sint24_le!", rb_append_int32besize_int24_le, 2);
1899
+ rb_define_method(mod_native, "append_int32besize_int24_be!", rb_append_int32besize_int24_be, 2);
1900
+ rb_define_method(mod_native, "append_int32besize_sint24_be!", rb_append_int32besize_int24_be, 2);
1901
+ rb_define_method(mod_native, "append_int32besize_int32_le!", rb_append_int32besize_int32_le, 2);
1902
+ rb_define_method(mod_native, "append_int32besize_sint32_le!", rb_append_int32besize_int32_le, 2);
1903
+ rb_define_method(mod_native, "append_int32besize_int32_be!", rb_append_int32besize_int32_be, 2);
1904
+ rb_define_method(mod_native, "append_int32besize_sint32_be!", rb_append_int32besize_int32_be, 2);
1905
+ rb_define_method(mod_native, "append_int32besize_int40_le!", rb_append_int32besize_int40_le, 2);
1906
+ rb_define_method(mod_native, "append_int32besize_sint40_le!", rb_append_int32besize_int40_le, 2);
1907
+ rb_define_method(mod_native, "append_int32besize_int40_be!", rb_append_int32besize_int40_be, 2);
1908
+ rb_define_method(mod_native, "append_int32besize_sint40_be!", rb_append_int32besize_int40_be, 2);
1909
+ rb_define_method(mod_native, "append_int32besize_int48_le!", rb_append_int32besize_int48_le, 2);
1910
+ rb_define_method(mod_native, "append_int32besize_sint48_le!", rb_append_int32besize_int48_le, 2);
1911
+ rb_define_method(mod_native, "append_int32besize_int48_be!", rb_append_int32besize_int48_be, 2);
1912
+ rb_define_method(mod_native, "append_int32besize_sint48_be!", rb_append_int32besize_int48_be, 2);
1913
+ rb_define_method(mod_native, "append_int32besize_int56_le!", rb_append_int32besize_int56_le, 2);
1914
+ rb_define_method(mod_native, "append_int32besize_sint56_le!", rb_append_int32besize_int56_le, 2);
1915
+ rb_define_method(mod_native, "append_int32besize_int56_be!", rb_append_int32besize_int56_be, 2);
1916
+ rb_define_method(mod_native, "append_int32besize_sint56_be!", rb_append_int32besize_int56_be, 2);
1917
+ rb_define_method(mod_native, "append_int32besize_int64_le!", rb_append_int32besize_int64_le, 2);
1918
+ rb_define_method(mod_native, "append_int32besize_sint64_le!", rb_append_int32besize_int64_le, 2);
1919
+ rb_define_method(mod_native, "append_int32besize_int64_be!", rb_append_int32besize_int64_be, 2);
1920
+ rb_define_method(mod_native, "append_int32besize_sint64_be!", rb_append_int32besize_int64_be, 2);
1921
+
1922
+ rb_define_method(mod_native, "append_string!", rb_append_string, 2);
1923
+ rb_define_method(mod_native, "append_bersize_string!", rb_append_bersize_string, 2);
1924
+ rb_define_method(mod_native, "append_int32lesize_string!", rb_append_int32lesize_string, 2);
1925
+ rb_define_method(mod_native, "append_int32besize_string!", rb_append_int32besize_string, 2);
1926
+
1927
+ rb_extend_object(mod_native, mod_native);
1928
+ }