libmeinos: +ringbuf
[meinos.git] / apps / lib / libmeinos / ringbuf.c
blobb7e43df95257a8357a612d33e770d9b8720319e2
1 #include <ringbuf.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
5 ringbuf_t *ringbuf_create(size_t size) {
6 ringbuf_t *ringbuf = malloc(sizeof(ringbuf_t));
7 ringbuf->buf = malloc(size);
8 ringbuf->size = size;
9 ringbuf->wpos = 0;
10 ringbuf->rpos = 0;
11 return ringbuf;
14 void ringbuf_destroy(ringbuf_t *ringbuf) {
15 free(ringbuf->buf);
16 free(ringbuf);
19 size_t ringbuf_read(ringbuf_t *ringbuf,void *buf,size_t size) {
20 // calculate free size
21 size_t size_free = ringbuf->wpos>=ringbuf->rpos?ringbuf->wpos-ringbuf->rpos:ringbuf->wpos+ringbuf->size-ringbuf->rpos;
23 // check if buffer is big enough
24 if (size>size_free) size = size_free;
25 if (size==0) return 0;
27 // if isn't wrapped around at end just copy
28 /// @todo Check this line
29 if (ringbuf->rpos+size<ringbuf->size) memcpy(buf,ringbuf->buf+ringbuf->rpos,size);
30 // else you have to do 2 copies
31 else {
32 size_t part1 = ringbuf->size-ringbuf->rpos;
33 size_t part2 = size-part1;
34 memcpy(buf,ringbuf->buf+ringbuf->rpos,part1);
35 memcpy(buf+part1,ringbuf->buf,part2);
38 // update read position
39 ringbuf->rpos = (ringbuf->rpos+size)%ringbuf->size;
41 return size;
44 size_t ringbuf_write(ringbuf_t *ringbuf,const void *buf,size_t size) {
45 // calculate free size
46 size_t size_free = ringbuf->rpos>ringbuf->wpos?ringbuf->rpos-ringbuf->wpos:ringbuf->rpos+ringbuf->size-ringbuf->rpos;
48 // check if buffer is big enough
49 if (size>size_free) size = size_free;
50 if (size==0) return 0;
52 // if isn't be wrapped around at end just copy
53 /// @todo Check this line
54 if (ringbuf->rpos+size<ringbuf->size) memcpy(ringbuf->buf+ringbuf->wpos,buf,size);
55 // else you have to do 2 copies
56 else {
57 size_t part1 = ringbuf->size-ringbuf->wpos;
58 size_t part2 = size-part1;
59 memcpy(ringbuf->buf+ringbuf->wpos,buf,part1);
60 memcpy(ringbuf->buf,buf+part1,part2);
63 // update read position
64 ringbuf->wpos = (ringbuf->wpos+size)%ringbuf->size;
66 return size;