|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.