home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / communic / sercom / cirbuf.c < prev    next >
Encoding:
Text File  |  1986-09-04  |  2.5 KB  |  84 lines

  1. typedef    struct {
  2.    int count;                /* number of chars now in the buffer          */
  3.    int start;                /* offset of next characte to take            */
  4.    int size;                 /* size of the buffer                         */
  5.    char *buffer;             /* Address of the buffer                      */
  6. } RING;
  7.  
  8. /*_________________________________________________________________________*/
  9. void initbuf(r, addr, len)
  10. register RING *r;
  11. char *addr;
  12. int len;
  13.  
  14. /*
  15. * initialize a RING buffer
  16. */
  17.  
  18. {
  19.     r -> count   = 0;
  20.     r -> start   = 0;
  21.     r -> buffer  = addr;
  22.     r -> size    = len;
  23. }
  24. /*_______________________________________________________________________*/
  25. void putbuf(r, ch)
  26. register RING *r;
  27. char   ch;
  28.  
  29. /*
  30. * Put a character into a RING buffer
  31. */
  32.  
  33. {
  34. int offset;
  35.  
  36.     offset = (r -> start + r -> count) % r -> size; 
  37.                                                  /* Position for new char  */
  38.                                                                      
  39.     r -> buffer[offset] = ch;                    /* place char in buffer   */
  40.  
  41.     if (r -> count >= r -> size) {
  42.                                                  /* overflow?              */
  43.        r -> start++;                             /* move starting point    */
  44.  
  45.        if (r -> start >= r -> size)              /* Start is beyond end    */
  46.           r -> start -= r -> size;               /* Rotate it              */
  47.  
  48.     }
  49.  
  50.     else {
  51.        r -> count++;                             /* just update the count  */
  52.     }
  53. }
  54. /*_________________________________________________________________________*/
  55. int getbuf(r, ch)
  56. register RING    *r;
  57. char *ch;
  58. /*
  59. * Get a character from a RING buffer
  60. * Returns 0 if buffer is empty.
  61. */
  62. {
  63.  
  64.     if (r -> count == 0)                         /* Nothing there          */
  65.          return (0);                             /* return 'failure'       */
  66.  
  67.     *ch = r -> buffer[r -> start];               /* get next char to take  */
  68.  
  69.     r -> start++;                                /* move starting point    */
  70.  
  71.     if (r -> start >= r -> size) {               /* Do not overflow        */
  72.        r -> start = 0;
  73.     }
  74.  
  75.     r -> count--;                                /* One less char there    */
  76.  
  77.     return(1);                                   /* return 'success'       */
  78. }
  79. /*_________________________________________________________________________*/
  80.  
  81. /* Figure 16.11: Circular Buffer Creation */
  82.  
  83.  
  84.