OSDN Git Service

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