packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/andrea-m2/lib/generic/stacks.mod

IMPLEMENTATION MODULE Stacks;

(* Procedures for non-homogeneous stack data structure *)
(* V1.2, J.Andrea, Jun.22/93 -more compiler generic *)
(* V1.1, John Andrea, Oct.11/91 - modified to use the generic Queue module *)
(* V1.0, John Andrea, Oct.3/91 *)
(* This code may be freely used and distributed, it may not be sold. *)

FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM SYSTEM IMPORT BYTE;
IMPORT Queues;

                                              (* Some compilers don't allow  *)
                                              (* type  Stack  = Queues.Queue *)
                                              (* So build in a second layer  *)
TYPE
   Stack     = POINTER TO StackData;
   StackData = RECORD
                 queue :Queues.Queue;
               END;

   (* ------------------------------------------- *)
   PROCEDURE InitStack( VAR a :Stack );
   (* Create a stack, this must be called before the stack is used *)
   BEGIN

     NEW( a );
     Queues.InitQueue( a^.queue );

   END InitStack;

   (* ------------------------------------------- *)
   PROCEDURE Push( a :Stack; data :ARRAY OF BYTE );
   (* Push an item onto the stack *)
   BEGIN

     Queues.Push( a^.queue, Queues.Top, data );

   END Push;

   (* ------------------------------------------- *)
   PROCEDURE Pop( a :Stack; VAR data :ARRAY OF BYTE;
                  VAR nothing_to_pop :BOOLEAN );
   (* Get an item from the stack *)
   BEGIN

     Queues.Pop( a^.queue, Queues.Top, data, nothing_to_pop );

   END Pop;

   (* ------------------------------------------- *)
   PROCEDURE DelStack( VAR a :Stack );
   (* Complete delete a stack *)
   BEGIN

      Queues.DelQueue( a^.queue );
      DISPOSE( a );

   END DelStack;

   (* ------------------------------------------- *)
   PROCEDURE StackInfo( a :Stack; VAR n_items, size :CARDINAL );
   (* Return some info about a stack *)
   BEGIN

     Queues.QueueInfo( a^.queue, Queues.Top, n_items, size );

   END StackInfo;

BEGIN
END Stacks.