~vibhavp/ubuntu/saucy/urg/merge-from-debian

« back to all changes in this revision

Viewing changes to src/c/connection/ring_buffer.c

  • Committer: Bazaar Package Importer
  • Author(s): Albert Huang
  • Date: 2011-05-20 11:33:03 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20110520113303-u8niofzwzcea0osk
Tags: 0.8.12-1
* New upstream release (closes: #624987)
* Add debian/watch file
* Bump standards-version to 3.9.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*!
2
 
  \file
3
 
  \brief �����O�o�b�t�@
4
 
 
5
 
  \author Satofumi KAMIMURA
6
 
 
7
 
  $Id: ring_buffer.c 1557 2009-12-01 12:38:06Z satofumi $
8
 
*/
9
 
 
10
 
#include "ring_buffer.h"
11
 
 
12
 
 
13
 
void ring_initialize(ringBuffer_t *ring, char *buffer, const int shift_length)
14
 
{
15
 
  ring->buffer = buffer;
16
 
  ring->buffer_size = 1 << shift_length;
17
 
  ring_clear(ring);
18
 
}
19
 
 
20
 
 
21
 
void ring_clear(ringBuffer_t *ring)
22
 
{
23
 
  ring->first = 0;
24
 
  ring->last = 0;
25
 
}
26
 
 
27
 
 
28
 
int ring_size(const ringBuffer_t *ring)
29
 
{
30
 
  int first = ring->first;
31
 
  int last = ring->last;
32
 
 
33
 
  return (last >= first) ? last - first : ring->buffer_size - (first - last);
34
 
}
35
 
 
36
 
 
37
 
int ring_capacity(const ringBuffer_t *ring)
38
 
{
39
 
  return ring->buffer_size - 1;
40
 
}
41
 
 
42
 
 
43
 
static void charmove(char *dest, const char *src, int n)
44
 
{
45
 
  const char *last_p = dest + n;
46
 
  while (dest < last_p) {
47
 
    *dest++ = *src++;
48
 
  }
49
 
}
50
 
 
51
 
 
52
 
int ring_write(ringBuffer_t *ring, const char *data, int size)
53
 
{
54
 
  int free_size = ring_capacity(ring) - ring_size(ring);
55
 
  int push_size = (size > free_size) ? free_size : size;
56
 
 
57
 
  // �f�[�^�z�u
58
 
  if (ring->first <= ring->last) {
59
 
    // last ���� buffer_size �I�[�܂łɔz�u
60
 
    int left_size = 0;
61
 
    int to_end = ring->buffer_size - ring->last;
62
 
    int move_size = (to_end > push_size) ? push_size : to_end;
63
 
 
64
 
    charmove(&ring->buffer[ring->last], data, move_size);
65
 
    ring->last += move_size;
66
 
    ring->last &= (ring->buffer_size -1);
67
 
 
68
 
    left_size = push_size - move_size;
69
 
    if (left_size > 0) {
70
 
      // 0 ���� first �̑O�܂ł�z�u
71
 
      charmove(ring->buffer, &data[move_size], left_size);
72
 
      ring->last = left_size;
73
 
    }
74
 
  } else {
75
 
    // last ���� first �̑O�܂Ŕz�u
76
 
    charmove(&ring->buffer[ring->last], data, size);
77
 
    ring->last += push_size;
78
 
  }
79
 
  return push_size;
80
 
}
81
 
 
82
 
 
83
 
int ring_read(ringBuffer_t *ring, char *buffer, int size)
84
 
{
85
 
  // �f�[�^�擾
86
 
  int now_size = ring_size(ring);
87
 
  int pop_size = (size > now_size) ? now_size : size;
88
 
 
89
 
  if (ring->first <= ring->last) {
90
 
    charmove(buffer, &ring->buffer[ring->first], pop_size);
91
 
    ring->first += pop_size;
92
 
 
93
 
  } else {
94
 
    // first ���� buffer_size �I�[�܂ł�z�u
95
 
    int left_size = 0;
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);
99
 
 
100
 
    ring->first += move_size;
101
 
    ring->first &= (ring->buffer_size -1);
102
 
 
103
 
    left_size = pop_size - move_size;
104
 
    if (left_size > 0) {
105
 
      // 0 ���� last �̑O�܂ł�z�u
106
 
      charmove(&buffer[move_size], ring->buffer, left_size);
107
 
 
108
 
      ring->first = left_size;
109
 
    }
110
 
  }
111
 
  return pop_size;
112
 
}
 
