mirror of https://github.com/mgba-emu/mgba.git
Util: Add CircleBufferWrite
This commit is contained in:
parent
ab663a24a8
commit
1de5d4e330
|
@ -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);
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue