annotate gcc/ada/libgnat/a-tigeau.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 . G E N E R I C _ 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 Interfaces.C_Streams; use Interfaces.C_Streams;
kono
parents:
diff changeset
33 with System.File_IO;
kono
parents:
diff changeset
34 with System.File_Control_Block;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 package body Ada.Text_IO.Generic_Aux is
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 package FIO renames System.File_IO;
kono
parents:
diff changeset
39 package FCB renames System.File_Control_Block;
kono
parents:
diff changeset
40 subtype AP is FCB.AFCB_Ptr;
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 ------------------------
kono
parents:
diff changeset
43 -- Check_End_Of_Field --
kono
parents:
diff changeset
44 ------------------------
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 procedure Check_End_Of_Field
kono
parents:
diff changeset
47 (Buf : String;
kono
parents:
diff changeset
48 Stop : Integer;
kono
parents:
diff changeset
49 Ptr : Integer;
kono
parents:
diff changeset
50 Width : Field)
kono
parents:
diff changeset
51 is
kono
parents:
diff changeset
52 begin
kono
parents:
diff changeset
53 if Ptr > Stop then
kono
parents:
diff changeset
54 return;
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 elsif Width = 0 then
kono
parents:
diff changeset
57 raise Data_Error;
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 else
kono
parents:
diff changeset
60 for J in Ptr .. Stop loop
kono
parents:
diff changeset
61 if not Is_Blank (Buf (J)) then
kono
parents:
diff changeset
62 raise Data_Error;
kono
parents:
diff changeset
63 end if;
kono
parents:
diff changeset
64 end loop;
kono
parents:
diff changeset
65 end if;
kono
parents:
diff changeset
66 end Check_End_Of_Field;
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 -----------------------
kono
parents:
diff changeset
69 -- Check_On_One_Line --
kono
parents:
diff changeset
70 -----------------------
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 procedure Check_On_One_Line
kono
parents:
diff changeset
73 (File : File_Type;
kono
parents:
diff changeset
74 Length : Integer)
kono
parents:
diff changeset
75 is
kono
parents:
diff changeset
76 begin
kono
parents:
diff changeset
77 FIO.Check_Write_Status (AP (File));
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 if File.Line_Length /= 0 then
kono
parents:
diff changeset
80 if Count (Length) > File.Line_Length then
kono
parents:
diff changeset
81 raise Layout_Error;
kono
parents:
diff changeset
82 elsif File.Col + Count (Length) > File.Line_Length + 1 then
kono
parents:
diff changeset
83 New_Line (File);
kono
parents:
diff changeset
84 end if;
kono
parents:
diff changeset
85 end if;
kono
parents:
diff changeset
86 end Check_On_One_Line;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 ----------
kono
parents:
diff changeset
89 -- Getc --
kono
parents:
diff changeset
90 ----------
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 function Getc (File : File_Type) return int is
kono
parents:
diff changeset
93 ch : int;
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 begin
kono
parents:
diff changeset
96 ch := fgetc (File.Stream);
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 if ch = EOF and then ferror (File.Stream) /= 0 then
kono
parents:
diff changeset
99 raise Device_Error;
kono
parents:
diff changeset
100 else
kono
parents:
diff changeset
101 return ch;
kono
parents:
diff changeset
102 end if;
kono
parents:
diff changeset
103 end Getc;
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 --------------
kono
parents:
diff changeset
106 -- Is_Blank --
kono
parents:
diff changeset
107 --------------
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 function Is_Blank (C : Character) return Boolean is
kono
parents:
diff changeset
110 begin
kono
parents:
diff changeset
111 return C = ' ' or else C = ASCII.HT;
kono
parents:
diff changeset
112 end Is_Blank;
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 ----------
kono
parents:
diff changeset
115 -- Load --
kono
parents:
diff changeset
116 ----------
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 procedure Load
kono
parents:
diff changeset
119 (File : File_Type;
kono
parents:
diff changeset
120 Buf : out String;
kono
parents:
diff changeset
121 Ptr : in out Integer;
kono
parents:
diff changeset
122 Char : Character;
kono
parents:
diff changeset
123 Loaded : out Boolean)
kono
parents:
diff changeset
124 is
kono
parents:
diff changeset
125 ch : int;
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 begin
kono
parents:
diff changeset
128 ch := Getc (File);
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 if ch = Character'Pos (Char) then
kono
parents:
diff changeset
131 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
132 Loaded := True;
kono
parents:
diff changeset
133 else
kono
parents:
diff changeset
134 Ungetc (ch, File);
kono
parents:
diff changeset
135 Loaded := False;
kono
parents:
diff changeset
136 end if;
kono
parents:
diff changeset
137 end Load;
kono
parents:
diff changeset
138
kono
parents:
diff changeset
139 procedure Load
kono
parents:
diff changeset
140 (File : File_Type;
kono
parents:
diff changeset
141 Buf : out String;
kono
parents:
diff changeset
142 Ptr : in out Integer;
kono
parents:
diff changeset
143 Char : Character)
kono
parents:
diff changeset
144 is
kono
parents:
diff changeset
145 ch : int;
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 begin
kono
parents:
diff changeset
148 ch := Getc (File);
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 if ch = Character'Pos (Char) then
kono
parents:
diff changeset
151 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
152 else
kono
parents:
diff changeset
153 Ungetc (ch, File);
kono
parents:
diff changeset
154 end if;
kono
parents:
diff changeset
155 end Load;
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 procedure Load
kono
parents:
diff changeset
158 (File : File_Type;
kono
parents:
diff changeset
159 Buf : out String;
kono
parents:
diff changeset
160 Ptr : in out Integer;
kono
parents:
diff changeset
161 Char1 : Character;
kono
parents:
diff changeset
162 Char2 : Character;
kono
parents:
diff changeset
163 Loaded : out Boolean)
kono
parents:
diff changeset
164 is
kono
parents:
diff changeset
165 ch : int;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 begin
kono
parents:
diff changeset
168 ch := Getc (File);
kono
parents:
diff changeset
169
kono
parents:
diff changeset
170 if ch = Character'Pos (Char1) or else ch = Character'Pos (Char2) then
kono
parents:
diff changeset
171 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
172 Loaded := True;
kono
parents:
diff changeset
173 else
kono
parents:
diff changeset
174 Ungetc (ch, File);
kono
parents:
diff changeset
175 Loaded := False;
kono
parents:
diff changeset
176 end if;
kono
parents:
diff changeset
177 end Load;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 procedure Load
kono
parents:
diff changeset
180 (File : File_Type;
kono
parents:
diff changeset
181 Buf : out String;
kono
parents:
diff changeset
182 Ptr : in out Integer;
kono
parents:
diff changeset
183 Char1 : Character;
kono
parents:
diff changeset
184 Char2 : Character)
kono
parents:
diff changeset
185 is
kono
parents:
diff changeset
186 ch : int;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 begin
kono
parents:
diff changeset
189 ch := Getc (File);
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 if ch = Character'Pos (Char1) or else ch = Character'Pos (Char2) then
kono
parents:
diff changeset
192 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
193 else
kono
parents:
diff changeset
194 Ungetc (ch, File);
kono
parents:
diff changeset
195 end if;
kono
parents:
diff changeset
196 end Load;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 -----------------
kono
parents:
diff changeset
199 -- Load_Digits --
kono
parents:
diff changeset
200 -----------------
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 procedure Load_Digits
kono
parents:
diff changeset
203 (File : File_Type;
kono
parents:
diff changeset
204 Buf : out String;
kono
parents:
diff changeset
205 Ptr : in out Integer;
kono
parents:
diff changeset
206 Loaded : out Boolean)
kono
parents:
diff changeset
207 is
kono
parents:
diff changeset
208 ch : int;
kono
parents:
diff changeset
209 After_Digit : Boolean;
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 begin
kono
parents:
diff changeset
212 ch := Getc (File);
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 if ch not in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
215 Loaded := False;
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 else
kono
parents:
diff changeset
218 Loaded := True;
kono
parents:
diff changeset
219 After_Digit := True;
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 loop
kono
parents:
diff changeset
222 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
223 ch := Getc (File);
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
226 After_Digit := True;
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
229 After_Digit := False;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 else
kono
parents:
diff changeset
232 exit;
kono
parents:
diff changeset
233 end if;
kono
parents:
diff changeset
234 end loop;
kono
parents:
diff changeset
235 end if;
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 Ungetc (ch, File);
kono
parents:
diff changeset
238 end Load_Digits;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 procedure Load_Digits
kono
parents:
diff changeset
241 (File : File_Type;
kono
parents:
diff changeset
242 Buf : out String;
kono
parents:
diff changeset
243 Ptr : in out Integer)
kono
parents:
diff changeset
244 is
kono
parents:
diff changeset
245 ch : int;
kono
parents:
diff changeset
246 After_Digit : Boolean;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 begin
kono
parents:
diff changeset
249 ch := Getc (File);
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
252 After_Digit := True;
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 loop
kono
parents:
diff changeset
255 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
256 ch := Getc (File);
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
259 After_Digit := True;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
262 After_Digit := False;
kono
parents:
diff changeset
263
kono
parents:
diff changeset
264 else
kono
parents:
diff changeset
265 exit;
kono
parents:
diff changeset
266 end if;
kono
parents:
diff changeset
267 end loop;
kono
parents:
diff changeset
268 end if;
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 Ungetc (ch, File);
kono
parents:
diff changeset
271 end Load_Digits;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 --------------------------
kono
parents:
diff changeset
274 -- Load_Extended_Digits --
kono
parents:
diff changeset
275 --------------------------
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 procedure Load_Extended_Digits
kono
parents:
diff changeset
278 (File : File_Type;
kono
parents:
diff changeset
279 Buf : out String;
kono
parents:
diff changeset
280 Ptr : in out Integer;
kono
parents:
diff changeset
281 Loaded : out Boolean)
kono
parents:
diff changeset
282 is
kono
parents:
diff changeset
283 ch : int;
kono
parents:
diff changeset
284 After_Digit : Boolean := False;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 begin
kono
parents:
diff changeset
287 Loaded := False;
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 loop
kono
parents:
diff changeset
290 ch := Getc (File);
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 if ch in Character'Pos ('0') .. Character'Pos ('9')
kono
parents:
diff changeset
293 or else
kono
parents:
diff changeset
294 ch in Character'Pos ('a') .. Character'Pos ('f')
kono
parents:
diff changeset
295 or else
kono
parents:
diff changeset
296 ch in Character'Pos ('A') .. Character'Pos ('F')
kono
parents:
diff changeset
297 then
kono
parents:
diff changeset
298 After_Digit := True;
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
301 After_Digit := False;
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 else
kono
parents:
diff changeset
304 exit;
kono
parents:
diff changeset
305 end if;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
308 Loaded := True;
kono
parents:
diff changeset
309 end loop;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Ungetc (ch, File);
kono
parents:
diff changeset
312 end Load_Extended_Digits;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 procedure Load_Extended_Digits
kono
parents:
diff changeset
315 (File : File_Type;
kono
parents:
diff changeset
316 Buf : out String;
kono
parents:
diff changeset
317 Ptr : in out Integer)
kono
parents:
diff changeset
318 is
kono
parents:
diff changeset
319 Junk : Boolean;
kono
parents:
diff changeset
320 pragma Unreferenced (Junk);
kono
parents:
diff changeset
321 begin
kono
parents:
diff changeset
322 Load_Extended_Digits (File, Buf, Ptr, Junk);
kono
parents:
diff changeset
323 end Load_Extended_Digits;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 ---------------
kono
parents:
diff changeset
326 -- Load_Skip --
kono
parents:
diff changeset
327 ---------------
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 procedure Load_Skip (File : File_Type) is
kono
parents:
diff changeset
330 C : Character;
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 begin
kono
parents:
diff changeset
333 FIO.Check_Read_Status (AP (File));
kono
parents:
diff changeset
334
kono
parents:
diff changeset
335 -- Loop till we find a non-blank character (note that as usual in
kono
parents:
diff changeset
336 -- Text_IO, blank includes horizontal tab). Note that Get deals with
kono
parents:
diff changeset
337 -- the Before_LM and Before_LM_PM flags appropriately.
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 loop
kono
parents:
diff changeset
340 Get (File, C);
kono
parents:
diff changeset
341 exit when not Is_Blank (C);
kono
parents:
diff changeset
342 end loop;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 Ungetc (Character'Pos (C), File);
kono
parents:
diff changeset
345 File.Col := File.Col - 1;
kono
parents:
diff changeset
346 end Load_Skip;
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 ----------------
kono
parents:
diff changeset
349 -- Load_Width --
kono
parents:
diff changeset
350 ----------------
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 procedure Load_Width
kono
parents:
diff changeset
353 (File : File_Type;
kono
parents:
diff changeset
354 Width : Field;
kono
parents:
diff changeset
355 Buf : out String;
kono
parents:
diff changeset
356 Ptr : in out Integer)
kono
parents:
diff changeset
357 is
kono
parents:
diff changeset
358 ch : int;
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 begin
kono
parents:
diff changeset
361 FIO.Check_Read_Status (AP (File));
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 -- If we are immediately before a line mark, then we have no characters.
kono
parents:
diff changeset
364 -- This is always a data error, so we may as well raise it right away.
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 if File.Before_LM then
kono
parents:
diff changeset
367 raise Data_Error;
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 else
kono
parents:
diff changeset
370 for J in 1 .. Width loop
kono
parents:
diff changeset
371 ch := Getc (File);
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 if ch = EOF then
kono
parents:
diff changeset
374 return;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 elsif ch = LM then
kono
parents:
diff changeset
377 Ungetc (ch, File);
kono
parents:
diff changeset
378 return;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 else
kono
parents:
diff changeset
381 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
382 end if;
kono
parents:
diff changeset
383 end loop;
kono
parents:
diff changeset
384 end if;
kono
parents:
diff changeset
385 end Load_Width;
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 -----------
kono
parents:
diff changeset
388 -- Nextc --
kono
parents:
diff changeset
389 -----------
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 function Nextc (File : File_Type) return int is
kono
parents:
diff changeset
392 ch : int;
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 begin
kono
parents:
diff changeset
395 ch := fgetc (File.Stream);
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 if ch = EOF then
kono
parents:
diff changeset
398 if ferror (File.Stream) /= 0 then
kono
parents:
diff changeset
399 raise Device_Error;
kono
parents:
diff changeset
400 else
kono
parents:
diff changeset
401 return EOF;
kono
parents:
diff changeset
402 end if;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 else
kono
parents:
diff changeset
405 Ungetc (ch, File);
kono
parents:
diff changeset
406 return ch;
kono
parents:
diff changeset
407 end if;
kono
parents:
diff changeset
408 end Nextc;
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 --------------
kono
parents:
diff changeset
411 -- Put_Item --
kono
parents:
diff changeset
412 --------------
kono
parents:
diff changeset
413
kono
parents:
diff changeset
414 procedure Put_Item (File : File_Type; Str : String) is
kono
parents:
diff changeset
415 begin
kono
parents:
diff changeset
416 Check_On_One_Line (File, Str'Length);
kono
parents:
diff changeset
417 Put (File, Str);
kono
parents:
diff changeset
418 end Put_Item;
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 ----------------
kono
parents:
diff changeset
421 -- Store_Char --
kono
parents:
diff changeset
422 ----------------
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 procedure Store_Char
kono
parents:
diff changeset
425 (File : File_Type;
kono
parents:
diff changeset
426 ch : int;
kono
parents:
diff changeset
427 Buf : in out String;
kono
parents:
diff changeset
428 Ptr : in out Integer)
kono
parents:
diff changeset
429 is
kono
parents:
diff changeset
430 begin
kono
parents:
diff changeset
431 File.Col := File.Col + 1;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 if Ptr < Buf'Last then
kono
parents:
diff changeset
434 Ptr := Ptr + 1;
kono
parents:
diff changeset
435 end if;
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 Buf (Ptr) := Character'Val (ch);
kono
parents:
diff changeset
438 end Store_Char;
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 -----------------
kono
parents:
diff changeset
441 -- String_Skip --
kono
parents:
diff changeset
442 -----------------
kono
parents:
diff changeset
443
kono
parents:
diff changeset
444 procedure String_Skip (Str : String; Ptr : out Integer) is
kono
parents:
diff changeset
445 begin
kono
parents:
diff changeset
446 -- Routines calling String_Skip malfunction if Str'Last = Positive'Last.
kono
parents:
diff changeset
447 -- It's too much trouble to make this silly case work, so we just raise
kono
parents:
diff changeset
448 -- Program_Error with an appropriate message. We raise Program_Error
kono
parents:
diff changeset
449 -- rather than Constraint_Error because we don't want this case to be
kono
parents:
diff changeset
450 -- converted to Data_Error.
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 if Str'Last = Positive'Last then
kono
parents:
diff changeset
453 raise Program_Error with
kono
parents:
diff changeset
454 "string upper bound is Positive'Last, not supported";
kono
parents:
diff changeset
455 end if;
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 -- Normal case where Str'Last < Positive'Last
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 Ptr := Str'First;
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 loop
kono
parents:
diff changeset
462 if Ptr > Str'Last then
kono
parents:
diff changeset
463 raise End_Error;
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 elsif not Is_Blank (Str (Ptr)) then
kono
parents:
diff changeset
466 return;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 else
kono
parents:
diff changeset
469 Ptr := Ptr + 1;
kono
parents:
diff changeset
470 end if;
kono
parents:
diff changeset
471 end loop;
kono
parents:
diff changeset
472 end String_Skip;
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 ------------
kono
parents:
diff changeset
475 -- Ungetc --
kono
parents:
diff changeset
476 ------------
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 procedure Ungetc (ch : int; File : File_Type) is
kono
parents:
diff changeset
479 begin
kono
parents:
diff changeset
480 if ch /= EOF then
kono
parents:
diff changeset
481 if ungetc (ch, File.Stream) = EOF then
kono
parents:
diff changeset
482 raise Device_Error;
kono
parents:
diff changeset
483 end if;
kono
parents:
diff changeset
484 end if;
kono
parents:
diff changeset
485 end Ungetc;
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 end Ada.Text_IO.Generic_Aux;