Lines Matching refs:ring

32 static const char sccsid[] = "@(#)ring.c	8.2 (Berkeley) 5/30/95";
36 __FBSDID("$FreeBSD: stable/11/contrib/telnet/telnet/ring.c 351432 2019-08-23 17:40:47Z emaste $");
39 * This defines a structure for a ring buffer.
63 #include "ring.h"
85 * There is some trickiness here. Since the ring buffers are initialized
100 ring_init(Ring *ring, unsigned char *buffer, int count)
102 memset((char *)ring, 0, sizeof *ring);
104 ring->size = count;
106 ring->supply = ring->consume = ring->bottom = buffer;
108 ring->top = ring->bottom+ring->size;
111 ring->clearto = 0;
124 ring_mark(Ring *ring)
126 ring->mark = ring_decrement(ring, ring->supply, 1);
130 * Is the ring pointing to the mark?
134 ring_at_mark(Ring *ring)
136 if (ring->mark == ring->consume) {
144 * Clear any mark set on the ring.
148 ring_clear_mark(Ring *ring)
150 ring->mark = 0;
154 * Add characters from current segment to ring buffer.
157 ring_supplied(Ring *ring, int count)
159 ring->supply = ring_increment(ring, ring->supply, count);
160 ring->supplytime = ++ring_clock;
167 ring_consumed(Ring *ring, int count)
172 if (ring->mark &&
173 (ring_subtract(ring, ring->mark, ring->consume) < count)) {
174 ring->mark = 0;
177 if (ring->consume < ring->clearto &&
178 ring->clearto <= ring->consume + count)
179 ring->clearto = 0;
180 else if (ring->consume + count > ring->top &&
181 ring->bottom <= ring->clearto &&
182 ring->bottom + ((ring->consume + count) - ring->top))
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 of the ring buffer.
273 ring_supply_data(Ring *ring, unsigned char *buffer, int count)
278 i = MIN(count, ring_empty_consecutive(ring));
279 memcpy(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)
311 Ring *ring;
313 if (!ring_empty(ring))
314 ring->clearto = ring->supply;
316 ring->clearto = 0;