home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------------ *)
- (* FIFO.INC *)
- (* First In / First Out - Puffer fuer den PASCAL-Druckerspooler *)
- (* ------------------------------------------------------------ *)
-
- CONST
- FifoHeaderSize = 8;
- FifoMaxSize = 32752;
-
- TYPE
- Fifo_ = RECORD
- Size,
- Contains,
- InPos,
- OutPos : INTEGER;
- Buffer : ARRAY [0..FifoMaxSize] OF BYTE;
- END;
- FifoAddr_ = ^Fifo_;
- FifoStatus_ = (FifoOk, FifoInvalid, FifoEmpty, FifoFull);
-
- (* ------------------------------------------------------------ *)
- (* uebergebenen FIFO-Puffer entleeren: *)
-
- PROCEDURE FifoReset (VAR Fifo: Fifo_);
-
- VAR CriticalSection: CriticalSection_;
-
- BEGIN
- IF Addr (Fifo) <> NIL THEN
- WITH Fifo DO
- BEGIN
- CriticalBegin (CriticalSection);
- Contains:= 0;
- InPos := 0;
- OutPos := Pred(Size);
- CriticalEnd (CriticalSection);
- END;
- END;
-
- (* ------------------------------------------------------------ *)
- (* FIFO initialisieren: *)
-
- PROCEDURE FifoInit (VAR Fifo: Fifo_; FifoSize: INTEGER);
-
- VAR CriticalSection: CriticalSection_;
-
- BEGIN
- IF Addr (Fifo) <> NIL THEN
- WITH Fifo DO
- BEGIN
- CriticalBegin (CriticalSection);
- Size := FifoSize;
- FifoReset (Fifo);
- CriticalEnd (CriticalSection);
- END;
- END;
-
- (* ------------------------------------------------------------ *)
- (* FIFO dynamisch im Heap anlegen: *)
-
- FUNCTION FifoAllocate (FifoSize: INTEGER): FifoAddr_;
-
- VAR
- Fifo : FifoAddr_;
- Avail : INTEGER;
- RecordSize: INTEGER;
-
- BEGIN
- IF (FifoSize > FifoMaxSize) OR (FifoSize < 1) THEN
- FifoSize:= FifoMaxSize;
- Avail:= MaxAvail;
- RecordSize:= FifoSize + FifoHeaderSize;
- IF (0 < Avail) AND (Avail < ((RecordSize+15) SHR 4)) THEN
- FifoAllocate:= NIL
- ELSE
- BEGIN
- GetMem (Fifo, RecordSize);
- FifoInit (Fifo^, FifoSize);
- FifoAllocate:= Fifo;
- END;
- END;
-
- (* ------------------------------------------------------------ *)
- (* belegten Heap wieder freigeben: *)
-
- PROCEDURE FifoFree (VAR Fifo: Fifo_);
-
- VAR FifoAddr: FifoAddr_;
-
- BEGIN
- FifoAddr:= Addr (Fifo);
- IF FifoAddr <> NIL THEN
- WITH Fifo DO
- FreeMem (FifoAddr, Size + FifoHeaderSize);
- END;
-
- (* ------------------------------------------------------------ *)
- (* ein Zeichen in den FIFO uebernehmen: *)
-
- PROCEDURE FifoWrite (VAR Fifo: Fifo_;
- VAR Status: FifoStatus_; C: BYTE);
-
- VAR CriticalSection : CriticalSection_;
-
- BEGIN
- IF Addr (Fifo) = NIL THEN
- Status:= FifoInvalid
- ELSE
- WITH Fifo DO
- IF Contains = Size THEN
- Status:= FifoFull
- ELSE
- BEGIN
- CriticalBegin (CriticalSection);
- Buffer [InPos]:= C;
- InPos:= Succ(InPos) MOD Size;
- Contains:= Succ(Contains);
- CriticalEnd (CriticalSection);
- Status:= FifoOk;
- END;
- END;
-
- (* ------------------------------------------------------------ *)
- (* ein Zeichen aus dem FIFO holen: *)
-
- PROCEDURE FifoRead (VAR Fifo: Fifo_;
- VAR Status: FifoStatus_; VAR C: BYTE);
-
- VAR CriticalSection : CriticalSection_;
-
- BEGIN
- IF Addr (Fifo) = NIL THEN
- Status:= FifoInvalid
- ELSE
- WITH Fifo DO
- IF Contains = 0 THEN
- Status:= FifoEmpty
- ELSE
- BEGIN
- CriticalBegin (CriticalSection);
- OutPos:= Succ(OutPos) MOD Size;
- C:= Buffer [OutPos];
- Contains:= Pred(Contains);
- CriticalEnd (CriticalSection);
- Status:= FifoOk;
- END;
- END;
- (* ------------------------------------------------------------ *)
- (* Ende von FIFO.INC *)