{ Donated by Warren Smith, Feb 1982 }

Module Circular_Queue ;

{ This set of routines is intended only as a guide for handling }
{ circular buffers or queues.  Normally, I/O buffering would    }
{ be handled through this type of data structure and operations.}

Type
       Q_range       = Min_Q..Max_Q ;
       Q_Type        = byte ;
       Queue         = record
                       Q_not_empty,
                       Q_not_full      : boolean ;
                       Q_head,
                       Q_tail          : Q_Range ;
                       Q               : array [Q_Range] of Q_Type ;
                   end ;

Function Put_Q (Var Cur_Q : Queue ; Var Cur_Entry : Q_Type) : boolean ;

 begin { Put_Q }
 With Cur_Q do
   If Q_not_full then
     begin
     Q[Q_head] := Cur_Entry ;
     If Q_head = Max_Q then
       Q_head := Min_Q
     else
       Q_head := Q_head + 1 ;
     Q_not_full := Q_head <> Q_tail ;
     Q_not_empty := TRUE ;
     Put_Q := TRUE
     end
   else
     Put_Q := FALSE
 end ; { Put_Q }

Function Get_Q (Var Cur_Q : Queue ; Var Cur_Entry : Q_Type) : boolean ;

 begin { Get_Q }
 With Cur_Q do
   If Q_not_empty then
     begin
     Cur_Entry := Q[Q_tail] ;
     If Q_tail = Max_Q then
       Q_tail := Min_Q
     else
       Q_tail := Q_tail + 1 ;
     Q_not_full := TRUE ;
     Q_not_empty := Q_head <> Q_tail ;
     Get_Q := TRUE
     end
   else
     Get_Q := FALSE
 end ; { Get_Q }

ModEnd.