From f61544ef710611cf351ce806c6c62f0e2d98727f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 3 Jan 2009 11:34:50 +0100 Subject: [PATCH] byte_source_read_marker() needs to refill. --- bytesource.c | 31 ++++++++++++++++++++++++------- bytesource.h | 3 +++ 2 files changed, 27 insertions(+), 7 deletions(-) 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; } diff --git a/bytesource.h b/bytesource.h index 4e9e307..bb934fb 100644 --- a/bytesource.h +++ b/bytesource.h @@ -19,7 +19,10 @@ struct byte_source { void* userdata; }; void init_byte_source(struct byte_source* source, raw_input_func_t* input_func, void* userdata); + +// Returns 0x00 if no marker was available (ie. error). uint8_t byte_source_read_marker(struct byte_source* source); + ssize_t byte_source_input_func(void* source, uint8_t* buf, size_t len); #endif /* !defined(_BYTESOURCE_H) */ -- 2.39.2