bin_utils 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MmIxYzY2OWZjNTMyM2YyNzI0NDBiOGEwNTc4ZDRiYmNjNTdhOWY1ZQ==
5
+ data.tar.gz: !binary |-
6
+ ZDM4MzEwZGQ2OGVmOTJhMjlkY2RiMzgyMTljZDdlYmVhOTVjYmUxMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZDE3ZTlmYjc3MDRjNzA2NTFlMzMzY2VlYzAxZjhkZWU0YzczNGU3M2NiNzgz
10
+ NDhkNjM3ZjM2NmI3ZGU1ZDA0MjNmYTFkMTRmODA4Y2JjOWFkYmJjMmUwZGQ0
11
+ M2ZmZmE3N2ViOTcxMWY4MDE4NjA0OWE4MWE4MzkxZTcyNWYzNzI=
12
+ data.tar.gz: !binary |-
13
+ M2QzMGE4YTdlMjBjMDg2MjUxNDM5ZjczZGMzZDA5YjViODUzYmY3MzkxN2Qy
14
+ OWMzZTBkOWRmNzlkYTY1YjVjMzI2MGMyOWI0MDBiODhjNjVmMTJlYzBhZDA1
15
+ YTY0ODlhYjdhOGFhZmNlNmI3MTFkNjYzN2EwZTk1YjM3OTgyNzI=
@@ -1,9 +1,12 @@
1
- if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
1
+ begin
2
+ unless RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
3
+ raise "Uh"
4
+ end
2
5
  require 'mkmf'
3
6
  # rubinius has no rb_str_drop_bytes
4
7
  have_func('rb_str_drop_bytes')
5
8
  create_makefile("bin_utils")
6
- else
9
+ rescue
7
10
  File.open(File.dirname(__FILE__) + "/Makefile", 'w') do |f|
8
11
  f.write("install:\n\t#nothing to build")
9
12
  end
@@ -61,16 +61,31 @@ ID rshft;
61
61
  ID band;
62
62
  #ifndef HAVE_RB_STR_DROP_BYTES
63
63
  /* rubinius has no rb_str_drop_bytes */
64
- ID aset;
64
+ ID aslice;
65
65
  static VALUE
66
66
  rb_str_drop_bytes(VALUE str, long bytes)
67
67
  {
68
- VALUE args[3] = {INT2FIX(0), INT2FIX(bytes), rb_str_new(0, 0)};
69
- rb_funcall2(str, aset, 3, args);
68
+ VALUE args[2] = {0, INT2FIX(bytes)};
69
+ rb_funcall2(str, aslice, 2, args);
70
70
  return str;
71
71
  }
72
72
  #endif
73
73
 
74
+ static int64_t
75
+ safe_int64_t(VALUE i)
76
+ {
77
+ if (FIXNUM_P(i)) {
78
+ return NUM2I64(i);
79
+ }
80
+ else {
81
+ VALUE argm = UINT2NUM(0xffffffff);
82
+ VALUE arg32 = INT2FIX(32);
83
+ uint64_t i0 = NUM2I64(rb_funcall2(i, band, 1, &argm));
84
+ i = rb_funcall2(i, rshft, 1, &arg32);
85
+ return i0 + (NUM2I64(rb_funcall2(i, band, 1, &argm)) << 32);
86
+ }
87
+ }
88
+
74
89
  static long
75
90
  check_size(long i, long strlen, long ilen)
76
91
  {
@@ -81,788 +96,768 @@ check_size(long i, long strlen, long ilen)
81
96
  return i;
82
97
  }
83
98
 
84
- static int32_t
85
- get_int8(VALUE rstr, VALUE ri)
99
+ static VALUE
100
+ check_argc(int argc, VALUE *argv)
86
101
  {
87
- long i = NUM2LONG(ri);
88
- StringValue(rstr);
89
- i = check_size(i, RSTRING_LEN(rstr), 1);
90
- return (uint8_t)(RSTRING_PTR(rstr)[i]);
102
+ if (argc == 0 || argc > 2) {
103
+ rb_raise(rb_eArgError, "accepts 1 or 2 arguments: (string[, offset=0])");
104
+ }
105
+ return argc == 2 ? argv[1] : INT2FIX(0);
91
106
  }
92
107
 
93
- static int32_t
94
- get_sint8(VALUE rstr, VALUE ri)
95
- {
96
- long i = NUM2LONG(ri);
97
- StringValue(rstr);
98
- i = check_size(i, RSTRING_LEN(rstr), 1);
99
- return (int8_t)(RSTRING_PTR(rstr)[i]);
100
- }
108
+ typedef struct append_args {
109
+ VALUE str;
110
+ int argc;
111
+ VALUE *argv;
112
+ } append_args;
101
113
 
102
- static int32_t
103
- get_int16_le(VALUE rstr, VALUE ri)
114
+ typedef struct append_args2 {
115
+ VALUE str;
116
+ int argc;
117
+ VALUE *argv;
118
+ VALUE int0;
119
+ } append_args2;
120
+
121
+ static void
122
+ check_argc_append(int argc, VALUE *argv, append_args *args, int bits)
104
123
  {
105
- long i = NUM2LONG(ri);
106
- const uint8_t *ptr;
107
- uint32_t byte0, byte1;
108
- StringValue(rstr);
109
- i = check_size(i, RSTRING_LEN(rstr), 2);
110
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
111
- byte0 = ptr[i];
112
- byte1 = ptr[i+1];
113
- return byte0 + (byte1 << 8);
124
+ if (argc < 1) {
125
+ rb_raise(rb_eArgError, "accepts at least 1 argument: (string[, *int%ds])", bits);
126
+ }
127
+ args->str = RTEST(argv[0]) ? argv[0] : rb_str_new(0, 0);
128
+ if (argc == 2 && TYPE(argv[1]) == T_ARRAY) {
129
+ args->argc = RARRAY_LEN(argv[1]);
130
+ args->argv = RARRAY_PTR(argv[1]);
131
+ }
132
+ else {
133
+ args->argc = argc-1;
134
+ args->argv = argv+1;
135
+ }
114
136
  }
115
137
 
116
- static int32_t
117
- get_sint16_le(VALUE rstr, VALUE ri)
138
+ static void
139
+ check_argc_append_2(int argc, VALUE *argv, append_args2 *args, int bits, int bits1)
118
140
  {
119
- int32_t res = get_int16_le(rstr, ri);
120
- return res - ((res >> 15)<<16);
141
+ if (argc < 2) {
142
+ rb_raise(rb_eArgError, "accepts at least 2 arguments: (string, int%d[, *int%ds])", bits, bits1);
143
+ }
144
+ args->str = RTEST(argv[0]) ? argv[0] : rb_str_new(0, 0);
145
+ args->int0 = argv[1];
146
+ if (argc == 3 && TYPE(argv[2]) == T_ARRAY) {
147
+ args->argc = RARRAY_LEN(argv[2]);
148
+ args->argv = RARRAY_PTR(argv[2]);
149
+ }
150
+ else {
151
+ args->argc = argc-2;
152
+ args->argv = argv+2;
153
+ }
121
154
  }
122
155
 
123
- static int32_t
124
- get_int16_be(VALUE rstr, VALUE ri)
156
+
157
+ static uint32_t
158
+ get_int8(VALUE rstr, VALUE ri)
125
159
  {
126
160
  long i = NUM2LONG(ri);
127
161
  const uint8_t *ptr;
128
- uint32_t byte0, byte1;
129
162
  StringValue(rstr);
130
- i = check_size(i, RSTRING_LEN(rstr), 2);
163
+ i = check_size(i, RSTRING_LEN(rstr), 1);
131
164
  ptr = (const uint8_t*)RSTRING_PTR(rstr);
132
- byte0 = ptr[i+1];
133
- byte1 = ptr[i];
134
- return byte0 + (byte1 << 8);
165
+ return
166
+ (((uint32_t)ptr[i + 0]) << 0 ) |
167
+ (uint32_t)0;
135
168
  }
136
169
 
137
170
  static int32_t
138
- get_sint16_be(VALUE rstr, VALUE ri)
171
+ get_sint8(VALUE rstr, VALUE ri)
139
172
  {
140
- int32_t res = get_int16_be(rstr, ri);
141
- return res - ((res >> 15) << 16);
173
+ int32_t res = (int32_t)get_int8(rstr, ri);
174
+ return res - ((res >> 7) << 8);
142
175
  }
143
176
 
144
- static int32_t
145
- get_int24_le(VALUE rstr, VALUE ri)
177
+ static VALUE
178
+ rb_get_int8(int argc, VALUE *argv, VALUE self)
146
179
  {
147
- long i = NUM2LONG(ri);
148
- const uint8_t *ptr;
149
- uint32_t byte0, byte1, byte2;
150
- StringValue(rstr);
151
- i = check_size(i, RSTRING_LEN(rstr), 3);
152
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
153
- byte0 = ptr[i];
154
- byte1 = ptr[i+1];
155
- byte2 = ptr[i+2];
156
- return byte0 + (byte1 << 8) + (byte2 << 16);
180
+ return INT2FIX(get_int8(argv[0], check_argc(argc, argv)));
157
181
  }
158
182
 
159
- static int32_t
160
- get_sint24_le(VALUE rstr, VALUE ri)
183
+ static VALUE
184
+ rb_get_sint8(int argc, VALUE *argv, VALUE self)
161
185
  {
162
- int32_t res = get_int24_le(rstr, ri);
163
- return res - ((res >> 23) << 24);
186
+ return INT2FIX(get_sint8(argv[0], check_argc(argc, argv)));
164
187
  }
165
188
 
166
- static int32_t
167
- get_int24_be(VALUE rstr, VALUE ri)
189
+ static VALUE
190
+ rb_slice_int8(VALUE self, VALUE rstr)
168
191
  {
169
- long i = NUM2LONG(ri);
170
- const uint8_t *ptr;
171
- uint32_t byte0, byte1, byte2;
172
- StringValue(rstr);
173
- i = check_size(i, RSTRING_LEN(rstr), 3);
174
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
175
- byte0 = ptr[i+2];
176
- byte1 = ptr[i+1];
177
- byte2 = ptr[i];
178
- return byte0 + (byte1 << 8) + (byte2 << 16);
192
+ uint32_t res = get_int8(rstr, INT2FIX(0));
193
+ rb_str_drop_bytes(rstr, 1);
194
+ return INT2FIX(res);
179
195
  }
180
196
 
181
- static int32_t
182
- get_sint24_be(VALUE rstr, VALUE ri)
197
+ static VALUE
198
+ rb_slice_sint8(VALUE self, VALUE rstr)
183
199
  {
184
- int32_t res = get_int24_be(rstr, ri);
185
- return res - ((res >> 23) << 24);
200
+ int32_t res = get_sint8(rstr, INT2FIX(0));
201
+ rb_str_drop_bytes(rstr, 1);
202
+ return INT2FIX(res);
186
203
  }
187
204
 
188
- static uint32_t
189
- get_int32_le(VALUE rstr, VALUE ri)
205
+ static void
206
+ append_int8(VALUE rstr, int32_t v)
190
207
  {
191
- long i = NUM2LONG(ri);
192
- const uint8_t *ptr;
193
- uint32_t byte0, byte1, byte2, byte3;
194
- StringValue(rstr);
195
- i = check_size(i, RSTRING_LEN(rstr), 4);
196
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
197
-
198
- byte0 = ptr[i];
199
- byte1 = ptr[i+1];
200
- byte2 = ptr[i+2];
201
- byte3 = ptr[i+3];
202
- return byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
208
+ char a[] = {
209
+ (v >> 0) & 0xff,
210
+ 0
211
+ };
212
+ rb_str_cat(rstr, a, 1);
203
213
  }
204
214
 
205
- static int32_t
206
- get_sint32_le(VALUE rstr, VALUE ri)
215
+ static VALUE
216
+ append_var_int8(int argc, VALUE* argv, VALUE str)
217
+ {
218
+ int i;
219
+ for(i = 0; i < argc; i++) {
220
+
221
+ append_int8(str, NUM2INT(argv[i]));
222
+
223
+ }
224
+ return str;
225
+ }
226
+
227
+ static VALUE
228
+ rb_append_int8(int argc, VALUE* argv, VALUE self)
207
229
  {
208
- return (int32_t)get_int32_le(rstr, ri);
230
+ append_args args;
231
+ check_argc_append(argc, argv, &args, 8);
232
+ return append_var_int8(args.argc, args.argv, args.str);
209
233
  }
