X-Git-Url: https://git.sesse.net/?p=fjl;a=blobdiff_plain;f=input.c;h=6bcfd3a03192ccfe9f96d8120006f291c570435c;hp=6c4630f075a4fee47751a149752ac415d10f7d6d;hb=a4009687c73083dd0290285a065740a83e27e855;hpb=f6111465adacc2840f4cd25d55b3017cbf0593b2 diff --git a/input.c b/input.c index 6c4630f..6bcfd3a 100644 --- a/input.c +++ b/input.c @@ -1,35 +1,14 @@ #include #include -#include -#include +#include #include "input.h" -#define MARKER_CHAR 0xff -#define STUFF_MARKER 0x00 - -void init_bit_source(struct bit_source* source, input_func_t* input_func, void* userdata) -{ - memset(source, 0, sizeof(*source)); - source->bytes = (uint8_t*)malloc(BYTERESERVOIR_SIZE); - source->input_func = input_func; - source->userdata = userdata; -} - -void possibly_refill_slow_path(struct bit_source* source, unsigned num_bits) +void reliable_read(raw_input_func_t* input_func, void* userdata, uint8_t* buf, size_t len) { - // First, make sure there's stuff in the byte reservoir if we can. - assert(source->bytes_available <= BYTERESERVOIR_SIZE); - - // 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; - const ssize_t bytes_read = - (*source->input_func)(source->userdata, - source->bytes + source->bytes_available, - bytes_to_read); - assert(bytes_read <= (ssize_t)bytes_to_read); - assert(bytes_read >= (ssize_t)-1); + while (len > 0) { + ssize_t bytes_read = input_func(userdata, buf, len); + assert(bytes_read <= (ssize_t)len); // TODO: We need better error handling here. setjmp()/longjmp() // should hopefully do the trick, but we need to take care for @@ -42,18 +21,23 @@ void possibly_refill_slow_path(struct bit_source* source, unsigned num_bits) fprintf(stderr, "Premature EOF\n"); exit(1); } - - source->bytes_available += bytes_read; - } - // Fill the bit reservoir one by one byte until we have enough. - 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; - --source->bytes_available; - source->bits |= ((bitreservoir_t)byte << (BITRESERVOIR_SIZE - source->bits_available - 8)); - source->bits_available += 8; + buf += bytes_read; + len -= bytes_read; } } + +uint8_t read_uint8(raw_input_func_t* input_func, void* userdata) +{ + uint8_t ret; + reliable_read(input_func, userdata, &ret, 1); + return ret; +} + +uint16_t read_uint16(raw_input_func_t* input_func, void* userdata) +{ + uint8_t buf[2]; + reliable_read(input_func, userdata, buf, 2); + return (buf[0] << 8) | buf[1]; +} +