bitstruct 8.22.2__cp315-cp315-win32.whl

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.
bitstruct/bitstream.c ADDED
@@ -0,0 +1,600 @@
1
+ /**
2
+ * The MIT License (MIT)
3
+ *
4
+ * Copyright (c) 2019 Erik Moqvist
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person
7
+ * obtaining a copy of this software and associated documentation
8
+ * files (the "Software"), to deal in the Software without
9
+ * restriction, including without limitation the rights to use, copy,
10
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
11
+ * of the Software, and to permit persons to whom the Software is
12
+ * furnished to do so, subject to the following conditions:
13
+ *
14
+ * The above copyright notice and this permission notice shall be
15
+ * included in all copies or substantial portions of the Software.
16
+ *
17
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
21
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ * SOFTWARE.
25
+ */
26
+
27
+ #include <string.h>
28
+ #include "bitstream.h"
29
+
30
+ void bitstream_writer_init(struct bitstream_writer_t *self_p,
31
+ uint8_t *buf_p)
32
+ {
33
+ self_p->buf_p = buf_p;
34
+ self_p->byte_offset = 0;
35
+ self_p->bit_offset = 0;
36
+ }
37
+
38
+ int bitstream_writer_size_in_bits(struct bitstream_writer_t *self_p)
39
+ {
40
+ return (8 * self_p->byte_offset + self_p->bit_offset);
41
+ }
42
+
43
+ int bitstream_writer_size_in_bytes(struct bitstream_writer_t *self_p)
44
+ {
45
+ return (self_p->byte_offset + (self_p->bit_offset + 7) / 8);
46
+ }
47
+
48
+ void bitstream_writer_write_bit(struct bitstream_writer_t *self_p,
49
+ int value)
50
+ {
51
+ if (self_p->bit_offset == 0) {
52
+ self_p->buf_p[self_p->byte_offset] = (value << 7);
53
+ self_p->bit_offset = 1;
54
+ } else {
55
+ self_p->buf_p[self_p->byte_offset] |= (value << (8 - self_p->bit_offset - 1));
56
+
57
+ if (self_p->bit_offset == 7) {
58
+ self_p->bit_offset = 0;
59
+ self_p->byte_offset++;
60
+ } else {
61
+ self_p->bit_offset++;
62
+ }
63
+ }
64
+ }
65
+
66
+ void bitstream_writer_write_bytes(struct bitstream_writer_t *self_p,
67
+ const uint8_t *buf_p,
68
+ int length)
69
+ {
70
+ int i;
71
+ uint8_t *dst_p;
72
+
73
+ dst_p = &self_p->buf_p[self_p->byte_offset];
74
+
75
+ if (self_p->bit_offset == 0) {
76
+ memcpy(dst_p, buf_p, sizeof(uint8_t) * length);
77
+ } else {
78
+ for (i = 0; i < length; i++) {
79
+ dst_p[i] |= (buf_p[i] >> self_p->bit_offset);
80
+ dst_p[i + 1] = (uint8_t)(buf_p[i] << (8 - self_p->bit_offset));
81
+ }
82
+ }
83
+
84
+ self_p->byte_offset += length;
85
+ }
86
+
87
+ void bitstream_writer_write_u8(struct bitstream_writer_t *self_p,
88
+ uint8_t value)
89
+ {
90
+ if (self_p->bit_offset == 0) {
91
+ self_p->buf_p[self_p->byte_offset] = value;
92
+ } else {
93
+ self_p->buf_p[self_p->byte_offset] |= (value >> self_p->bit_offset);
94
+ self_p->buf_p[self_p->byte_offset + 1] =
95
+ (uint8_t)(value << (8 - self_p->bit_offset));
96
+ }
97
+
98
+ self_p->byte_offset++;
99
+ }
100
+
101
+ void bitstream_writer_write_u16(struct bitstream_writer_t *self_p,
102
+ uint16_t value)
103
+ {
104
+ if (self_p->bit_offset == 0) {
105
+ self_p->buf_p[self_p->byte_offset] = (value >> 8);
106
+ } else {
107
+ self_p->buf_p[self_p->byte_offset] |= (value >> (8 + self_p->bit_offset));
108
+ self_p->buf_p[self_p->byte_offset + 2] =
109
+ (uint8_t)(value << (8 - self_p->bit_offset));
110
+ value >>= self_p->bit_offset;
111
+ }
112
+
113
+ self_p->buf_p[self_p->byte_offset + 1] = (uint8_t)value;
114
+ self_p->byte_offset += 2;
115
+ }
116
+
117
+ void bitstream_writer_write_u32(struct bitstream_writer_t *self_p,
118
+ uint32_t value)
119
+ {
120
+ int i;
121
+
122
+ if (self_p->bit_offset == 0) {
123
+ self_p->buf_p[self_p->byte_offset] = (value >> 24);
124
+ } else {
125
+ self_p->buf_p[self_p->byte_offset] |= (value >> (24 + self_p->bit_offset));
126
+ self_p->buf_p[self_p->byte_offset + 4] =
127
+ (uint8_t)(value << (8 - self_p->bit_offset));
128
+ value >>= self_p->bit_offset;
129
+ }
130
+
131
+ for (i = 3; i > 0; i--) {
132
+ self_p->buf_p[self_p->byte_offset + i] = value;
133
+ value >>= 8;
134
+ }
135
+
136
+ self_p->byte_offset += 4;
137
+ }
138
+
139
+ void bitstream_writer_write_u64(struct bitstream_writer_t *self_p,
140
+ uint64_t value)
141
+ {
142
+ int i;
143
+
144
+
145
+ if (self_p->bit_offset == 0) {
146
+ self_p->buf_p[self_p->byte_offset] = (value >> 56);
147
+ } else {
148
+ self_p->buf_p[self_p->byte_offset] |= (value >> (56 + self_p->bit_offset));
149
+ self_p->buf_p[self_p->byte_offset + 8] =
150
+ (uint8_t)(value << (8 - self_p->bit_offset));
151
+ value >>= self_p->bit_offset;
152
+ }
153
+
154
+ for (i = 7; i > 0; i--) {
155
+ self_p->buf_p[self_p->byte_offset + i] = (uint8_t)value;
156
+ value >>= 8;
157
+ }
158
+
159
+ self_p->byte_offset += 8;
160
+ }
161
+
162
+ void bitstream_writer_write_u64_bits(struct bitstream_writer_t *self_p,
163
+ uint64_t value,
164
+ int number_of_bits)
165
+ {
166
+ int i;
167
+ int first_byte_bits;
168
+ int last_byte_bits;
169
+ int full_bytes;
170
+
171
+ if (number_of_bits == 0) {
172
+ return;
173
+ }
174
+
175
+ /* Align beginning. */
176
+ first_byte_bits = (8 - self_p->bit_offset);
177
+
178
+ if (first_byte_bits != 8) {
179
+ if (number_of_bits < first_byte_bits) {
180
+ self_p->buf_p[self_p->byte_offset] |=
181
+ (uint8_t)(value << (first_byte_bits - number_of_bits));
182
+ self_p->bit_offset += number_of_bits;
183
+ } else {
184
+ self_p->buf_p[self_p->byte_offset] |= (value >> (number_of_bits
185
+ - first_byte_bits));
186
+ self_p->byte_offset++;
187
+ self_p->bit_offset = 0;
188
+ }
189
+
190
+ number_of_bits -= first_byte_bits;
191
+
192
+ if (number_of_bits <= 0) {
193
+ return;
194
+ }
195
+ }
196
+
197
+ /* Align end. */
198
+ last_byte_bits = (number_of_bits % 8);
199
+ full_bytes = (number_of_bits / 8);
200
+
201
+ if (last_byte_bits != 0) {
202
+ self_p->buf_p[self_p->byte_offset + full_bytes] =
203
+ (uint8_t)(value << (8 - last_byte_bits));
204
+ value >>= last_byte_bits;
205
+ self_p->bit_offset = last_byte_bits;
206
+ }
207
+
208
+ /* Copy middle bytes. */
209
+ for (i = full_bytes; i > 0; i--) {
210
+ self_p->buf_p[self_p->byte_offset + i - 1] = (uint8_t)value;
211
+ value >>= 8;
212
+ }
213
+
214
+ self_p->byte_offset += full_bytes;
215
+ }
216
+
217
+ void bitstream_writer_write_repeated_bit(struct bitstream_writer_t *self_p,
218
+ int value,
219
+ int length)
220
+ {
221
+ int rest;
222
+
223
+ if (value != 0) {
224
+ value = 0xff;
225
+ }
226
+
227
+ rest = (length % 8);
228
+ bitstream_writer_write_u64_bits(self_p, value & ((1 << rest) - 1), rest);
229
+ bitstream_writer_write_repeated_u8(self_p, value, length / 8);
230
+ }
231
+
232
+ void bitstream_writer_write_repeated_u8(struct bitstream_writer_t *self_p,
233
+ uint8_t value,
234
+ int length)
235
+ {
236
+ int i;
237
+
238
+ for (i = 0; i < length; i++) {
239
+ bitstream_writer_write_u8(self_p, value);
240
+ }
241
+ }
242
+
243
+ void bitstream_writer_insert_bit(struct bitstream_writer_t *self_p,
244
+ int value)
245
+ {
246
+ struct bitstream_writer_bounds_t bounds;
247
+
248
+ bitstream_writer_bounds_save(&bounds,
249
+ self_p,
250
+ (8 * self_p->byte_offset) + self_p->bit_offset,
251
+ 1);
252
+ bitstream_writer_write_bit(self_p, value);
253
+ bitstream_writer_bounds_restore(&bounds);
254
+ }
255
+
256
+ void bitstream_writer_insert_bytes(struct bitstream_writer_t *self_p,
257
+ const uint8_t *buf_p,
258
+ int length)
259
+ {
260
+ struct bitstream_writer_bounds_t bounds;
261
+
262
+ bitstream_writer_bounds_save(&bounds,
263
+ self_p,
264
+ (8 * self_p->byte_offset) + self_p->bit_offset,
265
+ 8 * length);
266
+ bitstream_writer_write_bytes(self_p, buf_p, length);
267
+ bitstream_writer_bounds_restore(&bounds);
268
+ }
269
+
270
+ void bitstream_writer_insert_u8(struct bitstream_writer_t *self_p,
271
+ uint8_t value)
272
+ {
273
+ struct bitstream_writer_bounds_t bounds;
274
+
275
+ bitstream_writer_bounds_save(&bounds,
276
+ self_p,
277
+ (8 * self_p->byte_offset) + self_p->bit_offset,
278
+ 8);
279
+ bitstream_writer_write_u8(self_p, value);
280
+ bitstream_writer_bounds_restore(&bounds);
281
+ }
282
+
283
+ void bitstream_writer_insert_u16(struct bitstream_writer_t *self_p,
284
+ uint16_t value)
285
+ {
286
+ struct bitstream_writer_bounds_t bounds;
287
+
288
+ bitstream_writer_bounds_save(&bounds,
289
+ self_p,
290
+ (8 * self_p->byte_offset) + self_p->bit_offset,
291
+ 16);
292
+ bitstream_writer_write_u16(self_p, value);
293
+ bitstream_writer_bounds_restore(&bounds);
294
+ }
295
+
296
+ void bitstream_writer_insert_u32(struct bitstream_writer_t *self_p,
297
+ uint32_t value)
298
+ {
299
+ struct bitstream_writer_bounds_t bounds;
300
+
301
+ bitstream_writer_bounds_save(&bounds,
302
+ self_p,
303
+ (8 * self_p->byte_offset) + self_p->bit_offset,
304
+ 32);
305
+ bitstream_writer_write_u32(self_p, value);
306
+ bitstream_writer_bounds_restore(&bounds);
307
+ }
308
+
309
+ void bitstream_writer_insert_u64(struct bitstream_writer_t *self_p,
310
+ uint64_t value)
311
+ {
312
+ struct bitstream_writer_bounds_t bounds;
313
+
314
+ bitstream_writer_bounds_save(&bounds,
315
+ self_p,
316
+ (8 * self_p->byte_offset) + self_p->bit_offset,
317
+ 64);
318
+ bitstream_writer_write_u64(self_p, value);
319
+ bitstream_writer_bounds_restore(&bounds);
320
+ }
321
+
322
+ void bitstream_writer_insert_u64_bits(struct bitstream_writer_t *self_p,
323
+ uint64_t value,
324
+ int number_of_bits)
325
+ {
326
+ struct bitstream_writer_bounds_t bounds;
327
+
328
+ bitstream_writer_bounds_save(&bounds,
329
+ self_p,
330
+ (8 * self_p->byte_offset) + self_p->bit_offset,
331
+ number_of_bits);
332
+ bitstream_writer_write_u64_bits(self_p, value, number_of_bits);
333
+ bitstream_writer_bounds_restore(&bounds);
334
+ }
335
+
336
+ void bitstream_writer_seek(struct bitstream_writer_t *self_p,
337
+ int offset)
338
+ {
339
+ offset += ((8 * self_p->byte_offset) + self_p->bit_offset);
340
+ self_p->byte_offset = (offset / 8);
341
+ self_p->bit_offset = (offset % 8);
342
+ }
343
+
344
+ void bitstream_writer_bounds_save(struct bitstream_writer_bounds_t *self_p,
345
+ struct bitstream_writer_t *writer_p,
346
+ int bit_offset,
347
+ int length)
348
+ {
349
+ int number_of_bits;
350
+
351
+ self_p->writer_p = writer_p;
352
+ number_of_bits = (bit_offset % 8);
353
+
354
+ if (number_of_bits == 0) {
355
+ self_p->first_byte_offset = -1;
356
+ } else {
357
+ self_p->first_byte_offset = (bit_offset / 8);
358
+ self_p->first_byte = writer_p->buf_p[self_p->first_byte_offset];
359
+ self_p->first_byte &= (0xff00 >> number_of_bits);
360
+ }
361
+
362
+ number_of_bits = ((bit_offset + length) % 8);
363
+
364
+ if (number_of_bits == 0) {
365
+ self_p->last_byte_offset = -1;
366
+ } else {
367
+ self_p->last_byte_offset = ((bit_offset + length) / 8);
368
+ self_p->last_byte = writer_p->buf_p[self_p->last_byte_offset];
369
+ self_p->last_byte &= ~(0xff00 >> number_of_bits);
370
+ writer_p->buf_p[self_p->last_byte_offset] = 0;
371
+ }
372
+
373
+ if (self_p->first_byte_offset != -1) {
374
+ writer_p->buf_p[self_p->first_byte_offset] = 0;
375
+ }
376
+ }
377
+
378
+ void bitstream_writer_bounds_restore(struct bitstream_writer_bounds_t *self_p)
379
+ {
380
+ if (self_p->first_byte_offset != -1) {
381
+ self_p->writer_p->buf_p[self_p->first_byte_offset] |= self_p->first_byte;
382
+ }
383
+
384
+ if (self_p->last_byte_offset != -1) {
385
+ self_p->writer_p->buf_p[self_p->last_byte_offset] |= self_p->last_byte;
386
+ }
387
+ }
388
+
389
+ void bitstream_reader_init(struct bitstream_reader_t *self_p,
390
+ const uint8_t *buf_p)
391
+ {
392
+ self_p->buf_p = buf_p;
393
+ self_p->byte_offset = 0;
394
+ self_p->bit_offset = 0;
395
+ }
396
+
397
+ int bitstream_reader_read_bit(struct bitstream_reader_t *self_p)
398
+ {
399
+ int value;
400
+
401
+ if (self_p->bit_offset == 0) {
402
+ value = (self_p->buf_p[self_p->byte_offset] >> 7);
403
+ self_p->bit_offset = 1;
404
+ } else {
405
+ value = ((self_p->buf_p[self_p->byte_offset] >> (7 - self_p->bit_offset)) & 0x1);
406
+
407
+ if (self_p->bit_offset == 7) {
408
+ self_p->bit_offset = 0;
409
+ self_p->byte_offset++;
410
+ } else {
411
+ self_p->bit_offset++;
412
+ }
413
+ }
414
+
415
+ return (value);
416
+ }
417
+
418
+ void bitstream_reader_read_bytes(struct bitstream_reader_t *self_p,
419
+ uint8_t *buf_p,
420
+ int length)
421
+ {
422
+ int i;
423
+ const uint8_t *src_p;
424
+
425
+ src_p = &self_p->buf_p[self_p->byte_offset];
426
+
427
+ if (self_p->bit_offset == 0) {
428
+ memcpy(buf_p, src_p, sizeof(uint8_t) * length);
429
+ } else {
430
+ for (i = 0; i < length; i++) {
431
+ buf_p[i] = (src_p[i] << self_p->bit_offset);
432
+ buf_p[i] |= (src_p[i + 1] >> (8 - self_p->bit_offset));
433
+ }
434
+ }
435
+
436
+ self_p->byte_offset += length;
437
+ }
438
+
439
+ uint8_t bitstream_reader_read_u8(struct bitstream_reader_t *self_p)
440
+ {
441
+ uint8_t value;
442
+
443
+ value = (self_p->buf_p[self_p->byte_offset] << self_p->bit_offset);
444
+ self_p->byte_offset++;
445
+
446
+ if (self_p->bit_offset != 0) {
447
+ value |= (self_p->buf_p[self_p->byte_offset] >> (8 - self_p->bit_offset));
448
+ }
449
+
450
+ return (value);
451
+ }
452
+
453
+ uint16_t bitstream_reader_read_u16(struct bitstream_reader_t *self_p)
454
+ {
455
+ uint16_t value;
456
+ int i;
457
+ int offset;
458
+ const uint8_t *src_p;
459
+
460
+ src_p = &self_p->buf_p[self_p->byte_offset];
461
+ offset = (16 + self_p->bit_offset);
462
+ value = 0;
463
+
464
+ for (i = 0; i < 2; i++) {
465
+ offset -= 8;
466
+ value |= ((uint16_t)src_p[i] << offset);
467
+ }
468
+
469
+ if (offset != 0) {
470
+ value |= (src_p[2] >> (8 - offset));
471
+ }
472
+
473
+ self_p->byte_offset += 2;
474
+
475
+ return (value);
476
+ }
477
+
478
+ uint32_t bitstream_reader_read_u32(struct bitstream_reader_t *self_p)
479
+ {
480
+ uint32_t value;
481
+ int i;
482
+ int offset;
483
+ const uint8_t *src_p;
484
+
485
+ src_p = &self_p->buf_p[self_p->byte_offset];
486
+ offset = (32 + self_p->bit_offset);
487
+ value = 0;
488
+
489
+ for (i = 0; i < 4; i++) {
490
+ offset -= 8;
491
+ value |= ((uint32_t)src_p[i] << offset);
492
+ }
493
+
494
+ if (offset != 0) {
495
+ value |= (src_p[4] >> (8 - offset));
496
+ }
497
+
498
+ self_p->byte_offset += 4;
499
+
500
+ return (value);
501
+ }
502
+
503
+ uint64_t bitstream_reader_read_u64(struct bitstream_reader_t *self_p)
504
+ {
505
+ uint64_t value;
506
+ int i;
507
+ int offset;
508
+ const uint8_t *src_p;
509
+
510
+ src_p = &self_p->buf_p[self_p->byte_offset];
511
+ offset = (64 + self_p->bit_offset);
512
+ value = 0;
513
+
514
+ for (i = 0; i < 8; i++) {
515
+ offset -= 8;
516
+ value |= ((uint64_t)src_p[i] << offset);
517
+ }
518
+
519
+ if (offset != 0) {
520
+ value |= ((uint64_t)src_p[8] >> (8 - offset));
521
+ }
522
+
523
+ self_p->byte_offset += 8;
524
+
525
+ return (value);
526
+ }
527
+
528
+ uint64_t bitstream_reader_read_u64_bits(struct bitstream_reader_t *self_p,
529
+ int number_of_bits)
530
+ {
531
+ uint64_t value;
532
+ int i;
533
+ int first_byte_bits;
534
+ int last_byte_bits;
535
+ int full_bytes;
536
+
537
+ if (number_of_bits == 0) {
538
+ return (0);
539
+ }
540
+
541
+ /* Align beginning. */
542
+ first_byte_bits = (8 - self_p->bit_offset);
543
+
544
+ if (first_byte_bits != 8) {
545
+ if (number_of_bits < first_byte_bits) {
546
+ value = (self_p->buf_p[self_p->byte_offset] >> (first_byte_bits
547
+ - number_of_bits));
548
+ value &= ((1 << number_of_bits) - 1);
549
+ self_p->bit_offset += number_of_bits;
550
+ } else {
551
+ value = self_p->buf_p[self_p->byte_offset];
552
+ value &= ((1 << first_byte_bits) - 1);
553
+ self_p->byte_offset++;
554
+ self_p->bit_offset = 0;
555
+ }
556
+
557
+ number_of_bits -= first_byte_bits;
558
+
559
+ if (number_of_bits <= 0) {
560
+ return (value);
561
+ }
562
+ } else {
563
+ value = 0;
564
+ }
565
+
566
+ /* Copy middle bytes. */
567
+ full_bytes = (number_of_bits / 8);
568
+
569
+ for (i = 0; i < full_bytes; i++) {
570
+ value <<= 8;
571
+ value |= self_p->buf_p[self_p->byte_offset + i];
572
+ }
573
+
574
+ /* Last byte. */
575
+ last_byte_bits = (number_of_bits % 8);
576
+
577
+ if (last_byte_bits != 0) {
578
+ value <<= last_byte_bits;
579
+ value |= (self_p->buf_p[self_p->byte_offset + full_bytes]
580
+ >> (8 - last_byte_bits));
581
+ self_p->bit_offset = last_byte_bits;
582
+ }
583
+
584
+ self_p->byte_offset += full_bytes;
585
+
586
+ return (value);
587
+ }
588
+
589
+ void bitstream_reader_seek(struct bitstream_reader_t *self_p,
590
+ int offset)
591
+ {
592
+ offset += ((8 * self_p->byte_offset) + self_p->bit_offset);
593
+ self_p->byte_offset = (offset / 8);
594
+ self_p->bit_offset = (offset % 8);
595
+ }
596
+
597
+ int bitstream_reader_tell(struct bitstream_reader_t *self_p)
598
+ {
599
+ return ((8 * self_p->byte_offset) + self_p->bit_offset);
600
+ }