210
234
 
235
+ #define append_var_int8_le append_var_int8
236
+ #define append_var_int8_be append_var_int8
211
237
  static uint32_t
212
- get_int32_be(VALUE rstr, VALUE ri)
238
+ get_int16_le(VALUE rstr, VALUE ri)
213
239
  {
214
240
  long i = NUM2LONG(ri);
215
241
  const uint8_t *ptr;
216
- uint32_t byte0, byte1, byte2, byte3;
217
242
  StringValue(rstr);
218
- i = check_size(i, RSTRING_LEN(rstr), 4);
243
+ i = check_size(i, RSTRING_LEN(rstr), 2);
219
244
  ptr = (const uint8_t*)RSTRING_PTR(rstr);
220
- byte0 = ptr[i+3];
221
- byte1 = ptr[i+2];
222
- byte2 = ptr[i+1];
223
- byte3 = ptr[i+0];
224
- return byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
245
+ return
246
+ (((uint32_t)ptr[i + 0]) << 0 ) |
247
+ (((uint32_t)ptr[i + 1]) << 8 ) |
248
+ (uint32_t)0;
225
249
  }
226
250
 
227
251
  static int32_t
228
- get_sint32_be(VALUE rstr, VALUE ri)
252
+ get_sint16_le(VALUE rstr, VALUE ri)
229
253
  {
230
- return (int32_t)get_int32_be(rstr, ri);
254
+ int32_t res = (int32_t)get_int16_le(rstr, ri);
255
+ return res - ((res >> 15) << 16);
231
256
  }
232
257
 
233
- static int64_t
234
- get_int40_le(VALUE rstr, VALUE ri)
258
+ static VALUE
259
+ rb_get_int16_le(int argc, VALUE *argv, VALUE self)
235
260
  {
236
- long i = NUM2LONG(ri);
237
- const uint8_t *ptr;
238
- uint32_t byte0, byte1, byte2, byte3;
239
- int64_t res;
240
- StringValue(rstr);
241
- i = check_size(i, RSTRING_LEN(rstr), 5);
242
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
243
-
244
- byte0 = ptr[i];
245
- byte1 = ptr[i+1];
246
- byte2 = ptr[i+2];
247
- byte3 = ptr[i+3];
248
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
249
- byte0 = ptr[i+4];
250
- return res + ((int64_t)byte0 << 32);
261
+ return INT2FIX(get_int16_le(argv[0], check_argc(argc, argv)));
251
262
  }
252
263
 
253
- static int64_t
254
- get_sint40_le(VALUE rstr, VALUE ri)
264
+ static VALUE
265
+ rb_get_sint16_le(int argc, VALUE *argv, VALUE self)
255
266
  {
256
- int64_t res = get_int40_le(rstr, ri);
257
- return res - ((res >> 39) << 40);
267
+ return INT2FIX(get_sint16_le(argv[0], check_argc(argc, argv)));
258
268
  }
259
269
 
260
- static int64_t
261
- get_int40_be(VALUE rstr, VALUE ri)
270
+ static VALUE
271
+ rb_slice_int16_le(VALUE self, VALUE rstr)
262
272
  {
263
- long i = NUM2LONG(ri);
264
- const uint8_t *ptr;
265
- uint32_t byte0, byte1, byte2, byte3;
266
- int64_t res;
267
- StringValue(rstr);
268
- i = check_size(i, RSTRING_LEN(rstr), 5);
269
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
270
-
271
- byte0 = ptr[i+4];
272
- byte1 = ptr[i+3];
273
- byte2 = ptr[i+2];
274
- byte3 = ptr[i+1];
275
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
276
- byte0 = ptr[i];
277
- return res + ((int64_t)byte0 << 32);
273
+ uint32_t res = get_int16_le(rstr, INT2FIX(0));
274
+ rb_str_drop_bytes(rstr, 2);
275
+ return INT2FIX(res);
278
276
  }
279
277
 
280
- static int64_t
281
- get_sint40_be(VALUE rstr, VALUE ri)
278
+ static VALUE
279
+ rb_slice_sint16_le(VALUE self, VALUE rstr)
282
280
  {
283
- int64_t res = get_int40_be(rstr, ri);
284
- return res - ((res >> 39) << 40);
281
+ int32_t res = get_sint16_le(rstr, INT2FIX(0));
282
+ rb_str_drop_bytes(rstr, 2);
283
+ return INT2FIX(res);
285
284
  }
286
285
 
287
- static int64_t
288
- get_int48_le(VALUE rstr, VALUE ri)
286
+ static void
287
+ append_int16_le(VALUE rstr, int32_t v)
289
288
  {
290
- long i = NUM2LONG(ri);
291
- const uint8_t *ptr;
292
- uint32_t byte0, byte1, byte2, byte3;
293
- int64_t res, res1;
294
- StringValue(rstr);
295
- i = check_size(i, RSTRING_LEN(rstr), 6);
296
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
297
-
298
- byte0 = ptr[i];
299
- byte1 = ptr[i+1];
300
- byte2 = ptr[i+2];
301
- byte3 = ptr[i+3];
302
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
303
- byte0 = ptr[i+4];
304
- byte1 = ptr[i+5];
305
- res1 = byte0 + (byte1 << 8);
306
- return res + (res1 << 32);
289
+ char a[] = {
290
+ (v >> 0) & 0xff,
291
+ (v >> 8) & 0xff,
292
+ 0
293
+ };
294
+ rb_str_cat(rstr, a, 2);
307
295
  }
308
296
 
309
- static int64_t
310
- get_sint48_le(VALUE rstr, VALUE ri)
297
+ static VALUE
298
+ append_var_int16_le(int argc, VALUE* argv, VALUE str)
311
299
  {
312
- int64_t res = get_int48_le(rstr, ri);
313
- return res - ((res >> 47) << 48);
314
- }
300
+ int i;
301
+ for(i = 0; i < argc; i++) {
315
302
 
316
- static int64_t
317
- get_int48_be(VALUE rstr, VALUE ri)
318
- {
319
- long i = NUM2LONG(ri);
320
- const uint8_t *ptr;
321
- uint32_t byte0, byte1, byte2, byte3;
322
- int64_t res, res1;
323
- StringValue(rstr);
324
- i = check_size(i, RSTRING_LEN(rstr), 6);
325
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
326
-
327
- byte0 = ptr[i+5];
328
- byte1 = ptr[i+4];
329
- byte2 = ptr[i+3];
330
- byte3 = ptr[i+2];
331
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
332
- byte0 = ptr[i+1];
333
- byte1 = ptr[i+0];
334
- res1 = byte0 + (byte1 << 8);
335
- return res + (res1 << 32);
303
+ append_int16_le(str, NUM2INT(argv[i]));
304
+
305
+ }
306
+ return str;
336
307
  }
337
308
 
338
- static int64_t
339
- get_sint48_be(VALUE rstr, VALUE ri)
309
+ static VALUE
310
+ rb_append_int16_le(int argc, VALUE* argv, VALUE self)
340
311
  {
341
- int64_t res = get_int48_be(rstr, ri);
342
- return res - ((res >> 47) << 48);
312
+ append_args args;
313
+ check_argc_append(argc, argv, &args, 16);
314
+ return append_var_int16_le(args.argc, args.argv, args.str);
343
315
  }
344
316
 
345
- static int64_t
346
- get_int56_le(VALUE rstr, VALUE ri)
317
+ static uint32_t
318
+ get_int24_le(VALUE rstr, VALUE ri)
347
319
  {
348
320
  long i = NUM2LONG(ri);
349
321
  const uint8_t *ptr;
350
- uint32_t byte0, byte1, byte2, byte3;
351
- int64_t res, res1;
352
322
  StringValue(rstr);
353
- i = check_size(i, RSTRING_LEN(rstr), 7);
323
+ i = check_size(i, RSTRING_LEN(rstr), 3);
354
324
  ptr = (const uint8_t*)RSTRING_PTR(rstr);
355
-
356
- byte0 = ptr[i];
357
- byte1 = ptr[i+1];
358
- byte2 = ptr[i+2];
359
- byte3 = ptr[i+3];
360
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
361
- byte0 = ptr[i+4];
362
- byte1 = ptr[i+5];
363
- byte2 = ptr[i+6];
364
- res1 = byte0 + (byte1 << 8) + (byte2 << 16);
365
- return res + (res1 << 32);
325
+ return
326
+ (((uint32_t)ptr[i + 0]) << 0 ) |
327
+ (((uint32_t)ptr[i + 1]) << 8 ) |
328
+ (((uint32_t)ptr[i + 2]) << 16 ) |
329
+ (uint32_t)0;
366
330
  }
367
331
 
368
- static int64_t
369
- get_sint56_le(VALUE rstr, VALUE ri)
332
+ static int32_t
333
+ get_sint24_le(VALUE rstr, VALUE ri)
370
334
  {
371
- int64_t res = get_int56_le(rstr, ri);
372
- return res - ((res >> 55) << 56);
335
+ int32_t res = (int32_t)get_int24_le(rstr, ri);
336
+ return res - ((res >> 23) << 24);
373
337
  }
374
338
 
375
- static int64_t
376
- get_int56_be(VALUE rstr, VALUE ri)
339
+ static VALUE
340
+ rb_get_int24_le(int argc, VALUE *argv, VALUE self)
377
341
  {
378
- long i = NUM2LONG(ri);
379
- const uint8_t *ptr;
380
- uint32_t byte0, byte1, byte2, byte3;
381
- int64_t res, res1;
382
- StringValue(rstr);
383
- i = check_size(i, RSTRING_LEN(rstr), 7);
384
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
385
-
386
- byte0 = ptr[i+6];
387
- byte1 = ptr[i+5];
388
- byte2 = ptr[i+4];
389
- byte3 = ptr[i+3];
390
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
391
- byte0 = ptr[i+2];
392
- byte1 = ptr[i+1];
393
- byte2 = ptr[i];
394
- res1 = byte0 + (byte1 << 8) + (byte2 << 16);
395
- return res + (res1 << 32);
342
+ return INT2FIX(get_int24_le(argv[0], check_argc(argc, argv)));
396
343
  }
397
344
 
398
- static int64_t
399
- get_sint56_be(VALUE rstr, VALUE ri)
345
+ static VALUE
346
+ rb_get_sint24_le(int argc, VALUE *argv, VALUE self)
400
347
  {
401
- int64_t res = get_int56_be(rstr, ri);
402
- return res - ((res >> 55) << 56);
348
+ return INT2FIX(get_sint24_le(argv[0], check_argc(argc, argv)));
403
349
  }
404
350
 
405
- static uint64_t
406
- get_int64_le(VALUE rstr, VALUE ri)
351
+ static VALUE
352
+ rb_slice_int24_le(VALUE self, VALUE rstr)
407
353
  {
408
- long i = NUM2LONG(ri);
409
- const uint8_t *ptr;
410
- uint32_t byte0, byte1, byte2, byte3;
411
- int64_t res, res1;
412
- StringValue(rstr);
413
- i = check_size(i, RSTRING_LEN(rstr), 8);
414
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
415
-
416
- byte0 = ptr[i];
417
- byte1 = ptr[i+1];
418
- byte2 = ptr[i+2];
419
- byte3 = ptr[i+3];
420
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
421
- byte0 = ptr[i+4];
422
- byte1 = ptr[i+5];
423
- byte2 = ptr[i+6];
424
- byte3 = ptr[i+7];
425
- res1 = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
426
- return res + (res1 << 32);
354
+ uint32_t res = get_int24_le(rstr, INT2FIX(0));
355
+ rb_str_drop_bytes(rstr, 3);
356
+ return INT2FIX(res);
427
357
  }
428
358
 
429
- static int64_t
430
- get_sint64_le(VALUE rstr, VALUE ri)
359
+ static VALUE
360
+ rb_slice_sint24_le(VALUE self, VALUE rstr)
431
361
  {
432
- return (int64_t)get_int64_le(rstr, ri);
362
+ int32_t res = get_sint24_le(rstr, INT2FIX(0));
363
+ rb_str_drop_bytes(rstr, 3);
364
+ return INT2FIX(res);
433
365
  }
