annotate gcc/ada/libgnat/a-timoau.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT RUN-TIME COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- A D A . T E X T _ I O . M O D U L A R _ A U X --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Ada.Text_IO.Generic_Aux; use Ada.Text_IO.Generic_Aux;
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 with System.Img_BIU; use System.Img_BIU;
kono
parents:
diff changeset
35 with System.Img_Uns; use System.Img_Uns;
kono
parents:
diff changeset
36 with System.Img_LLB; use System.Img_LLB;
kono
parents:
diff changeset
37 with System.Img_LLU; use System.Img_LLU;
kono
parents:
diff changeset
38 with System.Img_LLW; use System.Img_LLW;
kono
parents:
diff changeset
39 with System.Img_WIU; use System.Img_WIU;
kono
parents:
diff changeset
40 with System.Val_Uns; use System.Val_Uns;
kono
parents:
diff changeset
41 with System.Val_LLU; use System.Val_LLU;
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 package body Ada.Text_IO.Modular_Aux is
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 use System.Unsigned_Types;
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 -----------------------
kono
parents:
diff changeset
48 -- Local Subprograms --
kono
parents:
diff changeset
49 -----------------------
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 procedure Load_Modular
kono
parents:
diff changeset
52 (File : File_Type;
kono
parents:
diff changeset
53 Buf : out String;
kono
parents:
diff changeset
54 Ptr : in out Natural);
kono
parents:
diff changeset
55 -- This is an auxiliary routine that is used to load an possibly signed
kono
parents:
diff changeset
56 -- modular literal value from the input file into Buf, starting at Ptr + 1.
kono
parents:
diff changeset
57 -- Ptr is left set to the last character stored.
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 -------------
kono
parents:
diff changeset
60 -- Get_LLU --
kono
parents:
diff changeset
61 -------------
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 procedure Get_LLU
kono
parents:
diff changeset
64 (File : File_Type;
kono
parents:
diff changeset
65 Item : out Long_Long_Unsigned;
kono
parents:
diff changeset
66 Width : Field)
kono
parents:
diff changeset
67 is
kono
parents:
diff changeset
68 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
69 Stop : Integer := 0;
kono
parents:
diff changeset
70 Ptr : aliased Integer := 1;
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 begin
kono
parents:
diff changeset
73 if Width /= 0 then
kono
parents:
diff changeset
74 Load_Width (File, Width, Buf, Stop);
kono
parents:
diff changeset
75 String_Skip (Buf, Ptr);
kono
parents:
diff changeset
76 else
kono
parents:
diff changeset
77 Load_Modular (File, Buf, Stop);
kono
parents:
diff changeset
78 end if;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 Item := Scan_Long_Long_Unsigned (Buf, Ptr'Access, Stop);
kono
parents:
diff changeset
81 Check_End_Of_Field (Buf, Stop, Ptr, Width);
kono
parents:
diff changeset
82 end Get_LLU;
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 -------------
kono
parents:
diff changeset
85 -- Get_Uns --
kono
parents:
diff changeset
86 -------------
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 procedure Get_Uns
kono
parents:
diff changeset
89 (File : File_Type;
kono
parents:
diff changeset
90 Item : out Unsigned;
kono
parents:
diff changeset
91 Width : Field)
kono
parents:
diff changeset
92 is
kono
parents:
diff changeset
93 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
94 Stop : Integer := 0;
kono
parents:
diff changeset
95 Ptr : aliased Integer := 1;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 begin
kono
parents:
diff changeset
98 if Width /= 0 then
kono
parents:
diff changeset
99 Load_Width (File, Width, Buf, Stop);
kono
parents:
diff changeset
100 String_Skip (Buf, Ptr);
kono
parents:
diff changeset
101 else
kono
parents:
diff changeset
102 Load_Modular (File, Buf, Stop);
kono
parents:
diff changeset
103 end if;
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 Item := Scan_Unsigned (Buf, Ptr'Access, Stop);
kono
parents:
diff changeset
106 Check_End_Of_Field (Buf, Stop, Ptr, Width);
kono
parents:
diff changeset
107 end Get_Uns;
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 --------------
kono
parents:
diff changeset
110 -- Gets_LLU --
kono
parents:
diff changeset
111 --------------
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 procedure Gets_LLU
kono
parents:
diff changeset
114 (From : String;
kono
parents:
diff changeset
115 Item : out Long_Long_Unsigned;
kono
parents:
diff changeset
116 Last : out Positive)
kono
parents:
diff changeset
117 is
kono
parents:
diff changeset
118 Pos : aliased Integer;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 begin
kono
parents:
diff changeset
121 String_Skip (From, Pos);
kono
parents:
diff changeset
122 Item := Scan_Long_Long_Unsigned (From, Pos'Access, From'Last);
kono
parents:
diff changeset
123 Last := Pos - 1;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 exception
kono
parents:
diff changeset
126 when Constraint_Error =>
kono
parents:
diff changeset
127 raise Data_Error;
kono
parents:
diff changeset
128 end Gets_LLU;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 --------------
kono
parents:
diff changeset
131 -- Gets_Uns --
kono
parents:
diff changeset
132 --------------
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 procedure Gets_Uns
kono
parents:
diff changeset
135 (From : String;
kono
parents:
diff changeset
136 Item : out Unsigned;
kono
parents:
diff changeset
137 Last : out Positive)
kono
parents:
diff changeset
138 is
kono
parents:
diff changeset
139 Pos : aliased Integer;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 begin
kono
parents:
diff changeset
142 String_Skip (From, Pos);
kono
parents:
diff changeset
143 Item := Scan_Unsigned (From, Pos'Access, From'Last);
kono
parents:
diff changeset
144 Last := Pos - 1;
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 exception
kono
parents:
diff changeset
147 when Constraint_Error =>
kono
parents:
diff changeset
148 raise Data_Error;
kono
parents:
diff changeset
149 end Gets_Uns;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 ------------------
kono
parents:
diff changeset
152 -- Load_Modular --
kono
parents:
diff changeset
153 ------------------
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 procedure Load_Modular
kono
parents:
diff changeset
156 (File : File_Type;
kono
parents:
diff changeset
157 Buf : out String;
kono
parents:
diff changeset
158 Ptr : in out Natural)
kono
parents:
diff changeset
159 is
kono
parents:
diff changeset
160 Hash_Loc : Natural;
kono
parents:
diff changeset
161 Loaded : Boolean;
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 begin
kono
parents:
diff changeset
164 Load_Skip (File);
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 -- Note: it is a bit strange to allow a minus sign here, but it seems
kono
parents:
diff changeset
167 -- consistent with the general behavior expected by the ACVC tests
kono
parents:
diff changeset
168 -- which is to scan past junk and then signal data error, see ACVC
kono
parents:
diff changeset
169 -- test CE3704F, case (6), which is for signed integer exponents,
kono
parents:
diff changeset
170 -- which seems a similar case.
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 Load (File, Buf, Ptr, '+', '-');
kono
parents:
diff changeset
173 Load_Digits (File, Buf, Ptr, Loaded);
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 if Loaded then
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 -- Deal with based case. We recognize either the standard '#' or the
kono
parents:
diff changeset
178 -- allowed alternative replacement ':' (see RM J.2(3)).
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 Load (File, Buf, Ptr, '#', ':', Loaded);
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 if Loaded then
kono
parents:
diff changeset
183 Hash_Loc := Ptr;
kono
parents:
diff changeset
184 Load_Extended_Digits (File, Buf, Ptr);
kono
parents:
diff changeset
185 Load (File, Buf, Ptr, Buf (Hash_Loc));
kono
parents:
diff changeset
186 end if;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 Load (File, Buf, Ptr, 'E', 'e', Loaded);
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 if Loaded then
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 -- Note: it is strange to allow a minus sign, since the syntax
kono
parents:
diff changeset
193 -- does not, but that is what ACVC test CE3704F, case (6) wants
kono
parents:
diff changeset
194 -- for the signed case, and there seems no good reason to treat
kono
parents:
diff changeset
195 -- exponents differently for the signed and unsigned cases.
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 Load (File, Buf, Ptr, '+', '-');
kono
parents:
diff changeset
198 Load_Digits (File, Buf, Ptr);
kono
parents:
diff changeset
199 end if;
kono
parents:
diff changeset
200 end if;
kono
parents:
diff changeset
201 end Load_Modular;
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 -------------
kono
parents:
diff changeset
204 -- Put_LLU --
kono
parents:
diff changeset
205 -------------
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 procedure Put_LLU
kono
parents:
diff changeset
208 (File : File_Type;
kono
parents:
diff changeset
209 Item : Long_Long_Unsigned;
kono
parents:
diff changeset
210 Width : Field;
kono
parents:
diff changeset
211 Base : Number_Base)
kono
parents:
diff changeset
212 is
kono
parents:
diff changeset
213 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
214 Ptr : Natural := 0;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 begin
kono
parents:
diff changeset
217 if Base = 10 and then Width = 0 then
kono
parents:
diff changeset
218 Set_Image_Long_Long_Unsigned (Item, Buf, Ptr);
kono
parents:
diff changeset
219 elsif Base = 10 then
kono
parents:
diff changeset
220 Set_Image_Width_Long_Long_Unsigned (Item, Width, Buf, Ptr);
kono
parents:
diff changeset
221 else
kono
parents:
diff changeset
222 Set_Image_Based_Long_Long_Unsigned (Item, Base, Width, Buf, Ptr);
kono
parents:
diff changeset
223 end if;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 Put_Item (File, Buf (1 .. Ptr));
kono
parents:
diff changeset
226 end Put_LLU;
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 -------------
kono
parents:
diff changeset
229 -- Put_Uns --
kono
parents:
diff changeset
230 -------------
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 procedure Put_Uns
kono
parents:
diff changeset
233 (File : File_Type;
kono
parents:
diff changeset
234 Item : Unsigned;
kono
parents:
diff changeset
235 Width : Field;
kono
parents:
diff changeset
236 Base : Number_Base)
kono
parents:
diff changeset
237 is
kono
parents:
diff changeset
238 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
239 Ptr : Natural := 0;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 begin
kono
parents:
diff changeset
242 if Base = 10 and then Width = 0 then
kono
parents:
diff changeset
243 Set_Image_Unsigned (Item, Buf, Ptr);
kono
parents:
diff changeset
244 elsif Base = 10 then
kono
parents:
diff changeset
245 Set_Image_Width_Unsigned (Item, Width, Buf, Ptr);
kono
parents:
diff changeset
246 else
kono
parents:
diff changeset
247 Set_Image_Based_Unsigned (Item, Base, Width, Buf, Ptr);
kono
parents:
diff changeset
248 end if;
kono
parents:
diff changeset
249
kono
parents:
diff changeset
250 Put_Item (File, Buf (1 .. Ptr));
kono
parents:
diff changeset
251 end Put_Uns;
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 --------------
kono
parents:
diff changeset
254 -- Puts_LLU --
kono
parents:
diff changeset
255 --------------
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 procedure Puts_LLU
kono
parents:
diff changeset
258 (To : out String;
kono
parents:
diff changeset
259 Item : Long_Long_Unsigned;
kono
parents:
diff changeset
260 Base : Number_Base)
kono
parents:
diff changeset
261 is
kono
parents:
diff changeset
262 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
263 Ptr : Natural := 0;
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 begin
kono
parents:
diff changeset
266 if Base = 10 then
kono
parents:
diff changeset
267 Set_Image_Width_Long_Long_Unsigned (Item, To'Length, Buf, Ptr);
kono
parents:
diff changeset
268 else
kono
parents:
diff changeset
269 Set_Image_Based_Long_Long_Unsigned (Item, Base, To'Length, Buf, Ptr);
kono
parents:
diff changeset
270 end if;
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 if Ptr > To'Length then
kono
parents:
diff changeset
273 raise Layout_Error;
kono
parents:
diff changeset
274 else
kono
parents:
diff changeset
275 To (To'First .. To'First + Ptr - 1) := Buf (1 .. Ptr);
kono
parents:
diff changeset
276 end if;
kono
parents:
diff changeset
277 end Puts_LLU;
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 --------------
kono
parents:
diff changeset
280 -- Puts_Uns --
kono
parents:
diff changeset
281 --------------
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 procedure Puts_Uns
kono
parents:
diff changeset
284 (To : out String;
kono
parents:
diff changeset
285 Item : Unsigned;
kono
parents:
diff changeset
286 Base : Number_Base)
kono
parents:
diff changeset
287 is
kono
parents:
diff changeset
288 Buf : String (1 .. Field'Last);
kono
parents:
diff changeset
289 Ptr : Natural := 0;
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 begin
kono
parents:
diff changeset
292 if Base = 10 then
kono
parents:
diff changeset
293 Set_Image_Width_Unsigned (Item, To'Length, Buf, Ptr);
kono
parents:
diff changeset
294 else
kono
parents:
diff changeset
295 Set_Image_Based_Unsigned (Item, Base, To'Length, Buf, Ptr);
kono
parents:
diff changeset
296 end if;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 if Ptr > To'Length then
kono
parents:
diff changeset
299 raise Layout_Error;
kono
parents:
diff changeset
300 else
kono
parents:
diff changeset
301 To (To'First .. To'First + Ptr - 1) := Buf (1 .. Ptr);
kono
parents:
diff changeset
302 end if;
kono
parents:
diff changeset
303 end Puts_Uns;
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 end Ada.Text_IO.Modular_Aux;