home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 3 Comm / 03-Comm.zip / COMTALK.ZIP / CIRCLEQ.C < prev    next >
C/C++ Source or Header  |  1989-02-08  |  3KB  |  137 lines

  1. #define INCL_DOSSEMAPHORES
  2. #include <os2.h>        /* Need USHORT for global.h */
  3. #include <string.h>        /* One strcpy call */
  4. #include "global.h"
  5. #include "circleq.h"
  6.  
  7. #define    TIMEOUT    1000L        /* A second */
  8.  
  9. LineInfo aliRing[QUEUESIZE];    /* The Circular Queue...*/
  10. int  iHead, iTail;
  11. BOOL fFirst;            /* Are we just starting? */
  12. LONG lSemMyQueue;        /* Queue lock */
  13.  
  14. void LineCopy(Line, Line);
  15. void QueFill(void);
  16.  
  17. #define QueLock()   DosSemRequest(&lSemMyQueue, -1L)
  18. #define QueUnlock() DosSemClear(&lSemMyQueue)
  19.  
  20. #define Fix(n) (((n) >= 0) ? (n) : ((n) + QUEUESIZE))
  21. #define Circle(x)    ((x) % QUEUESIZE)
  22. #define Incr(x)     (x = Circle(x + 1))
  23. #define Decr(x)        (x = (x > 0) ? (x - 1) : (QUEUESIZE - 1))
  24.  
  25. void QueFill(void) {
  26.     int i, j;
  27.  
  28.     for (i = 0; i < 25; i++) {
  29.     aliRing[i].cch = MAXLINELEN;
  30.     for (j = 0; j < MAXLINELEN; j++)
  31.         aliRing[i].szText[j] = (char) ((i * j) % 10) + '0';
  32.     }
  33.     iHead = 0; iTail = 24;
  34. }
  35.  
  36. void QueInit(void) {
  37.     int i;
  38.  
  39.     fFirst = TRUE;
  40.     QueLock();
  41.     iHead = 0; iTail = 0;
  42.     for (i = 0; i < QUEUESIZE; i++) aliRing[i].cch = 0;
  43.     QueUnlock();
  44. }
  45.  
  46. void QueAdvance(int n) {
  47.     QueLock();
  48.     iHead = Circle(iHead + n);
  49.     QueUnlock();
  50. }
  51.  
  52. Line QueQuery(int LineNum) { return &aliRing[Circle(iHead + LineNum)]; }
  53.  
  54. BOOL QueInsertLine(Line pli) {
  55. /*
  56.     Return FALSE if we try to overwrite the head
  57. */
  58.     QueLock();
  59.     /*
  60.     Initialize the queue
  61.     */
  62.     if (fFirst) fFirst = FALSE;
  63.     /*
  64.     Increment TAIL, act if queue full
  65.     Overwrite if last entry was incomplete
  66.     */
  67.     else if (aliRing[iTail].fComplete && (Incr(iTail) == iHead)) {
  68.     /*
  69.         We are overflowing...
  70.     */
  71.     Decr(iTail);
  72.     QueUnlock();
  73.     return FALSE;
  74.     }
  75.     /*
  76.     Insert the element
  77.     */
  78.     LineCopy(pli, &aliRing[iTail]);
  79.     QueUnlock();
  80.     return TRUE;
  81. }
  82.  
  83. BOOL QueCompleteLine(void) { return aliRing[iTail].fComplete; }
  84.  
  85. void LineCopy(Line pliSrc, Line pliDst) {
  86.     int i;
  87.  
  88.     pliDst->fDrawn        = pliSrc->fDrawn;
  89.     pliDst->fComplete        = pliSrc->fComplete;
  90.     pliDst->cch            = pliSrc->cch;
  91.     for (i = 0; i < pliSrc->cch; i++) pliDst->szText[i] = pliSrc->szText[i];
  92. }
  93.  
  94. int QueUpdateHead(int nRows, BOOL bPage, BOOL bPaging) {
  95.     int i, nLines;
  96.  
  97.     nLines = Fix(Circle(iTail - iHead));
  98.     nLines = (nLines >= nRows) ? (nLines - nRows + 1) : 0;
  99.     if ((nLines = Min(nLines, nRows)) > 0) {
  100.     if (bPage) {
  101.         if (nLines < nRows) {
  102.         QueLock();
  103.         for (i = nLines; i < nRows; i++)
  104.             aliRing[Circle(iHead + nRows + i)].cch = 0;
  105.         QueUnlock();
  106.         }
  107.         nLines = nRows;
  108.     }
  109.     else if (bPaging) nLines = 0;
  110.     QueLock();
  111.     iHead = Circle(iHead + nLines);
  112.     QueUnlock();
  113.     }
  114.     return nLines;
  115. }
  116.  
  117. Line QueLastLine(void) {
  118.     QueLock();
  119.     aliRing[iTail].szText[aliRing[iTail].cch] = '\0';
  120.     QueUnlock();
  121.     return &aliRing[iTail];
  122. }
  123.  
  124. int QuePageUp(int nRows) {
  125.     int i, nLines;
  126.  
  127.     QueLock();
  128.     nLines = Min((QUEUESIZE - 1) - Fix(Circle(iTail - iHead)), nRows);
  129.     if (nLines) {
  130.     iHead = Fix(Circle(iHead - nLines));
  131.     for (i = 0; i < nLines; i++)
  132.         aliRing[Circle(iHead + nRows + i)].fDrawn = FALSE;
  133.     }
  134.     QueUnlock();
  135.     return nLines;
  136. }
  137.