/********************************************************************************* * Copyright: (C) 2023 LingYun IoT System Studio. * All rights reserved. * * Filename: ringbuf.c * Description: This file is common ring buffer API functions * * Version: 1.0.0(11/08/23) * Author: Guo Wenxue * ChangeLog: 1, Release initial version on "11/08/23 16:18:43" * ********************************************************************************/ #include #include #include "ringbuf.h" void rb_init(struct ring_buffer *rb, unsigned char *buf, int size) { memset(rb, 0, sizeof (struct ring_buffer)); rb->rd_pointer = 0; rb->wr_pointer = 0; rb->buffer= buf; rb->size = size; } void rb_clear(struct ring_buffer *rb) { memset(rb->buffer, 0, rb->size); rb->rd_pointer=0; rb->wr_pointer=0; } int rb_data_size(struct ring_buffer *rb) { return ((rb->wr_pointer - rb->rd_pointer) & (rb->size-1)); } int rb_free_size(struct ring_buffer *rb) { return (rb->size - 1 - rb_data_size(rb)); } unsigned char rb_peek(struct ring_buffer *rb, int index) { assert(index < rb_data_size(rb)); return rb->buffer[((rb->rd_pointer + index) % rb->size)]; } int rb_write(struct ring_buffer *rb, unsigned char *buf, int len) { int total; int i; /* total = len = min(space, len) */ total = rb_free_size(rb); if(len > total) len = total; else total = len; i = rb->wr_pointer; if(i + len > rb->size) { memcpy(rb->buffer + i, buf, rb->size - i); buf += rb->size - i; len -= rb->size - i; i = 0; } memcpy(rb->buffer + i, buf, len); rb->wr_pointer = i + len; return total; } int rb_read(struct ring_buffer *rb, unsigned char *buf, int bytes) { int total; int i; total = rb_data_size(rb); if(bytes > total) bytes = total; i = rb->rd_pointer; if(i + bytes > rb->size) { memcpy(buf, rb->buffer + i, rb->size - i); buf += rb->size - i; bytes -= rb->size - i; i = 0; } memcpy(buf, rb->buffer + i, bytes); rb->rd_pointer = i + bytes; return total; } int rb_copy(struct ring_buffer *rb, unsigned char *buf, int bytes) { int total; int i; total = rb_data_size(rb); if(bytes > total) bytes = total; i = rb->rd_pointer; if(i + bytes > rb->size) { memcpy(buf, rb->buffer + i, rb->size - i); buf += rb->size - i; bytes -= rb->size - i; i = 0; } memcpy(buf, rb->buffer + i, bytes); return total; }