From 1de5d4e330563d1cfd889534ba3c81979af607b7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 21 Mar 2017 22:30:30 -0700 Subject: [PATCH] Util: Add CircleBufferWrite --- include/mgba-util/circle-buffer.h | 1 + src/util/circle-buffer.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/include/mgba-util/circle-buffer.h b/include/mgba-util/circle-buffer.h index 28d436e03..6bce02e61 100644 --- a/include/mgba-util/circle-buffer.h +++ b/include/mgba-util/circle-buffer.h @@ -29,6 +29,7 @@ int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value); int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value); int CircleBufferRead16(struct CircleBuffer* buffer, int16_t* value); int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value); +size_t CircleBufferWrite(struct CircleBuffer* buffer, const void* input, size_t length); size_t CircleBufferRead(struct CircleBuffer* buffer, void* output, size_t length); size_t CircleBufferDump(const struct CircleBuffer* buffer, void* output, size_t length); diff --git a/src/util/circle-buffer.c b/src/util/circle-buffer.c index deb426473..53a3087ed 100644 --- a/src/util/circle-buffer.c +++ b/src/util/circle-buffer.c @@ -205,6 +205,34 @@ int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) { return 4; } +size_t CircleBufferWrite(struct CircleBuffer* buffer, const void* input, size_t length) { + int8_t* data = buffer->writePtr; + if (buffer->size + length > buffer->capacity) { + return 0; + } + size_t remaining = buffer->capacity - ((int8_t*) data - (int8_t*) buffer->data); + if (length <= remaining) { + memcpy(data, input, length); + if (length == remaining) { + buffer->writePtr = buffer->data; + } else { + buffer->writePtr = (int8_t*) data + length; + } + } else { + memcpy(data, input, remaining); + memcpy(buffer->data, (int8_t*) input + remaining, length - remaining); + buffer->writePtr = (int8_t*) buffer->data + length - remaining; + } + + buffer->size += length; +#ifndef NDEBUG + if (!_checkIntegrity(buffer)) { + abort(); + } +#endif + return length; +} + size_t CircleBufferRead(struct CircleBuffer* buffer, void* output, size_t length) { int8_t* data = buffer->readPtr; if (buffer->size == 0) {