-------------------------------------------------------------------------------
-- (C) Altran Praxis Limited
-------------------------------------------------------------------------------
--
-- The SPARK toolset is free software; you can redistribute it and/or modify it
-- under terms of the GNU General Public License as published by the Free
-- Software Foundation; either version 3, or (at your option) any later
-- version. The SPARK toolset is distributed in the hope that it will be
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
-- Public License for more details. You should have received a copy of the GNU
-- General Public License distributed with the SPARK toolset; see file
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy of
-- the license.
--
--=============================================================================

with SystemErrors;

package body LexTokenStacks is

   function IsEmpty (S : Stacks) return Boolean is
   begin
      return S.Ptr = 0;
   end IsEmpty;

   procedure Clear (S : out Stacks) is
   begin
      S := Stacks'(Vector => Vectors'(others => LexTokenManager.Null_String),
                   Ptr    => 0);
   end Clear;

   procedure Push (S    : in out Stacks;
                   Item : in     LexTokenManager.Lex_String) is
   begin
      if S.Ptr = MaxDepth then
         SystemErrors.Fatal_Error (Sys_Err => SystemErrors.Lex_Stack_Overflow,
                                   Msg     => "");
      end if;
      S.Ptr            := S.Ptr + 1;
      S.Vector (S.Ptr) := Item;
   end Push;

   procedure Pop (S    : in out Stacks;
                  Item :    out LexTokenManager.Lex_String) is
   begin
      if IsEmpty (S) then
         SystemErrors.Fatal_Error (Sys_Err => SystemErrors.Lex_Stack_Underflow,
                                   Msg     => "");
      end if;
      Item  := S.Vector (S.Ptr);
      S.Ptr := S.Ptr - 1;
   end Pop;

end LexTokenStacks;