434
366
 
435
- static uint64_t
436
- get_int64_be(VALUE rstr, VALUE ri)
367
+ static void
368
+ append_int24_le(VALUE rstr, int32_t v)
437
369
  {
438
- long i = NUM2LONG(ri);
439
- const uint8_t *ptr;
440
- uint32_t byte0, byte1, byte2, byte3;
441
- int64_t res, res1;
442
- StringValue(rstr);
443
- i = check_size(i, RSTRING_LEN(rstr), 8);
444
- ptr = (const uint8_t*)RSTRING_PTR(rstr);
445
-
446
- byte0 = ptr[i+7];
447
- byte1 = ptr[i+6];
448
- byte2 = ptr[i+5];
449
- byte3 = ptr[i+4];
450
- res = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
451
- byte0 = ptr[i+3];
452
- byte1 = ptr[i+2];
453
- byte2 = ptr[i+1];
454
- byte3 = ptr[i];
455
- res1 = byte0 + (byte1 << 8) + (byte2 << 16) + (byte3 << 24);
456
- return res + (res1 << 32);
370
+ char a[] = {
371
+ (v >> 0) & 0xff,
372
+ (v >> 8) & 0xff,
373
+ (v >> 16) & 0xff,
374
+ 0
375
+ };
376
+ rb_str_cat(rstr, a, 3);
457
377
  }
458
378
 
459
- static int64_t
460
- get_sint64_be(VALUE rstr, VALUE ri)
379
+ static VALUE
380
+ append_var_int24_le(int argc, VALUE* argv, VALUE str)
461
381
  {
462
- return (int64_t)get_int64_be(rstr, ri);
382
+ int i;
383
+ for(i = 0; i < argc; i++) {
384
+
385
+ append_int24_le(str, NUM2INT(argv[i]));
386
+
387
+ }
388
+ return str;
463
389
  }
464
390
 
465
- static uint64_t
466
- parse_ber(const uint8_t *ptr, long max, long *i)
391
+ static VALUE
392
+ rb_append_int24_le(int argc, VALUE* argv, VALUE self)
467
393
  {
468
- uint64_t res = 0;
469
- while (1) {
470
- if (*ptr < 128) {
471
- res += *ptr;
472
- break;
473
- }
474
- if (res > LLU(0xFFFFFFFFFFFFFFFF) / 128) {
475
- rb_raise(rb_eArgError, "BER integer is greater then 2**64, could not parse such big");
476
- }
477
- res = (res + ((*ptr) - 128)) * 128;
478
- ptr++;
479
- if (++(*i) >= max) {
480
- rb_raise(rb_eArgError, "String unexpectedly finished while parsing BER integer");
481
- }
482
- }
483
- return res;
394
+ append_args args;
395
+ check_argc_append(argc, argv, &args, 24);
396
+ return append_var_int24_le(args.argc, args.argv, args.str);
484
397
  }
485
398
 
486
- static uint64_t
487
- get_ber(VALUE rstr, VALUE ri)
399
+ static uint32_t
400
+ get_int32_le(VALUE rstr, VALUE ri)
488
401
  {
489
- long i = NUM2LONG(ri), len;
402
+ long i = NUM2LONG(ri);
490
403
  const uint8_t *ptr;
491
404
  StringValue(rstr);
492
- len = RSTRING_LEN(rstr);
493
- i = check_size(i, len, 1);
494
- ptr = (const uint8_t*)RSTRING_PTR(rstr) + i;
495
- return parse_ber(ptr, len, &i);
405
+ i = check_size(i, RSTRING_LEN(rstr), 4);
406
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
407
+ return
408
+ (((uint32_t)ptr[i + 0]) << 0 ) |
409
+ (((uint32_t)ptr[i + 1]) << 8 ) |
410
+ (((uint32_t)ptr[i + 2]) << 16 ) |
411
+ (((uint32_t)ptr[i + 3]) << 24 ) |
412
+ (uint32_t)0;
496
413
  }
497
414
 
498
- static int64_t
499
- safe_int64_t(VALUE i)
415
+ static int32_t
416
+ get_sint32_le(VALUE rstr, VALUE ri)
500
417
  {
501
- if (FIXNUM_P(i)) {
502
- return NUM2I64(i);
503
- }
504
- else {
505
- VALUE argm = UINT2NUM(0xffffffff);
506
- VALUE arg32 = INT2FIX(32);
507
- uint64_t i0 = NUM2I64(rb_funcall2(i, band, 1, &argm));
508
- i = rb_funcall2(i, rshft, 1, &arg32);
509
- return i0 + (NUM2I64(rb_funcall2(i, band, 1, &argm)) << 32);
510
- }
418
+ int32_t res = (int32_t)get_int32_le(rstr, ri);
419
+ return res;
511
420
  }
512
421
 
513
422
  static VALUE
514
- check_argc(int argc, VALUE *argv)
423
+ rb_get_int32_le(int argc, VALUE *argv, VALUE self)
515
424
  {
516
- if (argc == 0 || argc > 2) {
517
- rb_raise(rb_eArgError, "accepts 1 or 2 arguments: (string[, offset=0])");
518
- }
519
- return argc == 2 ? argv[1] : INT2FIX(0);
425
+ return UINT2NUM(get_int32_le(argv[0], check_argc(argc, argv)));
520
426
  }
521
427
 
522
- /**** GET ****/
523
- /**** 32bit ***/
524
428
  static VALUE
525
- rb_get_int8(int argc, VALUE *argv, VALUE self)
429
+ rb_get_sint32_le(int argc, VALUE *argv, VALUE self)
526
430
  {
527
- return INT2FIX(get_int8(argv[0], check_argc(argc, argv)));
431
+ return INT2NUM(get_sint32_le(argv[0], check_argc(argc, argv)));
528
432
  }
529
433
 
530
434
  static VALUE
531
- rb_get_sint8(int argc, VALUE *argv, VALUE self)
435
+ rb_slice_int32_le(VALUE self, VALUE rstr)
532
436
  {
533
- return INT2FIX(get_sint8(argv[0], check_argc(argc, argv)));
437
+ uint32_t res = get_int32_le(rstr, INT2FIX(0));
438
+ rb_str_drop_bytes(rstr, 4);
439
+ return UINT2NUM(res);
534
440
  }
535
441
 
536
442
  static VALUE
537
- rb_get_int16_le(int argc, VALUE *argv, VALUE self)
443
+ rb_slice_sint32_le(VALUE self, VALUE rstr)
538
444
  {
539
- return INT2FIX(get_int16_le(argv[0], check_argc(argc, argv)));
445
+ int32_t res = get_sint32_le(rstr, INT2FIX(0));
446
+ rb_str_drop_bytes(rstr, 4);
447
+ return INT2NUM(res);
540
448
  }
541
449
 
542
- static VALUE
543
- rb_get_sint16_le(int argc, VALUE *argv, VALUE self)
450
+ static void
451
+ append_int32_le(VALUE rstr, int32_t v)
544
452
  {
545
- return INT2FIX(get_sint16_le(argv[0], check_argc(argc, argv)));
453
+ char a[] = {
454
+ (v >> 0) & 0xff,
455
+ (v >> 8) & 0xff,
456
+ (v >> 16) & 0xff,
457
+ (v >> 24) & 0xff,
458
+ 0
459
+ };
460
+ rb_str_cat(rstr, a, 4);
546
461
  }
547
462
 
548
463
  static VALUE
549
- rb_get_int16_be(int argc, VALUE *argv, VALUE self)
464
+ append_var_int32_le(int argc, VALUE* argv, VALUE str)
550
465
  {
551
- return INT2FIX(get_int16_be(argv[0], check_argc(argc, argv)));
552
- }
466
+ int i;
467
+ for(i = 0; i < argc; i++) {
553
468
 
554
- static VALUE
555
- rb_get_sint16_be(int argc, VALUE *argv, VALUE self)
556
- {
557
- return INT2FIX(get_sint16_be(argv[0], check_argc(argc, argv)));
469
+ append_int32_le(str, (int32_t)NUM2I64(argv[i]));
470
+
471
+ }
472
+ return str;
558
473
  }
559
474
 
560
475
  static VALUE
561
- rb_get_int24_le(int argc, VALUE *argv, VALUE self)
476
+ rb_append_int32_le(int argc, VALUE* argv, VALUE self)
562
477
  {
563
- return INT2FIX(get_int24_le(argv[0], check_argc(argc, argv)));
478
+ append_args args;
479
+ check_argc_append(argc, argv, &args, 32);
480
+ return append_var_int32_le(args.argc, args.argv, args.str);
564
481
  }
565
482
 
566
- static VALUE
567
- rb_get_sint24_le(int argc, VALUE *argv, VALUE self)
483
+ static uint32_t
484
+ get_int16_be(VALUE rstr, VALUE ri)
568
485
  {
569
- return INT2FIX(get_sint24_le(argv[0], check_argc(argc, argv)));
486
+ long i = NUM2LONG(ri);
487
+ const uint8_t *ptr;
488
+ StringValue(rstr);
489
+ i = check_size(i, RSTRING_LEN(rstr), 2);
490
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
491
+ return
492
+ (((uint32_t)ptr[i + 1]) << 0 ) |
493
+ (((uint32_t)ptr[i + 0]) << 8 ) |
494
+ (uint32_t)0;
570
495
  }
571
496
 
572
- static VALUE
573
- rb_get_int24_be(int argc, VALUE *argv, VALUE self)
497
+ static int32_t
498
+ get_sint16_be(VALUE rstr, VALUE ri)
574
499
  {
575
- return INT2FIX(get_int24_be(argv[0], check_argc(argc, argv)));
500
+ int32_t res = (int32_t)get_int16_be(rstr, ri);
501
+ return res - ((res >> 15) << 16);
576
502
  }
577
503
 
578
504
  static VALUE
579
- rb_get_sint24_be(int argc, VALUE *argv, VALUE self)
505
+ rb_get_int16_be(int argc, VALUE *argv, VALUE self)
580
506
  {
581
- return INT2FIX(get_sint24_be(argv[0], check_argc(argc, argv)));
507
+ return INT2FIX(get_int16_be(argv[0], check_argc(argc, argv)));
582
508
  }
583
509
 
584
510
  static VALUE
585
- rb_get_int32_le(int argc, VALUE *argv, VALUE self)
511
+ rb_get_sint16_be(int argc, VALUE *argv, VALUE self)
586
512
  {
587
- return UINT2NUM(get_int32_le(argv[0], check_argc(argc, argv)));
513
+ return INT2FIX(get_sint16_be(argv[0], check_argc(argc, argv)));
588
514
  }
589
515
 
590
516
  static VALUE
591
- rb_get_sint32_le(int argc, VALUE *argv, VALUE self)
517
+ rb_slice_int16_be(VALUE self, VALUE rstr)
592
518
  {
593
- return INT2NUM(get_sint32_le(argv[0], check_argc(argc, argv)));
519
+ uint32_t res = get_int16_be(rstr, INT2FIX(0));
520
+ rb_str_drop_bytes(rstr, 2);
521
+ return INT2FIX(res);
594
522
  }
595
523
 
596
524
  static VALUE
597
- rb_get_int32_be(int argc, VALUE *argv, VALUE self)
525
+ rb_slice_sint16_be(VALUE self, VALUE rstr)
598
526
  {
599
- return UINT2NUM(get_int32_be(argv[0], check_argc(argc, argv)));
527
+ int32_t res = get_sint16_be(rstr, INT2FIX(0));
528
+ rb_str_drop_bytes(rstr, 2);
529
+ return INT2FIX(res);
600
530
  }
601
531
 
602
- static VALUE
603
- rb_get_sint32_be(int argc, VALUE *argv, VALUE self)
532
+ static void
533
+ append_int16_be(VALUE rstr, int32_t v)
604
534
  {
605
- return INT2NUM(get_sint32_be(argv[0], check_argc(argc, argv)));
535
+ char a[] = {
536
+ (v >> 8) & 0xff,
537
+ (v >> 0) & 0xff,
538
+ 0
539
+ };
540
+ rb_str_cat(rstr, a, 2);
606
541
  }
