-- 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;