From: Geoffrey Allott Date: Sun, 31 Jul 2022 21:56:48 +0000 (+0100) Subject: improve buf_bit_{reader,writer} implementation X-Git-Url: https://git.pointlesshacks.com/?a=commitdiff_plain;h=6ebbae91de85998107fc11546404273069d73fa0;p=tANS.git improve buf_bit_{reader,writer} implementation --- diff --git a/src/tans_bit_writer.h b/src/tans_bit_writer.h index 119c138..e21e842 100644 --- a/src/tans_bit_writer.h +++ b/src/tans_bit_writer.h @@ -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 { diff --git a/src/tans_buf_bit_reader.c b/src/tans_buf_bit_reader.c index e120ee0..a67f4e3 100644 --- a/src/tans_buf_bit_reader.c +++ b/src/tans_buf_bit_reader.c @@ -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 = { diff --git a/src/tans_buf_bit_writer.c b/src/tans_buf_bit_writer.c index 20186a1..48907a1 100644 --- a/src/tans_buf_bit_writer.c +++ b/src/tans_buf_bit_writer.c @@ -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 = {