607
- /*** 32BIT END ***/
608
542
 
609
- /*** 64BIT ***/
610
543
  static VALUE
611
- rb_get_int40_le(int argc, VALUE *argv, VALUE self)
544
+ append_var_int16_be(int argc, VALUE* argv, VALUE str)
612
545
  {
613
- return I642NUM(get_int40_le(argv[0], check_argc(argc, argv)));
546
+ int i;
547
+ for(i = 0; i < argc; i++) {
548
+
549
+ append_int16_be(str, NUM2INT(argv[i]));
550
+
551
+ }
552
+ return str;
614
553
  }
615
554
 
616
555
  static VALUE
617
- rb_get_sint40_le(int argc, VALUE *argv, VALUE self)
556
+ rb_append_int16_be(int argc, VALUE* argv, VALUE self)
618
557
  {
619
- return I642NUM(get_sint40_le(argv[0], check_argc(argc, argv)));
558
+ append_args args;
559
+ check_argc_append(argc, argv, &args, 16);
560
+ return append_var_int16_be(args.argc, args.argv, args.str);
620
561
  }
621
562
 
622
- static VALUE
623
- rb_get_int40_be(int argc, VALUE *argv, VALUE self)
563
+ static uint32_t
564
+ get_int24_be(VALUE rstr, VALUE ri)
624
565
  {
625
- return I642NUM(get_int40_be(argv[0], check_argc(argc, argv)));
566
+ long i = NUM2LONG(ri);
567
+ const uint8_t *ptr;
568
+ StringValue(rstr);
569
+ i = check_size(i, RSTRING_LEN(rstr), 3);
570
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
571
+ return
572
+ (((uint32_t)ptr[i + 2]) << 0 ) |
573
+ (((uint32_t)ptr[i + 1]) << 8 ) |
574
+ (((uint32_t)ptr[i + 0]) << 16 ) |
575
+ (uint32_t)0;
626
576
  }
627
577
 
628
- static VALUE
629
- rb_get_sint40_be(int argc, VALUE *argv, VALUE self)
578
+ static int32_t
579
+ get_sint24_be(VALUE rstr, VALUE ri)
630
580
  {
631
- return I642NUM(get_sint40_be(argv[0], check_argc(argc, argv)));
581
+ int32_t res = (int32_t)get_int24_be(rstr, ri);
582
+ return res - ((res >> 23) << 24);
632
583
  }
633
584
 
634
585
  static VALUE
635
- rb_get_int48_le(int argc, VALUE *argv, VALUE self)
586
+ rb_get_int24_be(int argc, VALUE *argv, VALUE self)
636
587
  {
637
- return I642NUM(get_int48_le(argv[0], check_argc(argc, argv)));
588
+ return INT2FIX(get_int24_be(argv[0], check_argc(argc, argv)));
638
589
  }
639
590
 
640
591
  static VALUE
641
- rb_get_sint48_le(int argc, VALUE *argv, VALUE self)
592
+ rb_get_sint24_be(int argc, VALUE *argv, VALUE self)
642
593
  {
643
- return I642NUM(get_sint48_le(argv[0], check_argc(argc, argv)));
594
+ return INT2FIX(get_sint24_be(argv[0], check_argc(argc, argv)));
644
595
  }
645
596
 
646
597
  static VALUE
647
- rb_get_int48_be(int argc, VALUE *argv, VALUE self)
598
+ rb_slice_int24_be(VALUE self, VALUE rstr)
648
599
  {
649
- return I642NUM(get_int48_be(argv[0], check_argc(argc, argv)));
600
+ uint32_t res = get_int24_be(rstr, INT2FIX(0));
601
+ rb_str_drop_bytes(rstr, 3);
602
+ return INT2FIX(res);
650
603
  }
651
604
 
652
605
  static VALUE
653
- rb_get_sint48_be(int argc, VALUE *argv, VALUE self)
606
+ rb_slice_sint24_be(VALUE self, VALUE rstr)
654
607
  {
655
- return I642NUM(get_sint48_be(argv[0], check_argc(argc, argv)));
608
+ int32_t res = get_sint24_be(rstr, INT2FIX(0));
609
+ rb_str_drop_bytes(rstr, 3);
610
+ return INT2FIX(res);
656
611
  }
657
612
 
658
- static VALUE
659
- rb_get_int56_le(int argc, VALUE *argv, VALUE self)
613
+ static void
614
+ append_int24_be(VALUE rstr, int32_t v)
660
615
  {
661
- return I642NUM(get_int56_le(argv[0], check_argc(argc, argv)));
616
+ char a[] = {
617
+ (v >> 16) & 0xff,
618
+ (v >> 8) & 0xff,
619
+ (v >> 0) & 0xff,
620
+ 0
621
+ };
622
+ rb_str_cat(rstr, a, 3);
662
623
  }
663
624
 
664
625
  static VALUE
665
- rb_get_sint56_le(int argc, VALUE *argv, VALUE self)
626
+ append_var_int24_be(int argc, VALUE* argv, VALUE str)
666
627
  {
667
- return I642NUM(get_sint56_le(argv[0], check_argc(argc, argv)));
628
+ int i;
629
+ for(i = 0; i < argc; i++) {
630
+
631
+ append_int24_be(str, NUM2INT(argv[i]));
632
+
633
+ }
634
+ return str;
668
635
  }
669
636
 
670
637
  static VALUE
671
- rb_get_int56_be(int argc, VALUE *argv, VALUE self)
638
+ rb_append_int24_be(int argc, VALUE* argv, VALUE self)
672
639
  {
673
- return I642NUM(get_int56_be(argv[0], check_argc(argc, argv)));
640
+ append_args args;
641
+ check_argc_append(argc, argv, &args, 24);
642
+ return append_var_int24_be(args.argc, args.argv, args.str);
674
643
  }
675
644
 
676
- static VALUE
677
- rb_get_sint56_be(int argc, VALUE *argv, VALUE self)
645
+ static uint32_t
646
+ get_int32_be(VALUE rstr, VALUE ri)
678
647
  {
679
- return I642NUM(get_sint56_be(argv[0], check_argc(argc, argv)));
648
+ long i = NUM2LONG(ri);
649
+ const uint8_t *ptr;
650
+ StringValue(rstr);
651
+ i = check_size(i, RSTRING_LEN(rstr), 4);
652
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
653
+ return
654
+ (((uint32_t)ptr[i + 3]) << 0 ) |
655
+ (((uint32_t)ptr[i + 2]) << 8 ) |
656
+ (((uint32_t)ptr[i + 1]) << 16 ) |
657
+ (((uint32_t)ptr[i + 0]) << 24 ) |
658
+ (uint32_t)0;
680
659
  }
681
660
 
682
- static VALUE
683
- rb_get_int64_le(int argc, VALUE *argv, VALUE self)
661
+ static int32_t
662
+ get_sint32_be(VALUE rstr, VALUE ri)
684
663
  {
685
- return U642NUM(get_int64_le(argv[0], check_argc(argc, argv)));
664
+ int32_t res = (int32_t)get_int32_be(rstr, ri);
665
+ return res;
686
666
  }
687
667
 
688
668
  static VALUE
689
- rb_get_sint64_le(int argc, VALUE *argv, VALUE self)
669
+ rb_get_int32_be(int argc, VALUE *argv, VALUE self)
690
670
  {
691
- return I642NUM(get_sint64_le(argv[0], check_argc(argc, argv)));
671
+ return UINT2NUM(get_int32_be(argv[0], check_argc(argc, argv)));
692
672
  }
693
673
 
694
674
  static VALUE
695
- rb_get_int64_be(int argc, VALUE *argv, VALUE self)
675
+ rb_get_sint32_be(int argc, VALUE *argv, VALUE self)
696
676
  {
697
- return U642NUM(get_int64_be(argv[0], check_argc(argc, argv)));
677
+ return INT2NUM(get_sint32_be(argv[0], check_argc(argc, argv)));
698
678
  }
699
679
 
700
680
  static VALUE
701
- rb_get_sint64_be(int argc, VALUE *argv, VALUE self)
681
+ rb_slice_int32_be(VALUE self, VALUE rstr)
702
682
  {
703
- return I642NUM(get_sint64_be(argv[0], check_argc(argc, argv)));
683
+ uint32_t res = get_int32_be(rstr, INT2FIX(0));
684
+ rb_str_drop_bytes(rstr, 4);
685
+ return UINT2NUM(res);
704
686
  }
705
- /*** 64BIT END ***/
706
687
 
707
688
  static VALUE
708
- rb_get_ber(int argc, VALUE *argv, VALUE self)
689
+ rb_slice_sint32_be(VALUE self, VALUE rstr)
709
690
  {
710
- return U642NUM(get_ber(argv[0], check_argc(argc, argv)));
691
+ int32_t res = get_sint32_be(rstr, INT2FIX(0));
692
+ rb_str_drop_bytes(rstr, 4);
693
+ return INT2NUM(res);
711
694
  }
712
- /** GET END **/
713
695
 
714
- /** SLICE **/
715
- /*** 32BIT ***/
716
- static VALUE
717
- rb_slice_int8(VALUE self, VALUE rstr)
696
+ static void
697
+ append_int32_be(VALUE rstr, int32_t v)
718
698
  {
719
- int32_t res = get_int8(rstr, INT2FIX(0));
720
- rb_str_drop_bytes(rstr, 1);
721
- return INT2FIX(res);
699
+ char a[] = {
700
+ (v >> 24) & 0xff,
701
+ (v >> 16) & 0xff,
702
+ (v >> 8) & 0xff,
703
+ (v >> 0) & 0xff,
704
+ 0
705
+ };
706
+ rb_str_cat(rstr, a, 4);
722
707
  }
723
708
 
724
709
  static VALUE
725
- rb_slice_sint8(VALUE self, VALUE rstr)
710
+ append_var_int32_be(int argc, VALUE* argv, VALUE str)
726
711
  {
727
- int32_t res = get_sint8(rstr, INT2FIX(0));
728
- rb_str_drop_bytes(rstr, 1);
729
- return INT2FIX(res);
730
- }
712
+ int i;
713
+ for(i = 0; i < argc; i++) {
731
714
 
732
- static VALUE
733
- rb_slice_int16_le(VALUE self, VALUE rstr)
734
- {
735
- int32_t res = get_int16_le(rstr, INT2FIX(0));
736
- rb_str_drop_bytes(rstr, 2);
737
- return INT2FIX(res);
738
- }
715
+ append_int32_be(str, (int32_t)NUM2I64(argv[i]));
739
716
 
740
- static VALUE
741
- rb_slice_sint16_le(VALUE self, VALUE rstr)
742
- {
743
- int32_t res = get_sint16_le(rstr, INT2FIX(0));
744
- rb_str_drop_bytes(rstr, 2);
745
- return INT2FIX(res);
717
+ }
718
+ return str;
746
719
  }
747
720
 
748
721
  static VALUE
749
- rb_slice_int16_be(VALUE self, VALUE rstr)
722
+ rb_append_int32_be(int argc, VALUE* argv, VALUE self)
750
723
  {
751
- int32_t res = get_int16_be(rstr, INT2FIX(0));
752
- rb_str_drop_bytes(rstr, 2);
753
- return INT2FIX(res);
724
+ append_args args;
725
+ check_argc_append(argc, argv, &args, 32);
726
+ return append_var_int32_be(args.argc, args.argv, args.str);
754
727
  }
755
728
 
756
- static VALUE
757
- rb_slice_sint16_be(VALUE self, VALUE rstr)
729
+
730
+
731
+
732
+ static uint64_t
733
+ get_int40_le(VALUE rstr, VALUE ri)
758
734
  {
759
- int32_t res = get_sint16_be(rstr, INT2FIX(0));
760
- rb_str_drop_bytes(rstr, 2);
761
- return INT2FIX(res);
735
+ long i = NUM2LONG(ri);
736
+ const uint8_t *ptr;
737
+ StringValue(rstr);
738
+ i = check_size(i, RSTRING_LEN(rstr), 5);
739
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
740
+ return (uint64_t)(
741
+ (((uint32_t)ptr[i + 0]) << 0) |
742
+ (((uint32_t)ptr[i + 1]) << 8) |
743
+ (((uint32_t)ptr[i + 2]) << 16) |
744
+ (((uint32_t)ptr[i + 3]) << 24) |
745
+ 0) | ((uint64_t)(
746
+ (((uint32_t)ptr[i + 4]) << 0) |
747
+ 0) << 32);
762
748
  }
