5
\author Satofumi KAMIMURA
7
$Id: ring_buffer.c 1557 2009-12-01 12:38:06Z satofumi $
10
#include "ring_buffer.h"
13
void ring_initialize(ringBuffer_t *ring, char *buffer, const int shift_length)
15
ring->buffer = buffer;
16
ring->buffer_size = 1 << shift_length;
21
void ring_clear(ringBuffer_t *ring)
28
int ring_size(const ringBuffer_t *ring)
30
int first = ring->first;
31
int last = ring->last;
33
return (last >= first) ? last - first : ring->buffer_size - (first - last);
37
int ring_capacity(const ringBuffer_t *ring)
39
return ring->buffer_size - 1;
43
static void charmove(char *dest, const char *src, int n)
45
const char *last_p = dest + n;
46
while (dest < last_p) {
52
int ring_write(ringBuffer_t *ring, const char *data, int size)
54
int free_size = ring_capacity(ring) - ring_size(ring);
55
int push_size = (size > free_size) ? free_size : size;
58
if (ring->first <= ring->last) {
59
// last ���� buffer_size �I�[�܂łɔz�u
61
int to_end = ring->buffer_size - ring->last;
62
int move_size = (to_end > push_size) ? push_size : to_end;
64
charmove(&ring->buffer[ring->last], data, move_size);
65
ring->last += move_size;
66
ring->last &= (ring->buffer_size -1);
68
left_size = push_size - move_size;
70
// 0 ���� first �̑O�܂ł�z�u
71
charmove(ring->buffer, &data[move_size], left_size);
72
ring->last = left_size;
75
// last ���� first �̑O�܂Ŕz�u
76
charmove(&ring->buffer[ring->last], data, size);
77
ring->last += push_size;
83
int ring_read(ringBuffer_t *ring, char *buffer, int size)
86
int now_size = ring_size(ring);
87
int pop_size = (size > now_size) ? now_size : size;
89
if (ring->first <= ring->last) {
90
charmove(buffer, &ring->buffer[ring->first], pop_size);
91
ring->first += pop_size;
94
// first ���� buffer_size �I�[�܂ł�z�u
96
int to_end = ring->buffer_size - ring->first;
97
int move_size = (to_end > pop_size) ? pop_size : to_end;
98
charmove(buffer, &ring->buffer[ring->first], move_size);
100
ring->first += move_size;
101
ring->first &= (ring->buffer_size -1);
103
left_size = pop_size - move_size;
105
// 0 ���� last �̑O�܂ł�z�u
106
charmove(&buffer[move_size], ring->buffer, left_size);
108
ring->first = left_size;
5
\author Satofumi KAMIMURA
7
$Id: ring_buffer.c 1811 2010-04-30 16:12:05Z satofumi $
10
#include "ring_buffer.h"
13
void ring_initialize(ringBuffer_t *ring, char *buffer, const int shift_length)
15
ring->buffer = buffer;
16
ring->buffer_size = 1 << shift_length;
21
void ring_clear(ringBuffer_t *ring)
28
int ring_size(const ringBuffer_t *ring)
30
int first = ring->first;
31
int last = ring->last;
33
return (last >= first) ? last - first : ring->buffer_size - (first - last);
37
int ring_capacity(const ringBuffer_t *ring)
39
return ring->buffer_size - 1;
43
static void charmove(char *dest, const char *src, int n)
45
const char *last_p = dest + n;
46
while (dest < last_p) {
52
int ring_write(ringBuffer_t *ring, const char *data, int size)
54
int free_size = ring_capacity(ring) - ring_size(ring);
55
int push_size = (size > free_size) ? free_size : size;
58
if (ring->first <= ring->last) {
59
// last ���� buffer_size �I�[�܂łɔz�u
61
int to_end = ring->buffer_size - ring->last;
62
int move_size = (to_end > push_size) ? push_size : to_end;
64
charmove(&ring->buffer[ring->last], data, move_size);
65
ring->last += move_size;
66
ring->last &= (ring->buffer_size -1);
68
left_size = push_size - move_size;
70
// 0 ���� first �̑O�܂ł�z�u
71
charmove(ring->buffer, &data[move_size], left_size);
72
ring->last = left_size;
75
// last ���� first �̑O�܂Ŕz�u
76
charmove(&ring->buffer[ring->last], data, size);
77
ring->last += push_size;
83
int ring_read(ringBuffer_t *ring, char *buffer, int size)
86
int now_size = ring_size(ring);
87
int pop_size = (size > now_size) ? now_size : size;
89
if (ring->first <= ring->last) {
90
charmove(buffer, &ring->buffer[ring->first], pop_size);
91
ring->first += pop_size;
94
// first ���� buffer_size �I�[�܂ł�z�u
96
int to_end = ring->buffer_size - ring->first;
97
int move_size = (to_end > pop_size) ? pop_size : to_end;
98
charmove(buffer, &ring->buffer[ring->first], move_size);
100
ring->first += move_size;
101
ring->first &= (ring->buffer_size -1);
103
left_size = pop_size - move_size;
105
// 0 ���� last �̑O�܂ł�z�u
106
charmove(&buffer[move_size], ring->buffer, left_size);
108
ring->first = left_size;