OSDN Git Service

gcc/ada/
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-ztflau.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                        GNAT RUN-TIME COMPONENTS                          --
4 --                                                                          --
5 --      A D A . W I D E _ 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-2007, 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 ------------------------------------------------------------------------------
33
34 with Ada.Wide_Wide_Text_IO.Generic_Aux; use Ada.Wide_Wide_Text_IO.Generic_Aux;
35
36 with System.Img_Real;  use System.Img_Real;
37 with System.Val_Real;  use System.Val_Real;
38
39 package body Ada.Wide_Wide_Text_IO.Float_Aux is
40
41    ---------
42    -- Get --
43    ---------
44
45    procedure Get
46      (File  : File_Type;
47       Item  : out Long_Long_Float;
48       Width : Field)
49    is
50       Buf  : String (1 .. Field'Last);
51       Stop : Integer := 0;
52       Ptr  : aliased Integer := 1;
53
54    begin
55       if Width /= 0 then
56          Load_Width (File, Width, Buf, Stop);
57          String_Skip (Buf, Ptr);
58       else
59          Load_Real (File, Buf, Stop);
60       end if;
61
62       Item := Scan_Real (Buf, Ptr'Access, Stop);
63
64       Check_End_Of_Field (Buf, Stop, Ptr, Width);
65    end Get;
66
67    ----------
68    -- Gets --
69    ----------
70
71    procedure Gets
72      (From : String;
73       Item : out Long_Long_Float;
74       Last : out Positive)
75    is
76       Pos : aliased Integer;
77
78    begin
79       String_Skip (From, Pos);
80       Item := Scan_Real (From, Pos'Access, From'Last);
81       Last := Pos - 1;
82
83    exception
84       when Constraint_Error =>
85          raise Data_Error;
86    end Gets;
87
88    ---------------
89    -- Load_Real --
90    ---------------
91
92    procedure Load_Real
93      (File : File_Type;
94       Buf  : out String;
95       Ptr  : in out Natural)
96    is
97       Loaded   : Boolean;
98
99    begin
100       --  Skip initial blanks and load possible sign
101
102       Load_Skip (File);
103       Load (File, Buf, Ptr, '+', '-');
104
105       --  Case of .nnnn
106
107       Load (File, Buf, Ptr, '.', Loaded);
108
109       if Loaded then
110          Load_Digits (File, Buf, Ptr, Loaded);
111
112          --  Hopeless junk if no digits loaded
113
114          if not Loaded then
115             return;
116          end if;
117
118       --  Otherwise must have digits to start
119
120       else
121          Load_Digits (File, Buf, Ptr, Loaded);
122
123          --  Hopeless junk if no digits loaded
124
125          if not Loaded then
126             return;
127          end if;
128
129          --  Based cases
130
131          Load (File, Buf, Ptr, '#', ':', Loaded);
132
133          if Loaded then
134
135             --  Case of nnn#.xxx#
136
137             Load (File, Buf, Ptr, '.', Loaded);
138
139             if Loaded then
140                Load_Extended_Digits (File, Buf, Ptr);
141                Load (File, Buf, Ptr, '#', ':');
142
143             --  Case of nnn#xxx.[xxx]# or nnn#xxx#
144
145             else
146                Load_Extended_Digits (File, Buf, Ptr);
147                Load (File, Buf, Ptr, '.', Loaded);
148
149                if Loaded then
150                   Load_Extended_Digits (File, Buf, Ptr);
151                end if;
152
153                --  As usual, it seems strange to allow mixed base characters,
154                --  but that is what ACVC tests expect, see CE3804M, case (3).
155
156                Load (File, Buf, Ptr, '#', ':');
157             end if;
158
159          --  Case of nnn.[nnn] or nnn
160
161          else
162             --  Prevent the potential processing of '.' in cases where the
163             --  initial digits have a trailing underscore.
164
165             if Buf (Ptr) = '_' then
166                return;
167             end if;
168
169             Load (File, Buf, Ptr, '.', Loaded);
170
171             if Loaded then
172                Load_Digits (File, Buf, Ptr);
173             end if;
174          end if;
175       end if;
176
177       --  Deal with exponent
178
179       Load (File, Buf, Ptr, 'E', 'e', Loaded);
180
181       if Loaded then
182          Load (File, Buf, Ptr, '+', '-');
183          Load_Digits (File, Buf, Ptr);
184       end if;
185    end Load_Real;
186
187    ---------
188    -- Put --
189    ---------
190
191    procedure Put
192      (File : File_Type;
193       Item : Long_Long_Float;
194       Fore : Field;
195       Aft  : Field;
196       Exp  : Field)
197    is
198       Buf : String (1 .. Field'Last);
199       Ptr : Natural := 0;
200
201    begin
202       Set_Image_Real (Item, Buf, Ptr, Fore, Aft, Exp);
203       Put_Item (File, Buf (1 .. Ptr));
204    end Put;
205
206    ----------
207    -- Puts --
208    ----------
209
210    procedure Puts
211      (To   : out String;
212       Item : Long_Long_Float;
213       Aft  : Field;
214       Exp  : Field)
215    is
216       Buf    : String (1 .. Field'Last);
217       Ptr    : Natural := 0;
218
219    begin
220       Set_Image_Real (Item, Buf, Ptr, Fore => 1, Aft => Aft, Exp => Exp);
221
222       if Ptr > To'Length then
223          raise Layout_Error;
224
225       else
226          for J in 1 .. Ptr loop
227             To (To'Last - Ptr + J) := Buf (J);
228          end loop;
229
230          for J in To'First .. To'Last - Ptr loop
231             To (J) := ' ';
232          end loop;
233       end if;
234    end Puts;
235
236 end Ada.Wide_Wide_Text_IO.Float_Aux;