PR c++/54038
[official-gcc.git] / gcc / ada / a-wtflau.adb
blob419ea7066bc2d90ca8cf1fbd60dd36cf3a96c360
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- A D A . W I D E _ T E X T _ I O . F L O A T _ A U X --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1992-2009, 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 3, 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. --
17 -- --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
21 -- --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
32 with Ada.Wide_Text_IO.Generic_Aux; use Ada.Wide_Text_IO.Generic_Aux;
34 with System.Img_Real; use System.Img_Real;
35 with System.Val_Real; use System.Val_Real;
37 package body Ada.Wide_Text_IO.Float_Aux is
39 ---------
40 -- Get --
41 ---------
43 procedure Get
44 (File : File_Type;
45 Item : out Long_Long_Float;
46 Width : Field)
48 Buf : String (1 .. Field'Last);
49 Stop : Integer := 0;
50 Ptr : aliased Integer := 1;
52 begin
53 if Width /= 0 then
54 Load_Width (File, Width, Buf, Stop);
55 String_Skip (Buf, Ptr);
56 else
57 Load_Real (File, Buf, Stop);
58 end if;
60 Item := Scan_Real (Buf, Ptr'Access, Stop);
62 Check_End_Of_Field (Buf, Stop, Ptr, Width);
63 end Get;
65 ----------
66 -- Gets --
67 ----------
69 procedure Gets
70 (From : String;
71 Item : out Long_Long_Float;
72 Last : out Positive)
74 Pos : aliased Integer;
76 begin
77 String_Skip (From, Pos);
78 Item := Scan_Real (From, Pos'Access, From'Last);
79 Last := Pos - 1;
81 exception
82 when Constraint_Error =>
83 raise Data_Error;
84 end Gets;
86 ---------------
87 -- Load_Real --
88 ---------------
90 procedure Load_Real
91 (File : File_Type;
92 Buf : out String;
93 Ptr : in out Natural)
95 Loaded : Boolean;
97 begin
98 -- Skip initial blanks and load possible sign
100 Load_Skip (File);
101 Load (File, Buf, Ptr, '+', '-');
103 -- Case of .nnnn
105 Load (File, Buf, Ptr, '.', Loaded);
107 if Loaded then
108 Load_Digits (File, Buf, Ptr, Loaded);
110 -- Hopeless junk if no digits loaded
112 if not Loaded then
113 return;
114 end if;
116 -- Otherwise must have digits to start
118 else
119 Load_Digits (File, Buf, Ptr, Loaded);
121 -- Hopeless junk if no digits loaded
123 if not Loaded then
124 return;
125 end if;
127 -- Based cases
129 Load (File, Buf, Ptr, '#', ':', Loaded);
131 if Loaded then
133 -- Case of nnn#.xxx#
135 Load (File, Buf, Ptr, '.', Loaded);
137 if Loaded then
138 Load_Extended_Digits (File, Buf, Ptr);
139 Load (File, Buf, Ptr, '#', ':');
141 -- Case of nnn#xxx.[xxx]# or nnn#xxx#
143 else
144 Load_Extended_Digits (File, Buf, Ptr);
145 Load (File, Buf, Ptr, '.', Loaded);
147 if Loaded then
148 Load_Extended_Digits (File, Buf, Ptr);
149 end if;
151 -- As usual, it seems strange to allow mixed base characters,
152 -- but that is what ACVC tests expect, see CE3804M, case (3).
154 Load (File, Buf, Ptr, '#', ':');
155 end if;
157 -- Case of nnn.[nnn] or nnn
159 else
160 -- Prevent the potential processing of '.' in cases where the
161 -- initial digits have a trailing underscore.
163 if Buf (Ptr) = '_' then
164 return;
165 end if;
167 Load (File, Buf, Ptr, '.', Loaded);
169 if Loaded then
170 Load_Digits (File, Buf, Ptr);
171 end if;
172 end if;
173 end if;
175 -- Deal with exponent
177 Load (File, Buf, Ptr, 'E', 'e', Loaded);
179 if Loaded then
180 Load (File, Buf, Ptr, '+', '-');
181 Load_Digits (File, Buf, Ptr);
182 end if;
183 end Load_Real;
185 ---------
186 -- Put --
187 ---------
189 procedure Put
190 (File : File_Type;
191 Item : Long_Long_Float;
192 Fore : Field;
193 Aft : Field;
194 Exp : Field)
196 Buf : String (1 .. Field'Last);
197 Ptr : Natural := 0;
199 begin
200 Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
201 Put_Item (File, Buf (1 .. Ptr));
202 end Put;
204 ----------
205 -- Puts --
206 ----------
208 procedure Puts
209 (To : out String;
210 Item : Long_Long_Float;
211 Aft : Field;
212 Exp : Field)
214 Buf : String (1 .. Field'Last);
215 Ptr : Natural := 0;
217 begin
218 Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
220 if Ptr > To'Length then
221 raise Layout_Error;
223 else
224 for J in 1 .. Ptr loop
225 To (To'Last - Ptr + J) := Buf (J);
226 end loop;
228 for J in To'First .. To'Last - Ptr loop
229 To (J) := ' ';
230 end loop;
231 end if;
232 end Puts;
234 end Ada.Wide_Text_IO.Float_Aux;