3 \brief
\83\8a\83\93\83O
\83o
\83b
\83t
\83@
\r
5 \author Satofumi KAMIMURA
\r
7 $Id: ring_buffer.c 1557 2009-12-01 12:38:06Z satofumi $
\r
10 #include "ring_buffer.h"
\r
13 void ring_initialize(ringBuffer_t *ring, char *buffer, const int shift_length)
\r
15 ring->buffer = buffer;
\r
16 ring->buffer_size = 1 << shift_length;
\r
21 void ring_clear(ringBuffer_t *ring)
\r
28 int ring_size(const ringBuffer_t *ring)
\r
30 int first = ring->first;
\r
31 int last = ring->last;
\r
33 return (last >= first) ? last - first : ring->buffer_size - (first - last);
\r
37 int ring_capacity(const ringBuffer_t *ring)
\r
39 return ring->buffer_size - 1;
\r
43 static void charmove(char *dest, const char *src, int n)
\r
45 const char *last_p = dest + n;
\r
46 while (dest < last_p) {
\r
52 int ring_write(ringBuffer_t *ring, const char *data, int size)
\r
54 int free_size = ring_capacity(ring) - ring_size(ring);
\r
55 int push_size = (size > free_size) ? free_size : size;
\r
57 //
\83f
\81[
\83^
\94z
\92u
\r
58 if (ring->first <= ring->last) {
\r
59 // last
\82©
\82ç buffer_size
\8fI
\92[
\82Ü
\82Å
\82É
\94z
\92u
\r
61 int to_end = ring->buffer_size - ring->last;
\r
62 int move_size = (to_end > push_size) ? push_size : to_end;
\r
64 charmove(&ring->buffer[ring->last], data, move_size);
\r
65 ring->last += move_size;
\r
66 ring->last &= (ring->buffer_size -1);
\r
68 left_size = push_size - move_size;
\r
69 if (left_size > 0) {
\r
70 // 0
\82©
\82ç first
\82Ì
\91O
\82Ü
\82Å
\82ð
\94z
\92u
\r
71 charmove(ring->buffer, &data[move_size], left_size);
\r
72 ring->last = left_size;
\r
75 // last
\82©
\82ç first
\82Ì
\91O
\82Ü
\82Å
\94z
\92u
\r
76 charmove(&ring->buffer[ring->last], data, size);
\r
77 ring->last += push_size;
\r
83 int ring_read(ringBuffer_t *ring, char *buffer, int size)
\r
85 //
\83f
\81[
\83^
\8eæ
\93¾
\r
86 int now_size = ring_size(ring);
\r
87 int pop_size = (size > now_size) ? now_size : size;
\r
89 if (ring->first <= ring->last) {
\r
90 charmove(buffer, &ring->buffer[ring->first], pop_size);
\r
91 ring->first += pop_size;
\r
94 // first
\82©
\82ç buffer_size
\8fI
\92[
\82Ü
\82Å
\82ð
\94z
\92u
\r
96 int to_end = ring->buffer_size - ring->first;
\r
97 int move_size = (to_end > pop_size) ? pop_size : to_end;
\r
98 charmove(buffer, &ring->buffer[ring->first], move_size);
\r
100 ring->first += move_size;
\r
101 ring->first &= (ring->buffer_size -1);
\r
103 left_size = pop_size - move_size;
\r
104 if (left_size > 0) {
\r
105 // 0
\82©
\82ç last
\82Ì
\91O
\82Ü
\82Å
\82ð
\94z
\92u
\r
106 charmove(&buffer[move_size], ring->buffer, left_size);
\r
108 ring->first = left_size;
\r