763
749
 
764
- static VALUE
765
- rb_slice_int24_le(VALUE self, VALUE rstr)
750
+ static int64_t
751
+ get_sint40_le(VALUE rstr, VALUE ri)
766
752
  {
767
- int32_t res = get_int24_le(rstr, INT2FIX(0));
768
- rb_str_drop_bytes(rstr, 3);
769
- return INT2FIX(res);
753
+ int64_t res = (int64_t)get_int40_le(rstr, ri);
754
+ return res - ((res >> 39) << 40);
770
755
  }
771
756
 
772
757
  static VALUE
773
- rb_slice_sint24_le(VALUE self, VALUE rstr)
758
+ rb_get_int40_le(int argc, VALUE *argv, VALUE self)
774
759
  {
775
- int32_t res = get_sint24_le(rstr, INT2FIX(0));
776
- rb_str_drop_bytes(rstr, 3);
777
- return INT2FIX(res);
760
+ return I642NUM(get_int40_le(argv[0], check_argc(argc, argv)));
778
761
  }
779
762
 
780
763
  static VALUE
781
- rb_slice_int24_be(VALUE self, VALUE rstr)
764
+ rb_get_sint40_le(int argc, VALUE *argv, VALUE self)
782
765
  {
783
- int32_t res = get_int24_be(rstr, INT2FIX(0));
784
- rb_str_drop_bytes(rstr, 3);
785
- return INT2FIX(res);
766
+ return I642NUM(get_sint40_le(argv[0], check_argc(argc, argv)));
786
767
  }
787
768
 
788
769
  static VALUE
789
- rb_slice_sint24_be(VALUE self, VALUE rstr)
770
+ rb_slice_int40_le(VALUE self, VALUE rstr)
790
771
  {
791
- int32_t res = get_sint24_be(rstr, INT2FIX(0));
792
- rb_str_drop_bytes(rstr, 3);
793
- return INT2FIX(res);
772
+ uint64_t res = get_int40_le(rstr, INT2FIX(0));
773
+ rb_str_drop_bytes(rstr, 5);
774
+ return I642NUM(res);
794
775
  }
795
776
 
796
777
  static VALUE
797
- rb_slice_int32_le(VALUE self, VALUE rstr)
778
+ rb_slice_sint40_le(VALUE self, VALUE rstr)
798
779
  {
799
- uint32_t res = get_int32_le(rstr, INT2FIX(0));
800
- rb_str_drop_bytes(rstr, 4);
801
- return UINT2NUM(res);
780
+ uint64_t res = get_sint40_le(rstr, INT2FIX(0));
781
+ rb_str_drop_bytes(rstr, 5);
782
+ return I642NUM(res);
802
783
  }
803
784
 
804
- static VALUE
805
- rb_slice_sint32_le(VALUE self, VALUE rstr)
785
+ static void
786
+ append_int40_le(VALUE rstr, int64_t v)
806
787
  {
807
- int32_t res = get_sint32_le(rstr, INT2FIX(0));
808
- rb_str_drop_bytes(rstr, 4);
809
- return INT2NUM(res);
788
+ char a[] = {
789
+ (v >> 0) & 0xff,
790
+ (v >> 8) & 0xff,
791
+ (v >> 16) & 0xff,
792
+ (v >> 24) & 0xff,
793
+ (v >> 32) & 0xff,
794
+ 0
795
+ };
796
+ rb_str_cat(rstr, a, 5);
810
797
  }
811
798
 
812
799
  static VALUE
813
- rb_slice_int32_be(VALUE self, VALUE rstr)
800
+ append_var_int40_le(int argc, VALUE* argv, VALUE str)
814
801
  {
815
- uint32_t res = get_int32_be(rstr, INT2FIX(0));
816
- rb_str_drop_bytes(rstr, 4);
817
- return UINT2NUM(res);
802
+ int i;
803
+ for(i = 0; i < argc; i++) {
804
+
805
+ append_int40_le(str, NUM2I64(argv[i]));
806
+
807
+ }
808
+ return str;
818
809
  }
819
810
 
820
811
  static VALUE
821
- rb_slice_sint32_be(VALUE self, VALUE rstr)
812
+ rb_append_int40_le(int argc, VALUE* argv, VALUE self)
822
813
  {
823
- int32_t res = get_sint32_be(rstr, INT2FIX(0));
824
- rb_str_drop_bytes(rstr, 4);
825
- return INT2NUM(res);
814
+ append_args args;
815
+ check_argc_append(argc, argv, &args, 40);
816
+ return append_var_int40_le(args.argc, args.argv, args.str);
826
817
  }
827
- /*** 32BIT END ***/
828
818
 
829
- /*** 64BIT ***/
830
- static VALUE
831
- rb_slice_int40_le(VALUE self, VALUE rstr)
819
+ static uint64_t
820
+ get_int48_le(VALUE rstr, VALUE ri)
832
821
  {
833
- int64_t res = get_int40_le(rstr, INT2FIX(0));
834
- rb_str_drop_bytes(rstr, 5);
835
- return I642NUM(res);
822
+ long i = NUM2LONG(ri);
823
+ const uint8_t *ptr;
824
+ StringValue(rstr);
825
+ i = check_size(i, RSTRING_LEN(rstr), 6);
826
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
827
+ return (uint64_t)(
828
+ (((uint32_t)ptr[i + 0]) << 0) |
829
+ (((uint32_t)ptr[i + 1]) << 8) |
830
+ (((uint32_t)ptr[i + 2]) << 16) |
831
+ (((uint32_t)ptr[i + 3]) << 24) |
832
+ 0) | ((uint64_t)(
833
+ (((uint32_t)ptr[i + 4]) << 0) |
834
+ (((uint32_t)ptr[i + 5]) << 8) |
835
+ 0) << 32);
836
836
  }
837
837
 
838
- static VALUE
839
- rb_slice_sint40_le(VALUE self, VALUE rstr)
838
+ static int64_t
839
+ get_sint48_le(VALUE rstr, VALUE ri)
840
840
  {
841
- int64_t res = get_sint40_le(rstr, INT2FIX(0));
842
- rb_str_drop_bytes(rstr, 5);
843
- return I642NUM(res);
841
+ int64_t res = (int64_t)get_int48_le(rstr, ri);
842
+ return res - ((res >> 47) << 48);
844
843
  }
845
844
 
846
845
  static VALUE
847
- rb_slice_int40_be(VALUE self, VALUE rstr)
846
+ rb_get_int48_le(int argc, VALUE *argv, VALUE self)
848
847
  {
849
- int64_t res = get_int40_be(rstr, INT2FIX(0));
850
- rb_str_drop_bytes(rstr, 5);
851
- return I642NUM(res);
848
+ return I642NUM(get_int48_le(argv[0], check_argc(argc, argv)));
852
849
  }
853
850
 
854
851
  static VALUE
855
- rb_slice_sint40_be(VALUE self, VALUE rstr)
852
+ rb_get_sint48_le(int argc, VALUE *argv, VALUE self)
856
853
  {
857
- int64_t res = get_sint40_be(rstr, INT2FIX(0));
858
- rb_str_drop_bytes(rstr, 5);
859
- return I642NUM(res);
854
+ return I642NUM(get_sint48_le(argv[0], check_argc(argc, argv)));
860
855
  }
861
856
 
862
857
  static VALUE
863
858
  rb_slice_int48_le(VALUE self, VALUE rstr)
864
859
  {
865
- int64_t res = get_int48_le(rstr, INT2FIX(0));
860
+ uint64_t res = get_int48_le(rstr, INT2FIX(0));
866
861
  rb_str_drop_bytes(rstr, 6);
867
862
  return I642NUM(res);
868
863
  }
@@ -870,476 +865,669 @@ rb_slice_int48_le(VALUE self, VALUE rstr)
870
865
  static VALUE
871
866
  rb_slice_sint48_le(VALUE self, VALUE rstr)
872
867
  {
873
- int64_t res = get_sint48_le(rstr, INT2FIX(0));
868
+ uint64_t res = get_sint48_le(rstr, INT2FIX(0));
874
869
  rb_str_drop_bytes(rstr, 6);
875
870
  return I642NUM(res);
876
871
  }
877
872
 
878
- static VALUE
879
- rb_slice_int48_be(VALUE self, VALUE rstr)
873
+ static void
874
+ append_int48_le(VALUE rstr, int64_t v)
880
875
  {
881
- int64_t res = get_int48_be(rstr, INT2FIX(0));
882
- rb_str_drop_bytes(rstr, 6);
883
- return I642NUM(res);
876
+ char a[] = {
877
+ (v >> 0) & 0xff,
878
+ (v >> 8) & 0xff,
879
+ (v >> 16) & 0xff,
880
+ (v >> 24) & 0xff,
881
+ (v >> 32) & 0xff,
882
+ (v >> 40) & 0xff,
883
+ 0
884
+ };
885
+ rb_str_cat(rstr, a, 6);
884
886
  }
885
887
 
886
888
  static VALUE
887
- rb_slice_sint48_be(VALUE self, VALUE rstr)
889
+ append_var_int48_le(int argc, VALUE* argv, VALUE str)
888
890
  {
889
- int64_t res = get_sint48_be(rstr, INT2FIX(0));
890
- rb_str_drop_bytes(rstr, 6);
891
- return I642NUM(res);
891
+ int i;
892
+ for(i = 0; i < argc; i++) {
893
+
894
+ append_int48_le(str, NUM2I64(argv[i]));
895
+
896
+ }
897
+ return str;
892
898
  }
893
899
 
894
900
  static VALUE
895
- rb_slice_int56_le(VALUE self, VALUE rstr)
901
+ rb_append_int48_le(int argc, VALUE* argv, VALUE self)
896
902
  {
897
- int64_t res = get_int56_le(rstr, INT2FIX(0));
898
- rb_str_drop_bytes(rstr, 7);
899
- return I642NUM(res);
903
+ append_args args;
904
+ check_argc_append(argc, argv, &args, 48);
905
+ return append_var_int48_le(args.argc, args.argv, args.str);
906
+ }
907
+
908
+ static uint64_t
909
+ get_int56_le(VALUE rstr, VALUE ri)
910
+ {
911
+ long i = NUM2LONG(ri);
912
+ const uint8_t *ptr;
913
+ StringValue(rstr);
914
+ i = check_size(i, RSTRING_LEN(rstr), 7);
915
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
916
+ return (uint64_t)(
917
+ (((uint32_t)ptr[i + 0]) << 0) |
918
+ (((uint32_t)ptr[i + 1]) << 8) |
919
+ (((uint32_t)ptr[i + 2]) << 16) |
920
+ (((uint32_t)ptr[i + 3]) << 24) |
921
+ 0) | ((uint64_t)(
922
+ (((uint32_t)ptr[i + 4]) << 0) |
923
+ (((uint32_t)ptr[i + 5]) << 8) |
924
+ (((uint32_t)ptr[i + 6]) << 16) |
925
+ 0) << 32);
926
+ }
927
+
928
+ static int64_t
929
+ get_sint56_le(VALUE rstr, VALUE ri)
930
+ {
931
+ int64_t res = (int64_t)get_int56_le(rstr, ri);
932
+ return res - ((res >> 55) << 56);
900
933
  }
901
934
 
902
935
  static VALUE
903
- rb_slice_sint56_le(VALUE self, VALUE rstr)
936
+ rb_get_int56_le(int argc, VALUE *argv, VALUE self)
904
937
  {
905
- int64_t res = get_sint56_le(rstr, INT2FIX(0));
906
- rb_str_drop_bytes(rstr, 7);
907
- return I642NUM(res);
938
+ return I642NUM(get_int56_le(argv[0], check_argc(argc, argv)));
908
939
  }
909
940
 
910
941
  static VALUE
911
- rb_slice_int56_be(VALUE self, VALUE rstr)
942
+ rb_get_sint56_le(int argc, VALUE *argv, VALUE self)
912
943
  {
913
- int64_t res = get_int56_be(rstr, INT2FIX(0));
914
- rb_str_drop_bytes(rstr, 7);
915
- return I642NUM(res);
944
+ return I642NUM(get_sint56_le(argv[0], check_argc(argc, argv)));
916
945
  }
