fifo refine
This commit is contained in:
+32
-6
@@ -141,7 +141,7 @@ os_size_t fifo_read_fast(fifo_t* rb, uint8_t * data, os_size_t len){
|
||||
// w r
|
||||
|
||||
if(write_idx > read_idx){
|
||||
memcpy(&data, &rb->buffer[read_idx], len);
|
||||
memcpy(data, &rb->buffer[read_idx], len);
|
||||
}else{
|
||||
os_size_t first_part = size - read_idx;
|
||||
if(first_part >= len){
|
||||
@@ -203,7 +203,7 @@ os_size_t fifo_peek_bulk(fifo_t* rb, os_size_t offset, uint8_t* data, os_size_t
|
||||
// w r
|
||||
|
||||
if(write_idx > read_idx){
|
||||
memcpy(&data, &rb->buffer[read_idx], len);
|
||||
memcpy(data, &rb->buffer[read_idx], len);
|
||||
}else{
|
||||
os_size_t first_part = size - read_idx;
|
||||
if(first_part >= len){
|
||||
@@ -249,16 +249,16 @@ int fifo_memcmp(fifo_t *rb, os_size_t offset, const void *ptr, os_size_t len) {
|
||||
*/
|
||||
os_size_t fifo_find(fifo_t *rb, os_size_t offset, const void *pattern, os_size_t pattern_len) {
|
||||
if (!rb || !pattern || pattern_len == 0) {
|
||||
return -1u;
|
||||
return FIFO_INVALID_POS;
|
||||
}
|
||||
|
||||
os_size_t data_size = fifo_count(rb);
|
||||
if(offset > data_size){
|
||||
return -1u; // 开始查找位置错误了
|
||||
return FIFO_INVALID_POS; // 开始查找位置错误了
|
||||
}
|
||||
|
||||
if (pattern_len > (data_size - offset) ) {
|
||||
return -1u; // 模式长度超过缓冲区数据量,不可能找到
|
||||
return FIFO_INVALID_POS; // 模式长度超过缓冲区数据量,不可能找到
|
||||
}
|
||||
|
||||
// 遍历缓冲区中所有可能的起始位置
|
||||
@@ -290,7 +290,7 @@ os_size_t fifo_find(fifo_t *rb, os_size_t offset, const void *pattern, os_size_t
|
||||
}
|
||||
}
|
||||
|
||||
return -1u;
|
||||
return FIFO_INVALID_POS;
|
||||
}
|
||||
|
||||
unsigned long fifo_strtoul(fifo_t* self, os_size_t* endptr /*从哪里开始转换*/, int base) {
|
||||
@@ -397,3 +397,29 @@ unsigned long fifo_strtoul(fifo_t* self, os_size_t* endptr /*从哪里开始转
|
||||
return acc;
|
||||
}
|
||||
|
||||
// Returns the virtual index relative to tail where the match starts, or -1 if not found
|
||||
os_size_t fifo_strstr(fifo_t *self, const char *search) {
|
||||
os_size_t search_len = strlen(search);
|
||||
os_size_t count = fifo_count(self);
|
||||
if (search_len == 0 || count < search_len) return FIFO_INVALID_POS;
|
||||
|
||||
// Loop through every possible starting position in the ring buffer
|
||||
for (os_size_t i = 0; i <= (count - search_len); i++) {
|
||||
bool match = true;
|
||||
|
||||
// Check if the substring matches starting at virtual position i
|
||||
for (os_size_t j = 0; j < search_len; j++) {
|
||||
os_size_t rd_index = (self->read_idx + i + j) % self->buffer_size;
|
||||
if (self->buffer[rd_index] != search[j]) {
|
||||
match = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (match) {
|
||||
return i; // Return the position relative to the current tail
|
||||
}
|
||||
}
|
||||
return FIFO_INVALID_POS;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user