| | |
| | | #include <assert.h> |
| | | #include "ringbuf.h" |
| | | |
| | | void rb_init (struct ring_buffer *ring, unsigned char* buff, int size) |
| | | void rb_init(struct ring_buffer *rb, unsigned char *buf, int size) |
| | | { |
| | | memset (ring, 0, sizeof (struct ring_buffer)); |
| | | ring->rd_pointer = 0; |
| | | ring->wr_pointer = 0; |
| | | ring->buffer= buff; |
| | | ring->size = 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) |
| | | { |
| | |
| | | return total; |
| | | } |
| | | |
| | | |
| | | int rb_free_size (struct ring_buffer *rb) |
| | | { |
| | | return (rb->size - 1 - rb_data_size(rb)); |
| | | } |
| | | |
| | | |
| | | int rb_read (struct ring_buffer *rb, unsigned char * buf, int max) |
| | | int rb_read(struct ring_buffer *rb, unsigned char *buf, int bytes) |
| | | { |
| | | int total; |
| | | int i; |
| | | |
| | | /* total = len = min(used, len) */ |
| | | total = rb_data_size(rb); |
| | | |
| | | if(max > total) |
| | | max = total; |
| | | else |
| | | total = max; |
| | | |
| | | if(bytes > total) |
| | | bytes = total; |
| | | |
| | | i = rb->rd_pointer; |
| | | if(i + max > rb->size) |
| | | if(i + bytes > rb->size) |
| | | { |
| | | memcpy(buf, rb->buffer + i, rb->size - i); |
| | | buf += rb->size - i; |
| | | max -= rb->size - i; |
| | | bytes -= rb->size - i; |
| | | i = 0; |
| | | } |
| | | |
| | | memcpy(buf, rb->buffer + i, max); |
| | | rb->rd_pointer = i + max; |
| | | memcpy(buf, rb->buffer + i, bytes); |
| | | rb->rd_pointer = i + bytes; |
| | | |
| | | return total; |
| | | } |
| | | |
| | | int rb_data_size (struct ring_buffer *rb) |
| | | int rb_copy(struct ring_buffer *rb, unsigned char *buf, int bytes) |
| | | { |
| | | return ((rb->wr_pointer - rb->rd_pointer) & (rb->size-1)); |
| | | 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; |
| | | } |
| | | |
| | | void rb_clear (struct ring_buffer *rb) |
| | | { |
| | | memset(rb->buffer,0,rb->size); |
| | | rb->rd_pointer=0; |
| | | rb->wr_pointer=0; |
| | | memcpy(buf, rb->buffer + i, bytes); |
| | | |
| | | return total; |
| | | } |
| | | |
| | | 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)]; |
| | | } |