11e4bc969Sminshall /* 2*c9590d16Sbostic * Copyright (c) 1988, 1993 3*c9590d16Sbostic * The Regents of the University of California. All rights reserved. 4bb8d19bbSbostic * 5068cc2b8Sbostic * %sccs.include.redist.c% 6bb8d19bbSbostic * 7*c9590d16Sbostic * @(#)ring.h 8.1 (Berkeley) 06/06/93 8bb8d19bbSbostic */ 9bb8d19bbSbostic 102cd0b9fbSdab #if defined(P) 112cd0b9fbSdab # undef P 122cd0b9fbSdab #endif 132cd0b9fbSdab 142cd0b9fbSdab #if defined(__STDC__) || defined(LINT_ARGS) 152cd0b9fbSdab # define P(x) x 162cd0b9fbSdab #else 172cd0b9fbSdab # define P(x) () 182cd0b9fbSdab #endif 192cd0b9fbSdab 20bb8d19bbSbostic /* 2158ab6e53Sminshall * This defines a structure for a ring buffer. 221e4bc969Sminshall * 2358ab6e53Sminshall * The circular buffer has two parts: 241e4bc969Sminshall *((( 2558ab6e53Sminshall * full: [consume, supply) 2658ab6e53Sminshall * empty: [supply, consume) 271e4bc969Sminshall *]]] 281e4bc969Sminshall * 291e4bc969Sminshall */ 301e4bc969Sminshall typedef struct { 312cd0b9fbSdab unsigned char *consume, /* where data comes out of */ 3258ab6e53Sminshall *supply, /* where data comes in to */ 331e4bc969Sminshall *bottom, /* lowest address in buffer */ 34cc687d58Sminshall *top, /* highest address+1 in buffer */ 35cc687d58Sminshall *mark; /* marker (user defined) */ 362d9ecb3aSdab #ifdef ENCRYPTION 372cd0b9fbSdab unsigned char *clearto; /* Data to this point is clear text */ 382cd0b9fbSdab unsigned char *encryyptedto; /* Data is encrypted to here */ 392d9ecb3aSdab #endif /* ENCRYPTION */ 401e4bc969Sminshall int size; /* size in bytes of buffer */ 4158ab6e53Sminshall u_long consumetime, /* help us keep straight full, empty, etc. */ 4258ab6e53Sminshall supplytime; 431e4bc969Sminshall } Ring; 441e4bc969Sminshall 451e4bc969Sminshall /* Here are some functions and macros to deal with the ring buffer */ 461e4bc969Sminshall 4701ec75b3Sminshall /* Initialization routine */ 4801ec75b3Sminshall extern int 492cd0b9fbSdab ring_init P((Ring *ring, unsigned char *buffer, int count)); 5001ec75b3Sminshall 511e4bc969Sminshall /* Data movement routines */ 521e4bc969Sminshall extern void 532cd0b9fbSdab ring_supply_data P((Ring *ring, unsigned char *buffer, int count)); 54693d27aaSborman #ifdef notdef 55693d27aaSborman extern void 562cd0b9fbSdab ring_consume_data P((Ring *ring, unsigned char *buffer, int count)); 57693d27aaSborman #endif 581e4bc969Sminshall 591e4bc969Sminshall /* Buffer state transition routines */ 601e4bc969Sminshall extern void 612cd0b9fbSdab ring_supplied P((Ring *ring, int count)), 622cd0b9fbSdab ring_consumed P((Ring *ring, int count)); 631e4bc969Sminshall 641e4bc969Sminshall /* Buffer state query routines */ 651e4bc969Sminshall extern int 662cd0b9fbSdab ring_empty_count P((Ring *ring)), 672cd0b9fbSdab ring_empty_consecutive P((Ring *ring)), 682cd0b9fbSdab ring_full_count P((Ring *ring)), 692cd0b9fbSdab ring_full_consecutive P((Ring *ring)); 701e4bc969Sminshall 712d9ecb3aSdab #ifdef ENCRYPTION 722686cc61Sminshall extern void 732cd0b9fbSdab ring_encrypt P((Ring *ring, void (*func)())), 742cd0b9fbSdab ring_clearto P((Ring *ring)); 752d9ecb3aSdab #endif /* ENCRYPTION */ 762686cc61Sminshall 772686cc61Sminshall extern void 782686cc61Sminshall ring_clear_mark(), 792686cc61Sminshall ring_mark(); 80