-- main is main file of main project written with Ada.
-- Main is Copyright (C) 2025 Manuel De Girardi ; 
--
--   This program 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 of the License, or
--   (at your option) any later version.
--
--   This program 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 this program; if not, write to the Free Software
--   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
--
-- Date := 2025-07-25 08:23:50 ; 
-- Version := 0.5.0r ; 
with Ada.Characters.Handling;
use Ada.Characters.Handling;
with Ada.Calendar.Formatting;
use Ada.Calendar.Formatting;
with M.Ansi.Console;
use M.Ansi.Console;
with Text_Io;
use Text_Io;
with Gnat.Os_Lib;
use Gnat.Os_Lib;
with Ada.Unchecked_Deallocation;

package body M.Engine is
   
   use Ada.Wide_Text_Io;
   use Element_Vectors;
   procedure String_Free is new Ada.Unchecked_Deallocation(String, String_Access);
   function Same (Left, Right : in Element_Access) return Boolean is
   begin
      return Left.all = Right.all;
   end Same;
   
   procedure Obj_Free(O : in out Element_Access) is
   begin
      Wide_Free(O.Info.Name);
      if O.Definition.Index /= 0 then
	 for Att in 1..O.Definition.Index loop
	    if O.Definition.List(Att).Enum = Str then
	       String_Free(O.Definition.List(Att).Str);
	    end if;
	 end loop;
      end if;
      
	      
   end Obj_Free;

   
   procedure Print (Info : Element_Info; header : in Window_Type) is
   begin
      
      Draw(Header, 1, 2, White, "Class : " & To_Wide_String(Element_Enum'Image(Info.Tag)));
      Draw(Header, 2, 2, White, "Index : " & To_Wide_String(Element_Index'Image(Info.Index)));
      if Info.Name /= null then
	 Draw(Header, 3, 2, White, "Name : " & Info.Name.all);
      else
	 Draw(Header, 3, 2, White, "Name : ");
      end if;
      Draw(Header, 4, 2, White, "Created : " & To_Wide_String(Image(Info.Created)));
   end Print;
   
   
   
   
   procedure Print (Obj    : in None_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      null;
   end Print;
   
   procedure Write (O : in None_Class;File : in W_Io.File_Type) is
   begin
      null;
   end Write;
   procedure Read (O : out None_Class;File : in W_Io.File_Type) is
   begin
      null;
   end Read;
   
   
   
   
   procedure Print (Attr : in Attributs; Win : in Window_type) is
   begin      

      if Attr.Index /= 0 then
	 
	 for I in 1..Attr.Index loop
	    Draw(Win, I, 1, white, To_Wide_String(Attr.List(I).Name.all));
	    Draw(Win, I, Attr.List(I).Name'Length+1, Red, "=");
	    Draw(Win, I, Attr.List(I).Name'Length+2, white, To_Wide_String(Attr.List(I).Value.all));
	 end loop;
      end if;
   end Print;
      
   procedure Print (Obj    : in Program_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin

      Print(Obj.Info, Header);

      if Obj.line /= null then

	 Draw(Win, 1, 1, white, "Project : " & Obj.line.all);

      end if;
   end Print;
   
   procedure Write (O : in Program_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
      
   end Write;
   procedure Read (O : out Program_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      
   end Read;
   
   procedure Print (Obj    : in Description_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, header);
      Draw(Win, 1, 1, Yellow, "Description : ");
      Draw(Win, 1, 15, white, Obj.Line.all);
   end Print;
   
   procedure Write (O : in Description_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);      
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
      
   end Write;
   procedure Read (O : out Description_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;

      
   end Read;
   
   procedure Print (Obj    : in License_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin      
      Print(Obj.Info, Header);
      for Line in 1..Obj.License.Line_Last loop
	 Draw(Win, Line, 1, Yellow, Obj.License.Lines(Line).all);
      end loop;
   end Print;
   
   procedure Write (O : in License_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      W_Io.Put_Line(File, To_Wide_String(Integer'Image(O.License.Line_Last)));
      for Line in 1..O.License.Line_Last loop
	 W_Io.Put_Line(File, O.License.Lines(Line).all);
      end loop;
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out License_Class;File : in W_Io.File_Type) is
      Length : Natural := 0;
   begin
      O.Info.Index := Element_Index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      Length := Integer'Value(To_String(Get_Line(File)));
      O.License := new Wide_String_Set(Length);
      for Line in 1..Length loop
	 O.License.lines(Line) := new Wide_String ' (Get_Line(File));
      end loop;
      O.License.Line_Last := Length;
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      
   end Read;
   
   procedure Print (Obj    : in Main_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Name : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Main_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Main_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_Index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      
   end Read;

   procedure Print (Obj    : in Library_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw (Win, 1, 1, White, "Unit : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Library_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Library_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      

   end Read;
   
   
   
   procedure Print (Obj    : in Axiomatic_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Title : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Axiomatic_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Axiomatic_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      
   end Read;
   
   procedure Print (Obj    : in Precondition_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Precondition : " & Obj.Line.all);
   end Print;
	   
   procedure Write (O : in Precondition_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Precondition_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      

   end Read;
   
   procedure Print (Obj    : in Axiom_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Axiom : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Axiom_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Axiom_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      
   end Read;
   
   procedure Print (Obj    : in Predicate_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Predicate : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Predicate_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      w_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Predicate_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      W_Io.Put_Line(File, O.Line.all);
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;


   end Read;
   
   procedure Print (Obj    : in Condition_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Condition : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Condition_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      W_Io.Put_Line(File, O.Line.all);
   end Write;
   procedure Read (O : out Condition_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;


   end Read;
   
   procedure Print (Obj    : in Component_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Component : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Component_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Component_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;


   end Read;
   
   procedure Print (Obj    : in Action_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Action : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Action_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Action_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;


   end Read;
   
   procedure Print (Obj    : in Class_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Class : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Class_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Class_Class;File : in W_Io.File_Type) is
   begin
            O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      

   end Read;
   
   procedure Print (Obj    : in Machine_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "Machine : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in Machine_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out Machine_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      

   end Read;
   
   procedure Print (Obj    : in System_Class;
		    Header : in Window_Type;
		    Win : in Window_Type) is
   begin
      Print(Obj.Info, Header);
      Draw(Win, 1, 1, White, "System : " & Obj.Line.all);
   end Print;
   
   procedure Write (O : in System_Class;File : in W_Io.File_Type) is
   begin
      W_Io.Put_Line(File, To_Wide_String(Element_Enum'Image(Element_Class(O).Tag)));      
      W_Io.Put_Line(File, To_Wide_String(Element_Index'Image(O.Info.Index)));
      W_Io.Put_Line(File, To_Wide_String(Image(O.Info.Created)));
      W_Io.Put_Line(File, O.Info.Name.all);
      if not Is_Empty(O.Childs) then
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(Natural(Length(O.Childs)))));
      else
	 W_Io.Put_Line(File, To_Wide_String(Natural'Image(0)));
      end if;
      W_Io.Put_Line(File, O.Line.all);
      W_Io.Put_Line(File, To_Wide_String(Natural'Image(O.Definition.Index)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    W_Io.Put_Line(File, To_Wide_String(O.Definition.List(I).name.all) & '=' & To_Wide_String(O.Definition.List(I).Value.all));
	 end loop;
      end if;
      
   end Write;
   procedure Read (O : out System_Class;File : in W_Io.File_Type) is
   begin
      O.Info.Index := Element_index'Value(To_String(W_Io.Get_Line(File)));
	    
      O.Info.Created := Formatting.Value(To_String(W_Io.Get_Line(File)));
      
      O.Info.Name := new Wide_String ' (W_Io.Get_Line(File));
      O.Info.Childs_Num := Natural'Value(To_String(W_Io.Get_Line(File)));
      O.Line := new Wide_String ' (Get_Line(File));
      O.Definition.Index := Natural'Value(To_String(W_Io.Get_Line(File)));
      if O.Definition.Index /= 0 then
	 for I in 1..O.Definition.Index loop
	    declare
	       Name : String_Access;
	       Image : String_Access;
	       Line : constant String :=  To_String(W_Io.Get_Line(File));
	    begin
	       Parse(Line, Name,  Image);
	       O.Definition.List(I) := Make(Name.all, Image.all);
	    end;
	 end loop;
      end if;
      

   end Read;
   
   use Element_Vectors;

end M.Engine ;