-- Code of Figure 14.10, pages 658-659 from
-- Kenneth C. Louden, Programming Languages
-- Principles and Practice 2nd Edition
-- Copyright (C) Brooks-Cole/ITP, 2003
-- A Bounded Buffer as an Ada83 task type

task buf is
  entry insert(ch: in character);
  entry delete(ch: out character);
  entry more (notEmpty: out boolean);
end;

task body buf is
   MaxBufferSize: constant integer := 5;
   store: array (1..MaxBufferSize) of character;
   bufferStart: integer := 1;
   bufferEnd: integer := 0;
   bufferSize: integer := 0;
begin
   loop
     select
       when bufferSize < MaxBufferSize =>
          accept insert(ch: in character) do
             bufferEnd :=
	        bufferEnd mod MaxBufferSize + 1;
             store(bufferEnd) := ch;
          end insert;
          bufferSize := bufferSize + 1;
       or when bufferSize > 0 =>
          accept delete(ch: out character) do
             ch := store(bufferStart);
         end delete;
         bufferStart :=
	     bufferStart mod MaxBufferSize + 1;
         bufferSize := bufferSize - 1;
      or
         accept more(notEmpty: out boolean) do
              notEmpty := bufferSize > 0;
         end more;
      or terminate;
    end select;
  end loop;
end buf;
