Annotation of pmsdk/samples/comtalk/circleq.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.