1
/*!
 
2
  \file
 
3
  \brief �����O�o�b�t�@
 
4
 
 
5
  \author Satofumi KAMIMURA
 
6
 
 
7
  $Id: ring_buffer.c 1811 2010-04-30 16:12:05Z satofumi $
 
8
*/
 
9
 
 
10
#include "ring_buffer.h"
 
11
 
 
12
 
 
13
void ring_initialize(ringBuffer_t *ring, char *buffer, const int shift_length)
 
14
{
 
15
    ring->buffer = buffer;
 
16
    ring->buffer_size = 1 << shift_length;
 
17
    ring_clear(ring);
 
18
}
 
19
 
 
20
 
 
21
void ring_clear(ringBuffer_t *ring)
 
22
{
 
23
    ring->first = 0;
 
24
    ring->last = 0;
 
25
}
 
26
 
 
27
 
 
28
int ring_size(const ringBuffer_t *ring)
 
29
{
 
30
    int first = ring->first;
 
31
    int last = ring->last;
 
32
 
 
33
    return (last >= first) ? last - first : ring->buffer_size - (first - last);
 
34
}
 
35
 
 
36
 
 
37
int ring_capacity(const ringBuffer_t *ring)
 
38
{
 
39
    return ring->buffer_size - 1;
 
40
}
 
41
 
 
42
 
 
43
static void charmove(char *dest, const char *src, int n)
 
44
{
 
45
    const char *last_p = dest + n;
 
46
    while (dest < last_p) {
 
47
        *dest++ = *src++;
 
48
    }
 
49
}
 
50
 
 
51
 
 
52
int ring_write(ringBuffer_t *ring, const char *data, int size)
 
53
{
 
54
    int free_size = ring_capacity(ring) - ring_size(ring);
 
55
    int push_size = (size > free_size) ? free_size : size;
 
56
 
 
57
    // �f�[�^�z�u
 
58
    if (ring->first <= ring->last) {
 
59
        // last ���� buffer_size �I�[�܂łɔz�u
 
60
        int left_size = 0;
 
61
        int to_end = ring->buffer_size - ring->last;
 
62
        int move_size = (to_end > push_size) ? push_size : to_end;
 
63
 
 
64
        charmove(&ring->buffer[ring->last], data, move_size);
 
65
        ring->last += move_size;
 
66
        ring->last &= (ring->buffer_size -1);
 
67
 
 
68
        left_size = push_size - move_size;
 
69
        if (left_size > 0) {
 
70
            // 0 ���� first �̑O�܂ł�z�u
 
71
            charmove(ring->buffer, &data[move_size], left_size);
 
72
            ring->last = left_size;
 
73
        }
 
74
    } else {
 
75
        // last ���� first �̑O�܂Ŕz�u
 
76
        charmove(&ring->buffer[ring->last], data, size);
 
77
        ring->last += push_size;
 
78
    }
 
79
    return push_size;
 
80
}
 
81
 
 
82
 
 
83
int ring_read(ringBuffer_t *ring, char *buffer, int size)
 
84
{
 
85
    // �f�[�^�擾
 
86
    int now_size = ring_size(ring);
 
87
    int pop_size = (size > now_size) ? now_size : size;
 
88
 
 
89
    if (ring->first <= ring->last) {
 
90
        charmove(buffer, &ring->buffer[ring->first], pop_size);
 
91
        ring->first += pop_size;
 
92
 
 
93
    } else {
 
94
        // first ���� buffer_size �I�[�܂ł�z�u
 
95
        int left_size = 0;
 
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);
 
99
 
 
100
        ring->first += move_size;
 
101
        ring->first &= (ring->buffer_size -1);
 
102
 
 
103
        left_size = pop_size - move_size;
 
104
        if (left_size > 0) {
 
105
            // 0 ���� last �̑O�܂ł�z�u
 
106
            charmove(&buffer[move_size], ring->buffer, left_size);
 
107
 
 
108
            ring->first = left_size;
 
109
        }
 
110
    }
 
111
    return pop_size;
 
112
}