home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1987 / 07 / interrpt / fifo.inc < prev    next >
Encoding:
Text File  |  1987-06-10  |  4.0 KB  |  149 lines

  1. (* ------------------------------------------------------------ *)
  2. (*                          FIFO.INC                            *)
  3. (* First In / First Out - Puffer fuer den PASCAL-Druckerspooler *)
  4. (* ------------------------------------------------------------ *)
  5.  
  6. CONST
  7.    FifoHeaderSize    = 8;
  8.    FifoMaxSize       = 32752;
  9.  
  10. TYPE
  11.    Fifo_       = RECORD
  12.                    Size,
  13.                    Contains,
  14.                    InPos,
  15.                    OutPos      : INTEGER;
  16.                    Buffer      : ARRAY [0..FifoMaxSize] OF BYTE;
  17.                  END;
  18.    FifoAddr_   = ^Fifo_;
  19.    FifoStatus_ = (FifoOk, FifoInvalid, FifoEmpty, FifoFull);
  20.  
  21. (* ------------------------------------------------------------ *)
  22. (*             uebergebenen FIFO-Puffer entleeren:              *)
  23.  
  24. PROCEDURE FifoReset (VAR Fifo: Fifo_);
  25.  
  26. VAR  CriticalSection: CriticalSection_;
  27.  
  28. BEGIN
  29.   IF Addr (Fifo) <> NIL THEN
  30.     WITH Fifo DO
  31.       BEGIN
  32.         CriticalBegin (CriticalSection);
  33.         Contains:= 0;
  34.         InPos   := 0;
  35.         OutPos  := Pred(Size);
  36.         CriticalEnd (CriticalSection);
  37.       END;
  38. END;
  39.  
  40. (* ------------------------------------------------------------ *)
  41. (*                      FIFO initialisieren:                    *)
  42.  
  43. PROCEDURE FifoInit (VAR Fifo: Fifo_; FifoSize: INTEGER);
  44.  
  45. VAR  CriticalSection: CriticalSection_;
  46.  
  47. BEGIN
  48.   IF Addr (Fifo) <> NIL THEN
  49.     WITH Fifo DO
  50.       BEGIN
  51.         CriticalBegin (CriticalSection);
  52.         Size := FifoSize;
  53.         FifoReset (Fifo);
  54.         CriticalEnd (CriticalSection);
  55.       END;
  56. END;
  57.  
  58. (* ------------------------------------------------------------ *)
  59. (*               FIFO dynamisch im Heap anlegen:                *)
  60.  
  61. FUNCTION FifoAllocate (FifoSize: INTEGER): FifoAddr_;
  62.  
  63. VAR
  64.   Fifo      : FifoAddr_;
  65.   Avail     : INTEGER;
  66.   RecordSize: INTEGER;
  67.  
  68. BEGIN
  69.   IF (FifoSize > FifoMaxSize) OR (FifoSize < 1) THEN
  70.     FifoSize:= FifoMaxSize;
  71.   Avail:= MaxAvail;
  72.   RecordSize:= FifoSize + FifoHeaderSize;
  73.   IF (0 < Avail) AND (Avail < ((RecordSize+15) SHR 4)) THEN
  74.     FifoAllocate:= NIL
  75.   ELSE
  76.     BEGIN
  77.       GetMem (Fifo, RecordSize);
  78.       FifoInit (Fifo^, FifoSize);
  79.       FifoAllocate:= Fifo;
  80.     END;
  81. END;
  82.  
  83. (* ------------------------------------------------------------ *)
  84. (*           belegten Heap wieder freigeben:                    *)
  85.  
  86. PROCEDURE FifoFree (VAR Fifo: Fifo_);
  87.  
  88. VAR  FifoAddr: FifoAddr_;
  89.  
  90. BEGIN
  91.   FifoAddr:= Addr (Fifo);
  92.   IF FifoAddr <> NIL THEN
  93.     WITH Fifo DO
  94.       FreeMem (FifoAddr, Size + FifoHeaderSize);
  95. END;
  96.  
  97. (* ------------------------------------------------------------ *)
  98. (*             ein Zeichen in  den FIFO uebernehmen:            *)
  99.  
  100. PROCEDURE FifoWrite (VAR Fifo: Fifo_;
  101.                      VAR Status: FifoStatus_; C: BYTE);
  102.  
  103. VAR  CriticalSection : CriticalSection_;
  104.  
  105. BEGIN
  106.   IF Addr (Fifo) = NIL THEN
  107.     Status:= FifoInvalid
  108.   ELSE
  109.     WITH Fifo DO
  110.       IF Contains = Size THEN
  111.         Status:= FifoFull
  112.       ELSE
  113.         BEGIN
  114.           CriticalBegin (CriticalSection);
  115.           Buffer [InPos]:= C;
  116.           InPos:= Succ(InPos) MOD Size;
  117.           Contains:= Succ(Contains);
  118.           CriticalEnd (CriticalSection);
  119.           Status:= FifoOk;
  120.         END;
  121. END;
  122.  
  123. (* ------------------------------------------------------------ *)
  124. (*          ein Zeichen aus dem FIFO holen:                     *)
  125.  
  126. PROCEDURE FifoRead (VAR Fifo: Fifo_;
  127.                     VAR Status: FifoStatus_; VAR C: BYTE);
  128.  
  129. VAR  CriticalSection : CriticalSection_;
  130.  
  131. BEGIN
  132.   IF Addr (Fifo) = NIL THEN
  133.     Status:= FifoInvalid
  134.   ELSE
  135.     WITH Fifo DO
  136.       IF Contains = 0 THEN
  137.         Status:= FifoEmpty
  138.       ELSE
  139.         BEGIN
  140.           CriticalBegin (CriticalSection);
  141.           OutPos:= Succ(OutPos) MOD Size;
  142.           C:= Buffer [OutPos];
  143.           Contains:= Pred(Contains);
  144.           CriticalEnd (CriticalSection);
  145.           Status:= FifoOk;
  146.         END;
  147. END;
  148. (* ------------------------------------------------------------ *)
  149. (*                   Ende von FIFO.INC                          *)