File size: 2,037 Bytes
52edc5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
with Ada.Text_IO;
with Core_Types; use Core_Types;
package body Errors is
   procedure Clear_Error (Log : in out Error_Log) is
   begin
      Log.Context.Code := Success; Log.Context.Line_Hint := 0;
      Log.Context.Detail := (others => ' '); Log.Active := False;
   end Clear_Error;
   procedure Set_Error (Log : in out Error_Log; Code : Status_Code; Hint : Medium_Natural := 0; Message : String := "") is
      Len : Natural;
   begin
      Log.Context.Code := Code; Log.Context.Line_Hint := Hint;
      Log.Context.Detail := (others => ' ');
      if Message'Length > 0 then
         Len := Natural'Min (Message'Length, Log.Context.Detail'Length);
         for I in 0 .. Len - 1 loop
            Log.Context.Detail (I) := Message (Message'First + I);
         end loop;
      end if;
      Log.Active := True;
   end Set_Error;
   function Get_Code (Log : Error_Log) return Status_Code is (Log.Context.Code);
   function Get_Hint (Log : Error_Log) return Medium_Natural is (Log.Context.Line_Hint);
   function Has_Error (Log : Error_Log) return Boolean is (Log.Active and then Log.Context.Code /= Success);
   function Get_Message (Log : Error_Log) return String is
      Last : Natural := 0;
   begin
      for I in Log.Context.Detail'Range loop
         if Log.Context.Detail (I) /= ' ' then Last := I + 1; end if;
      end loop;
      if Last = 0 then return ""; else return String (Log.Context.Detail (0 .. Last - 1)); end if;
   end Get_Message;
   procedure Report_Error (Log : Error_Log) is
   begin
      if Has_Error (Log) then
         Ada.Text_IO.Put_Line ("ERROR: " & Status_To_String (Log.Context.Code) &
            " hint=" & Medium_Natural'Image (Log.Context.Line_Hint) & " msg=" & Get_Message (Log));
      else
         Ada.Text_IO.Put_Line ("NO_ERROR");
      end if;
   end Report_Error;
   function Error_Is (Log : Error_Log; Code : Status_Code) return Boolean is
   begin
      return Has_Error (Log) and then Log.Context.Code = Code;
   end Error_Is;
end Errors;