Lines Matching refs:ring
1 /* $NetBSD: ring.c,v 1.17 2024/05/13 00:32:39 msaitoh Exp $ */
35 static char sccsid[] = "@(#)ring.c 8.2 (Berkeley) 5/30/95";
37 __RCSID("$NetBSD: ring.c,v 1.17 2024/05/13 00:32:39 msaitoh Exp $");
42 * This defines a structure for a ring buffer.
60 #include "ring.h"
82 * There is some trickiness here. Since the ring buffers are initialized
101 ring_init(Ring *ring, unsigned char *buffer, int count)
103 memset(ring, 0, sizeof *ring);
105 ring->size = count;
107 ring->supply = ring->consume = ring->bottom = buffer;
109 ring->top = ring->bottom+ring->size;
112 ring->clearto = 0;
125 ring_mark(Ring *ring)
127 ring->mark = ring_decrement(ring, ring->supply, 1);
131 * Is the ring pointing to the mark?
135 ring_at_mark(Ring *ring)
137 if (ring->mark == ring->consume) {
145 * Clear any mark set on the ring.
149 ring_clear_mark(Ring *ring)
151 ring->mark = 0;
155 * Add characters from current segment to ring buffer.
158 ring_supplied(Ring *ring, int count)
160 ring->supply = ring_increment(ring, ring->supply, count);
161 ring->supplytime = ++ring_clock;
168 ring_consumed(Ring *ring, int count)
173 if (ring->mark &&
174 (ring_subtract(ring, ring->mark, ring->consume) < count)) {
175 ring->mark = 0;
178 if (ring->consume < ring->clearto &&
179 ring->clearto <= ring->consume + count)
180 ring->clearto = 0;
181 else if (ring->consume + count > ring->top &&
182 ring->bottom <= ring->clearto)
183 ring->clearto = 0;
185 ring->consume = ring_increment(ring, ring->consume, count);
186 ring->consumetime = ++ring_clock;
190 if (ring_empty(ring)) {
191 ring->consume = ring->supply = ring->bottom;
202 ring_empty_count(Ring *ring)
204 if (ring_empty(ring)) { /* if empty */
205 return ring->size;
207 return ring_subtract(ring, ring->consume, ring->supply);
213 ring_empty_consecutive(Ring *ring)
215 if ((ring->consume < ring->supply) || ring_empty(ring)) {
220 return ring_subtract(ring, ring->top, ring->supply);
225 return ring_subtract(ring, ring->consume, ring->supply);
234 ring_full_count(Ring *ring)
236 if ((ring->mark == 0) || (ring->mark == ring->consume)) {
237 if (ring_full(ring)) {
238 return ring->size; /* nothing consumed, but full */
240 return ring_subtract(ring, ring->supply, ring->consume);
243 return ring_subtract(ring, ring->mark, ring->consume);
252 ring_full_consecutive(Ring *ring)
254 if ((ring->mark == 0) || (ring->mark == ring->consume)) {
255 if ((ring->supply < ring->consume) || ring_full(ring)) {
256 return ring_subtract(ring, ring->top, ring->consume);
258 return ring_subtract(ring, ring->supply, ring->consume);
261 if (ring->mark < ring->consume) {
262 return ring_subtract(ring, ring->top, ring->consume);
264 return ring_subtract(ring, ring->mark, ring->consume);
270 * Move data into the "supply" portion of the ring buffer.
273 ring_supply_data(Ring *ring, unsigned char *buffer, int count)
278 i = MIN(count, ring_empty_consecutive(ring));
279 memmove(ring->supply, buffer, i);
280 ring_supplied(ring, i);
288 ring_encrypt(Ring *ring, void (*encryptor)(unsigned char *, int))
292 if (ring_empty(ring) || ring->clearto == ring->supply)
295 if (!(c = ring->clearto))
296 c = ring->consume;
298 s = ring->supply;
301 (*encryptor)(c, ring->top - c);
302 (*encryptor)(ring->bottom, s - ring->bottom);
306 ring->clearto = ring->supply;
310 ring_clearto(Ring *ring)
313 if (!ring_empty(ring))
314 ring->clearto = ring->supply;
316 ring->clearto = 0;