annotate gcc/ada/libgnat/a-wtgeau.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 . W I D E _ 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.Wide_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 -- Is_Blank --
kono
parents:
diff changeset
90 --------------
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 function Is_Blank (C : Character) return Boolean is
kono
parents:
diff changeset
93 begin
kono
parents:
diff changeset
94 return C = ' ' or else C = ASCII.HT;
kono
parents:
diff changeset
95 end Is_Blank;
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 ----------
kono
parents:
diff changeset
98 -- Load --
kono
parents:
diff changeset
99 ----------
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 procedure Load
kono
parents:
diff changeset
102 (File : File_Type;
kono
parents:
diff changeset
103 Buf : out String;
kono
parents:
diff changeset
104 Ptr : in out Integer;
kono
parents:
diff changeset
105 Char : Character;
kono
parents:
diff changeset
106 Loaded : out Boolean)
kono
parents:
diff changeset
107 is
kono
parents:
diff changeset
108 ch : int;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 begin
kono
parents:
diff changeset
111 if File.Before_Wide_Character then
kono
parents:
diff changeset
112 Loaded := False;
kono
parents:
diff changeset
113 return;
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 else
kono
parents:
diff changeset
116 ch := Getc (File);
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 if ch = Character'Pos (Char) then
kono
parents:
diff changeset
119 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
120 Loaded := True;
kono
parents:
diff changeset
121 else
kono
parents:
diff changeset
122 Ungetc (ch, File);
kono
parents:
diff changeset
123 Loaded := False;
kono
parents:
diff changeset
124 end if;
kono
parents:
diff changeset
125 end if;
kono
parents:
diff changeset
126 end Load;
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 procedure Load
kono
parents:
diff changeset
129 (File : File_Type;
kono
parents:
diff changeset
130 Buf : out String;
kono
parents:
diff changeset
131 Ptr : in out Integer;
kono
parents:
diff changeset
132 Char : Character)
kono
parents:
diff changeset
133 is
kono
parents:
diff changeset
134 ch : int;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 begin
kono
parents:
diff changeset
137 if File.Before_Wide_Character then
kono
parents:
diff changeset
138 null;
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 else
kono
parents:
diff changeset
141 ch := Getc (File);
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 if ch = Character'Pos (Char) then
kono
parents:
diff changeset
144 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
145 else
kono
parents:
diff changeset
146 Ungetc (ch, File);
kono
parents:
diff changeset
147 end if;
kono
parents:
diff changeset
148 end if;
kono
parents:
diff changeset
149 end Load;
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 procedure Load
kono
parents:
diff changeset
152 (File : File_Type;
kono
parents:
diff changeset
153 Buf : out String;
kono
parents:
diff changeset
154 Ptr : in out Integer;
kono
parents:
diff changeset
155 Char1 : Character;
kono
parents:
diff changeset
156 Char2 : Character;
kono
parents:
diff changeset
157 Loaded : out Boolean)
kono
parents:
diff changeset
158 is
kono
parents:
diff changeset
159 ch : int;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 begin
kono
parents:
diff changeset
162 if File.Before_Wide_Character then
kono
parents:
diff changeset
163 Loaded := False;
kono
parents:
diff changeset
164 return;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 else
kono
parents:
diff changeset
167 ch := Getc (File);
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 if ch = Character'Pos (Char1)
kono
parents:
diff changeset
170 or else ch = Character'Pos (Char2)
kono
parents:
diff changeset
171 then
kono
parents:
diff changeset
172 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
173 Loaded := True;
kono
parents:
diff changeset
174 else
kono
parents:
diff changeset
175 Ungetc (ch, File);
kono
parents:
diff changeset
176 Loaded := False;
kono
parents:
diff changeset
177 end if;
kono
parents:
diff changeset
178 end if;
kono
parents:
diff changeset
179 end Load;
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 procedure Load
kono
parents:
diff changeset
182 (File : File_Type;
kono
parents:
diff changeset
183 Buf : out String;
kono
parents:
diff changeset
184 Ptr : in out Integer;
kono
parents:
diff changeset
185 Char1 : Character;
kono
parents:
diff changeset
186 Char2 : Character)
kono
parents:
diff changeset
187 is
kono
parents:
diff changeset
188 ch : int;
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 begin
kono
parents:
diff changeset
191 if File.Before_Wide_Character then
kono
parents:
diff changeset
192 null;
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 else
kono
parents:
diff changeset
195 ch := Getc (File);
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 if ch = Character'Pos (Char1)
kono
parents:
diff changeset
198 or else ch = Character'Pos (Char2)
kono
parents:
diff changeset
199 then
kono
parents:
diff changeset
200 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
201 else
kono
parents:
diff changeset
202 Ungetc (ch, File);
kono
parents:
diff changeset
203 end if;
kono
parents:
diff changeset
204 end if;
kono
parents:
diff changeset
205 end Load;
kono
parents:
diff changeset
206
kono
parents:
diff changeset
207 -----------------
kono
parents:
diff changeset
208 -- Load_Digits --
kono
parents:
diff changeset
209 -----------------
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 procedure Load_Digits
kono
parents:
diff changeset
212 (File : File_Type;
kono
parents:
diff changeset
213 Buf : out String;
kono
parents:
diff changeset
214 Ptr : in out Integer;
kono
parents:
diff changeset
215 Loaded : out Boolean)
kono
parents:
diff changeset
216 is
kono
parents:
diff changeset
217 ch : int;
kono
parents:
diff changeset
218 After_Digit : Boolean;
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 begin
kono
parents:
diff changeset
221 if File.Before_Wide_Character then
kono
parents:
diff changeset
222 Loaded := False;
kono
parents:
diff changeset
223 return;
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 else
kono
parents:
diff changeset
226 ch := Getc (File);
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 if ch not in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
229 Loaded := False;
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 else
kono
parents:
diff changeset
232 Loaded := True;
kono
parents:
diff changeset
233 After_Digit := True;
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 loop
kono
parents:
diff changeset
236 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
237 ch := Getc (File);
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
240 After_Digit := True;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
243 After_Digit := False;
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 else
kono
parents:
diff changeset
246 exit;
kono
parents:
diff changeset
247 end if;
kono
parents:
diff changeset
248 end loop;
kono
parents:
diff changeset
249 end if;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 Ungetc (ch, File);
kono
parents:
diff changeset
252 end if;
kono
parents:
diff changeset
253 end Load_Digits;
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 procedure Load_Digits
kono
parents:
diff changeset
256 (File : File_Type;
kono
parents:
diff changeset
257 Buf : out String;
kono
parents:
diff changeset
258 Ptr : in out Integer)
kono
parents:
diff changeset
259 is
kono
parents:
diff changeset
260 ch : int;
kono
parents:
diff changeset
261 After_Digit : Boolean;
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 begin
kono
parents:
diff changeset
264 if File.Before_Wide_Character then
kono
parents:
diff changeset
265 return;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 else
kono
parents:
diff changeset
268 ch := Getc (File);
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
271 After_Digit := True;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 loop
kono
parents:
diff changeset
274 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
275 ch := Getc (File);
kono
parents:
diff changeset
276
kono
parents:
diff changeset
277 if ch in Character'Pos ('0') .. Character'Pos ('9') then
kono
parents:
diff changeset
278 After_Digit := True;
kono
parents:
diff changeset
279
kono
parents:
diff changeset
280 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
281 After_Digit := False;
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 else
kono
parents:
diff changeset
284 exit;
kono
parents:
diff changeset
285 end if;
kono
parents:
diff changeset
286 end loop;
kono
parents:
diff changeset
287 end if;
kono
parents:
diff changeset
288
kono
parents:
diff changeset
289 Ungetc (ch, File);
kono
parents:
diff changeset
290 end if;
kono
parents:
diff changeset
291 end Load_Digits;
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 --------------------------
kono
parents:
diff changeset
294 -- Load_Extended_Digits --
kono
parents:
diff changeset
295 --------------------------
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 procedure Load_Extended_Digits
kono
parents:
diff changeset
298 (File : File_Type;
kono
parents:
diff changeset
299 Buf : out String;
kono
parents:
diff changeset
300 Ptr : in out Integer;
kono
parents:
diff changeset
301 Loaded : out Boolean)
kono
parents:
diff changeset
302 is
kono
parents:
diff changeset
303 ch : int;
kono
parents:
diff changeset
304 After_Digit : Boolean := False;
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 begin
kono
parents:
diff changeset
307 if File.Before_Wide_Character then
kono
parents:
diff changeset
308 Loaded := False;
kono
parents:
diff changeset
309 return;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 else
kono
parents:
diff changeset
312 Loaded := False;
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 loop
kono
parents:
diff changeset
315 ch := Getc (File);
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 if ch in Character'Pos ('0') .. Character'Pos ('9')
kono
parents:
diff changeset
318 or else
kono
parents:
diff changeset
319 ch in Character'Pos ('a') .. Character'Pos ('f')
kono
parents:
diff changeset
320 or else
kono
parents:
diff changeset
321 ch in Character'Pos ('A') .. Character'Pos ('F')
kono
parents:
diff changeset
322 then
kono
parents:
diff changeset
323 After_Digit := True;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 elsif ch = Character'Pos ('_') and then After_Digit then
kono
parents:
diff changeset
326 After_Digit := False;
kono
parents:
diff changeset
327
kono
parents:
diff changeset
328 else
kono
parents:
diff changeset
329 exit;
kono
parents:
diff changeset
330 end if;
kono
parents:
diff changeset
331
kono
parents:
diff changeset
332 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
333 Loaded := True;
kono
parents:
diff changeset
334 end loop;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 Ungetc (ch, File);
kono
parents:
diff changeset
337 end if;
kono
parents:
diff changeset
338 end Load_Extended_Digits;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 procedure Load_Extended_Digits
kono
parents:
diff changeset
341 (File : File_Type;
kono
parents:
diff changeset
342 Buf : out String;
kono
parents:
diff changeset
343 Ptr : in out Integer)
kono
parents:
diff changeset
344 is
kono
parents:
diff changeset
345 Junk : Boolean;
kono
parents:
diff changeset
346 pragma Unreferenced (Junk);
kono
parents:
diff changeset
347 begin
kono
parents:
diff changeset
348 Load_Extended_Digits (File, Buf, Ptr, Junk);
kono
parents:
diff changeset
349 end Load_Extended_Digits;
kono
parents:
diff changeset
350
kono
parents:
diff changeset
351 ---------------
kono
parents:
diff changeset
352 -- Load_Skip --
kono
parents:
diff changeset
353 ---------------
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 procedure Load_Skip (File : File_Type) is
kono
parents:
diff changeset
356 C : Character;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 begin
kono
parents:
diff changeset
359 FIO.Check_Read_Status (AP (File));
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 -- We need to explicitly test for the case of being before a wide
kono
parents:
diff changeset
362 -- character (greater than 16#7F#). Since no such character can
kono
parents:
diff changeset
363 -- ever legitimately be a valid numeric character, we can
kono
parents:
diff changeset
364 -- immediately signal Data_Error.
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 if File.Before_Wide_Character then
kono
parents:
diff changeset
367 raise Data_Error;
kono
parents:
diff changeset
368 end if;
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 -- Otherwise loop till we find a non-blank character (note that as
kono
parents:
diff changeset
371 -- usual in Wide_Text_IO, blank includes horizontal tab). Note that
kono
parents:
diff changeset
372 -- Get_Character deals with Before_LM/Before_LM_PM flags appropriately.
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 loop
kono
parents:
diff changeset
375 Get_Character (File, C);
kono
parents:
diff changeset
376 exit when not Is_Blank (C);
kono
parents:
diff changeset
377 end loop;
kono
parents:
diff changeset
378
kono
parents:
diff changeset
379 Ungetc (Character'Pos (C), File);
kono
parents:
diff changeset
380 File.Col := File.Col - 1;
kono
parents:
diff changeset
381 end Load_Skip;
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 ----------------
kono
parents:
diff changeset
384 -- Load_Width --
kono
parents:
diff changeset
385 ----------------
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 procedure Load_Width
kono
parents:
diff changeset
388 (File : File_Type;
kono
parents:
diff changeset
389 Width : Field;
kono
parents:
diff changeset
390 Buf : out String;
kono
parents:
diff changeset
391 Ptr : in out Integer)
kono
parents:
diff changeset
392 is
kono
parents:
diff changeset
393 ch : int;
kono
parents:
diff changeset
394 WC : Wide_Character;
kono
parents:
diff changeset
395
kono
parents:
diff changeset
396 Bad_Wide_C : Boolean := False;
kono
parents:
diff changeset
397 -- Set True if one of the characters read is not in range of type
kono
parents:
diff changeset
398 -- Character. This is always a Data_Error, but we do not signal it
kono
parents:
diff changeset
399 -- right away, since we have to read the full number of characters.
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 begin
kono
parents:
diff changeset
402 FIO.Check_Read_Status (AP (File));
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 -- If we are immediately before a line mark, then we have no characters.
kono
parents:
diff changeset
405 -- This is always a data error, so we may as well raise it right away.
kono
parents:
diff changeset
406
kono
parents:
diff changeset
407 if File.Before_LM then
kono
parents:
diff changeset
408 raise Data_Error;
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 else
kono
parents:
diff changeset
411 for J in 1 .. Width loop
kono
parents:
diff changeset
412 if File.Before_Wide_Character then
kono
parents:
diff changeset
413 Bad_Wide_C := True;
kono
parents:
diff changeset
414 Store_Char (File, 0, Buf, Ptr);
kono
parents:
diff changeset
415 File.Before_Wide_Character := False;
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 else
kono
parents:
diff changeset
418 ch := Getc (File);
kono
parents:
diff changeset
419
kono
parents:
diff changeset
420 if ch = EOF then
kono
parents:
diff changeset
421 exit;
kono
parents:
diff changeset
422
kono
parents:
diff changeset
423 elsif ch = LM then
kono
parents:
diff changeset
424 Ungetc (ch, File);
kono
parents:
diff changeset
425 exit;
kono
parents:
diff changeset
426
kono
parents:
diff changeset
427 else
kono
parents:
diff changeset
428 WC := Get_Wide_Char (Character'Val (ch), File);
kono
parents:
diff changeset
429 ch := Wide_Character'Pos (WC);
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 if ch > 255 then
kono
parents:
diff changeset
432 Bad_Wide_C := True;
kono
parents:
diff changeset
433 ch := 0;
kono
parents:
diff changeset
434 end if;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 Store_Char (File, ch, Buf, Ptr);
kono
parents:
diff changeset
437 end if;
kono
parents:
diff changeset
438 end if;
kono
parents:
diff changeset
439 end loop;
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 if Bad_Wide_C then
kono
parents:
diff changeset
442 raise Data_Error;
kono
parents:
diff changeset
443 end if;
kono
parents:
diff changeset
444 end if;
kono
parents:
diff changeset
445 end Load_Width;
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 --------------
kono
parents:
diff changeset
448 -- Put_Item --
kono
parents:
diff changeset
449 --------------
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 procedure Put_Item (File : File_Type; Str : String) is
kono
parents:
diff changeset
452 begin
kono
parents:
diff changeset
453 Check_On_One_Line (File, Str'Length);
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 for J in Str'Range loop
kono
parents:
diff changeset
456 Put (File, Wide_Character'Val (Character'Pos (Str (J))));
kono
parents:
diff changeset
457 end loop;
kono
parents:
diff changeset
458 end Put_Item;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 ----------------
kono
parents:
diff changeset
461 -- Store_Char --
kono
parents:
diff changeset
462 ----------------
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 procedure Store_Char
kono
parents:
diff changeset
465 (File : File_Type;
kono
parents:
diff changeset
466 ch : Integer;
kono
parents:
diff changeset
467 Buf : out String;
kono
parents:
diff changeset
468 Ptr : in out Integer)
kono
parents:
diff changeset
469 is
kono
parents:
diff changeset
470 begin
kono
parents:
diff changeset
471 File.Col := File.Col + 1;
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 if Ptr = Buf'Last then
kono
parents:
diff changeset
474 raise Data_Error;
kono
parents:
diff changeset
475 else
kono
parents:
diff changeset
476 Ptr := Ptr + 1;
kono
parents:
diff changeset
477 Buf (Ptr) := Character'Val (ch);
kono
parents:
diff changeset
478 end if;
kono
parents:
diff changeset
479 end Store_Char;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 -----------------
kono
parents:
diff changeset
482 -- String_Skip --
kono
parents:
diff changeset
483 -----------------
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 procedure String_Skip (Str : String; Ptr : out Integer) is
kono
parents:
diff changeset
486 begin
kono
parents:
diff changeset
487 -- Routines calling String_Skip malfunction if Str'Last = Positive'Last.
kono
parents:
diff changeset
488 -- It's too much trouble to make this silly case work, so we just raise
kono
parents:
diff changeset
489 -- Program_Error with an appropriate message. We raise Program_Error
kono
parents:
diff changeset
490 -- rather than Constraint_Error because we don't want this case to be
kono
parents:
diff changeset
491 -- converted to Data_Error.
kono
parents:
diff changeset
492
kono
parents:
diff changeset
493 if Str'Last = Positive'Last then
kono
parents:
diff changeset
494 raise Program_Error with
kono
parents:
diff changeset
495 "string upper bound is Positive'Last, not supported";
kono
parents:
diff changeset
496 end if;
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 -- Normal case where Str'Last < Positive'Last
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 Ptr := Str'First;
kono
parents:
diff changeset
501
kono
parents:
diff changeset
502 loop
kono
parents:
diff changeset
503 if Ptr > Str'Last then
kono
parents:
diff changeset
504 raise End_Error;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 elsif not Is_Blank (Str (Ptr)) then
kono
parents:
diff changeset
507 return;
kono
parents:
diff changeset
508
kono
parents:
diff changeset
509 else
kono
parents:
diff changeset
510 Ptr := Ptr + 1;
kono
parents:
diff changeset
511 end if;
kono
parents:
diff changeset
512 end loop;
kono
parents:
diff changeset
513 end String_Skip;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 ------------
kono
parents:
diff changeset
516 -- Ungetc --
kono
parents:
diff changeset
517 ------------
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 procedure Ungetc (ch : int; File : File_Type) is
kono
parents:
diff changeset
520 begin
kono
parents:
diff changeset
521 if ch /= EOF then
kono
parents:
diff changeset
522 if ungetc (ch, File.Stream) = EOF then
kono
parents:
diff changeset
523 raise Device_Error;
kono
parents:
diff changeset
524 end if;
kono
parents:
diff changeset
525 end if;
kono
parents:
diff changeset
526 end Ungetc;
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 end Ada.Wide_Text_IO.Generic_Aux;