917
946
 
918
947
  static VALUE
919
- rb_slice_sint56_be(VALUE self, VALUE rstr)
948
+ rb_slice_int56_le(VALUE self, VALUE rstr)
920
949
  {
921
- int64_t res = get_sint56_be(rstr, INT2FIX(0));
950
+ uint64_t res = get_int56_le(rstr, INT2FIX(0));
922
951
  rb_str_drop_bytes(rstr, 7);
923
952
  return I642NUM(res);
924
953
  }
925
954
 
926
955
  static VALUE
927
- rb_slice_int64_le(VALUE self, VALUE rstr)
956
+ rb_slice_sint56_le(VALUE self, VALUE rstr)
928
957
  {
929
- uint64_t res = get_int64_le(rstr, INT2FIX(0));
930
- rb_str_drop_bytes(rstr, 8);
931
- return U642NUM(res);
958
+ uint64_t res = get_sint56_le(rstr, INT2FIX(0));
959
+ rb_str_drop_bytes(rstr, 7);
960
+ return I642NUM(res);
932
961
  }
933
962
 
934
- static VALUE
935
- rb_slice_sint64_le(VALUE self, VALUE rstr)
963
+ static void
964
+ append_int56_le(VALUE rstr, int64_t v)
936
965
  {
937
- int64_t res = get_sint64_le(rstr, INT2FIX(0));
938
- rb_str_drop_bytes(rstr, 8);
939
- return I642NUM(res);
966
+ char a[] = {
967
+ (v >> 0) & 0xff,
968
+ (v >> 8) & 0xff,
969
+ (v >> 16) & 0xff,
970
+ (v >> 24) & 0xff,
971
+ (v >> 32) & 0xff,
972
+ (v >> 40) & 0xff,
973
+ (v >> 48) & 0xff,
974
+ 0
975
+ };
976
+ rb_str_cat(rstr, a, 7);
940
977
  }
941
978
 
942
979
  static VALUE
943
- rb_slice_int64_be(VALUE self, VALUE rstr)
980
+ append_var_int56_le(int argc, VALUE* argv, VALUE str)
944
981
  {
945
- uint64_t res = get_int64_be(rstr, INT2FIX(0));
946
- rb_str_drop_bytes(rstr, 8);
947
- return U642NUM(res);
982
+ int i;
983
+ for(i = 0; i < argc; i++) {
984
+
985
+ append_int56_le(str, NUM2I64(argv[i]));
986
+
987
+ }
988
+ return str;
948
989
  }
949
990
 
950
991
  static VALUE
951
- rb_slice_sint64_be(VALUE self, VALUE rstr)
992
+ rb_append_int56_le(int argc, VALUE* argv, VALUE self)
952
993
  {
953
- int64_t res = get_sint64_be(rstr, INT2FIX(0));
954
- rb_str_drop_bytes(rstr, 8);
955
- return I642NUM(res);
994
+ append_args args;
995
+ check_argc_append(argc, argv, &args, 56);
996
+ return append_var_int56_le(args.argc, args.argv, args.str);
956
997
  }
957
- /*** 64BIT END ***/
958
998
 
959
999
  static uint64_t
960
- slice_ber(VALUE rstr, long *i)
1000
+ get_int64_le(VALUE rstr, VALUE ri)
961
1001
  {
962
- long len;
1002
+ long i = NUM2LONG(ri);
963
1003
  const uint8_t *ptr;
964
1004
  StringValue(rstr);
965
- len = RSTRING_LEN(rstr);
1005
+ i = check_size(i, RSTRING_LEN(rstr), 8);
966
1006
  ptr = (const uint8_t*)RSTRING_PTR(rstr);
967
- return parse_ber(ptr, len, i);
1007
+ return (uint64_t)(
1008
+ (((uint32_t)ptr[i + 0]) << 0) |
1009
+ (((uint32_t)ptr[i + 1]) << 8) |
1010
+ (((uint32_t)ptr[i + 2]) << 16) |
1011
+ (((uint32_t)ptr[i + 3]) << 24) |
1012
+ 0) | ((uint64_t)(
1013
+ (((uint32_t)ptr[i + 4]) << 0) |
1014
+ (((uint32_t)ptr[i + 5]) << 8) |
1015
+ (((uint32_t)ptr[i + 6]) << 16) |
1016
+ (((uint32_t)ptr[i + 7]) << 24) |
1017
+ 0) << 32);
1018
+ }
1019
+
1020
+ static int64_t
1021
+ get_sint64_le(VALUE rstr, VALUE ri)
1022
+ {
1023
+ int64_t res = (int64_t)get_int64_le(rstr, ri);
1024
+ return res;
968
1025
  }
969
1026
 
970
1027
  static VALUE
971
- rb_slice_ber(VALUE self, VALUE rstr)
1028
+ rb_get_int64_le(int argc, VALUE *argv, VALUE self)
972
1029
  {
973
- long i = 0;
974
- int64_t res = slice_ber(rstr, &i);
975
- rb_str_drop_bytes(rstr, i+1);
1030
+ return U642NUM(get_int64_le(argv[0], check_argc(argc, argv)));
1031
+ }
1032
+
1033
+ static VALUE
1034
+ rb_get_sint64_le(int argc, VALUE *argv, VALUE self)
1035
+ {
1036
+ return I642NUM(get_sint64_le(argv[0], check_argc(argc, argv)));
1037
+ }
1038
+
1039
+ static VALUE
1040
+ rb_slice_int64_le(VALUE self, VALUE rstr)
1041
+ {
1042
+ uint64_t res = get_int64_le(rstr, INT2FIX(0));
1043
+ rb_str_drop_bytes(rstr, 8);
976
1044
  return U642NUM(res);
977
1045
  }
978
- /** SLICE END **/
979
1046
 
980
- /** APPEND **/
981
- static void
982
- append_int8(VALUE rstr, int32_t v)
1047
+ static VALUE
1048
+ rb_slice_sint64_le(VALUE self, VALUE rstr)
983
1049
  {
984
- char a[1] = {v & 255};
985
- rb_str_cat(rstr, a, 1);
1050
+ uint64_t res = get_sint64_le(rstr, INT2FIX(0));
1051
+ rb_str_drop_bytes(rstr, 8);
1052
+ return I642NUM(res);
986
1053
  }
987
1054
 
988
1055
  static void
989
- append_int16_le(VALUE rstr, int32_t v)
1056
+ append_int64_le(VALUE rstr, int64_t v)
990
1057
  {
991
- char a[2] = {v & 255, (v >> 8) & 255};
992
- rb_str_cat(rstr, a, 2);
1058
+ char a[] = {
1059
+ (v >> 0) & 0xff,
1060
+ (v >> 8) & 0xff,
1061
+ (v >> 16) & 0xff,
1062
+ (v >> 24) & 0xff,
1063
+ (v >> 32) & 0xff,
1064
+ (v >> 40) & 0xff,
1065
+ (v >> 48) & 0xff,
1066
+ (v >> 56) & 0xff,
1067
+ 0
1068
+ };
1069
+ rb_str_cat(rstr, a, 8);
993
1070
  }
994
1071
 
995
- static void
996
- append_int16_be(VALUE rstr, int32_t v)
1072
+ static VALUE
1073
+ append_var_int64_le(int argc, VALUE* argv, VALUE str)
997
1074
  {
998
- char a[2] = {(v >> 8) & 255, v & 255};
999
- rb_str_cat(rstr, a, 2);
1075
+ int i;
1076
+ for(i = 0; i < argc; i++) {
1077
+
1078
+ append_int64_le(str, safe_int64_t(argv[i]));
1079
+
1080
+ }
1081
+ return str;
1000
1082
  }
1001
1083
 
1002
- static void
1003
- append_int24_le(VALUE rstr, int32_t v)
1084
+ static VALUE
1085
+ rb_append_int64_le(int argc, VALUE* argv, VALUE self)
1004
1086
  {
1005
- char a[3] = {v & 255, (v >> 8) & 255, (v >> 16) & 255};
1006
- rb_str_cat(rstr, a, 3);
1087
+ append_args args;
1088
+ check_argc_append(argc, argv, &args, 64);
1089
+ return append_var_int64_le(args.argc, args.argv, args.str);
1007
1090
  }
1008
1091
 
1009
- static void
1010
- append_int24_be(VALUE rstr, int32_t v)
1092
+ static uint64_t
1093
+ get_int40_be(VALUE rstr, VALUE ri)
1011
1094
  {
1012
- char a[3] = {(v >> 16) & 255, (v >> 8) & 255, v & 255};
1013
- rb_str_cat(rstr, a, 3);
1095
+ long i = NUM2LONG(ri);
1096
+ const uint8_t *ptr;
1097
+ StringValue(rstr);
1098
+ i = check_size(i, RSTRING_LEN(rstr), 5);
1099
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
1100
+ return (uint64_t)(
1101
+ (((uint32_t)ptr[i + 4]) << 0) |
1102
+ (((uint32_t)ptr[i + 3]) << 8) |
1103
+ (((uint32_t)ptr[i + 2]) << 16) |
1104
+ (((uint32_t)ptr[i + 1]) << 24) |
1105
+ 0) | ((uint64_t)(
1106
+ (((uint32_t)ptr[i + 0]) << 0) |
1107
+ 0) << 32);
1014
1108
  }
1015
1109
 
1016
- static void
1017
- append_int32_le(VALUE rstr, int32_t v)
1110
+ static int64_t
1111
+ get_sint40_be(VALUE rstr, VALUE ri)
1018
1112
  {
1019
- char a[4] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255};
1020
- rb_str_cat(rstr, a, 4);
1113
+ int64_t res = (int64_t)get_int40_be(rstr, ri);
1114
+ return res - ((res >> 39) << 40);
1021
1115
  }
1022
1116
 
