mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-07-23 23:52:44 +00:00
119 lines
2.8 KiB
C
119 lines
2.8 KiB
C
#include "ringbuffer.h"
|
|
#include <stdlib.h>
|
|
|
|
RingBuffer *RingBuf_create(int capacity) {
|
|
RingBuffer *buffer = (RingBuffer *)calloc(sizeof(RingBuffer), sizeof(uint8_t));
|
|
if (!buffer) {
|
|
return NULL;
|
|
}
|
|
|
|
buffer->data = (uint8_t *)calloc(capacity, sizeof(uint8_t));
|
|
if (!buffer->data) {
|
|
free(buffer);
|
|
return NULL;
|
|
}
|
|
|
|
buffer->capacity = capacity;
|
|
buffer->size = 0;
|
|
buffer->front = 0;
|
|
buffer->rear = 0;
|
|
|
|
return buffer;
|
|
}
|
|
|
|
inline bool RingBuf_isFull(RingBuffer *buffer) {
|
|
return buffer->size == buffer->capacity;
|
|
}
|
|
|
|
inline bool RingBuf_isEmpty(RingBuffer *buffer) {
|
|
return buffer->size == 0;
|
|
}
|
|
|
|
bool RingBuf_enqueue(RingBuffer *buffer, uint8_t value) {
|
|
if (RingBuf_isFull(buffer)) {
|
|
return false;
|
|
}
|
|
|
|
buffer->data[buffer->rear] = value;
|
|
buffer->rear = (buffer->rear + 1) % buffer->capacity;
|
|
buffer->size++;
|
|
return true;
|
|
}
|
|
|
|
bool RingBuf_dequeue(RingBuffer *buffer, uint8_t *value) {
|
|
if (RingBuf_isEmpty(buffer)) {
|
|
return false;
|
|
}
|
|
|
|
*value = buffer->data[buffer->front];
|
|
buffer->front = (buffer->front + 1) % buffer->capacity;
|
|
buffer->size--;
|
|
return true;
|
|
}
|
|
|
|
int RingBuf_enqueueBatch(RingBuffer *buffer, const uint8_t *values, int count) {
|
|
int processed = 0;
|
|
|
|
if (RingBuf_getAvailableSize(buffer) < count) {
|
|
count = RingBuf_getAvailableSize(buffer);
|
|
}
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
buffer->data[buffer->rear] = values[i];
|
|
buffer->rear = (buffer->rear + 1) % buffer->capacity;
|
|
processed++;
|
|
}
|
|
|
|
buffer->size += processed;
|
|
|
|
return processed;
|
|
}
|
|
|
|
int RingBuf_dequeueBatch(RingBuffer *buffer, uint8_t *values, int count) {
|
|
int processed = 0;
|
|
|
|
if (buffer->size < count) {
|
|
count = buffer->size;
|
|
}
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
values[i] = buffer->data[buffer->front];
|
|
buffer->front = (buffer->front + 1) % buffer->capacity;
|
|
processed++;
|
|
}
|
|
|
|
buffer->size -= processed;
|
|
|
|
return processed;
|
|
}
|
|
|
|
inline int RingBuf_getUsedSize(RingBuffer *buffer) {
|
|
return buffer->size;
|
|
}
|
|
|
|
inline int RingBuf_getAvailableSize(RingBuffer *buffer) {
|
|
return (buffer->capacity) - (buffer->size);
|
|
}
|
|
|
|
void RingBuf_destroy(RingBuffer *buffer) {
|
|
if (buffer != NULL)
|
|
free(buffer->data);
|
|
free(buffer);
|
|
}
|
|
|
|
inline int RingBuf_getContinousAvailableSize(RingBuffer *buffer) {
|
|
const int availableSize = RingBuf_getAvailableSize(buffer);
|
|
const int continousSize = (buffer->capacity) - (buffer->rear);
|
|
return (availableSize < continousSize) ? availableSize : continousSize;
|
|
}
|
|
|
|
inline void RingBuf_postEnqueueBatch(RingBuffer *buffer, int count) {
|
|
// no check there
|
|
buffer->rear = (buffer->rear + count) % buffer->capacity;
|
|
buffer->size += count;
|
|
}
|
|
|
|
inline uint8_t *RingBuf_getRearPtr(RingBuffer *buffer) {
|
|
return buffer->data + buffer->rear;
|
|
}
|