X-Git-Url: https://git.sesse.net/?p=fjl;a=blobdiff_plain;f=bitsource.c;h=6cc627c70b08b462b0d0c9c7e0a4ec3d25cdceed;hp=72b143bf7092b666669b3eafb19baf1b7d3bd670;hb=ddc3c24c837f081787825d128675eca628d0e91c;hpb=0b02847989970a190c2cfaec4d1abaa1f616284a diff --git a/bitsource.c b/bitsource.c index 72b143b..6cc627c 100644 --- a/bitsource.c +++ b/bitsource.c @@ -12,15 +12,20 @@ void init_bit_source(struct bit_source* source, input_func_t* input_func, void* { memset(source, 0, sizeof(*source)); source->bytes = (uint8_t*)malloc(BYTERESERVOIR_SIZE); + source->byte_read_ptr = source->bytes; source->input_func = input_func; source->userdata = userdata; } void possibly_refill_slow_path(struct bit_source* source, unsigned num_bits) { - // First, make sure there's stuff in the byte reservoir if we can. + // First, move out the data we already read. assert(source->bytes_available <= BYTERESERVOIR_SIZE); + assert(source->byte_read_ptr >= source->bytes); + memmove(source->bytes, source->byte_read_ptr, source->bytes_available); + source->byte_read_ptr = source->bytes; + // Then, make sure there's stuff in the byte reservoir if we can. // Read data from the source until we have enough to satisfy the request. while (source->bits_available + 8 * source->bytes_available < num_bits) { const size_t bytes_to_read = BYTERESERVOIR_SIZE - source->bytes_available; @@ -50,8 +55,8 @@ void possibly_refill_slow_path(struct bit_source* source, unsigned num_bits) while (source->bits_available < num_bits) { assert(source->bytes_available > 0); assert(source->bits_available + 8 <= BITRESERVOIR_SIZE); - uint8_t byte = *(source->bytes); - ++source->bytes; + uint8_t byte = *(source->byte_read_ptr); + ++source->byte_read_ptr; --source->bytes_available; source->bits |= ((bitreservoir_t)byte << (BITRESERVOIR_SIZE - source->bits_available - 8)); source->bits_available += 8;