2 Ringbuffer Implementation for gtvscreen
4 Copyright (C) 2000 Marcus Metzler (mocm@metzlerbros.de)
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "ringbuffy.h"
23 int ring_init (ringbuffy *rbuf, int size)
27 if( !(rbuf->buffy = (char *) malloc(sizeof(char)*size)) ){
28 fprintf(stderr,"Not enough memory for ringbuffy\n");
32 fprintf(stderr,"Wrong size for ringbuffy\n");
41 void ring_destroy(ringbuffy *rbuf)
47 int ring_write(ringbuffy *rbuf, char *data, int count)
50 int diff, free, pos, rest;
52 if (count <=0 ) return 0;
53 pos = rbuf->write_pos;
54 rest = rbuf->size - pos;
55 diff = rbuf->read_pos - pos;
56 free = (diff > 0) ? diff-1 : rbuf->size+diff-1;
58 if ( free <= 0 ) return FULL_BUFFER;
59 if ( free < count ) count = free;
62 memcpy (rbuf->buffy+pos, data, rest);
64 memcpy (rbuf->buffy, data+rest, count - rest);
65 rbuf->write_pos = count - rest;
67 memcpy (rbuf->buffy+pos, data, count);
68 rbuf->write_pos += count;
77 int ring_peek(ringbuffy *rbuf, char *data, int count, long off)
80 int diff, free, pos, rest;
82 if (count <=0 ) return 0;
83 pos = rbuf->read_pos+off;
84 rest = rbuf->size - pos ;
85 diff = rbuf->write_pos - pos;
86 free = (diff >= 0) ? diff : rbuf->size+diff;
88 if ( free <= 0 ) return FULL_BUFFER;
89 if ( free < count ) count = free;
92 memcpy(data, rbuf->buffy+pos, count);
94 memcpy(data, rbuf->buffy+pos, rest);
96 memcpy(data+rest, rbuf->buffy, count - rest);
102 int ring_read(ringbuffy *rbuf, char *data, int count)
105 int diff, free, pos, rest;
107 if (count <=0 ) return 0;
108 pos = rbuf->read_pos;
109 rest = rbuf->size - pos;
110 diff = rbuf->write_pos - pos;
111 free = (diff >= 0) ? diff : rbuf->size+diff;
113 if ( rest <= 0 ) return 0;
114 if ( free < count ) count = free;
117 memcpy(data, rbuf->buffy+pos, count);
118 rbuf->read_pos += count;
120 memcpy(data, rbuf->buffy+pos, rest);
122 memcpy(data+rest, rbuf->buffy, count - rest);
123 rbuf->read_pos = count - rest;
131 int ring_write_file(ringbuffy *rbuf, int fd, int count)
134 int diff, free, pos, rest, rr;
136 if (count <=0 ) return 0;
137 pos = rbuf->write_pos;
138 rest = rbuf->size - pos;
139 diff = rbuf->read_pos - pos;
140 free = (diff > 0) ? diff-1 : rbuf->size+diff-1;
142 if ( rest <= 0 ) return 0;
143 if ( free < count ) count = free;
146 rr = read (fd, rbuf->buffy+pos, rest);
147 if (rr == rest && count - rest)
148 rr += read (fd, rbuf->buffy, count - rest);
150 rbuf->write_pos = (pos + rr) % rbuf->size;
152 rr = read (fd, rbuf->buffy+pos, count);
154 rbuf->write_pos += rr;
162 int ring_read_file(ringbuffy *rbuf, int fd, int count)
165 int diff, free, pos, rest, rr;
167 if (count <=0 ) return 0;
168 pos = rbuf->read_pos;
169 rest = rbuf->size - pos;
170 diff = rbuf->write_pos - pos;
171 free = (diff >= 0) ? diff : rbuf->size+diff;
173 if ( free <= 0 ) return FULL_BUFFER;
174 if ( free < count ) count = free;
177 rr = write (fd, rbuf->buffy+pos, rest);
178 if (rr == rest && count - rest)
179 rr += write (fd, rbuf->buffy, count - rest);
181 rbuf->read_pos = (pos + rr) % rbuf->size;
183 rr = write (fd, rbuf->buffy+pos, count);
185 rbuf->read_pos += rr;
192 int ring_rest(ringbuffy *rbuf){
193 int diff, free, pos, rest;
194 pos = rbuf->read_pos;
195 rest = rbuf->size - pos;
196 diff = rbuf->write_pos - pos;
197 free = (diff >= 0) ? diff : rbuf->size+diff;