stephes_ada_library_3.7.3_08b48307/source/sal-text_io_utils.adb

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
--  Abstract :
--
--  See spec
--
--  Copyright (C) 2001, 2002, 2003, 2004, 2009 Stephen Leake.  All Rights Reserved.
--
--  This library 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. This library 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 this program; see file COPYING. If not,
--  write to the Free Software Foundation, 59 Temple Place - Suite
--  330, Boston, MA 02111-1307, USA.
--
--  As a special exception, if other files instantiate generics from
--  this unit, or you link this unit with other files to produce an
--  executable, this unit does not by itself cause the resulting
--  executable to be covered by the GNU General Public License. This
--  exception does not however invalidate any other reasons why the
--  executable file might be covered by the GNU Public License.

with Ada.Exceptions;
with Ada.Strings.Fixed;
package body SAL.Text_IO_Utils is
   use Ada.Text_IO;

   procedure Skip_Whitespace
   is begin
      Skip_Whitespace (Current_Input);
   end Skip_Whitespace;

   procedure Skip_Whitespace (File : in File_Type)
   is
      Item        : Character;
      End_Of_Line : Boolean;
   begin
      loop
         Look_Ahead (File, Item, End_Of_Line);
         if End_Of_Line then
            if End_Of_File (File) then
               return;
            else
               Skip_Line (File);
            end if;
         elsif Item = ' ' or Item = ASCII.HT then
            Get (File, Item);
         else
            return;
         end if;
      end loop;
   end Skip_Whitespace;

   procedure Skip_Past (Delimiter : in Character)
   is begin
      Skip_Past (Current_Input, Delimiter);
   end Skip_Past;

   procedure Skip_Past (File : in Ada.Text_IO.File_Type; Delimiter : in Character)
   is
      Item : Character;
   begin
      loop
         Get (File, Item);
         if Item = Delimiter then
            return;
         end if;
      end loop;
   end Skip_Past;

   procedure Check (Item : in String)
   is begin
      Check (Current_Input, Item);
   end Check;

   procedure Check (File : in File_Type; Item : in String)
   is
      Trimmed_Item : constant String := Ada.Strings.Fixed.Trim (Item, Ada.Strings.Both);
      Temp         : String (Trimmed_Item'Range);
   begin
      Skip_Whitespace (File);
      Get (File, Temp);
      if Temp /= Trimmed_Item then
         Ada.Exceptions.Raise_Exception
           (Syntax_Error'Identity,
            Name (File) & ":" &
              Ada.Strings.Fixed.Trim (Count'Image (Line (File)), Ada.Strings.Both) & ":" &
              Ada.Strings.Fixed.Trim (Count'Image (Col (File)), Ada.Strings.Both) &
              ": Expecting """ & Item & """, found """ & Temp & """.");
      end if;
      Skip_Whitespace (File);
   end Check;

   function Peek (File : in Ada.Text_IO.File_Type) return Character
   is
      Item        : Character;
      End_Of_Line : Boolean;
   begin
      Skip_Whitespace (File);
      Look_Ahead (File, Item, End_Of_Line);
      --  Skip_Whitespace guarrantees End_Of_Line won't be True here.
      return Item;
   end Peek;

end SAL.Text_IO_Utils;