annotate gcc/ada/libgnat/i-c.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 COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- I N T E R F A C E S . C --
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 package body Interfaces.C is
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 -----------------------
kono
parents:
diff changeset
35 -- Is_Nul_Terminated --
kono
parents:
diff changeset
36 -----------------------
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 -- Case of char_array
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 function Is_Nul_Terminated (Item : char_array) return Boolean is
kono
parents:
diff changeset
41 begin
kono
parents:
diff changeset
42 for J in Item'Range loop
kono
parents:
diff changeset
43 if Item (J) = nul then
kono
parents:
diff changeset
44 return True;
kono
parents:
diff changeset
45 end if;
kono
parents:
diff changeset
46 end loop;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 return False;
kono
parents:
diff changeset
49 end Is_Nul_Terminated;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 -- Case of wchar_array
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 function Is_Nul_Terminated (Item : wchar_array) return Boolean is
kono
parents:
diff changeset
54 begin
kono
parents:
diff changeset
55 for J in Item'Range loop
kono
parents:
diff changeset
56 if Item (J) = wide_nul then
kono
parents:
diff changeset
57 return True;
kono
parents:
diff changeset
58 end if;
kono
parents:
diff changeset
59 end loop;
kono
parents:
diff changeset
60
kono
parents:
diff changeset
61 return False;
kono
parents:
diff changeset
62 end Is_Nul_Terminated;
kono
parents:
diff changeset
63
kono
parents:
diff changeset
64 -- Case of char16_array
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 function Is_Nul_Terminated (Item : char16_array) return Boolean is
kono
parents:
diff changeset
67 begin
kono
parents:
diff changeset
68 for J in Item'Range loop
kono
parents:
diff changeset
69 if Item (J) = char16_nul then
kono
parents:
diff changeset
70 return True;
kono
parents:
diff changeset
71 end if;
kono
parents:
diff changeset
72 end loop;
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 return False;
kono
parents:
diff changeset
75 end Is_Nul_Terminated;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 -- Case of char32_array
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 function Is_Nul_Terminated (Item : char32_array) return Boolean is
kono
parents:
diff changeset
80 begin
kono
parents:
diff changeset
81 for J in Item'Range loop
kono
parents:
diff changeset
82 if Item (J) = char32_nul then
kono
parents:
diff changeset
83 return True;
kono
parents:
diff changeset
84 end if;
kono
parents:
diff changeset
85 end loop;
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 return False;
kono
parents:
diff changeset
88 end Is_Nul_Terminated;
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 ------------
kono
parents:
diff changeset
91 -- To_Ada --
kono
parents:
diff changeset
92 ------------
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 -- Convert char to Character
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 function To_Ada (Item : char) return Character is
kono
parents:
diff changeset
97 begin
kono
parents:
diff changeset
98 return Character'Val (char'Pos (Item));
kono
parents:
diff changeset
99 end To_Ada;
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 -- Convert char_array to String (function form)
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 function To_Ada
kono
parents:
diff changeset
104 (Item : char_array;
kono
parents:
diff changeset
105 Trim_Nul : Boolean := True) return String
kono
parents:
diff changeset
106 is
kono
parents:
diff changeset
107 Count : Natural;
kono
parents:
diff changeset
108 From : size_t;
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 begin
kono
parents:
diff changeset
111 if Trim_Nul then
kono
parents:
diff changeset
112 From := Item'First;
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 loop
kono
parents:
diff changeset
115 if From > Item'Last then
kono
parents:
diff changeset
116 raise Terminator_Error;
kono
parents:
diff changeset
117 elsif Item (From) = nul then
kono
parents:
diff changeset
118 exit;
kono
parents:
diff changeset
119 else
kono
parents:
diff changeset
120 From := From + 1;
kono
parents:
diff changeset
121 end if;
kono
parents:
diff changeset
122 end loop;
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 Count := Natural (From - Item'First);
kono
parents:
diff changeset
125
kono
parents:
diff changeset
126 else
kono
parents:
diff changeset
127 Count := Item'Length;
kono
parents:
diff changeset
128 end if;
kono
parents:
diff changeset
129
kono
parents:
diff changeset
130 declare
kono
parents:
diff changeset
131 R : String (1 .. Count);
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 begin
kono
parents:
diff changeset
134 for J in R'Range loop
kono
parents:
diff changeset
135 R (J) := To_Ada (Item (size_t (J) + (Item'First - 1)));
kono
parents:
diff changeset
136 end loop;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 return R;
kono
parents:
diff changeset
139 end;
kono
parents:
diff changeset
140 end To_Ada;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 -- Convert char_array to String (procedure form)
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 procedure To_Ada
kono
parents:
diff changeset
145 (Item : char_array;
kono
parents:
diff changeset
146 Target : out String;
kono
parents:
diff changeset
147 Count : out Natural;
kono
parents:
diff changeset
148 Trim_Nul : Boolean := True)
kono
parents:
diff changeset
149 is
kono
parents:
diff changeset
150 From : size_t;
kono
parents:
diff changeset
151 To : Positive;
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 begin
kono
parents:
diff changeset
154 if Trim_Nul then
kono
parents:
diff changeset
155 From := Item'First;
kono
parents:
diff changeset
156 loop
kono
parents:
diff changeset
157 if From > Item'Last then
kono
parents:
diff changeset
158 raise Terminator_Error;
kono
parents:
diff changeset
159 elsif Item (From) = nul then
kono
parents:
diff changeset
160 exit;
kono
parents:
diff changeset
161 else
kono
parents:
diff changeset
162 From := From + 1;
kono
parents:
diff changeset
163 end if;
kono
parents:
diff changeset
164 end loop;
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 Count := Natural (From - Item'First);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 else
kono
parents:
diff changeset
169 Count := Item'Length;
kono
parents:
diff changeset
170 end if;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 if Count > Target'Length then
kono
parents:
diff changeset
173 raise Constraint_Error;
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 else
kono
parents:
diff changeset
176 From := Item'First;
kono
parents:
diff changeset
177 To := Target'First;
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 for J in 1 .. Count loop
kono
parents:
diff changeset
180 Target (To) := Character (Item (From));
kono
parents:
diff changeset
181 From := From + 1;
kono
parents:
diff changeset
182 To := To + 1;
kono
parents:
diff changeset
183 end loop;
kono
parents:
diff changeset
184 end if;
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 end To_Ada;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 -- Convert wchar_t to Wide_Character
kono
parents:
diff changeset
189
kono
parents:
diff changeset
190 function To_Ada (Item : wchar_t) return Wide_Character is
kono
parents:
diff changeset
191 begin
kono
parents:
diff changeset
192 return Wide_Character (Item);
kono
parents:
diff changeset
193 end To_Ada;
kono
parents:
diff changeset
194
kono
parents:
diff changeset
195 -- Convert wchar_array to Wide_String (function form)
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 function To_Ada
kono
parents:
diff changeset
198 (Item : wchar_array;
kono
parents:
diff changeset
199 Trim_Nul : Boolean := True) return Wide_String
kono
parents:
diff changeset
200 is
kono
parents:
diff changeset
201 Count : Natural;
kono
parents:
diff changeset
202 From : size_t;
kono
parents:
diff changeset
203
kono
parents:
diff changeset
204 begin
kono
parents:
diff changeset
205 if Trim_Nul then
kono
parents:
diff changeset
206 From := Item'First;
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 loop
kono
parents:
diff changeset
209 if From > Item'Last then
kono
parents:
diff changeset
210 raise Terminator_Error;
kono
parents:
diff changeset
211 elsif Item (From) = wide_nul then
kono
parents:
diff changeset
212 exit;
kono
parents:
diff changeset
213 else
kono
parents:
diff changeset
214 From := From + 1;
kono
parents:
diff changeset
215 end if;
kono
parents:
diff changeset
216 end loop;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 Count := Natural (From - Item'First);
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 else
kono
parents:
diff changeset
221 Count := Item'Length;
kono
parents:
diff changeset
222 end if;
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 declare
kono
parents:
diff changeset
225 R : Wide_String (1 .. Count);
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 begin
kono
parents:
diff changeset
228 for J in R'Range loop
kono
parents:
diff changeset
229 R (J) := To_Ada (Item (size_t (J) + (Item'First - 1)));
kono
parents:
diff changeset
230 end loop;
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 return R;
kono
parents:
diff changeset
233 end;
kono
parents:
diff changeset
234 end To_Ada;
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 -- Convert wchar_array to Wide_String (procedure form)
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 procedure To_Ada
kono
parents:
diff changeset
239 (Item : wchar_array;
kono
parents:
diff changeset
240 Target : out Wide_String;
kono
parents:
diff changeset
241 Count : out Natural;
kono
parents:
diff changeset
242 Trim_Nul : Boolean := True)
kono
parents:
diff changeset
243 is
kono
parents:
diff changeset
244 From : size_t;
kono
parents:
diff changeset
245 To : Positive;
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 begin
kono
parents:
diff changeset
248 if Trim_Nul then
kono
parents:
diff changeset
249 From := Item'First;
kono
parents:
diff changeset
250 loop
kono
parents:
diff changeset
251 if From > Item'Last then
kono
parents:
diff changeset
252 raise Terminator_Error;
kono
parents:
diff changeset
253 elsif Item (From) = wide_nul then
kono
parents:
diff changeset
254 exit;
kono
parents:
diff changeset
255 else
kono
parents:
diff changeset
256 From := From + 1;
kono
parents:
diff changeset
257 end if;
kono
parents:
diff changeset
258 end loop;
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 Count := Natural (From - Item'First);
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 else
kono
parents:
diff changeset
263 Count := Item'Length;
kono
parents:
diff changeset
264 end if;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 if Count > Target'Length then
kono
parents:
diff changeset
267 raise Constraint_Error;
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 else
kono
parents:
diff changeset
270 From := Item'First;
kono
parents:
diff changeset
271 To := Target'First;
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 for J in 1 .. Count loop
kono
parents:
diff changeset
274 Target (To) := To_Ada (Item (From));
kono
parents:
diff changeset
275 From := From + 1;
kono
parents:
diff changeset
276 To := To + 1;
kono
parents:
diff changeset
277 end loop;
kono
parents:
diff changeset
278 end if;
kono
parents:
diff changeset
279 end To_Ada;
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 -- Convert char16_t to Wide_Character
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 function To_Ada (Item : char16_t) return Wide_Character is
kono
parents:
diff changeset
284 begin
kono
parents:
diff changeset
285 return Wide_Character'Val (char16_t'Pos (Item));
kono
parents:
diff changeset
286 end To_Ada;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 -- Convert char16_array to Wide_String (function form)
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 function To_Ada
kono
parents:
diff changeset
291 (Item : char16_array;
kono
parents:
diff changeset
292 Trim_Nul : Boolean := True) return Wide_String
kono
parents:
diff changeset
293 is
kono
parents:
diff changeset
294 Count : Natural;
kono
parents:
diff changeset
295 From : size_t;
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 begin
kono
parents:
diff changeset
298 if Trim_Nul then
kono
parents:
diff changeset
299 From := Item'First;
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 loop
kono
parents:
diff changeset
302 if From > Item'Last then
kono
parents:
diff changeset
303 raise Terminator_Error;
kono
parents:
diff changeset
304 elsif Item (From) = char16_t'Val (0) then
kono
parents:
diff changeset
305 exit;
kono
parents:
diff changeset
306 else
kono
parents:
diff changeset
307 From := From + 1;
kono
parents:
diff changeset
308 end if;
kono
parents:
diff changeset
309 end loop;
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 Count := Natural (From - Item'First);
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 else
kono
parents:
diff changeset
314 Count := Item'Length;
kono
parents:
diff changeset
315 end if;
kono
parents:
diff changeset
316
kono
parents:
diff changeset
317 declare
kono
parents:
diff changeset
318 R : Wide_String (1 .. Count);
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 begin
kono
parents:
diff changeset
321 for J in R'Range loop
kono
parents:
diff changeset
322 R (J) := To_Ada (Item (size_t (J) + (Item'First - 1)));
kono
parents:
diff changeset
323 end loop;
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 return R;
kono
parents:
diff changeset
326 end;
kono
parents:
diff changeset
327 end To_Ada;
kono
parents:
diff changeset
328
kono
parents:
diff changeset
329 -- Convert char16_array to Wide_String (procedure form)
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 procedure To_Ada
kono
parents:
diff changeset
332 (Item : char16_array;
kono
parents:
diff changeset
333 Target : out Wide_String;
kono
parents:
diff changeset
334 Count : out Natural;
kono
parents:
diff changeset
335 Trim_Nul : Boolean := True)
kono
parents:
diff changeset
336 is
kono
parents:
diff changeset
337 From : size_t;
kono
parents:
diff changeset
338 To : Positive;
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 begin
kono
parents:
diff changeset
341 if Trim_Nul then
kono
parents:
diff changeset
342 From := Item'First;
kono
parents:
diff changeset
343 loop
kono
parents:
diff changeset
344 if From > Item'Last then
kono
parents:
diff changeset
345 raise Terminator_Error;
kono
parents:
diff changeset
346 elsif Item (From) = char16_t'Val (0) then
kono
parents:
diff changeset
347 exit;
kono
parents:
diff changeset
348 else
kono
parents:
diff changeset
349 From := From + 1;
kono
parents:
diff changeset
350 end if;
kono
parents:
diff changeset
351 end loop;
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 Count := Natural (From - Item'First);
kono
parents:
diff changeset
354
kono
parents:
diff changeset
355 else
kono
parents:
diff changeset
356 Count := Item'Length;
kono
parents:
diff changeset
357 end if;
kono
parents:
diff changeset
358
kono
parents:
diff changeset
359 if Count > Target'Length then
kono
parents:
diff changeset
360 raise Constraint_Error;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 else
kono
parents:
diff changeset
363 From := Item'First;
kono
parents:
diff changeset
364 To := Target'First;
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366 for J in 1 .. Count loop
kono
parents:
diff changeset
367 Target (To) := To_Ada (Item (From));
kono
parents:
diff changeset
368 From := From + 1;
kono
parents:
diff changeset
369 To := To + 1;
kono
parents:
diff changeset
370 end loop;
kono
parents:
diff changeset
371 end if;
kono
parents:
diff changeset
372 end To_Ada;
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 -- Convert char32_t to Wide_Wide_Character
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 function To_Ada (Item : char32_t) return Wide_Wide_Character is
kono
parents:
diff changeset
377 begin
kono
parents:
diff changeset
378 return Wide_Wide_Character'Val (char32_t'Pos (Item));
kono
parents:
diff changeset
379 end To_Ada;
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 -- Convert char32_array to Wide_Wide_String (function form)
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 function To_Ada
kono
parents:
diff changeset
384 (Item : char32_array;
kono
parents:
diff changeset
385 Trim_Nul : Boolean := True) return Wide_Wide_String
kono
parents:
diff changeset
386 is
kono
parents:
diff changeset
387 Count : Natural;
kono
parents:
diff changeset
388 From : size_t;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 begin
kono
parents:
diff changeset
391 if Trim_Nul then
kono
parents:
diff changeset
392 From := Item'First;
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 loop
kono
parents:
diff changeset
395 if From > Item'Last then
kono
parents:
diff changeset
396 raise Terminator_Error;
kono
parents:
diff changeset
397 elsif Item (From) = char32_t'Val (0) then
kono
parents:
diff changeset
398 exit;
kono
parents:
diff changeset
399 else
kono
parents:
diff changeset
400 From := From + 1;
kono
parents:
diff changeset
401 end if;
kono
parents:
diff changeset
402 end loop;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 Count := Natural (From - Item'First);
kono
parents:
diff changeset
405
kono
parents:
diff changeset
406 else
kono
parents:
diff changeset
407 Count := Item'Length;
kono
parents:
diff changeset
408 end if;
kono
parents:
diff changeset
409
kono
parents:
diff changeset
410 declare
kono
parents:
diff changeset
411 R : Wide_Wide_String (1 .. Count);
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 begin
kono
parents:
diff changeset
414 for J in R'Range loop
kono
parents:
diff changeset
415 R (J) := To_Ada (Item (size_t (J) + (Item'First - 1)));
kono
parents:
diff changeset
416 end loop;
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 return R;
kono
parents:
diff changeset
419 end;
kono
parents:
diff changeset
420 end To_Ada;
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 -- Convert char32_array to Wide_Wide_String (procedure form)
kono
parents:
diff changeset
423
kono
parents:
diff changeset
424 procedure To_Ada
kono
parents:
diff changeset
425 (Item : char32_array;
kono
parents:
diff changeset
426 Target : out Wide_Wide_String;
kono
parents:
diff changeset
427 Count : out Natural;
kono
parents:
diff changeset
428 Trim_Nul : Boolean := True)
kono
parents:
diff changeset
429 is
kono
parents:
diff changeset
430 From : size_t;
kono
parents:
diff changeset
431 To : Positive;
kono
parents:
diff changeset
432
kono
parents:
diff changeset
433 begin
kono
parents:
diff changeset
434 if Trim_Nul then
kono
parents:
diff changeset
435 From := Item'First;
kono
parents:
diff changeset
436 loop
kono
parents:
diff changeset
437 if From > Item'Last then
kono
parents:
diff changeset
438 raise Terminator_Error;
kono
parents:
diff changeset
439 elsif Item (From) = char32_t'Val (0) then
kono
parents:
diff changeset
440 exit;
kono
parents:
diff changeset
441 else
kono
parents:
diff changeset
442 From := From + 1;
kono
parents:
diff changeset
443 end if;
kono
parents:
diff changeset
444 end loop;
kono
parents:
diff changeset
445
kono
parents:
diff changeset
446 Count := Natural (From - Item'First);
kono
parents:
diff changeset
447
kono
parents:
diff changeset
448 else
kono
parents:
diff changeset
449 Count := Item'Length;
kono
parents:
diff changeset
450 end if;
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 if Count > Target'Length then
kono
parents:
diff changeset
453 raise Constraint_Error;
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 else
kono
parents:
diff changeset
456 From := Item'First;
kono
parents:
diff changeset
457 To := Target'First;
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 for J in 1 .. Count loop
kono
parents:
diff changeset
460 Target (To) := To_Ada (Item (From));
kono
parents:
diff changeset
461 From := From + 1;
kono
parents:
diff changeset
462 To := To + 1;
kono
parents:
diff changeset
463 end loop;
kono
parents:
diff changeset
464 end if;
kono
parents:
diff changeset
465 end To_Ada;
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 ----------
kono
parents:
diff changeset
468 -- To_C --
kono
parents:
diff changeset
469 ----------
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 -- Convert Character to char
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 function To_C (Item : Character) return char is
kono
parents:
diff changeset
474 begin
kono
parents:
diff changeset
475 return char'Val (Character'Pos (Item));
kono
parents:
diff changeset
476 end To_C;
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 -- Convert String to char_array (function form)
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 function To_C
kono
parents:
diff changeset
481 (Item : String;
kono
parents:
diff changeset
482 Append_Nul : Boolean := True) return char_array
kono
parents:
diff changeset
483 is
kono
parents:
diff changeset
484 begin
kono
parents:
diff changeset
485 if Append_Nul then
kono
parents:
diff changeset
486 declare
kono
parents:
diff changeset
487 R : char_array (0 .. Item'Length);
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 begin
kono
parents:
diff changeset
490 for J in Item'Range loop
kono
parents:
diff changeset
491 R (size_t (J - Item'First)) := To_C (Item (J));
kono
parents:
diff changeset
492 end loop;
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 R (R'Last) := nul;
kono
parents:
diff changeset
495 return R;
kono
parents:
diff changeset
496 end;
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 -- Append_Nul False
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 else
kono
parents:
diff changeset
501 -- A nasty case, if the string is null, we must return a null
kono
parents:
diff changeset
502 -- char_array. The lower bound of this array is required to be zero
kono
parents:
diff changeset
503 -- (RM B.3(50)) but that is of course impossible given that size_t
kono
parents:
diff changeset
504 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
kono
parents:
diff changeset
505 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
kono
parents:
diff changeset
506 -- since nothing else makes sense.
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 if Item'Length = 0 then
kono
parents:
diff changeset
509 raise Constraint_Error;
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 -- Normal case
kono
parents:
diff changeset
512
kono
parents:
diff changeset
513 else
kono
parents:
diff changeset
514 declare
kono
parents:
diff changeset
515 R : char_array (0 .. Item'Length - 1);
kono
parents:
diff changeset
516
kono
parents:
diff changeset
517 begin
kono
parents:
diff changeset
518 for J in Item'Range loop
kono
parents:
diff changeset
519 R (size_t (J - Item'First)) := To_C (Item (J));
kono
parents:
diff changeset
520 end loop;
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 return R;
kono
parents:
diff changeset
523 end;
kono
parents:
diff changeset
524 end if;
kono
parents:
diff changeset
525 end if;
kono
parents:
diff changeset
526 end To_C;
kono
parents:
diff changeset
527
kono
parents:
diff changeset
528 -- Convert String to char_array (procedure form)
kono
parents:
diff changeset
529
kono
parents:
diff changeset
530 procedure To_C
kono
parents:
diff changeset
531 (Item : String;
kono
parents:
diff changeset
532 Target : out char_array;
kono
parents:
diff changeset
533 Count : out size_t;
kono
parents:
diff changeset
534 Append_Nul : Boolean := True)
kono
parents:
diff changeset
535 is
kono
parents:
diff changeset
536 To : size_t;
kono
parents:
diff changeset
537
kono
parents:
diff changeset
538 begin
kono
parents:
diff changeset
539 if Target'Length < Item'Length then
kono
parents:
diff changeset
540 raise Constraint_Error;
kono
parents:
diff changeset
541
kono
parents:
diff changeset
542 else
kono
parents:
diff changeset
543 To := Target'First;
kono
parents:
diff changeset
544 for From in Item'Range loop
kono
parents:
diff changeset
545 Target (To) := char (Item (From));
kono
parents:
diff changeset
546 To := To + 1;
kono
parents:
diff changeset
547 end loop;
kono
parents:
diff changeset
548
kono
parents:
diff changeset
549 if Append_Nul then
kono
parents:
diff changeset
550 if To > Target'Last then
kono
parents:
diff changeset
551 raise Constraint_Error;
kono
parents:
diff changeset
552 else
kono
parents:
diff changeset
553 Target (To) := nul;
kono
parents:
diff changeset
554 Count := Item'Length + 1;
kono
parents:
diff changeset
555 end if;
kono
parents:
diff changeset
556
kono
parents:
diff changeset
557 else
kono
parents:
diff changeset
558 Count := Item'Length;
kono
parents:
diff changeset
559 end if;
kono
parents:
diff changeset
560 end if;
kono
parents:
diff changeset
561 end To_C;
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 -- Convert Wide_Character to wchar_t
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 function To_C (Item : Wide_Character) return wchar_t is
kono
parents:
diff changeset
566 begin
kono
parents:
diff changeset
567 return wchar_t (Item);
kono
parents:
diff changeset
568 end To_C;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 -- Convert Wide_String to wchar_array (function form)
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 function To_C
kono
parents:
diff changeset
573 (Item : Wide_String;
kono
parents:
diff changeset
574 Append_Nul : Boolean := True) return wchar_array
kono
parents:
diff changeset
575 is
kono
parents:
diff changeset
576 begin
kono
parents:
diff changeset
577 if Append_Nul then
kono
parents:
diff changeset
578 declare
kono
parents:
diff changeset
579 R : wchar_array (0 .. Item'Length);
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 begin
kono
parents:
diff changeset
582 for J in Item'Range loop
kono
parents:
diff changeset
583 R (size_t (J - Item'First)) := To_C (Item (J));
kono
parents:
diff changeset
584 end loop;
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 R (R'Last) := wide_nul;
kono
parents:
diff changeset
587 return R;
kono
parents:
diff changeset
588 end;
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 else
kono
parents:
diff changeset
591 -- A nasty case, if the string is null, we must return a null
kono
parents:
diff changeset
592 -- wchar_array. The lower bound of this array is required to be zero
kono
parents:
diff changeset
593 -- (RM B.3(50)) but that is of course impossible given that size_t
kono
parents:
diff changeset
594 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
kono
parents:
diff changeset
595 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
kono
parents:
diff changeset
596 -- since nothing else makes sense.
kono
parents:
diff changeset
597
kono
parents:
diff changeset
598 if Item'Length = 0 then
kono
parents:
diff changeset
599 raise Constraint_Error;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 else
kono
parents:
diff changeset
602 declare
kono
parents:
diff changeset
603 R : wchar_array (0 .. Item'Length - 1);
kono
parents:
diff changeset
604
kono
parents:
diff changeset
605 begin
kono
parents:
diff changeset
606 for J in size_t range 0 .. Item'Length - 1 loop
kono
parents:
diff changeset
607 R (J) := To_C (Item (Integer (J) + Item'First));
kono
parents:
diff changeset
608 end loop;
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 return R;
kono
parents:
diff changeset
611 end;
kono
parents:
diff changeset
612 end if;
kono
parents:
diff changeset
613 end if;
kono
parents:
diff changeset
614 end To_C;
kono
parents:
diff changeset
615
kono
parents:
diff changeset
616 -- Convert Wide_String to wchar_array (procedure form)
kono
parents:
diff changeset
617
kono
parents:
diff changeset
618 procedure To_C
kono
parents:
diff changeset
619 (Item : Wide_String;
kono
parents:
diff changeset
620 Target : out wchar_array;
kono
parents:
diff changeset
621 Count : out size_t;
kono
parents:
diff changeset
622 Append_Nul : Boolean := True)
kono
parents:
diff changeset
623 is
kono
parents:
diff changeset
624 To : size_t;
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 begin
kono
parents:
diff changeset
627 if Target'Length < Item'Length then
kono
parents:
diff changeset
628 raise Constraint_Error;
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 else
kono
parents:
diff changeset
631 To := Target'First;
kono
parents:
diff changeset
632 for From in Item'Range loop
kono
parents:
diff changeset
633 Target (To) := To_C (Item (From));
kono
parents:
diff changeset
634 To := To + 1;
kono
parents:
diff changeset
635 end loop;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 if Append_Nul then
kono
parents:
diff changeset
638 if To > Target'Last then
kono
parents:
diff changeset
639 raise Constraint_Error;
kono
parents:
diff changeset
640 else
kono
parents:
diff changeset
641 Target (To) := wide_nul;
kono
parents:
diff changeset
642 Count := Item'Length + 1;
kono
parents:
diff changeset
643 end if;
kono
parents:
diff changeset
644
kono
parents:
diff changeset
645 else
kono
parents:
diff changeset
646 Count := Item'Length;
kono
parents:
diff changeset
647 end if;
kono
parents:
diff changeset
648 end if;
kono
parents:
diff changeset
649 end To_C;
kono
parents:
diff changeset
650
kono
parents:
diff changeset
651 -- Convert Wide_Character to char16_t
kono
parents:
diff changeset
652
kono
parents:
diff changeset
653 function To_C (Item : Wide_Character) return char16_t is
kono
parents:
diff changeset
654 begin
kono
parents:
diff changeset
655 return char16_t'Val (Wide_Character'Pos (Item));
kono
parents:
diff changeset
656 end To_C;
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 -- Convert Wide_String to char16_array (function form)
kono
parents:
diff changeset
659
kono
parents:
diff changeset
660 function To_C
kono
parents:
diff changeset
661 (Item : Wide_String;
kono
parents:
diff changeset
662 Append_Nul : Boolean := True) return char16_array
kono
parents:
diff changeset
663 is
kono
parents:
diff changeset
664 begin
kono
parents:
diff changeset
665 if Append_Nul then
kono
parents:
diff changeset
666 declare
kono
parents:
diff changeset
667 R : char16_array (0 .. Item'Length);
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 begin
kono
parents:
diff changeset
670 for J in Item'Range loop
kono
parents:
diff changeset
671 R (size_t (J - Item'First)) := To_C (Item (J));
kono
parents:
diff changeset
672 end loop;
kono
parents:
diff changeset
673
kono
parents:
diff changeset
674 R (R'Last) := char16_t'Val (0);
kono
parents:
diff changeset
675 return R;
kono
parents:
diff changeset
676 end;
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 else
kono
parents:
diff changeset
679 -- A nasty case, if the string is null, we must return a null
kono
parents:
diff changeset
680 -- char16_array. The lower bound of this array is required to be zero
kono
parents:
diff changeset
681 -- (RM B.3(50)) but that is of course impossible given that size_t
kono
parents:
diff changeset
682 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
kono
parents:
diff changeset
683 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
kono
parents:
diff changeset
684 -- since nothing else makes sense.
kono
parents:
diff changeset
685
kono
parents:
diff changeset
686 if Item'Length = 0 then
kono
parents:
diff changeset
687 raise Constraint_Error;
kono
parents:
diff changeset
688
kono
parents:
diff changeset
689 else
kono
parents:
diff changeset
690 declare
kono
parents:
diff changeset
691 R : char16_array (0 .. Item'Length - 1);
kono
parents:
diff changeset
692
kono
parents:
diff changeset
693 begin
kono
parents:
diff changeset
694 for J in size_t range 0 .. Item'Length - 1 loop
kono
parents:
diff changeset
695 R (J) := To_C (Item (Integer (J) + Item'First));
kono
parents:
diff changeset
696 end loop;
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 return R;
kono
parents:
diff changeset
699 end;
kono
parents:
diff changeset
700 end if;
kono
parents:
diff changeset
701 end if;
kono
parents:
diff changeset
702 end To_C;
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 -- Convert Wide_String to char16_array (procedure form)
kono
parents:
diff changeset
705
kono
parents:
diff changeset
706 procedure To_C
kono
parents:
diff changeset
707 (Item : Wide_String;
kono
parents:
diff changeset
708 Target : out char16_array;
kono
parents:
diff changeset
709 Count : out size_t;
kono
parents:
diff changeset
710 Append_Nul : Boolean := True)
kono
parents:
diff changeset
711 is
kono
parents:
diff changeset
712 To : size_t;
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 begin
kono
parents:
diff changeset
715 if Target'Length < Item'Length then
kono
parents:
diff changeset
716 raise Constraint_Error;
kono
parents:
diff changeset
717
kono
parents:
diff changeset
718 else
kono
parents:
diff changeset
719 To := Target'First;
kono
parents:
diff changeset
720 for From in Item'Range loop
kono
parents:
diff changeset
721 Target (To) := To_C (Item (From));
kono
parents:
diff changeset
722 To := To + 1;
kono
parents:
diff changeset
723 end loop;
kono
parents:
diff changeset
724
kono
parents:
diff changeset
725 if Append_Nul then
kono
parents:
diff changeset
726 if To > Target'Last then
kono
parents:
diff changeset
727 raise Constraint_Error;
kono
parents:
diff changeset
728 else
kono
parents:
diff changeset
729 Target (To) := char16_t'Val (0);
kono
parents:
diff changeset
730 Count := Item'Length + 1;
kono
parents:
diff changeset
731 end if;
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 else
kono
parents:
diff changeset
734 Count := Item'Length;
kono
parents:
diff changeset
735 end if;
kono
parents:
diff changeset
736 end if;
kono
parents:
diff changeset
737 end To_C;
kono
parents:
diff changeset
738
kono
parents:
diff changeset
739 -- Convert Wide_Character to char32_t
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 function To_C (Item : Wide_Wide_Character) return char32_t is
kono
parents:
diff changeset
742 begin
kono
parents:
diff changeset
743 return char32_t'Val (Wide_Wide_Character'Pos (Item));
kono
parents:
diff changeset
744 end To_C;
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 -- Convert Wide_Wide_String to char32_array (function form)
kono
parents:
diff changeset
747
kono
parents:
diff changeset
748 function To_C
kono
parents:
diff changeset
749 (Item : Wide_Wide_String;
kono
parents:
diff changeset
750 Append_Nul : Boolean := True) return char32_array
kono
parents:
diff changeset
751 is
kono
parents:
diff changeset
752 begin
kono
parents:
diff changeset
753 if Append_Nul then
kono
parents:
diff changeset
754 declare
kono
parents:
diff changeset
755 R : char32_array (0 .. Item'Length);
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 begin
kono
parents:
diff changeset
758 for J in Item'Range loop
kono
parents:
diff changeset
759 R (size_t (J - Item'First)) := To_C (Item (J));
kono
parents:
diff changeset
760 end loop;
kono
parents:
diff changeset
761
kono
parents:
diff changeset
762 R (R'Last) := char32_t'Val (0);
kono
parents:
diff changeset
763 return R;
kono
parents:
diff changeset
764 end;
kono
parents:
diff changeset
765
kono
parents:
diff changeset
766 else
kono
parents:
diff changeset
767 -- A nasty case, if the string is null, we must return a null
kono
parents:
diff changeset
768 -- char32_array. The lower bound of this array is required to be zero
kono
parents:
diff changeset
769 -- (RM B.3(50)) but that is of course impossible given that size_t
kono
parents:
diff changeset
770 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
kono
parents:
diff changeset
771 -- Constraint_Error.
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 if Item'Length = 0 then
kono
parents:
diff changeset
774 raise Constraint_Error;
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 else
kono
parents:
diff changeset
777 declare
kono
parents:
diff changeset
778 R : char32_array (0 .. Item'Length - 1);
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 begin
kono
parents:
diff changeset
781 for J in size_t range 0 .. Item'Length - 1 loop
kono
parents:
diff changeset
782 R (J) := To_C (Item (Integer (J) + Item'First));
kono
parents:
diff changeset
783 end loop;
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 return R;
kono
parents:
diff changeset
786 end;
kono
parents:
diff changeset
787 end if;
kono
parents:
diff changeset
788 end if;
kono
parents:
diff changeset
789 end To_C;
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 -- Convert Wide_Wide_String to char32_array (procedure form)
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 procedure To_C
kono
parents:
diff changeset
794 (Item : Wide_Wide_String;
kono
parents:
diff changeset
795 Target : out char32_array;
kono
parents:
diff changeset
796 Count : out size_t;
kono
parents:
diff changeset
797 Append_Nul : Boolean := True)
kono
parents:
diff changeset
798 is
kono
parents:
diff changeset
799 To : size_t;
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 begin
kono
parents:
diff changeset
802 if Target'Length < Item'Length then
kono
parents:
diff changeset
803 raise Constraint_Error;
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 else
kono
parents:
diff changeset
806 To := Target'First;
kono
parents:
diff changeset
807 for From in Item'Range loop
kono
parents:
diff changeset
808 Target (To) := To_C (Item (From));
kono
parents:
diff changeset
809 To := To + 1;
kono
parents:
diff changeset
810 end loop;
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 if Append_Nul then
kono
parents:
diff changeset
813 if To > Target'Last then
kono
parents:
diff changeset
814 raise Constraint_Error;
kono
parents:
diff changeset
815 else
kono
parents:
diff changeset
816 Target (To) := char32_t'Val (0);
kono
parents:
diff changeset
817 Count := Item'Length + 1;
kono
parents:
diff changeset
818 end if;
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 else
kono
parents:
diff changeset
821 Count := Item'Length;
kono
parents:
diff changeset
822 end if;
kono
parents:
diff changeset
823 end if;
kono
parents:
diff changeset
824 end To_C;
kono
parents:
diff changeset
825
kono
parents:
diff changeset
826 end Interfaces.C;