-- MesaBandStreamImpl.mesa -- Last changed by Ken Pier, March 14, 1982 6:48 PM DIRECTORY MesaBandStream, PressBandsDefs USING [GetTfsBandsBuffer, ReadTfsPage], Inline USING [COPY]; MesaBandStreamImpl: PROGRAM IMPORTS Inline, PressBandsDefs EXPORTS MesaBandStream = { OPEN PB: PressBandsDefs, MesaBandStream; wordsPerPage: CARDINAL = 256; wordsPerTFSPage: CARDINAL = 1024; InitBandFileBuffer: PUBLIC PROC[] = { wordsLeft ← 0; bRef ← bStart ← PB.GetTfsBandsBuffer[]; bEnd ← bStart+bufferWords; }; GetBand: PUBLIC PROC[to: POINTER, words: CARDINAL] RETURNS [CARDINAL] = { wordsRead, nWords: CARDINAL ← 0; DO nWords ← MIN[wordsLeft, words]; Inline.COPY[from: bRef, nwords: nWords, to: to]; wordsRead ← wordsRead+nWords; IF nWords=words THEN {--buffer had all the words wordsLeft ← wordsLeft-words; bRef ← bRef+words; EXIT; }; --buffer empty and more to COPY. bRef ← bStart; words ← words-wordsLeft; to ← to+wordsLeft; PB.ReadTfsPage; wordsLeft ← wordsPerTFSPage; ENDLOOP; RETURN[wordsRead]; };--GetBand SkipBand: PUBLIC PROC [words: CARDINAL] RETURNS [CARDINAL] = { wordsRead, nWords: CARDINAL ← 0; DO nWords ← MIN[wordsLeft, words]; wordsRead ← wordsRead+nWords; IF nWords=words THEN {--buffer had all the words wordsLeft ← wordsLeft-words; bRef ← bRef+words; EXIT; }; --buffer empty and more to COPY. bRef ← bStart; words ← words-wordsLeft; PB.ReadTfsPage; wordsLeft ← wordsPerTFSPage; ENDLOOP; RETURN[wordsRead]; };--SkipBand --global storage wordsLeft: CARDINAL ← 0;--remaining valid words in Get buffer bufferPages: CARDINAL ← 1; bufferWords: CARDINAL ← bufferPages*wordsPerTFSPage; bStart, bRef, bEnd: POINTER ← NIL; }. LOG March 11, 1982, changed to SHORT POINTERS