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-wtdeau.adb < prev    next >
Text File  |  2000-07-19  |  8KB  |  267 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT RUNTIME COMPONENTS                          --
  4. --                                                                          --
  5. --         A D A . W I D E _ 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.2 $                              --
  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.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
  37. with Ada.Wide_Text_IO.Float_Aux;   use Ada.Wide_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.Wide_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.  
  168.    end Gets_Dec;
  169.  
  170.    --------------
  171.    -- Gets_LLD --
  172.    --------------
  173.  
  174.    function Gets_LLD
  175.      (From  : in String;
  176.       Last  : access Positive;
  177.       Scale : Integer)
  178.       return  Long_Long_Integer
  179.    is
  180.       Pos  : aliased Integer;
  181.       Item : Long_Long_Integer;
  182.  
  183.    begin
  184.       String_Skip (From, Pos);
  185.       Item := Scan_Long_Long_Decimal (From, Pos'Access, From'Last, Scale);
  186.       Last.all := Pos - 1;
  187.       return Item;
  188.  
  189.    exception
  190.       when Constraint_Error =>
  191.          Last.all := Pos - 1;
  192.          raise Data_Error;
  193.  
  194.    end Gets_LLD;
  195.  
  196.    --------------
  197.    -- Puts_Dec --
  198.    --------------
  199.  
  200.    procedure Puts_Dec
  201.      (To    : out String;
  202.       Item  : in Integer;
  203.       Aft   : in Field;
  204.       Exp   : in Field;
  205.       Scale : Integer)
  206.    is
  207.       Buf  : String (1 .. Field'Last);
  208.       Fore : Integer;
  209.       Ptr  : Natural := 0;
  210.  
  211.    begin
  212.       if Exp = 0 then
  213.          Fore := To'Length - 1 - Aft;
  214.       else
  215.          Fore := To'Length - 2 - Aft - Exp;
  216.       end if;
  217.  
  218.       if Fore < 1 then
  219.          raise Layout_Error;
  220.       end if;
  221.  
  222.       Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  223.  
  224.       if Ptr > To'Length then
  225.          raise Layout_Error;
  226.       else
  227.          To := Buf (1 .. Ptr);
  228.       end if;
  229.    end Puts_Dec;
  230.  
  231.    --------------
  232.    -- Puts_Dec --
  233.    --------------
  234.  
  235.    procedure Puts_LLD
  236.      (To    : out String;
  237.       Item  : in Long_Long_Integer;
  238.       Aft   : in Field;
  239.       Exp   : in Field;
  240.       Scale : Integer)
  241.    is
  242.       Buf  : String (1 .. Field'Last);
  243.       Fore : Integer;
  244.       Ptr  : Natural := 0;
  245.  
  246.    begin
  247.       if Exp = 0 then
  248.          Fore := To'Length - 1 - Aft;
  249.       else
  250.          Fore := To'Length - 2 - Aft - Exp;
  251.       end if;
  252.  
  253.       if Fore < 1 then
  254.          raise Layout_Error;
  255.       end if;
  256.  
  257.       Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
  258.  
  259.       if Ptr > To'Length then
  260.          raise Layout_Error;
  261.       else
  262.          To := Buf (1 .. Ptr);
  263.       end if;
  264.    end Puts_LLD;
  265.  
  266. end Ada.Wide_Text_IO.Decimal_Aux;
  267.