1 #include <lunaix/ds/rbuffer.h>
2 #include <lunaix/mm/valloc.h>
3 #include <lunaix/spike.h>
5 #include <klibc/string.h>
8 rbuffer_create(char* buf, size_t maxsz)
10 struct rbuffer* rb = valloc(sizeof(struct rbuffer));
11 rbuffer_init(rb, buf, maxsz);
17 rbuffer_erase(struct rbuffer* rb)
22 rb->ptr = (rb->ptr - 1) % rb->maxsz;
29 rbuffer_put(struct rbuffer* rb, char c)
31 rb->buffer[rb->ptr] = c;
32 rb->ptr = (rb->ptr + 1) % rb->maxsz;
33 rb->len = MIN(rb->len + 1, rb->maxsz);
35 return rb->len < rb->maxsz;
39 rbuffer_puts(struct rbuffer* rb, char* buf, size_t len)
44 size_t nlen = MIN(len, rb->maxsz);
45 size_t ptr = (rb->ptr + nlen) % rb->maxsz;
46 size_t ptr_start = rb->ptr;
49 if (ptr_start >= ptr) {
50 size_t llen = rb->maxsz - ptr_start;
51 memcpy(&rb->buffer[ptr_start], &buf[-nlen], llen);
52 memcpy(&rb->buffer[0], &buf[-nlen + llen], ptr);
54 memcpy(&rb->buffer[ptr_start], &buf[-nlen], nlen);
58 rb->len = MIN(rb->len + nlen, rb->maxsz);
64 rbuffer_gets(struct rbuffer* rb, char* buf, size_t len)
69 size_t nlen = MIN(len, rb->len);
70 size_t ptr_start = (rb->ptr - rb->len) % rb->maxsz;
71 size_t ptr_end = (ptr_start + nlen) % rb->maxsz;
74 if (ptr_start >= ptr_end) {
75 size_t llen = rb->maxsz - ptr_start;
76 memcpy(&buf[-nlen], &rb->buffer[ptr_start], llen);
77 memcpy(&buf[-nlen + llen], &rb->buffer[0], ptr_end);
79 memcpy(&buf[-nlen], &rb->buffer[ptr_start], nlen);
88 rbuffer_get(struct rbuffer* rb, char* c)
94 size_t ptr_start = (rb->ptr - rb->len) % rb->maxsz;
97 *c = rb->buffer[ptr_start];