X-Git-Url: https://git.sesse.net/?p=fjl;a=blobdiff_plain;f=bytesource.c;fp=bytesource.c;h=9e46d20ec0fdd8411326f097e38e774399075176;hp=65d5a4482ac194a64f15bf0ac69d7870dcceae19;hb=f61544ef710611cf351ce806c6c62f0e2d98727f;hpb=6543458868bf1090c6b0bb7a088430f07d83f63b diff --git a/bytesource.c b/bytesource.c index 65d5a44..9e46d20 100644 --- a/bytesource.c +++ b/bytesource.c @@ -17,16 +17,33 @@ void init_byte_source(struct byte_source* source, raw_input_func_t* input_func, source->userdata = userdata; } -uint8_t byte_source_read_marker(struct byte_source* source) +uint8_t byte_source_read_marker(struct byte_source* src) { - assert(source->bytes_available >= 2); - assert(source->bytes[0] == MARKER_CHAR); - assert(source->bytes[1] != STUFF_MARKER); + // Refill until we have at least two bytes or EOF. + while (src->bytes_available < 2) { + const unsigned bytes_to_read = BYTESOURCE_CHUNK_SIZE - src->bytes_available; + const ssize_t bytes_read = + (*src->input_func)(src->userdata, + src->bytes + src->bytes_available, + bytes_to_read); + assert(bytes_read >= -1); + assert(bytes_read <= (ssize_t)bytes_to_read); + + if (bytes_read == -1 || bytes_read == 0) { + return 0x00; + } - uint8_t ret = source->bytes[1]; + src->bytes_available += bytes_read; + } + + assert(src->bytes_available >= 2); + if (src->bytes[0] != MARKER_CHAR || src->bytes[1] == STUFF_MARKER) { + return 0x00; + } - memmove(source->bytes, source->bytes + 2, source->bytes_available - 2); - source->bytes_available -= 2; + uint8_t ret = src->bytes[1]; + memmove(src->bytes, src->bytes + 2, src->bytes_available - 2); + src->bytes_available -= 2; return ret; }