const 
  qCapacity = 4;

type
  Queue = 
    record
      head : integer;
      usedCount : integer;
      buffer : array [0..qCapacity-1] of integer
    end;

function Queue_is_empty(var q : Queue) : boolean;
  begin
{    if q.usedCount = 0 then
      Queue_is_empty := true
    else
      Queue_is_empty := false}
    Queue_is_empty := (q.usedCount = 0)
  end;

function Queue_is_full(var q : Queue) : boolean;
  begin
    Queue_is_full := (q.usedCount = qCapacity)
  end;

procedure Queue_add_item(var q : Queue; item : integer);
  begin
    q.buffer[(q.head + q.usedCount) mod qCapacity] := item;
    q.usedCount := q.usedCount + 1
  end;

procedure Queue_remove_item(var q : Queue; var item : integer);
  begin
    item := q.buffer[q.head];
    q.head := (q.head + 1) mod qCapacity;
    q.usedCount := q.usedCount - 1
  end;

procedure Queue_initialize(var q : Queue);
  begin
    q.head := 0;
    q.usedCount := 0;
  end;
   
function Queue_safe_add_item(var q : Queue; item : integer) : boolean;
  begin
    if Queue_is_full(q) then
      Queue_safe_add_item := false
    else
      begin
        Queue_add_item(q, item);
	Queue_safe_add_item := true
      end
  end;

function Queue_safe_remove_item(var q : Queue; var item : integer) : boolean;
  begin
    if Queue_is_empty(q) then
      Queue_safe_remove_item := false
    else
      begin
        Queue_remove_item(q, item);
	Queue_safe_remove_item := true
      end
  end;

var
  q : Queue;
  choice : integer;
  item : integer;

begin
  repeat
    { make sure user enters a valid choice }
    repeat
      writeln('0 : exit');
      writeln('1 : initialize');
      writeln('2 : check empty');
      writeln('3 : check full');
      writeln('4 : add item');
      writeln('5 : remove item');

      readln(choice);

      if (choice < 0) or (choice > 5) then
        writeln('your choice was not valid')
    until (choice >= 0) and (choice <= 5); { choice is valid }
    { perform the choosen operation }

    if choice = 0 then
      writeln('exiting program now')
    else if choice = 1 then
      Queue_initialize(q)
    else if choice = 2 then
      writeln('Queue_is_empty returns ',Queue_is_empty(q))
    else if choice = 3 then
      writeln('Queue_is_full returns ', Queue_is_full(q))
    else if (choice = 4) then
      begin
        writeln('enter the value of item ');
	readln(item);
	writeln('Queue_safe_add_item returns ',Queue_safe_add_item(q, item))
      end
    else if choice = 5 then
      begin
        writeln('Queue_safe_remove_item returns ',Queue_safe_remove_item(q, item));
	writeln('item retrieved is  ',item)
      end
  until choice = 0 { user chooses to exit }
end.

