File : a-ztdeio.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT RUN-TIME COMPONENTS                         --
   4 --                                                                          --
   5 --      A D A . W I D E _ W I D E _ T E X T _ I O . D E C I M A L _ I O     --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2009, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 with Ada.Wide_Wide_Text_IO.Decimal_Aux;
  33 
  34 with System.WCh_Con; use System.WCh_Con;
  35 with System.WCh_WtS; use System.WCh_WtS;
  36 
  37 package body Ada.Wide_Wide_Text_IO.Decimal_IO is
  38 
  39    subtype TFT is Ada.Wide_Wide_Text_IO.File_Type;
  40    --  File type required for calls to routines in Aux
  41 
  42    package Aux renames Ada.Wide_Wide_Text_IO.Decimal_Aux;
  43 
  44    Scale : constant Integer := Num'Scale;
  45 
  46    ---------
  47    -- Get --
  48    ---------
  49 
  50    procedure Get
  51      (File  : File_Type;
  52       Item  : out Num;
  53       Width : Field := 0)
  54    is
  55    begin
  56       if Num'Size > Integer'Size then
  57          Item := Num'Fixed_Value (Aux.Get_LLD (TFT (File), Width, Scale));
  58       else
  59          Item := Num'Fixed_Value (Aux.Get_Dec (TFT (File), Width, Scale));
  60       end if;
  61    exception
  62       when Constraint_Error => raise Data_Error;
  63    end Get;
  64 
  65    procedure Get
  66      (Item  : out Num;
  67       Width : Field := 0)
  68    is
  69    begin
  70       Get (Current_Input, Item, Width);
  71    end Get;
  72 
  73    procedure Get
  74      (From : Wide_Wide_String;
  75       Item : out Num;
  76       Last : out Positive)
  77    is
  78       S : constant String := Wide_Wide_String_To_String (From, WCEM_Upper);
  79       --  String on which we do the actual conversion. Note that the method
  80       --  used for wide character encoding is irrelevant, since if there is
  81       --  a character outside the Standard.Character range then the call to
  82       --  Aux.Gets will raise Data_Error in any case.
  83 
  84    begin
  85       if Num'Size > Integer'Size then
  86          --  Item := Num'Fixed_Value
  87          --  should write above, but gets assert error ???
  88          Item := Num
  89                    (Aux.Gets_LLD (S, Last'Unrestricted_Access, Scale));
  90       else
  91          --  Item := Num'Fixed_Value
  92          --  should write above, but gets assert error ???
  93          Item := Num
  94                    (Aux.Gets_Dec (S, Last'Unrestricted_Access, Scale));
  95       end if;
  96 
  97    exception
  98       when Constraint_Error => raise Data_Error;
  99    end Get;
 100 
 101    ---------
 102    -- Put --
 103    ---------
 104 
 105    procedure Put
 106      (File : File_Type;
 107       Item : Num;
 108       Fore : Field := Default_Fore;
 109       Aft  : Field := Default_Aft;
 110       Exp  : Field := Default_Exp)
 111    is
 112    begin
 113       if Num'Size > Integer'Size then
 114          Aux.Put_LLD
 115 --           (TFT (File), Long_Long_Integer'Integer_Value (Item),
 116 --  ???
 117            (TFT (File), Long_Long_Integer (Item),
 118             Fore, Aft, Exp, Scale);
 119       else
 120          Aux.Put_Dec
 121 --           (TFT (File), Integer'Integer_Value (Item), Fore, Aft, Exp, Scale);
 122 --  ???
 123            (TFT (File), Integer (Item), Fore, Aft, Exp, Scale);
 124 
 125       end if;
 126    end Put;
 127 
 128    procedure Put
 129      (Item : Num;
 130       Fore : Field := Default_Fore;
 131       Aft  : Field := Default_Aft;
 132       Exp  : Field := Default_Exp)
 133    is
 134    begin
 135       Put (Current_Output, Item, Fore, Aft, Exp);
 136    end Put;
 137 
 138    procedure Put
 139      (To   : out Wide_Wide_String;
 140       Item : Num;
 141       Aft  : Field := Default_Aft;
 142       Exp  : Field := Default_Exp)
 143    is
 144       S : String (To'First .. To'Last);
 145 
 146    begin
 147       if Num'Size > Integer'Size then
 148 --       Aux.Puts_LLD
 149 --         (S, Long_Long_Integer'Integer_Value (Item), Aft, Exp, Scale);
 150 --  ???
 151          Aux.Puts_LLD
 152            (S, Long_Long_Integer (Item), Aft, Exp, Scale);
 153       else
 154 --       Aux.Puts_Dec (S, Integer'Integer_Value (Item), Aft, Exp, Scale);
 155 --  ???
 156          Aux.Puts_Dec (S, Integer (Item), Aft, Exp, Scale);
 157       end if;
 158 
 159       for J in S'Range loop
 160          To (J) := Wide_Wide_Character'Val (Character'Pos (S (J)));
 161       end loop;
 162    end Put;
 163 
 164 end Ada.Wide_Wide_Text_IO.Decimal_IO;