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;
}
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) */