1023
- static void
1024
- append_int32_be(VALUE rstr, int32_t v)
1117
+ static VALUE
1118
+ rb_get_int40_be(int argc, VALUE *argv, VALUE self)
1025
1119
  {
1026
- char a[4] = {(v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1027
- rb_str_cat(rstr, a, 4);
1120
+ return I642NUM(get_int40_be(argv[0], check_argc(argc, argv)));
1028
1121
  }
1029
1122
 
1030
- static void
1031
- append_int40_le(VALUE rstr, int64_t v)
1123
+ static VALUE
1124
+ rb_get_sint40_be(int argc, VALUE *argv, VALUE self)
1032
1125
  {
1033
- char a[5] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1034
- (v >> 32) & 255};
1035
- rb_str_cat(rstr, a, 5);
1126
+ return I642NUM(get_sint40_be(argv[0], check_argc(argc, argv)));
1036
1127
  }
1037
1128
 
1038
- static void
1039
- append_int40_be(VALUE rstr, int64_t v)
1129
+ static VALUE
1130
+ rb_slice_int40_be(VALUE self, VALUE rstr)
1040
1131
  {
1041
- char a[5] = {(v >> 32) & 255,
1042
- (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1043
- rb_str_cat(rstr, a, 5);
1132
+ uint64_t res = get_int40_be(rstr, INT2FIX(0));
1133
+ rb_str_drop_bytes(rstr, 5);
1134
+ return I642NUM(res);
1044
1135
  }
1045
1136
 
1046
- static void
1047
- append_int48_le(VALUE rstr, int64_t v)
1137
+ static VALUE
1138
+ rb_slice_sint40_be(VALUE self, VALUE rstr)
1048
1139
  {
1049
- char a[6] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1050
- (v >> 32) & 255, (v >> 40) & 255};
1051
- rb_str_cat(rstr, a, 6);
1140
+ uint64_t res = get_sint40_be(rstr, INT2FIX(0));
1141
+ rb_str_drop_bytes(rstr, 5);
1142
+ return I642NUM(res);
1052
1143
  }
1053
1144
 
1054
1145
  static void
1055
- append_int48_be(VALUE rstr, int64_t v)
1146
+ append_int40_be(VALUE rstr, int64_t v)
1056
1147
  {
1057
- char a[6] = {(v >> 40) & 255, (v >> 32) & 255,
1058
- (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1059
- rb_str_cat(rstr, a, 6);
1148
+ char a[] = {
1149
+ (v >> 32) & 0xff,
1150
+ (v >> 24) & 0xff,
1151
+ (v >> 16) & 0xff,
1152
+ (v >> 8) & 0xff,
1153
+ (v >> 0) & 0xff,
1154
+ 0
1155
+ };
1156
+ rb_str_cat(rstr, a, 5);
1060
1157
  }
1061
1158
 
1062
- static void
1063
- append_int56_le(VALUE rstr, int64_t v)
1159
+ static VALUE
1160
+ append_var_int40_be(int argc, VALUE* argv, VALUE str)
1064
1161
  {
1065
- char a[7] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1066
- (v >> 32) & 255, (v >> 40) & 255, (v >> 48) & 255};
1067
- rb_str_cat(rstr, a, 7);
1162
+ int i;
1163
+ for(i = 0; i < argc; i++) {
1164
+
1165
+ append_int40_be(str, NUM2I64(argv[i]));
1166
+
1167
+ }
1168
+ return str;
1068
1169
  }
1069
1170
 
1070
- static void
1071
- append_int56_be(VALUE rstr, int64_t v)
1171
+ static VALUE
1172
+ rb_append_int40_be(int argc, VALUE* argv, VALUE self)
1072
1173
  {
1073
- char a[7] = {(v >> 48) & 255, (v >> 40) & 255, (v >> 32) & 255,
1074
- (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1075
- rb_str_cat(rstr, a, 7);
1174
+ append_args args;
1175
+ check_argc_append(argc, argv, &args, 40);
1176
+ return append_var_int40_be(args.argc, args.argv, args.str);
1076
1177
  }
1077
1178
 
1078
- static void
1079
- append_int64_le(VALUE rstr, int64_t v)
1179
+ static uint64_t
1180
+ get_int48_be(VALUE rstr, VALUE ri)
1080
1181
  {
1081
- char a[8] = {v & 255, (v >> 8) & 255, (v >> 16) & 255, (v >> 24) & 255,
1082
- (v >> 32) & 255, (v >> 40) & 255, (v >> 48) & 255, (v >> 56) & 255};
1083
- rb_str_cat(rstr, a, 8);
1182
+ long i = NUM2LONG(ri);
1183
+ const uint8_t *ptr;
1184
+ StringValue(rstr);
1185
+ i = check_size(i, RSTRING_LEN(rstr), 6);
1186
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
1187
+ return (uint64_t)(
1188
+ (((uint32_t)ptr[i + 5]) << 0) |
1189
+ (((uint32_t)ptr[i + 4]) << 8) |
1190
+ (((uint32_t)ptr[i + 3]) << 16) |
1191
+ (((uint32_t)ptr[i + 2]) << 24) |
1192
+ 0) | ((uint64_t)(
1193
+ (((uint32_t)ptr[i + 1]) << 0) |
1194
+ (((uint32_t)ptr[i + 0]) << 8) |
1195
+ 0) << 32);
1084
1196
  }
1085
1197
 
1086
- static void
1087
- append_int64_be(VALUE rstr, int64_t v)
1198
+ static int64_t
1199
+ get_sint48_be(VALUE rstr, VALUE ri)
1088
1200
  {
1089
- char a[8] = {(v >> 56) & 255, (v >> 48) & 255, (v >> 40) & 255, (v >> 32) & 255,
1090
- (v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255, v & 255};
1091
- rb_str_cat(rstr, a, 8);
1201
+ int64_t res = (int64_t)get_int48_be(rstr, ri);
1202
+ return res - ((res >> 47) << 48);
1092
1203
  }
1093
1204
 
1094
- static int
1095
- append_ber(VALUE rstr, uint64_t ber)
1205
+ static VALUE
1206
+ rb_get_int48_be(int argc, VALUE *argv, VALUE self)
1096
1207
  {
1097
- int i = 10;
1098
- char a[11] = {128, 128, 128, 128,
1099
- 128, 128 ,128 ,128,
1100
- 128, 128, 0};
1101
- do {
1102
- a[i] += ber % 128;
1103
- ber /= 128;
1104
- i--;
1105
- } while (ber);
1106
- i++;
1107
- rb_str_cat(rstr, a+i, 11-i);
1108
-
1109
- return 11-i;
1208
+ return I642NUM(get_int48_be(argv[0], check_argc(argc, argv)));
1110
1209
  }
1111
1210
 
1112
- typedef struct append_args {
1113
- VALUE str;
1114
- int argc;
1115
- VALUE *argv;
1116
- } append_args;
1211
+ static VALUE
1212
+ rb_get_sint48_be(int argc, VALUE *argv, VALUE self)
1213
+ {
1214
+ return I642NUM(get_sint48_be(argv[0], check_argc(argc, argv)));
1215
+ }
1117
1216
 
1118
- typedef struct append_args2 {
1119
- VALUE str;
1120
- int argc;
1121
- VALUE *argv;
1122
- VALUE int0;
1123
- } append_args2;
1217
+ static VALUE
1218
+ rb_slice_int48_be(VALUE self, VALUE rstr)
1219
+ {
1220
+ uint64_t res = get_int48_be(rstr, INT2FIX(0));
1221
+ rb_str_drop_bytes(rstr, 6);
1222
+ return I642NUM(res);
1223
+ }
1124
1224
 
1125
- static void
1126
- check_argc_append(int argc, VALUE *argv, append_args *args, int bits)
1225
+ static VALUE
1226
+ rb_slice_sint48_be(VALUE self, VALUE rstr)
1127
1227
  {
1128
- if (argc < 1) {
1129
- rb_raise(rb_eArgError, "accepts at least 1 argument: (string[, *int%ds])", bits);
1130
- }
1131
- args->str = RTEST(argv[0]) ? argv[0] : rb_str_new(0, 0);
1132
- if (argc == 2 && TYPE(argv[1]) == T_ARRAY) {
1133
- args->argc = RARRAY_LEN(argv[1]);
1134
- args->argv = RARRAY_PTR(argv[1]);
1135
- }
1136
- else {
1137
- args->argc = argc-1;
1138
- args->argv = argv+1;
1139
- }
1228
+ uint64_t res = get_sint48_be(rstr, INT2FIX(0));
1229
+ rb_str_drop_bytes(rstr, 6);
1230
+ return I642NUM(res);
1140
1231
  }
1141
1232
 
1142
1233
  static void
1143
- check_argc_append_2(int argc, VALUE *argv, append_args2 *args, int bits, int bits1)
1234
+ append_int48_be(VALUE rstr, int64_t v)
1144
1235
  {
1145
- if (argc < 2) {
1146
- rb_raise(rb_eArgError, "accepts at least 2 arguments: (string, int%d[, *int%ds])", bits, bits1);
1147
- }
1148
- args->str = RTEST(argv[0]) ? argv[0] : rb_str_new(0, 0);
1149
- args->int0 = argv[1];
1150
- if (argc == 3 && TYPE(argv[2]) == T_ARRAY) {
1151
- args->argc = RARRAY_LEN(argv[2]);
1152
- args->argv = RARRAY_PTR(argv[2]);
1153
- }
1154
- else {
1155
- args->argc = argc-2;
1156
- args->argv = argv+2;
1157
- }
1236
+ char a[] = {
1237
+ (v >> 40) & 0xff,
1238
+ (v >> 32) & 0xff,
1239
+ (v >> 24) & 0xff,
1240
+ (v >> 16) & 0xff,
1241
+ (v >> 8) & 0xff,
1242
+ (v >> 0) & 0xff,
1243
+ 0
1244
+ };
1245
+ rb_str_cat(rstr, a, 6);
1158
1246
  }
1159
1247
 
1160
- /*** 32BIT **/
1161
1248
  static VALUE
1162
- append_var_int8(int argc, VALUE* argv, VALUE str)
1249
+ append_var_int48_be(int argc, VALUE* argv, VALUE str)
1163
1250
  {
1164
1251
  int i;
1165
1252
  for(i = 0; i < argc; i++) {
1166
- append_int8(str, NUM2INT(argv[i]));
1253
+
1254
+ append_int48_be(str, NUM2I64(argv[i]));
1255
+
1167
1256
  }
1168
1257
  return str;
1169
1258
  }
1170
- #define append_var_int8_le append_var_int8
1171
- #define append_var_int8_be append_var_int8
1172
1259
 
1173
1260
  static VALUE
1174
- append_var_int16_le(int argc, VALUE* argv, VALUE str)
1261
+ rb_append_int48_be(int argc, VALUE* argv, VALUE self)
1175
1262
  {
1176
- int i;
1177
- for(i = 0; i < argc; i++) {
1178
- append_int16_le(str, NUM2INT(argv[i]));
1179
- }
1180
- return str;
1263
+ append_args args;
1264
+ check_argc_append(argc, argv, &args, 48);
1265
+ return append_var_int48_be(args.argc, args.argv, args.str);
1266
+ }
1267
+
1268
+ static uint64_t
1269
+ get_int56_be(VALUE rstr, VALUE ri)
1270
+ {
1271
+ long i = NUM2LONG(ri);
1272
+ const uint8_t *ptr;
1273
+ StringValue(rstr);
1274
+ i = check_size(i, RSTRING_LEN(rstr), 7);
1275
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
1276
+ return (uint64_t)(
1277
+ (((uint32_t)ptr[i + 6]) << 0) |
1278
+ (((uint32_t)ptr[i + 5]) << 8) |
1279
+ (((uint32_t)ptr[i + 4]) << 16) |
1280
+ (((uint32_t)ptr[i + 3]) << 24) |
1281
+ 0) | ((uint64_t)(
1282
+ (((uint32_t)ptr[i + 2]) << 0) |
1283
+ (((uint32_t)ptr[i + 1]) << 8) |
1284
+ (((uint32_t)ptr[i + 0]) << 16) |
1285
+ 0) << 32);
1286
+ }
1287
+
1288
+ static int64_t
1289
+ get_sint56_be(VALUE rstr, VALUE ri)
1290
+ {
1291
+ int64_t res = (int64_t)get_int56_be(rstr, ri);
1292
+ return res - ((res >> 55) << 56);
1181
1293
  }
1182
1294
 
1183
1295
  static VALUE
1184
- append_var_int24_le(int argc, VALUE* argv, VALUE str)
1296
+ rb_get_int56_be(int argc, VALUE *argv, VALUE self)
1185
1297
  {
1186
- int i;
1187
- for(i = 0; i < argc; i++) {
1188
- append_int24_le(str, NUM2INT(argv[i]));
1189
- }
1190
- return str;
1298
+ return I642NUM(get_int56_be(argv[0], check_argc(argc, argv)));
1191
1299
  }
1192
1300
 
1193
1301
  static VALUE
1194
- append_var_int32_le(int argc, VALUE* argv, VALUE str)
1302
+ rb_get_sint56_be(int argc, VALUE *argv, VALUE self)
1195
1303
  {
1196
- int i;
1197
- for(i = 0; i < argc; i++) {
1198
- append_int32_le(str, (int32_t)NUM2I64(argv[i]));
1199
- }
1200
- return str;
1304
+ return I642NUM(get_sint56_be(argv[0], check_argc(argc, argv)));
1201
1305
  }
1202
1306
 
1203
1307
  static VALUE
1204
- append_var_int16_be(int argc, VALUE* argv, VALUE str)
1308
+ rb_slice_int56_be(VALUE self, VALUE rstr)
1205
1309
  {
1206
- int i;
1207
- for(i = 0; i < argc; i++) {
1208
- append_int16_be(str, NUM2INT(argv[i]));
1209
- }
1210
- return str;
1310
+ uint64_t res = get_int56_be(rstr, INT2FIX(0));
1311
+ rb_str_drop_bytes(rstr, 7);
1312
+ return I642NUM(res);
1211
1313
  }
1212
1314
 
1213
1315
  static VALUE
1214
- append_var_int24_be(int argc, VALUE* argv, VALUE str)
1316
+ rb_slice_sint56_be(VALUE self, VALUE rstr)
1215
1317
  {
1216
- int i;
1217
- for(i = 0; i < argc; i++) {
1218
- append_int24_be(str, NUM2INT(argv[i]));
1219
- }
1220
- return str;
1318
+ uint64_t res = get_sint56_be(rstr, INT2FIX(0));
1319
+ rb_str_drop_bytes(rstr, 7);
1320
+ return I642NUM(res);
1321
+ }
1322
+
1323
+ static void
1324
+ append_int56_be(VALUE rstr, int64_t v)
1325
+ {
1326
+ char a[] = {
1327
+ (v >> 48) & 0xff,
1328
+ (v >> 40) & 0xff,
1329
+ (v >> 32) & 0xff,
1330
+ (v >> 24) & 0xff,
1331
+ (v >> 16) & 0xff,
1332
+ (v >> 8) & 0xff,
1333
+ (v >> 0) & 0xff,
1334
+ 0
1335
+ };
1336
+ rb_str_cat(rstr, a, 7);
1221
1337
  }
1222
1338
 
1223
1339
  static VALUE
1224
- append_var_int32_be(int argc, VALUE* argv, VALUE str)
1340
+ append_var_int56_be(int argc, VALUE* argv, VALUE str)
1225
1341
  {
1226
1342
  int i;
1227
1343
  for(i = 0; i < argc; i++) {
1228
- append_int32_be(str, (int32_t)NUM2I64(argv[i]));
1344
+
1345
+ append_int56_be(str, NUM2I64(argv[i]));
1346
+
1229
1347
  }
1230
1348
  return str;
1231
1349
  }
1232
- /*** 32BIT END ***/
1233
1350
 
1234
- /*** 64BIT ***/
1235
1351
  static VALUE
1236
- append_var_int40_le(int argc, VALUE* argv, VALUE str)
1352
+ rb_append_int56_be(int argc, VALUE* argv, VALUE self)
1237
1353
  {
1238
- int i;
1239
- for(i = 0; i < argc; i++) {
1240
- append_int40_le(str, NUM2I64(argv[i]));
1241
- }
1242
- return str;
1354
+ append_args args;
1355
+ check_argc_append(argc, argv, &args, 56);
1356
+ return append_var_int56_be(args.argc, args.argv, args.str);
1357
+ }
1358
+
1359
+ static uint64_t
1360
+ get_int64_be(VALUE rstr, VALUE ri)
1361
+ {
1362
+ long i = NUM2LONG(ri);
1363
+ const uint8_t *ptr;
1364
+ StringValue(rstr);
1365
+ i = check_size(i, RSTRING_LEN(rstr), 8);
1366
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
1367
+ return (uint64_t)(
1368
+ (((uint32_t)ptr[i + 7]) << 0) |
1369
+ (((uint32_t)ptr[i + 6]) << 8) |
1370
+ (((uint32_t)ptr[i + 5]) << 16) |
1371
+ (((uint32_t)ptr[i + 4]) << 24) |
1372
+ 0) | ((uint64_t)(
1373
+ (((uint32_t)ptr[i + 3]) << 0) |
1374
+ (((uint32_t)ptr[i + 2]) << 8) |
1375
+ (((uint32_t)ptr[i + 1]) << 16) |
1376
+ (((uint32_t)ptr[i + 0]) << 24) |
1377
+ 0) << 32);
1378
+ }
1379
+
1380
+ static int64_t
1381
+ get_sint64_be(VALUE rstr, VALUE ri)
1382
+ {
1383
+ int64_t res = (int64_t)get_int64_be(rstr, ri);
1384
+ return res;
1243
1385
  }
1244
1386
 
1245
1387
  static VALUE
1246
- append_var_int48_le(int argc, VALUE* argv, VALUE str)
1388
+ rb_get_int64_be(int argc, VALUE *argv, VALUE self)
1247
1389
  {
1248
- int i;
1249
- for(i = 0; i < argc; i++) {
1250
- append_int48_le(str, NUM2I64(argv[i]));
1251
- }
1252
- return str;
1390
+ return U642NUM(get_int64_be(argv[0], check_argc(argc, argv)));
1253
1391
  }
1254
1392
 
1255
1393
  static VALUE
1256
- append_var_int56_le(int argc, VALUE* argv, VALUE str)
1394
+ rb_get_sint64_be(int argc, VALUE *argv, VALUE self)
1257
1395
  {
1258
- int i;
1259
- for(i = 0; i < argc; i++) {
1260
- append_int56_le(str, NUM2I64(argv[i]));
1261
- }
1262
- return str;
1396
+ return I642NUM(get_sint64_be(argv[0], check_argc(argc, argv)));
1263
1397
  }
1264
1398
 
1265
1399
  static VALUE
1266
- append_var_int64_le(int argc, VALUE* argv, VALUE str)
1400
+ rb_slice_int64_be(VALUE self, VALUE rstr)
1267
1401
  {
1268
- int i;
1269
- for(i = 0; i < argc; i++) {
1270
- append_int64_le(str, safe_int64_t(argv[i]));
1271
- }
1272
- return str;
1402
+ uint64_t res = get_int64_be(rstr, INT2FIX(0));
1403
+ rb_str_drop_bytes(rstr, 8);
1404
+ return U642NUM(res);
1273
1405
  }
1274
1406
 
1275
1407
  static VALUE
1276
- append_var_int40_be(int argc, VALUE* argv, VALUE str)
1408
+ rb_slice_sint64_be(VALUE self, VALUE rstr)
1277
1409
  {
1278
- int i;
1279
- for(i = 0; i < argc; i++) {
1280
- append_int40_be(str, NUM2I64(argv[i]));
1281
- }
1282
- return str;
1410
+ uint64_t res = get_sint64_be(rstr, INT2FIX(0));
1411
+ rb_str_drop_bytes(rstr, 8);
1412
+ return I642NUM(res);
1413
+ }
1414
+
1415
+ static void
1416
+ append_int64_be(VALUE rstr, int64_t v)
1417
+ {
1418
+ char a[] = {
1419
+ (v >> 56) & 0xff,
1420
+ (v >> 48) & 0xff,
1421
+ (v >> 40) & 0xff,
1422
+ (v >> 32) & 0xff,
1423
+ (v >> 24) & 0xff,
1424
+ (v >> 16) & 0xff,
1425
+ (v >> 8) & 0xff,
1426
+ (v >> 0) & 0xff,
1427
+ 0
1428
+ };
1429
+ rb_str_cat(rstr, a, 8);
1283
1430
  }
1284
1431
 
1285
1432
  static VALUE
1286
- append_var_int48_be(int argc, VALUE* argv, VALUE str)
1433
+ append_var_int64_be(int argc, VALUE* argv, VALUE str)
1287
1434
  {
1288
1435
  int i;
1289
1436
  for(i = 0; i < argc; i++) {
1290
- append_int48_be(str, NUM2I64(argv[i]));
1437
+
1438
+ append_int64_be(str, safe_int64_t(argv[i]));
1439
+
1291
1440
  }
1292
1441
  return str;
1293
1442
  }
1294
1443
 
1295
1444
  static VALUE
1296
- append_var_int56_be(int argc, VALUE* argv, VALUE str)
1445
+ rb_append_int64_be(int argc, VALUE* argv, VALUE self)
1297
1446
  {
1298
- int i;
1299
- for(i = 0; i < argc; i++) {
1300
- append_int56_be(str, NUM2I64(argv[i]));
1447
+ append_args args;
1448
+ check_argc_append(argc, argv, &args, 64);
1449
+ return append_var_int64_be(args.argc, args.argv, args.str);
1450
+ }
1451
+
1452
+
1453
+ /* BER */
1454
+ static uint64_t
1455
+ parse_ber(const uint8_t *ptr, long max, long *i)
1456
+ {
1457
+ uint64_t res = 0;
1458
+ while (1) {
1459
+ if (*ptr < 128) {
1460
+ res += *ptr;
1461
+ break;
1462
+ }
1463
+ if (res > LLU(0xFFFFFFFFFFFFFFFF) / 128) {
1464
+ rb_raise(rb_eArgError, "BER integer is greater then 2**64, could not parse such big");
1465
+ }
1466
+ res = (res + ((*ptr) - 128)) * 128;
1467
+ ptr++;
1468
+ if (++(*i) >= max) {
1469
+ rb_raise(rb_eArgError, "String unexpectedly finished while parsing BER integer");
1470
+ }
1301
1471
  }
1302
- return str;
1472
+ return res;
1473
+ }
1474
+
1475
+ static uint64_t
1476
+ get_ber(VALUE rstr, VALUE ri)
1477
+ {
1478
+ long i = NUM2LONG(ri), len;
1479
+ const uint8_t *ptr;
1480
+ StringValue(rstr);
1481
+ len = RSTRING_LEN(rstr);
1482
+ i = check_size(i, len, 1);
1483
+ ptr = (const uint8_t*)RSTRING_PTR(rstr) + i;
1484
+ return parse_ber(ptr, len, &i);
1303
1485
  }
1304
1486
 
1305
1487
  static VALUE
1306
- append_var_int64_be(int argc, VALUE* argv, VALUE str)
1488
+ rb_get_ber(int argc, VALUE *argv, VALUE self)
1307
1489
  {
1308
- int i;
1309
- for(i = 0; i < argc; i++) {
1310
- append_int64_be(str, safe_int64_t(argv[i]));
1311
- }
1312
- return str;
1490
+ return U642NUM(get_ber(argv[0], check_argc(argc, argv)));
1491
+ }
1492
+
1493
+ static uint64_t
1494
+ slice_ber(VALUE rstr, long *i)
1495
+ {
1496
+ long len;
1497
+ const uint8_t *ptr;
1498
+ StringValue(rstr);
1499
+ len = RSTRING_LEN(rstr);
1500
+ ptr = (const uint8_t*)RSTRING_PTR(rstr);
1501
+ return parse_ber(ptr, len, i);
1313
1502
  }
1314
- /*** 64BIT END **/
1315
1503
 
1504
+ static VALUE
1505
+ rb_slice_ber(VALUE self, VALUE rstr)
1506
+ {
1507
+ long i = 0;
1508
+ int64_t res = slice_ber(rstr, &i);
1509
+ rb_str_drop_bytes(rstr, i+1);
1510
+ return U642NUM(res);
1511
+ }
1316
1512
 
1317
- #define append_func(type, bits) \
1318
- static VALUE \
1319
- rb_append_##type(int argc, VALUE* argv, VALUE self) \
1320
- { \
1321
- append_args args; \
1322
- check_argc_append(argc, argv, &args, bits); \
1323
- return append_var_##type(args.argc, args.argv, args.str);\
1513
+ static int
1514
+ append_ber(VALUE rstr, uint64_t ber)
1515
+ {
1516
+ int i = 10;
1517
+ char a[11] = {128, 128, 128, 128,
1518
+ 128, 128 ,128 ,128,
1519
+ 128, 128, 0};
1520
+ do {
1521
+ a[i] += ber % 128;
1522
+ ber /= 128;
1523
+ i--;
1524
+ } while (ber);
1525
+ i++;
1526
+ rb_str_cat(rstr, a+i, 11-i);
1527
+
1528
+ return 11-i;
1324
1529
  }
1325
1530
 
1326
- append_func(int8, 8)
1327
- append_func(int16_le, 16)
1328
- append_func(int24_le, 24)
1329
- append_func(int32_le, 32)
1330
- append_func(int40_le, 40)
1331
- append_func(int48_le, 48)
1332
- append_func(int56_le, 56)
1333
- append_func(int64_le, 64)
1334
- append_func(int16_be, 16)
1335
- append_func(int24_be, 24)
1336
- append_func(int32_be, 32)
1337
- append_func(int40_be, 40)
1338
- append_func(int48_be, 48)
1339
- append_func(int56_be, 56)
1340
- append_func(int64_be, 64)
1341
-
1342
- /** APPEND END **/
1343
1531
 
1344
1532
  /** APPEND BERSIZE **/
1345
1533
  #define append_bersize_func(type, bytes) \
@@ -1600,7 +1788,7 @@ Init_bin_utils()
1600
1788
  rshft = rb_intern(">>");
1601
1789
  band = rb_intern("&");
1602
1790
  #ifndef HAVE_RB_STR_DROP_BYTES
1603
- aset = rb_intern("[]=");
1791
+ aslice = rb_intern("slice!");
1604
1792
  #endif
1605
1793
 
1606
1794
  rb_define_method(mod_native, "get_ber", rb_get_ber, -1);