X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/59ecf21e36b2332f6adf2a568ef555283d8c119a..bdc143a7aa3f51a46eceec62b0b364599533fa21:/lunaix-os/kernel/ds/rbuffer.c diff --git a/lunaix-os/kernel/ds/rbuffer.c b/lunaix-os/kernel/ds/rbuffer.c index bfcc3a5..82d1402 100644 --- a/lunaix-os/kernel/ds/rbuffer.c +++ b/lunaix-os/kernel/ds/rbuffer.c @@ -32,7 +32,7 @@ rbuffer_put(struct rbuffer* rb, char c) rb->ptr = (rb->ptr + 1) % rb->maxsz; rb->len = MIN(rb->len + 1, rb->maxsz); - return 1; + return rb->len < rb->maxsz; } int @@ -41,29 +41,29 @@ rbuffer_puts(struct rbuffer* rb, char* buf, size_t len) if (!len) return 0; - size_t ptr = (rb->ptr + len) % rb->maxsz; size_t nlen = MIN(len, rb->maxsz); - size_t ptr_start = (ptr - nlen) % rb->maxsz; + size_t ptr = (rb->ptr + nlen) % rb->maxsz; + size_t ptr_start = rb->ptr; buf = &buf[nlen]; if (ptr_start >= ptr) { size_t llen = rb->maxsz - ptr_start; memcpy(&rb->buffer[ptr_start], &buf[-nlen], llen); - memcpy(&rb->buffer[0], &buf[-nlen + llen], ptr + 1); + memcpy(&rb->buffer[0], &buf[-nlen + llen], ptr); } else { memcpy(&rb->buffer[ptr_start], &buf[-nlen], nlen); } rb->ptr = ptr; - rb->len = nlen; + rb->len = MIN(rb->len + nlen, rb->maxsz); return nlen; } int -rbuffer_gets(struct rbuffer* rb, char* buf, size_t len) +rbuffer_gets_opt(struct rbuffer* rb, char* buf, size_t len, bool consumed) { - if (!len) + if (!len || !rb->len) return 0; size_t nlen = MIN(len, rb->len); @@ -74,12 +74,14 @@ rbuffer_gets(struct rbuffer* rb, char* buf, size_t len) if (ptr_start >= ptr_end) { size_t llen = rb->maxsz - ptr_start; memcpy(&buf[-nlen], &rb->buffer[ptr_start], llen); - memcpy(&buf[-nlen + llen], &rb->buffer[0], ptr_end + 1); + memcpy(&buf[-nlen + llen], &rb->buffer[0], ptr_end); } else { memcpy(&buf[-nlen], &rb->buffer[ptr_start], nlen); } - rb->len -= nlen; + if (consumed) { + rb->len -= nlen; + } return nlen; }