Back to... Zip-Ada

Source file : dual_io.ads


------------------------------------------------------------------------------
--  File:            Dual_IO.ads
--  Description:     Dual_IO : clones the Text_IO I/O functions towards
--                   Standard I/O but also outputs these I/O to a log file.
--
--  NB:  1) Use Create_Log and Close_Log to create and close a log file.
--       2) Generic Integer_IO, Float_IO, ... are of course also present.
--       3) Only procedures for I/O to Standard device are kept, use the
--          genuine Text_IO for Files and String I/O.
--
--
--  Date/version:    2-Mar-2013; 2-Feb-2011; 7-Jul-2001; 4-Jul-2001
--  Author:          G. de Montmollin
--                   http://gautiersblog.blogspot.com/
------------------------------------------------------------------------------

with IO_Exceptions, Text_IO;
   -- ^ These are standard renamings of Ada.Text_IO & Ada.IO_Exceptions

package Dual_IO is

   subtype Count is Text_IO.Count;

   subtype Positive_Count is Text_IO.Positive_Count;

   Unbounded : constant Count := Text_IO.Unbounded;

   subtype Field is Text_IO.Field;

   subtype Number_Base is Text_IO.Number_Base;

   subtype Type_Set is Text_IO.Type_Set;

   -------------------------
   -- Log file Management --
   -------------------------

   procedure Create_Log (Name : in String);
   procedure Append_Log (Name : in String);
   procedure Close_Log;
   function Is_Log_Open return Boolean;

   -- Close and reopen: have an up to date copy on file system
   procedure Close_and_Append_Log;

   -- Buffer control
   procedure Flush;

   --------------------------------------------
   -- Specification of line and page lengths --
   --------------------------------------------

   procedure Set_Line_Length (To : in Count) renames Text_IO.Set_Line_Length;
   procedure Set_Page_Length (To : in Count) renames Text_IO.Set_Page_Length;
   function Line_Length return Count renames Text_IO.Line_Length;
   function Page_Length return Count renames Text_IO.Page_Length;

   ------------------------------------
   -- Column, Line, and Page Control --
   ------------------------------------

   procedure New_Line (Spacing : in Positive_Count := 1);
   procedure Skip_Line (Spacing : in Positive_Count := 1);
   function End_Of_Line return Boolean renames Text_IO.End_Of_Line;
   procedure New_Page;
   procedure Skip_Page;
   function End_Of_Page return Boolean         renames Text_IO.End_Of_Page;
   function End_Of_File return Boolean         renames Text_IO.End_Of_File;
   procedure Set_Col (To : in Positive_Count)  renames Text_IO.Set_Col;
   procedure Set_Line (To : in Positive_Count) renames Text_IO.Set_Line;
   function Col return Positive_Count          renames Text_IO.Col;
   function Line return Positive_Count         renames Text_IO.Line;
   function Page return Positive_Count         renames Text_IO.Page;

   -----------------------------
   -- Characters Input-Output --
   -----------------------------

   procedure Get (Item : out Character);
   procedure Put (Item : in Character);

   procedure Look_Ahead (Item        : out Character;
                         End_Of_Line : out Boolean)
      renames Text_IO.Look_Ahead;

   -- No echo -> not logged -> renames suffices

   procedure Get_Immediate(Item      : out Character)
      renames Text_IO.Get_Immediate;

   procedure Get_Immediate(Item      : out Character;
                           Available : out Boolean)
      renames Text_IO.Get_Immediate;

   --------------------------
   -- Strings Input-Output --
   --------------------------

   procedure Get (Item : out String);
   procedure Put (Item : in String);

   procedure Get_Line
     (Item : out String;
      Last : out Natural);

   procedure Put_Line
     (Item : in String);

   -- Generic package for Input-Output of Integer Types

   generic
      type Num is range <>;
   package Integer_IO is

      Default_Width : Field := Num'Width;
      Default_Base  : Number_Base := 10;

      procedure Get(Item  : out Num;
                    Width : in  Field := 0);

      procedure Put(Item  : in Num;
                    Width : in Field := Default_Width;
                    Base  : in Number_Base := Default_Base);

   end Integer_IO;

   -- Generic package for Input-Output of Real Types

   generic
      type Num is digits <>;
   package Float_IO is

      Default_Fore : Field := 2;
      Default_Aft  : Field := Num'Digits-1;
      Default_Exp  : Field := 3;

      procedure Get(Item  : out Num;
                    Width : in  Field := 0);

      procedure Put(Item : in Num;
                    Fore : in Field := Default_Fore;
                    Aft  : in Field := Default_Aft;
                    Exp  : in Field := Default_Exp);
   end Float_IO;

   generic
      type Num is delta <>;
   package Fixed_IO is

      Default_Fore : Field := Num'Fore;
      Default_Aft  : Field := Num'Aft;
      Default_Exp  : Field := 0;

      procedure Get(Item  : out Num;
                    Width : in  Field := 0);

      procedure Put(Item : in Num;
                    Fore : in Field := Default_Fore;
                    Aft  : in Field := Default_Aft;
                    Exp  : in Field := Default_Exp);
   end Fixed_IO;

   -- Generic package for Input-Output of Decimal Types

   generic
      type Num is delta <> digits <>;

   package Decimal_IO is

      Default_Fore : Field := Num'Fore;
      Default_Aft  : Field := Num'Aft;
      Default_Exp  : Field := 0;

      procedure Get
        (Item  : out Num;
         Width : in Field := 0);

      procedure Put
        (Item : in Num;
         Fore : in Field := Default_Fore;
         Aft  : in Field := Default_Aft;
         Exp  : in Field := Default_Exp);

   end Decimal_IO;

   -- Generic package for Input-Output of Modular Types

   generic
      type Num is mod <>;

   package Modular_IO is

      Default_Width : Field := Num'Width;
      Default_Base  : Number_Base := 10;

      procedure Get
        (Item  : out Num;
         Width : in Field := 0);

      procedure Put
        (Item  : in Num;
         Width : in Field := Default_Width;
         Base  : in Number_Base := Default_Base);

   end Modular_IO;
   -- Generic package for Input-Output of Enumeration Types

   generic
      type Enum is (<>);
   package Enumeration_IO is

      Default_Width   : Field := 0;
      Default_Setting : Type_Set := Text_IO.Upper_Case;

      procedure Get(Item : out Enum);

      procedure Put(Item  : in Enum;
                    Width : in Field    := Default_Width;
                    Set   : in Type_Set := Default_Setting);
   end Enumeration_IO;

   --  Exceptions

   Status_Error : exception renames IO_Exceptions.Status_Error;
   Mode_Error   : exception renames IO_Exceptions.Mode_Error;
   Name_Error   : exception renames IO_Exceptions.Name_Error;
   Use_Error    : exception renames IO_Exceptions.Use_Error;
   Device_Error : exception renames IO_Exceptions.Device_Error;
   End_Error    : exception renames IO_Exceptions.End_Error;
   Data_Error   : exception renames IO_Exceptions.Data_Error;
   Layout_Error : exception renames IO_Exceptions.Layout_Error;

   Log_not_open     : exception;
   Log_already_open : exception;

end Dual_IO;

Zip-Ada: Ada library for zip archive files (.zip). Ada programming.
Some news about Zip-Ada and other related Ada projects on Gautier's blog.