* Mainline merge as of 2006-02-16 (@111136).
[official-gcc.git] / gcc / ada / a-tideau.adb
blob5be5f66f074018eccab209bd9d680d83b1819465
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME 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 -- Copyright (C) 1992-2006, 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 2, 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. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING. If not, write --
19 -- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
20 -- Boston, MA 02110-1301, USA. --
21 -- --
22 -- As a special exception, if other files instantiate generics from this --
23 -- unit, or you link this unit with other files to produce an executable, --
24 -- this unit does not by itself cause the resulting executable to be --
25 -- covered by the GNU General Public License. This exception does not --
26 -- however invalidate any other reasons why the executable file might be --
27 -- covered by the GNU Public License. --
28 -- --
29 -- GNAT was originally developed by the GNAT team at New York University. --
30 -- Extensive contributions were provided by Ada Core Technologies Inc. --
31 -- --
32 ------------------------------------------------------------------------------
34 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
35 with Ada.Text_IO.Float_Aux; use Ada.Text_IO.Float_Aux;
37 with System.Img_Dec; use System.Img_Dec;
38 with System.Img_LLD; use System.Img_LLD;
39 with System.Val_Dec; use System.Val_Dec;
40 with System.Val_LLD; use System.Val_LLD;
42 package body Ada.Text_IO.Decimal_Aux is
44 -------------
45 -- Get_Dec --
46 -------------
48 function Get_Dec
49 (File : File_Type;
50 Width : Field;
51 Scale : Integer) return Integer
53 Buf : String (1 .. Field'Last);
54 Ptr : aliased Integer;
55 Stop : Integer := 0;
56 Item : Integer;
58 begin
59 if Width /= 0 then
60 Load_Width (File, Width, Buf, Stop);
61 String_Skip (Buf, Ptr);
62 else
63 Load_Real (File, Buf, Stop);
64 Ptr := 1;
65 end if;
67 Item := Scan_Decimal (Buf, Ptr'Access, Stop, Scale);
68 Check_End_Of_Field (Buf, Stop, Ptr, Width);
69 return Item;
70 end Get_Dec;
72 -------------
73 -- Get_LLD --
74 -------------
76 function Get_LLD
77 (File : File_Type;
78 Width : Field;
79 Scale : Integer) return Long_Long_Integer
81 Buf : String (1 .. Field'Last);
82 Ptr : aliased Integer;
83 Stop : Integer := 0;
84 Item : Long_Long_Integer;
86 begin
87 if Width /= 0 then
88 Load_Width (File, Width, Buf, Stop);
89 String_Skip (Buf, Ptr);
90 else
91 Load_Real (File, Buf, Stop);
92 Ptr := 1;
93 end if;
95 Item := Scan_Long_Long_Decimal (Buf, Ptr'Access, Stop, Scale);
96 Check_End_Of_Field (Buf, Stop, Ptr, Width);
97 return Item;
98 end Get_LLD;
100 --------------
101 -- Gets_Dec --
102 --------------
104 function Gets_Dec
105 (From : String;
106 Last : access Positive;
107 Scale : Integer) return Integer
109 Pos : aliased Integer;
110 Item : Integer;
112 begin
113 String_Skip (From, Pos);
114 Item := Scan_Decimal (From, Pos'Access, From'Last, Scale);
115 Last.all := Pos - 1;
116 return Item;
118 exception
119 when Constraint_Error =>
120 Last.all := Pos - 1;
121 raise Data_Error;
122 end Gets_Dec;
124 --------------
125 -- Gets_LLD --
126 --------------
128 function Gets_LLD
129 (From : String;
130 Last : access Positive;
131 Scale : Integer) return Long_Long_Integer
133 Pos : aliased Integer;
134 Item : Long_Long_Integer;
136 begin
137 String_Skip (From, Pos);
138 Item := Scan_Long_Long_Decimal (From, Pos'Access, From'Last, Scale);
139 Last.all := Pos - 1;
140 return Item;
142 exception
143 when Constraint_Error =>
144 Last.all := Pos - 1;
145 raise Data_Error;
146 end Gets_LLD;
148 -------------
149 -- Put_Dec --
150 -------------
152 procedure Put_Dec
153 (File : File_Type;
154 Item : Integer;
155 Fore : Field;
156 Aft : Field;
157 Exp : Field;
158 Scale : Integer)
160 Buf : String (1 .. Field'Last);
161 Ptr : Natural := 0;
163 begin
164 Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
165 Put_Item (File, Buf (1 .. Ptr));
166 end Put_Dec;
168 -------------
169 -- Put_LLD --
170 -------------
172 procedure Put_LLD
173 (File : File_Type;
174 Item : Long_Long_Integer;
175 Fore : Field;
176 Aft : Field;
177 Exp : Field;
178 Scale : Integer)
180 Buf : String (1 .. Field'Last);
181 Ptr : Natural := 0;
183 begin
184 Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
185 Put_Item (File, Buf (1 .. Ptr));
186 end Put_LLD;
188 --------------
189 -- Puts_Dec --
190 --------------
192 procedure Puts_Dec
193 (To : out String;
194 Item : Integer;
195 Aft : Field;
196 Exp : Field;
197 Scale : Integer)
199 Buf : String (1 .. Field'Last);
200 Fore : Integer;
201 Ptr : Natural := 0;
203 begin
204 if Exp = 0 then
205 Fore := To'Length - 1 - Aft;
206 else
207 Fore := To'Length - 2 - Aft - Exp;
208 end if;
210 if Fore < 1 then
211 raise Layout_Error;
212 end if;
214 Set_Image_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
216 if Ptr > To'Length then
217 raise Layout_Error;
218 else
219 To := Buf (1 .. Ptr);
220 end if;
221 end Puts_Dec;
223 --------------
224 -- Puts_Dec --
225 --------------
227 procedure Puts_LLD
228 (To : out String;
229 Item : Long_Long_Integer;
230 Aft : Field;
231 Exp : Field;
232 Scale : Integer)
234 Buf : String (1 .. Field'Last);
235 Fore : Integer;
236 Ptr : Natural := 0;
238 begin
239 if Exp = 0 then
240 Fore := To'Length - 1 - Aft;
241 else
242 Fore := To'Length - 2 - Aft - Exp;
243 end if;
245 if Fore < 1 then
246 raise Layout_Error;
247 end if;
249 Set_Image_Long_Long_Decimal (Item, Buf, Ptr, Scale, Fore, Aft, Exp);
251 if Ptr > To'Length then
252 raise Layout_Error;
253 else
254 To := Buf (1 .. Ptr);
255 end if;
256 end Puts_LLD;
258 end Ada.Text_IO.Decimal_Aux;