rngLib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* rngLib.h - ring buffer subroutine library header */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 02b,22sep92,rrr  added support for c++
  7. 02a,04jul92,jcf  cleaned up.
  8. 01k,26may92,rrr  the tree shuffle
  9. 01j,04oct91,rrr  passed through the ansification filter
  10.   -changed VOID to void
  11.   -changed copyright notice
  12. 01i,06apr91,gae  added NOMANUAL to avoid fooling mangen.
  13. 01h,05oct90,shl  added ANSI function prototypes.
  14.                  made #endif ANSI style.
  15.                  added copyright notice.
  16. 01g,10aug90,dnw  added declaration of rngFlush().
  17. 01f,07aug90,shl  moved function declarations to end of file.
  18. 01e,22aug88,gae  removed incorrect comment about using 'shorts'
  19.  for optimization.
  20. 01d,30may88,dnw  changed to v4 names.
  21. 01c,10nov87,dnw  changed ring pointers from shorts to ints.
  22.  rings can now be > 32K bytes.
  23. 01b,15aug84,dnw  removed several macros, now routines in rngLib.cs;
  24.    only rngGetC and rngPutC remain as macros.
  25. 01a,06jun84,dnw  culled from old drvLib.h
  26. */
  27. #ifndef __INCrngLibh
  28. #define __INCrngLibh
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /* HIDDEN */
  33. /* typedefs */
  34. typedef struct /* RING - ring buffer */
  35.     {
  36.     int pToBuf; /* offset from start of buffer where to write next */
  37.     int pFromBuf; /* offset from start of buffer where to read next */
  38.     int bufSize; /* size of ring in bytes */
  39.     char *buf; /* pointer to start of buffer */
  40.     } RING;
  41. /* END_HIDDEN */
  42. typedef RING *RING_ID;
  43. /*
  44.  * The following macros are designed to do various operations on
  45.  * the RING object.  By using them, users can avoid having to know
  46.  * the structure of RING.  However they are intended to be very
  47.  * efficient and this is why they are macros in the first place.
  48.  * In general the parameters to them should be register variables
  49.  * for maximum efficiency.
  50.  */
  51. /*******************************************************************************
  52. *
  53. * RNG_ELEM_GET - get one character from a ring buffer
  54. *
  55. * This macro gets a single character from the specified ring buffer.
  56. * Must supply temporary variable (register int) 'fromP'.
  57. *
  58. * RETURNS: 1 if there was a char in the buffer to return, 0 otherwise
  59. *
  60. * NOMANUAL
  61. */
  62. #define RNG_ELEM_GET(ringId, pCh, fromP)
  63.     (
  64.     fromP = (ringId)->pFromBuf,
  65.     ((ringId)->pToBuf == fromP) ?
  66.     :
  67. (
  68. *pCh = (ringId)->buf[fromP],
  69. (ringId)->pFromBuf = ((++fromP == (ringId)->bufSize) ? 0 : fromP), 
  70. 1
  71. )
  72.     )
  73. /*******************************************************************************
  74. *
  75. * RNG_ELEM_PUT - put one character into a ring buffer
  76. *
  77. * This macro puts a single character into the specified ring buffer.
  78. * Must supply temporary variable (register int) 'toP'.
  79. *
  80. * RETURNS: 1 if there was room in the buffer for the char, 0 otherwise
  81. *
  82. * NOMANUAL
  83. */
  84. #define RNG_ELEM_PUT(ringId, ch, toP)
  85.     (
  86.     toP = (ringId)->pToBuf,
  87.     (toP == (ringId)->pFromBuf - 1) ?
  88.     :
  89. (
  90.      (toP == (ringId)->bufSize - 1) ?
  91.     (
  92.     ((ringId)->pFromBuf == 0) ?
  93. 0
  94.     :
  95. (
  96. (ringId)->buf[toP] = ch,
  97. (ringId)->pToBuf = 0,
  98. 1
  99. )
  100.     )
  101. :
  102.     (
  103.     (ringId)->buf[toP] = ch,
  104.     (ringId)->pToBuf++,
  105.     1
  106.     )
  107. )
  108.     )
  109. /* function declarations */
  110. #if defined(__STDC__) || defined(__cplusplus)
  111. extern BOOL  rngIsEmpty (RING_ID ringId);
  112. extern BOOL  rngIsFull (RING_ID ringId);
  113. extern RING_ID  rngCreate (int nbytes);
  114. extern int  rngBufGet (RING_ID rngId, char *buffer, int maxbytes);
  115. extern int  rngBufPut (RING_ID rngId, char *buffer, int nbytes);
  116. extern int  rngFreeBytes (RING_ID ringId);
  117. extern int  rngNBytes (RING_ID ringId);
  118. extern void  rngDelete (RING_ID ringId);
  119. extern void  rngFlush (RING_ID ringId);
  120. extern void  rngMoveAhead (RING_ID ringId, int n);
  121. extern void  rngPutAhead (RING_ID ringId, char byte, int offset);
  122. #else /* __STDC__ */
  123. extern BOOL  rngIsEmpty ();
  124. extern BOOL  rngIsFull ();
  125. extern RING_ID  rngCreate ();
  126. extern int  rngBufGet ();
  127. extern int  rngBufPut ();
  128. extern int  rngFreeBytes ();
  129. extern int  rngNBytes ();
  130. extern void  rngDelete ();
  131. extern void  rngFlush ();
  132. extern void  rngMoveAhead ();
  133. extern void  rngPutAhead ();
  134. #endif /* __STDC__ */
  135. #ifdef __cplusplus
  136. }
  137. #endif
  138. #endif /* __INCrngLibh */