From 47950e8bab3a3ff5812e92eecd7a3de9631352a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kijewski?= <rene.kijewski@fu-berlin.de> Date: Sat, 3 May 2014 18:49:55 +0200 Subject: [PATCH] ringbuffer: remove pointer to the end There is no need for an explicit pointer to the end of the buffer. --- sys/include/ringbuffer.h | 7 ++--- sys/lib/ringbuffer.c | 61 ++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/sys/include/ringbuffer.h b/sys/include/ringbuffer.h index 23755c1229..7122b95560 100644 --- a/sys/include/ringbuffer.h +++ b/sys/include/ringbuffer.h @@ -21,10 +21,9 @@ typedef struct ringbuffer { char *buf; - unsigned int start; - unsigned int end; - unsigned int size; - unsigned int avail; + unsigned int size; + unsigned int start; + unsigned int avail; } ringbuffer_t; void ringbuffer_init(ringbuffer_t *restrict rb, char *buffer, unsigned bufsize); diff --git a/sys/lib/ringbuffer.c b/sys/lib/ringbuffer.c index b8ee266f89..588a6aeec2 100644 --- a/sys/lib/ringbuffer.c +++ b/sys/lib/ringbuffer.c @@ -12,6 +12,7 @@ * @{ * @file ringbuffer.c * @author Kaspar Schleiser <kaspar@schleiser.de> + * @author René Kijewski <rene.kijewski@fu-berlin.de> * @} */ @@ -20,12 +21,29 @@ void ringbuffer_init(ringbuffer_t *restrict rb, char *buffer, unsigned bufsize) { rb->buf = buffer; - rb->start = 0; - rb->end = 0; rb->size = bufsize; + rb->start = 0; rb->avail = 0; } +static void add_tail(ringbuffer_t *restrict rb, char c) +{ + unsigned pos = rb->start + rb->avail++; + if (pos >= rb->size) { + pos -= rb->size; + } + rb->buf[pos] = c; +} + +static char get_head(ringbuffer_t *restrict rb) +{ + char result = rb->buf[rb->start]; + if ((--rb->avail == 0) || (++rb->start == rb->size)) { + rb->start = 0; + } + return result; +} + void ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n) { for (unsigned i = 0; i < n; i++) { @@ -35,45 +53,32 @@ void ringbuffer_add(ringbuffer_t *restrict rb, const char *buf, unsigned n) void ringbuffer_add_one(ringbuffer_t *restrict rb, char c) { - if (rb->avail == rb->size) { - ringbuffer_get_one(rb); - } - - rb->buf[rb->end++] = c; - - if (rb->end >= rb->size) { - rb->end = 0; + if (ringbuffer_full(rb)) { + get_head(rb); } - - rb->avail++; + add_tail(rb, c); } int ringbuffer_get_one(ringbuffer_t *restrict rb) { - if (rb->avail == 0) { - return -1; + if (!ringbuffer_empty(rb)) { + return (unsigned char) get_head(rb); } - - rb->avail--; - - int c = (char)rb->buf[rb->start++]; - - if (rb->start >= rb->size) { - rb->start = 0; + else { + return -1; } - - return c; } unsigned ringbuffer_get(ringbuffer_t *restrict rb, char *buf, unsigned n) { - unsigned count = 0; - - while (rb->avail && (count < n)) { - buf[count++] = ringbuffer_get_one(rb); + if (n > rb->avail) { + n = rb->avail; } - return count; + for (unsigned i = 0; i < n; ++i) { + buf[i] = get_head(rb); + } + return n; } int ringbuffer_peek_one(const ringbuffer_t *restrict rb_) -- GitLab