5 ringbuf_t
*ringbuf_create(size_t size
) {
6 ringbuf_t
*ringbuf
= malloc(sizeof(ringbuf_t
));
7 ringbuf
->buf
= malloc(size
);
14 void ringbuf_destroy(ringbuf_t
*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
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
;
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
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
;