OSDN Git Service

* sem_ch3.adb (Find_Type_Of_Subtype_Indic): If subtype indication
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-wtdeau.adb
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.3 $
10 --                                                                          --
11 --          Copyright (C) 1992-2001 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   : File_Type;
52       Width  : 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   : File_Type;
81       Width  : 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    -- Gets_Dec --
106    --------------
107
108    function Gets_Dec
109      (From  : String;
110       Last  : access Positive;
111       Scale : Integer)
112       return  Integer
113    is
114       Pos  : aliased Integer;
115       Item : Integer;
116
117    begin
118       String_Skip (From, Pos);
119       Item := Scan_Decimal (From, Pos'Access, From'Last, Scale);
120       Last.all := Pos - 1;
121       return Item;
122
123    exception
124       when Constraint_Error =>
125          Last.all := Pos - 1;
126          raise Data_Error;
127
128    end Gets_Dec;
129
130    --------------
131    -- Gets_LLD --
132    --------------
133
134    function Gets_LLD
135      (From  : String;
136       Last  : access Positive;
137       Scale : Integer)
138       return  Long_Long_Integer
139    is
140       Pos  : aliased Integer;
141       Item : Long_Long_Integer;
142
143    begin
144       String_Skip (From, Pos);
145       Item := Scan_Long_Long_Decimal (From, Pos'Access, From'Last, Scale);
146       Last.all := Pos - 1;
147       return Item;
148
149    exception
150       when Constraint_Error =>
151          Last.all := Pos - 1;
152          raise Data_Error;
153
154    end Gets_LLD;
155
156    -------------
157    -- Put_Dec --
158    -------------
159
160    procedure Put_Dec
161      (File  : File_Type;
162       Item  : Integer;
163       Fore  : Field;
164       Aft   : Field;
165       Exp   : Field;
166       Scale : Integer)
167    is
168       Buf : String (1 .. Field'Last);
169       Ptr : Natural := 0;
170
171    begin
172       Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
173       Put_Item (File, Buf (1 .. Ptr));
174    end Put_Dec;
175
176    -------------
177    -- Put_LLD --
178    -------------
179
180    procedure Put_LLD
181      (File  : File_Type;
182       Item  : Long_Long_Integer;
183       Fore  : Field;
184       Aft   : Field;
185       Exp   : Field;
186       Scale : Integer)
187    is
188       Buf : String (1 .. Field'Last);
189       Ptr : Natural := 0;
190
191    begin
192       Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
193       Put_Item (File, Buf (1 .. Ptr));
194    end Put_LLD;
195
196    --------------
197    -- Puts_Dec --
198    --------------
199
200    procedure Puts_Dec
201      (To    : out String;
202       Item  : Integer;
203       Aft   : Field;
204       Exp   : 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  : Long_Long_Integer;
238       Aft   : Field;
239       Exp   : 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;