improve buf_bit_{reader,writer} implementation
authorGeoffrey Allott <geoffrey@allott.email>
Sun, 31 Jul 2022 21:56:48 +0000 (22:56 +0100)
committerGeoffrey Allott <geoffrey@allott.email>
Sun, 31 Jul 2022 21:56:48 +0000 (22:56 +0100)
src/tans_bit_writer.h
src/tans_buf_bit_reader.c
src/tans_buf_bit_writer.c

index 119c1388b405b3f99aaa55c762945c0d05c47e02..e21e84281627db2d85ce6b3b2da4a1c81b728c50 100644 (file)
@@ -5,7 +5,7 @@
 struct tans_bit_writer;
 
 struct tans_bit_writer_ops {
-    uint16_t (*write)(struct tans_bit_writer *self, uint16_t value, uint8_t bits);
+    uint16_t (*write)(struct tans_bit_writer *self, uint32_t value, uint8_t bits);
 };
 
 struct tans_bit_writer {
index e120ee001a4126c8498156942a59d96dd7c16557..a67f4e3ee33109a73b613d68621124ad0426f134 100644 (file)
@@ -5,10 +5,7 @@ static uint16_t tans_buf_bit_reader_read(struct tans_bit_reader *reader, uint8_t
     struct tans_buf_bit_reader *self = (struct tans_buf_bit_reader *) reader;
     uint32_t bit = self->bit % 8;
     uint32_t byte = self->bit / 8;
-
-    if (bits == 0) {
-        return 0;
-    }
+    uint32_t value;
 
     if (self->bit + bits > self->len * 8) {
         return (uint16_t) -1;
@@ -16,15 +13,13 @@ static uint16_t tans_buf_bit_reader_read(struct tans_bit_reader *reader, uint8_t
 
     self->bit += bits;
 
-    if (bit + bits <= 8) {
-        return (uint16_t) (((1 << bits) - 1) & (self->buf[byte] >> bit));
-    } else if (bit + bits <= 16) {
-        return (uint16_t) (((1 << bits) - 1) & ((self->buf[byte] | (self->buf[byte+1] << 8)) >> bit));
-    } else if (bit + bits <= 24) {
-        return (uint16_t) (((1 << bits) - 1) & ((self->buf[byte] | (self->buf[byte+1] << 8) | (self->buf[byte+2] << 16)) >> bit));
-    } else {
-        return (uint16_t) -1;
-    }
+    value = self->buf[byte];
+    if (bit + bits > 8) value |= (uint32_t) self->buf[byte+1] << 8;
+    if (bit + bits > 16) value |= (uint32_t) self->buf[byte+2] << 16;
+    value >>= bit;
+    value &= (uint16_t) ((1 << bits) - 1);
+
+    return (uint16_t) value;
 }
 
 static const struct tans_bit_reader_ops vtable = {
index 20186a1bacafb16c5f5d6f6eb32b5237f06db363..48907a185a8af62ecbbb050fd83a733e4f1e80f5 100644 (file)
@@ -1,36 +1,24 @@
 #include "tans_buf_bit_writer.h"
 
-static uint16_t tans_buf_bit_writer_write(struct tans_bit_writer *writer, uint16_t value, uint8_t bits)
+static uint16_t tans_buf_bit_writer_write(struct tans_bit_writer *writer, uint32_t value, uint8_t bits)
 {
     struct tans_buf_bit_writer *self = (struct tans_buf_bit_writer *) writer;
     uint32_t bit = self->bit % 8;
     uint32_t byte = self->bit / 8;
 
-    if (bits == 0) {
-        return 0;
-    }
-
     if (self->bit + bits > self->len * 8) {
         return (uint16_t) -1;
     }
 
     self->bit += bits;
 
-    if (bit + bits <= 8) {
-        self->buf[byte] |= (uint8_t) ((value & ((1 << bits) - 1)) << bit);
-        return bits;
-    } else if (bit + bits <= 16) {
-        self->buf[byte] |= (uint8_t) ((value << bit) & 0xff);
-        self->buf[byte+1] |= (uint8_t) ((value & ((1 << bits) - 1)) >> (8 - bit));
-        return bits;
-    } else if (bit + bits <= 24) {
-        self->buf[byte] |= (uint8_t) ((value << bit) & 0xff);
-        self->buf[byte+1] |= (uint8_t) ((value >> (8 - bit)) & 0xff);
-        self->buf[byte+2] |= (uint8_t) ((value & ((1 << bits) - 1)) >> (16 - bit));
-        return bits;
-    } else {
-        return (uint16_t) -1;
-    }
+    value &= (uint16_t) ((1 << bits) - 1);
+    value <<= bit;
+    self->buf[byte] |= (uint8_t) value;
+    if (bit + bits > 8) self->buf[byte+1] |= (uint8_t) (value >> 8);
+    if (bit + bits > 16) self->buf[byte+2] |= (uint8_t) (value >> 16);
+
+    return bits;
 }
 
 static const struct tans_bit_writer_ops vtable = {