aboutsummaryrefslogtreecommitdiffstats
path: root/src/errorout-memory.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-05-09 18:24:08 +0200
committerTristan Gingold <tgingold@free.fr>2019-05-09 18:24:08 +0200
commit987a94c378dfb969e8bb7f1b734f29a33e63212e (patch)
tree7017b5c0fe2c97b53ea3bddca514c325dad11cc9 /src/errorout-memory.adb
parentb9c2c358ac74c66736537d5b1eb44d42819f6ec1 (diff)
downloadghdl-987a94c378dfb969e8bb7f1b734f29a33e63212e.tar.gz
ghdl-987a94c378dfb969e8bb7f1b734f29a33e63212e.tar.bz2
ghdl-987a94c378dfb969e8bb7f1b734f29a33e63212e.zip
Move errorout from vhdl/ to src/
Diffstat (limited to 'src/errorout-memory.adb')
-rw-r--r--src/errorout-memory.adb103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/errorout-memory.adb b/src/errorout-memory.adb
new file mode 100644
index 000000000..83b694b74
--- /dev/null
+++ b/src/errorout-memory.adb
@@ -0,0 +1,103 @@
+-- Store error messages
+-- Copyright (C) 2018 Tristan Gingold
+--
+-- GHDL is free software; you can redistribute it and/or modify it under
+-- the terms of the GNU General Public License as published by the Free
+-- Software Foundation; either version 2, or (at your option) any later
+-- version.
+--
+-- GHDL 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
+-- along with GHDL; see the file COPYING. If not, write to the Free
+-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+-- 02111-1307, USA.
+
+with Tables;
+
+package body Errorout.Memory is
+
+ type Char_Index is new Uns32;
+
+ package Messages is new Tables
+ (Table_Component_Type => Character,
+ Table_Index_Type => Char_Index,
+ Table_Low_Bound => 1,
+ Table_Initial => 128);
+
+ type Error_Element is record
+ Header : Error_Record;
+ Str : Char_Index;
+ end record;
+
+ package Errors is new Tables
+ (Table_Component_Type => Error_Element,
+ Table_Index_Type => Error_Index,
+ Table_Low_Bound => 1,
+ Table_Initial => 32);
+
+ function Get_Nbr_Messages return Error_Index is
+ begin
+ return Errors.Last;
+ end Get_Nbr_Messages;
+
+ function Get_Error_Record (Idx : Error_Index) return Error_Record is
+ begin
+ return Errors.Table (Idx).Header;
+ end Get_Error_Record;
+
+ function Get_Error_Message (Idx : Error_Index) return String
+ is
+ First : constant Char_Index := Errors.Table (Idx).Str;
+ Last : Char_Index;
+ begin
+ if Idx = Errors.Last then
+ Last := Messages.Last;
+ else
+ Last := Errors.Table (Idx + 1).Str - 1;
+ end if;
+ return String (Messages.Table (First .. Last - 1));
+ end Get_Error_Message;
+
+ function Get_Error_Message_Addr (Idx : Error_Index) return System.Address
+ is
+ First : constant Char_Index := Errors.Table (Idx).Str;
+ begin
+ return Messages.Table (First)'Address;
+ end Get_Error_Message_Addr;
+
+ procedure Clear_Errors is
+ begin
+ Errors.Init;
+ Messages.Init;
+ Nbr_Errors := 0;
+ end Clear_Errors;
+
+ procedure Memory_Error_Start (E : Error_Record) is
+ begin
+ Errors.Append ((E, Messages.Last + 1));
+ end Memory_Error_Start;
+
+ procedure Memory_Message (Str : String) is
+ begin
+ for I in Str'Range loop
+ Messages.Append (Str (I));
+ end loop;
+ end Memory_Message;
+
+ procedure Memory_Message_End is
+ begin
+ Messages.Append (ASCII.NUL);
+ end Memory_Message_End;
+
+ procedure Install_Handler is
+ begin
+ Set_Report_Handler ((Memory_Error_Start'Access,
+ Memory_Message'Access,
+ Memory_Message_End'Access));
+ end Install_Handler;
+
+end Errorout.Memory;