initial commit
This commit is contained in:
123
hx_ringbuffer.c
Normal file
123
hx_ringbuffer.c
Normal file
@@ -0,0 +1,123 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "hx_ringbuffer.h"
|
||||
|
||||
int by_ringbuf_init(by_ringbuf_t *rb, int size) {
|
||||
#ifdef BY_RINGBUF_STATIC_ALLOC
|
||||
// 使用预先分配的内存
|
||||
static uint8_t static_buffer[BY_RINGBUF_STATIC_BUFFER_SIZE];
|
||||
|
||||
if (size > sizeof(static_buffer)) {
|
||||
return -1; // 预先分配的内存不足
|
||||
}
|
||||
rb->buffer = static_buffer;
|
||||
#else
|
||||
// 使用 malloc 动态分配内存
|
||||
rb->buffer = (uint8_t *)malloc(size);
|
||||
if (rb->buffer == NULL) {
|
||||
return -1; // 分配内存失败
|
||||
}
|
||||
#endif
|
||||
|
||||
rb->size = size;
|
||||
rb->head = 0;
|
||||
rb->tail = 0;
|
||||
rb->is_full = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void by_ringbuf_free(by_ringbuf_t *rb) {
|
||||
#ifndef BY_RINGBUF_STATIC_ALLOC
|
||||
// 只有使用 malloc 分配的内存才需要释放
|
||||
if (rb->buffer) {
|
||||
free(rb->buffer);
|
||||
rb->buffer = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
rb->size = 0;
|
||||
rb->head = 0;
|
||||
rb->tail = 0;
|
||||
rb->is_full = false;
|
||||
}
|
||||
|
||||
int by_ringbuf_append(by_ringbuf_t *rb, const uint8_t *data, int len) {
|
||||
if (len > by_ringbuf_available_space(rb)) {
|
||||
return -1; // 缓冲区空间不足
|
||||
}
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
rb->buffer[rb->head] = data[i];
|
||||
rb->head = (rb->head + 1) % rb->size;
|
||||
if (rb->head == rb->tail) {
|
||||
rb->is_full = true;
|
||||
}
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int by_ringbuf_pop(by_ringbuf_t *rb, uint8_t *data, int len) {
|
||||
if (len > by_ringbuf_available_data(rb)) {
|
||||
return -1; // 数据不足
|
||||
}
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
data[i] = rb->buffer[rb->tail];
|
||||
rb->tail = (rb->tail + 1) % rb->size;
|
||||
rb->is_full = false;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int by_ringbuf_find(by_ringbuf_t *rb, const uint8_t *pattern, int pattern_len) {
|
||||
int available_data = by_ringbuf_available_data(rb);
|
||||
if (pattern_len > available_data) {
|
||||
return -1; // 数据不足,无法查找
|
||||
}
|
||||
|
||||
for (int i = 0; i <= available_data - pattern_len; i++) {
|
||||
int match = 1;
|
||||
for (int j = 0; j < pattern_len; j++) {
|
||||
int index = (rb->tail + i + j) % rb->size;
|
||||
if (rb->buffer[index] != pattern[j]) {
|
||||
match = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match) {
|
||||
return i; // 返回匹配的起始位置
|
||||
}
|
||||
}
|
||||
|
||||
return -1; // 未找到匹配
|
||||
}
|
||||
|
||||
int by_ringbuf_available_data(by_ringbuf_t *rb) {
|
||||
if (rb->is_full) {
|
||||
return rb->size;
|
||||
}
|
||||
return (rb->head - rb->tail + rb->size) % rb->size;
|
||||
}
|
||||
|
||||
int by_ringbuf_available_space(by_ringbuf_t *rb) {
|
||||
return rb->size - by_ringbuf_available_data(rb);
|
||||
}
|
||||
|
||||
// 调试函数:打印环形缓冲区中的数据及其序号
|
||||
void by_ringbuf_debug_print(by_ringbuf_t *rb) {
|
||||
int available_data = by_ringbuf_available_data(rb);
|
||||
if (available_data == 0) {
|
||||
printf("Ring buffer is empty.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Ring buffer content (size: %d, available data: %d):\n", rb->size, available_data);
|
||||
for (int i = 0; i < available_data; i++) {
|
||||
int index = (rb->tail + i) % rb->size;
|
||||
printf("[%04d] 0x%02X\n", i, rb->buffer[index]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user