 
-- remove all generic IO from stkland.ada ==> stknoid.ada
------------------------------------------------------------------------
--								      --
-- NAME:	Stack Land					      --
-- AUTHOR:	G. Pyle						      --
-- DATE:	1983						      --
--								      --
------------------------------------------------------------------------
							-- C*T Ada features
 with TEXT_IO; 
 use TEXT_IO;

-- Procedure STACKS is a procedure to demonstrate the use of stacks.
procedure STACKS is

  -- We will use this type in the enumeration example.
  type VEGETABLES is (CARROT, LETTUCE, PEA, PRUNE);	-- enumeraction types

  -- Define a generic stack.
  generic						-- generics
     type ITEM is private;		-- Type to be stacked.
     MAX : integer;			-- Size of the stack.

  package STACK is					-- packages

     -- procedure to add an item to the stack.
     procedure PUSH(X:ITEM);

     -- procedure to remove an item and return its value.
     function POP return ITEM;

  end STACK;

  package body STACK is

     S:array(1..MAX) of ITEM;
     TOP:INTEGER range 0 .. MAX;

     procedure PUSH(X:ITEM) is
     begin
       TOP:=TOP+1;
       S(TOP):=X;
     end PUSH;

     function POP return ITEM is
     begin
       TOP:=TOP-1;
       return S(TOP+1);
     end POP;

  begin
    TOP:=0;				-- Initialize the stack top.
  end STACK;

  -- We will need integer and float I/O for  our examples.
  -- We will also need enumeration I/O for our vegetables.
  -- remove the generic instantiations
--  package INT_IO        is new INTEGER_IO(INTEGER);	-- generic I/O	
--  package FLO_IO        is new FLOAT_IO(FLOAT);
--  package VEG_IO        is new ENUMERATION_IO(VEGETABLES);

  -- Instantiate 3 stacks for different types, and with different
  -- sizes.
  -- ditto
--  package INTEGER_STACK is new STACK(INTEGER,5);
--  package VEG_STACK     is new STACK(VEGETABLES,7);
--  package FLOAT_STACK   is new STACK(FLOAT,6);

  -- A Simple task to demonstrate the INTEGER STACK	-- Tasks
  task INTEGER_EXAMPLE;
  task body INTEGER_EXAMPLE is
--    use INTEGER_STACK,INT_IO;
  begin
--    PUSH(123);
--    PUSH(456);
--    PUT(INTEGER'(POP),10);				-- qualifiers
--    PUT(INTEGER'(POP),10);
    NEW_LINE;
  end INTEGER_EXAMPLE;

  -- A Simple task to demonstrate the FLOAT STACK
  task FLOAT_EXAMPLE;
  task body FLOAT_EXAMPLE is
--    use FLOAT_STACK,FLO_IO;
  begin
--    PUSH(123.0);
--    PUSH(FLOAT(456));					-- conversion
--    PUT(FLOAT'(POP),10);
--    PUT(FLOAT'(POP),10);
    NEW_LINE;
  end;

  -- And a task for our enumeration example using vegetables.
  task ENUM_EXAMPLE;
  task body ENUM_EXAMPLE is
--    use VEG_STACK,VEG_IO;
  begin
--    PUSH(CARROT);
--    PUSH(PRUNE);
--    PUT(POP);
--    PUT(POP);
    NEW_LINE;
  end;

-- Print welcome messages from time to time.
begin
  for WELCOME in 1 .. 5 loop
    PUT_LINE("Welcome to the wonderful world of stacks");
  end loop;
end STACKS;
  
------------------------------------------------------------------------

