home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / adav313.zip / gnat-3_13p-os2-bin-20010916.zip / emx / gnatlib / a-tideau.adb < prev    next >
Text File  |  2000-07-19  |  8KB  |  265 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT RUNTIME COMPONENTS                          --
  4. --                                                                          --
  5. --              A D A . T E X T _ I O . D E C I M A L _ A U X               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.11 $                             --
  10. --                                                                          --
  11. --   Copyright (C) 1992,1993,1994,1995,1996 Free Software Foundation, Inc.  --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
  22. -- MA 02111-1307, USA.                                                      --
  23. --                                                                          --
  24. -- As a special exception,  if other files  instantiate  generics from this --
  25. -- unit, or you link  this unit with other files  to produce an executable, --
  26. -- this  unit  does not  by itself cause  the resulting  executable  to  be --
  27. -- covered  by the  GNU  General  Public  License.  This exception does not --
  28. -- however invalidate  any other reasons why  the executable file  might be --
  29. -- covered by the  GNU Public License.                                      --
  30. --                                                                          --
  31. -- GNAT was originally developed  by the GNAT team at  New York University. --
  32. -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
  33. --                                                                          --
  34. ------------------------------------------------------------------------------
  35.  
  36. with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
  37. with Ada.Text_IO.Float_Aux;   use Ada.Text_IO.Float_Aux;
  38.  
  39. with System.Img_Dec; use System.Img_Dec;
  40. with System.Img_LLD; use System.Img_LLD;
  41. with System.Val_Dec; use System.Val_Dec;
  42. with System.Val_LLD; use System.Val_LLD;
  43.  
  44. package body Ada.Text_IO.Decimal_Aux is
  45.  
  46.    -------------
  47.    -- Get_Dec --
  48.    -------------
  49.  
  50.    function Get_Dec
  51.      (File   : in File_Type;
  52.       Width  : in Field;
  53.       Scale  : Integer)
  54.       return   Integer
  55.    is
  56.       Buf  : String (1 .. Field'Last);
  57.       Ptr  : aliased Integer;
  58.       Stop : Integer := 0;
  59.       Item : Integer;
  60.  
  61.    begin
  62.       if Width /= 0 then
  63.          Load_Width (File, Width, Buf, Stop);
  64.          String_Skip (Buf, Ptr);
  65.       else
  66.          Load_Real (File, Buf, Stop);
  67.          Ptr := 1;
  68.       end if;
  69.  
  70.       Item := Scan_Decimal (Buf, Ptr'Access, Stop, Scale);
  71.       Check_End_Of_Field (File, Buf, Stop, Ptr, Width);
  72.       return Item;
  73.    end Get_Dec;
  74.  
  75.    -------------
  76.    -- Get_LLD --
  77.    -------------
  78.  
  79.    function Get_LLD
  80.      (File   : in File_Type;
  81.       Width  : in Field;
  82.       Scale  : Integer)
  83.       return   Long_Long_Integer
  84.    is
  85.       Buf  : String (1 .. Field'Last);
  86.       Ptr  : aliased Integer;
  87.       Stop : Integer := 0;
  88.       Item : Long_Long_Integer;
  89.  
  90.    begin
  91.       if Width /= 0 then
  92.          Load_Width (File, Width, Buf, Stop);
  93.          String_Skip (Buf, Ptr);
  94.       else
  95.          Load_Real (File, Buf, Stop);
  96.          Ptr := 1;
  97.       end if;
  98.  
  99.       Item := Scan_Long_Long_Decimal (Buf, Ptr'Access, Stop, Scale);
  100.       Check_End_Of_Field (File, Buf, Stop, Ptr, Width);
  101.       return Item;
  102.    end Get_LLD;
  103.  
  104.    -------------
  105.    -- Put_Dec --
  106.    -------------
  107.  
  108.    procedure Put_Dec
  109.      (File  : in File_Type;
  110.       Item  : in Integer;
  111.       Fore  : in Field;
  112.       Aft   : in Field;
  113.       Exp   : in Field;
  114.       Scale : Integer)
  115.    is
  116.       Buf : String (1 .. Field'Last);
  117.       Ptr : Natural := 0;
  118.  
  119.    begin
  120.       Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  121.       Put_Item (File, Buf (1 .. Ptr));
  122.    end Put_Dec;
  123.  
  124.    -------------
  125.    -- Put_LLD --
  126.    -------------
  127.  
  128.    procedure Put_LLD
  129.      (File  : in File_Type;
  130.       Item  : in Long_Long_Integer;
  131.       Fore  : in Field;
  132.       Aft   : in Field;
  133.       Exp   : in Field;
  134.       Scale : Integer)
  135.    is
  136.       Buf : String (1 .. Field'Last);
  137.       Ptr : Natural := 0;
  138.  
  139.    begin
  140.       Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  141.       Put_Item (File, Buf (1 .. Ptr));
  142.    end Put_LLD;
  143.  
  144.    --------------
  145.    -- Gets_Dec --
  146.    --------------
  147.  
  148.    function Gets_Dec
  149.      (From  : in String;
  150.       Last  : access Positive;
  151.       Scale : Integer)
  152.       return  Integer
  153.    is
  154.       Pos  : aliased Integer;
  155.       Item : Integer;
  156.  
  157.    begin
  158.       String_Skip (From, Pos);
  159.       Item := Scan_Decimal (From, Pos'Access, From'Last, Scale);
  160.       Last.all := Pos - 1;
  161.       return Item;
  162.  
  163.    exception
  164.       when Constraint_Error =>
  165.          Last.all := Pos - 1;
  166.          raise Data_Error;
  167.    end Gets_Dec;
  168.  
  169.    --------------
  170.    -- Gets_LLD --
  171.    --------------
  172.  
  173.    function Gets_LLD
  174.      (From  : in String;
  175.       Last  : access Positive;
  176.       Scale : Integer)
  177.       return  Long_Long_Integer
  178.    is
  179.       Pos  : aliased Integer;
  180.       Item : Long_Long_Integer;
  181.  
  182.    begin
  183.       String_Skip (From, Pos);
  184.       Item := Scan_Long_Long_Decimal (From, Pos'Access, From'Last, Scale);
  185.       Last.all := Pos - 1;
  186.       return Item;
  187.  
  188.    exception
  189.       when Constraint_Error =>
  190.          Last.all := Pos - 1;
  191.          raise Data_Error;
  192.    end Gets_LLD;
  193.  
  194.    --------------
  195.    -- Puts_Dec --
  196.    --------------
  197.  
  198.    procedure Puts_Dec
  199.      (To    : out String;
  200.       Item  : in Integer;
  201.       Aft   : in Field;
  202.       Exp   : in Field;
  203.       Scale : Integer)
  204.    is
  205.       Buf  : String (1 .. Field'Last);
  206.       Fore : Integer;
  207.       Ptr  : Natural := 0;
  208.  
  209.    begin
  210.       if Exp = 0 then
  211.          Fore := To'Length - 1 - Aft;
  212.       else
  213.          Fore := To'Length - 2 - Aft - Exp;
  214.       end if;
  215.  
  216.       if Fore < 1 then
  217.          raise Layout_Error;
  218.       end if;
  219.  
  220.       Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  221.  
  222.       if Ptr > To'Length then
  223.          raise Layout_Error;
  224.       else
  225.          To := Buf (1 .. Ptr);
  226.       end if;
  227.    end Puts_Dec;
  228.  
  229.    --------------
  230.    -- Puts_Dec --
  231.    --------------
  232.  
  233.    procedure Puts_LLD
  234.      (To    : out String;
  235.       Item  : in Long_Long_Integer;
  236.       Aft   : in Field;
  237.       Exp   : in Field;
  238.       Scale : Integer)
  239.    is
  240.       Buf  : String (1 .. Field'Last);
  241.       Fore : Integer;
  242.       Ptr  : Natural := 0;
  243.  
  244.    begin
  245.       if Exp = 0 then
  246.          Fore := To'Length - 1 - Aft;
  247.       else
  248.          Fore := To'Length - 2 - Aft - Exp;
  249.       end if;
  250.  
  251.       if Fore < 1 then
  252.          raise Layout_Error;
  253.       end if;
  254.  
  255.       Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  256.  
  257.       if Ptr > To'Length then
  258.          raise Layout_Error;
  259.       else
  260.          To := Buf (1 .. Ptr);
  261.       end if;
  262.    end Puts_LLD;
  263.  
  264. end Ada.Text_IO.Decimal_Aux;
  265.