1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- I N T E R F A C E S . C --
9 -- Copyright (C) 1992-2024, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
30 ------------------------------------------------------------------------------
32 -- Ghost code, loop invariants and assertions in this unit are meant for
33 -- analysis only, not for run-time checking, as it would be too costly
34 -- otherwise. This is enforced by setting the assertion policy to Ignore.
36 pragma Assertion_Policy
(Ghost
=> Ignore
,
37 Loop_Invariant
=> Ignore
,
40 package body Interfaces
.C
48 function C_Length_Ghost
(Item
: char_array
) return size_t
is
50 for J
in Item
'Range loop
51 if Item
(J
) = nul
then
52 return J
- Item
'First;
56 (for all K
in Item
'First .. J
=> Item
(K
) /= nul
);
62 function C_Length_Ghost
(Item
: wchar_array
) return size_t
is
64 for J
in Item
'Range loop
65 if Item
(J
) = wide_nul
then
66 return J
- Item
'First;
70 (for all K
in Item
'First .. J
=> Item
(K
) /= wide_nul
);
76 function C_Length_Ghost
(Item
: char16_array
) return size_t
is
78 for J
in Item
'Range loop
79 if Item
(J
) = char16_nul
then
80 return J
- Item
'First;
84 (for all K
in Item
'First .. J
=> Item
(K
) /= char16_nul
);
90 function C_Length_Ghost
(Item
: char32_array
) return size_t
is
92 for J
in Item
'Range loop
93 if Item
(J
) = char32_nul
then
94 return J
- Item
'First;
98 (for all K
in Item
'First .. J
=> Item
(K
) /= char32_nul
);
104 -----------------------
105 -- Is_Nul_Terminated --
106 -----------------------
108 -- Case of char_array
110 function Is_Nul_Terminated
(Item
: char_array
) return Boolean is
112 for J
in Item
'Range loop
113 if Item
(J
) = nul
then
117 pragma Loop_Invariant
118 (for all K
in Item
'First .. J
=> Item
(K
) /= nul
);
122 end Is_Nul_Terminated
;
124 -- Case of wchar_array
126 function Is_Nul_Terminated
(Item
: wchar_array
) return Boolean is
128 for J
in Item
'Range loop
129 if Item
(J
) = wide_nul
then
133 pragma Loop_Invariant
134 (for all K
in Item
'First .. J
=> Item
(K
) /= wide_nul
);
138 end Is_Nul_Terminated
;
140 -- Case of char16_array
142 function Is_Nul_Terminated
(Item
: char16_array
) return Boolean is
144 for J
in Item
'Range loop
145 if Item
(J
) = char16_nul
then
149 pragma Loop_Invariant
150 (for all K
in Item
'First .. J
=> Item
(K
) /= char16_nul
);
154 end Is_Nul_Terminated
;
156 -- Case of char32_array
158 function Is_Nul_Terminated
(Item
: char32_array
) return Boolean is
160 for J
in Item
'Range loop
161 if Item
(J
) = char32_nul
then
165 pragma Loop_Invariant
166 (for all K
in Item
'First .. J
=> Item
(K
) /= char32_nul
);
170 end Is_Nul_Terminated
;
176 -- Convert char to Character
178 function To_Ada
(Item
: char
) return Character is
180 return Character'Val (char
'Pos (Item
));
183 -- Convert char_array to String (function form)
187 Trim_Nul
: Boolean := True) return String
197 pragma Loop_Invariant
(From
in Item
'Range);
198 pragma Loop_Invariant
199 (for some J
in From
.. Item
'Last => Item
(J
) = nul
);
200 pragma Loop_Invariant
201 (for all J
in Item
'First .. From
when J
/= From
=>
203 pragma Loop_Variant
(Increases
=> From
);
205 if From
> Item
'Last then
206 raise Terminator_Error
;
207 elsif Item
(From
) = nul
then
214 pragma Assert
(From
= Item
'First + C_Length_Ghost
(Item
));
216 Count
:= Natural (From
- Item
'First);
219 Count
:= Item
'Length;
223 Count_Cst
: constant Natural := Count
;
224 R
: String (1 .. Count_Cst
) with Relaxed_Initialization
;
227 for J
in R
'Range loop
228 R
(J
) := To_Ada
(Item
(size_t
(J
) - 1 + Item
'First));
230 pragma Loop_Invariant
(for all K
in 1 .. J
=> R
(K
)'Initialized);
231 pragma Loop_Invariant
232 (for all K
in 1 .. J
=>
233 R
(K
) = To_Ada
(Item
(size_t
(K
) - 1 + Item
'First)));
240 -- Convert char_array to String (procedure form)
246 Trim_Nul
: Boolean := True)
255 pragma Loop_Invariant
(From
in Item
'Range);
256 pragma Loop_Invariant
257 (for some J
in From
.. Item
'Last => Item
(J
) = nul
);
258 pragma Loop_Invariant
259 (for all J
in Item
'First .. From
when J
/= From
=>
261 pragma Loop_Variant
(Increases
=> From
);
263 if From
> Item
'Last then
264 raise Terminator_Error
;
265 elsif Item
(From
) = nul
then
272 Count
:= Natural (From
- Item
'First);
275 Count
:= Item
'Length;
278 if Count
> Target
'Length then
279 raise Constraint_Error
;
285 for J
in 1 .. Count
loop
286 Target
(To
) := Character (Item
(From
));
288 pragma Loop_Invariant
(From
in Item
'Range);
289 pragma Loop_Invariant
(To
in Target
'Range);
290 pragma Loop_Invariant
(To
= Target
'First + (J
- 1));
291 pragma Loop_Invariant
(From
= Item
'First + size_t
(J
- 1));
292 pragma Loop_Invariant
293 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
294 pragma Loop_Invariant
295 (Target
(Target
'First .. To
)'Initialized);
296 pragma Loop_Invariant
297 (for all K
in Target
'First .. To
=>
299 To_Ada
(Item
(size_t
(K
- Target
'First) + Item
'First)));
301 -- Avoid possible overflow when incrementing To in the last
302 -- iteration of the loop.
311 -- Convert wchar_t to Wide_Character
313 function To_Ada
(Item
: wchar_t
) return Wide_Character is
315 return Wide_Character (Item
);
318 -- Convert wchar_array to Wide_String (function form)
322 Trim_Nul
: Boolean := True) return Wide_String
332 pragma Loop_Invariant
(From
in Item
'Range);
333 pragma Loop_Invariant
334 (for some J
in From
.. Item
'Last => Item
(J
) = wide_nul
);
335 pragma Loop_Invariant
336 (for all J
in Item
'First .. From
when J
/= From
=>
337 Item
(J
) /= wide_nul
);
338 pragma Loop_Variant
(Increases
=> From
);
340 if From
> Item
'Last then
341 raise Terminator_Error
;
342 elsif Item
(From
) = wide_nul
then
349 pragma Assert
(From
= Item
'First + C_Length_Ghost
(Item
));
351 Count
:= Natural (From
- Item
'First);
354 Count
:= Item
'Length;
358 Count_Cst
: constant Natural := Count
;
359 R
: Wide_String (1 .. Count_Cst
) with Relaxed_Initialization
;
362 for J
in R
'Range loop
363 R
(J
) := To_Ada
(Item
(size_t
(J
) - 1 + Item
'First));
365 pragma Loop_Invariant
(for all K
in 1 .. J
=> R
(K
)'Initialized);
366 pragma Loop_Invariant
367 (for all K
in 1 .. J
=>
368 R
(K
) = To_Ada
(Item
(size_t
(K
) - 1 + Item
'First)));
375 -- Convert wchar_array to Wide_String (procedure form)
379 Target
: out Wide_String;
381 Trim_Nul
: Boolean := True)
390 pragma Loop_Invariant
(From
in Item
'Range);
391 pragma Loop_Invariant
392 (for some J
in From
.. Item
'Last => Item
(J
) = wide_nul
);
393 pragma Loop_Invariant
394 (for all J
in Item
'First .. From
when J
/= From
=>
395 Item
(J
) /= wide_nul
);
396 pragma Loop_Variant
(Increases
=> From
);
398 if From
> Item
'Last then
399 raise Terminator_Error
;
400 elsif Item
(From
) = wide_nul
then
407 Count
:= Natural (From
- Item
'First);
410 Count
:= Item
'Length;
413 if Count
> Target
'Length then
414 raise Constraint_Error
;
420 for J
in 1 .. Count
loop
421 Target
(To
) := To_Ada
(Item
(From
));
423 pragma Loop_Invariant
(From
in Item
'Range);
424 pragma Loop_Invariant
(To
in Target
'Range);
425 pragma Loop_Invariant
(To
= Target
'First + (J
- 1));
426 pragma Loop_Invariant
(From
= Item
'First + size_t
(J
- 1));
427 pragma Loop_Invariant
428 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
429 pragma Loop_Invariant
430 (Target
(Target
'First .. To
)'Initialized);
431 pragma Loop_Invariant
432 (for all K
in Target
'First .. To
=>
434 To_Ada
(Item
(size_t
(K
- Target
'First) + Item
'First)));
436 -- Avoid possible overflow when incrementing To in the last
437 -- iteration of the loop.
446 -- Convert char16_t to Wide_Character
448 function To_Ada
(Item
: char16_t
) return Wide_Character is
450 return Wide_Character'Val (char16_t
'Pos (Item
));
453 -- Convert char16_array to Wide_String (function form)
456 (Item
: char16_array
;
457 Trim_Nul
: Boolean := True) return Wide_String
467 pragma Loop_Invariant
(From
in Item
'Range);
468 pragma Loop_Invariant
469 (for some J
in From
.. Item
'Last => Item
(J
) = char16_nul
);
470 pragma Loop_Invariant
471 (for all J
in Item
'First .. From
when J
/= From
=>
472 Item
(J
) /= char16_nul
);
473 pragma Loop_Variant
(Increases
=> From
);
475 if From
> Item
'Last then
476 raise Terminator_Error
;
477 elsif Item
(From
) = char16_nul
then
484 pragma Assert
(From
= Item
'First + C_Length_Ghost
(Item
));
486 Count
:= Natural (From
- Item
'First);
489 Count
:= Item
'Length;
493 Count_Cst
: constant Natural := Count
;
494 R
: Wide_String (1 .. Count_Cst
) with Relaxed_Initialization
;
497 for J
in R
'Range loop
498 R
(J
) := To_Ada
(Item
(size_t
(J
) - 1 + Item
'First));
500 pragma Loop_Invariant
(for all K
in 1 .. J
=> R
(K
)'Initialized);
501 pragma Loop_Invariant
502 (for all K
in 1 .. J
=>
503 R
(K
) = To_Ada
(Item
(size_t
(K
) - 1 + Item
'First)));
510 -- Convert char16_array to Wide_String (procedure form)
513 (Item
: char16_array
;
514 Target
: out Wide_String;
516 Trim_Nul
: Boolean := True)
525 pragma Loop_Invariant
(From
in Item
'Range);
526 pragma Loop_Invariant
527 (for some J
in From
.. Item
'Last => Item
(J
) = char16_nul
);
528 pragma Loop_Invariant
529 (for all J
in Item
'First .. From
when J
/= From
=>
530 Item
(J
) /= char16_nul
);
531 pragma Loop_Variant
(Increases
=> From
);
533 if From
> Item
'Last then
534 raise Terminator_Error
;
535 elsif Item
(From
) = char16_nul
then
542 Count
:= Natural (From
- Item
'First);
545 Count
:= Item
'Length;
548 if Count
> Target
'Length then
549 raise Constraint_Error
;
555 for J
in 1 .. Count
loop
556 Target
(To
) := To_Ada
(Item
(From
));
558 pragma Loop_Invariant
(From
in Item
'Range);
559 pragma Loop_Invariant
(To
in Target
'Range);
560 pragma Loop_Invariant
(To
= Target
'First + (J
- 1));
561 pragma Loop_Invariant
(From
= Item
'First + size_t
(J
- 1));
562 pragma Loop_Invariant
563 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
564 pragma Loop_Invariant
565 (Target
(Target
'First .. To
)'Initialized);
566 pragma Loop_Invariant
567 (for all K
in Target
'First .. To
=>
569 To_Ada
(Item
(size_t
(K
- Target
'First) + Item
'First)));
571 -- Avoid possible overflow when incrementing To in the last
572 -- iteration of the loop.
581 -- Convert char32_t to Wide_Wide_Character
583 function To_Ada
(Item
: char32_t
) return Wide_Wide_Character
is
585 return Wide_Wide_Character
'Val (char32_t
'Pos (Item
));
588 -- Convert char32_array to Wide_Wide_String (function form)
591 (Item
: char32_array
;
592 Trim_Nul
: Boolean := True) return Wide_Wide_String
602 pragma Loop_Invariant
(From
in Item
'Range);
603 pragma Loop_Invariant
604 (for some J
in From
.. Item
'Last => Item
(J
) = char32_nul
);
605 pragma Loop_Invariant
606 (for all J
in Item
'First .. From
when J
/= From
=>
607 Item
(J
) /= char32_nul
);
608 pragma Loop_Invariant
(From
<= Item
'First + C_Length_Ghost
(Item
));
609 pragma Loop_Variant
(Increases
=> From
);
611 if From
> Item
'Last then
612 raise Terminator_Error
;
613 elsif Item
(From
) = char32_nul
then
620 pragma Assert
(From
= Item
'First + C_Length_Ghost
(Item
));
622 Count
:= Natural (From
- Item
'First);
625 Count
:= Item
'Length;
629 Count_Cst
: constant Natural := Count
;
630 R
: Wide_Wide_String
(1 .. Count_Cst
) with Relaxed_Initialization
;
633 for J
in R
'Range loop
634 R
(J
) := To_Ada
(Item
(size_t
(J
) - 1 + Item
'First));
636 pragma Loop_Invariant
(for all K
in 1 .. J
=> R
(K
)'Initialized);
637 pragma Loop_Invariant
638 (for all K
in 1 .. J
=>
639 R
(K
) = To_Ada
(Item
(size_t
(K
) - 1 + Item
'First)));
646 -- Convert char32_array to Wide_Wide_String (procedure form)
649 (Item
: char32_array
;
650 Target
: out Wide_Wide_String
;
652 Trim_Nul
: Boolean := True)
661 pragma Loop_Invariant
(From
in Item
'Range);
662 pragma Loop_Invariant
663 (for some J
in From
.. Item
'Last => Item
(J
) = char32_nul
);
664 pragma Loop_Invariant
665 (for all J
in Item
'First .. From
when J
/= From
=>
666 Item
(J
) /= char32_nul
);
667 pragma Loop_Variant
(Increases
=> From
);
669 if From
> Item
'Last then
670 raise Terminator_Error
;
671 elsif Item
(From
) = char32_nul
then
678 Count
:= Natural (From
- Item
'First);
681 Count
:= Item
'Length;
684 if Count
> Target
'Length then
685 raise Constraint_Error
;
691 for J
in 1 .. Count
loop
692 Target
(To
) := To_Ada
(Item
(From
));
694 pragma Loop_Invariant
(From
in Item
'Range);
695 pragma Loop_Invariant
(To
in Target
'Range);
696 pragma Loop_Invariant
(To
= Target
'First + (J
- 1));
697 pragma Loop_Invariant
(From
= Item
'First + size_t
(J
- 1));
698 pragma Loop_Invariant
699 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
700 pragma Loop_Invariant
701 (Target
(Target
'First .. To
)'Initialized);
702 pragma Loop_Invariant
703 (for all K
in Target
'First .. To
=>
705 To_Ada
(Item
(size_t
(K
- Target
'First) + Item
'First)));
707 -- Avoid possible overflow when incrementing To in the last
708 -- iteration of the loop.
721 -- Convert Character to char
723 function To_C
(Item
: Character) return char
is
725 return char
'Val (Character'Pos (Item
));
728 -- Convert String to char_array (function form)
732 Append_Nul
: Boolean := True) return char_array
737 R
: char_array
(0 .. Item
'Length) with Relaxed_Initialization
;
740 for J
in Item
'Range loop
741 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
743 pragma Loop_Invariant
744 (for all K
in 0 .. size_t
(J
- Item
'First) =>
746 pragma Loop_Invariant
747 (for all K
in Item
'First .. J
=>
748 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
754 (for all J
in Item
'Range =>
755 R
(size_t
(J
- Item
'First)) = To_C
(Item
(J
)));
763 -- A nasty case, if the string is null, we must return a null
764 -- char_array. The lower bound of this array is required to be zero
765 -- (RM B.3(50)) but that is of course impossible given that size_t
766 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
767 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
768 -- since nothing else makes sense.
770 if Item
'Length = 0 then
771 raise Constraint_Error
;
777 R
: char_array
(0 .. Item
'Length - 1)
778 with Relaxed_Initialization
;
781 for J
in Item
'Range loop
782 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
784 pragma Loop_Invariant
785 (for all K
in 0 .. size_t
(J
- Item
'First) =>
787 pragma Loop_Invariant
788 (for all K
in Item
'First .. J
=>
789 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
798 -- Convert String to char_array (procedure form)
802 Target
: out char_array
;
804 Append_Nul
: Boolean := True)
809 if Target
'Length < Item
'Length then
810 raise Constraint_Error
;
814 for From
in Item
'Range loop
815 Target
(To
) := char
(Item
(From
));
817 pragma Loop_Invariant
(To
in Target
'Range);
818 pragma Loop_Invariant
819 (To
- Target
'First = size_t
(From
- Item
'First));
820 pragma Loop_Invariant
821 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
822 pragma Loop_Invariant
823 (Target
(Target
'First .. To
)'Initialized);
824 pragma Loop_Invariant
825 (for all J
in Item
'First .. From
=>
826 Target
(Target
'First + size_t
(J
- Item
'First)) =
833 if To
> Target
'Last then
834 raise Constraint_Error
;
837 Count
:= Item
'Length + 1;
841 Count
:= Item
'Length;
846 -- Convert Wide_Character to wchar_t
848 function To_C
(Item
: Wide_Character) return wchar_t
is
850 return wchar_t
(Item
);
853 -- Convert Wide_String to wchar_array (function form)
857 Append_Nul
: Boolean := True) return wchar_array
862 R
: wchar_array
(0 .. Item
'Length) with Relaxed_Initialization
;
865 for J
in Item
'Range loop
866 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
868 pragma Loop_Invariant
869 (for all K
in 0 .. size_t
(J
- Item
'First) =>
871 pragma Loop_Invariant
872 (for all K
in Item
'First .. J
=>
873 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
876 R
(R
'Last) := wide_nul
;
879 (for all J
in Item
'Range =>
880 R
(size_t
(J
- Item
'First)) = To_C
(Item
(J
)));
886 -- A nasty case, if the string is null, we must return a null
887 -- wchar_array. The lower bound of this array is required to be zero
888 -- (RM B.3(50)) but that is of course impossible given that size_t
889 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
890 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
891 -- since nothing else makes sense.
893 if Item
'Length = 0 then
894 raise Constraint_Error
;
898 R
: wchar_array
(0 .. Item
'Length - 1)
899 with Relaxed_Initialization
;
902 for J
in Item
'Range loop
903 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
905 pragma Loop_Invariant
906 (for all K
in 0 .. size_t
(J
- Item
'First) =>
908 pragma Loop_Invariant
909 (for all K
in Item
'First .. J
=>
910 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
919 -- Convert Wide_String to wchar_array (procedure form)
923 Target
: out wchar_array
;
925 Append_Nul
: Boolean := True)
930 if Target
'Length < Item
'Length then
931 raise Constraint_Error
;
935 for From
in Item
'Range loop
936 Target
(To
) := To_C
(Item
(From
));
938 pragma Loop_Invariant
(To
in Target
'Range);
939 pragma Loop_Invariant
940 (To
- Target
'First = size_t
(From
- Item
'First));
941 pragma Loop_Invariant
942 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
943 pragma Loop_Invariant
944 (Target
(Target
'First .. To
)'Initialized);
945 pragma Loop_Invariant
946 (for all J
in Item
'First .. From
=>
947 Target
(Target
'First + size_t
(J
- Item
'First)) =
954 (for all J
in Item
'Range =>
955 Target
(Target
'First + size_t
(J
- Item
'First)) =
958 (if Item
'Length /= 0 then
959 Target
(Target
'First ..
960 Target
'First + (Item
'Length - 1))'Initialized);
963 if To
> Target
'Last then
964 raise Constraint_Error
;
966 Target
(To
) := wide_nul
;
967 Count
:= Item
'Length + 1;
971 Count
:= Item
'Length;
976 -- Convert Wide_Character to char16_t
978 function To_C
(Item
: Wide_Character) return char16_t
is
980 return char16_t
'Val (Wide_Character'Pos (Item
));
983 -- Convert Wide_String to char16_array (function form)
987 Append_Nul
: Boolean := True) return char16_array
992 R
: char16_array
(0 .. Item
'Length) with Relaxed_Initialization
;
995 for J
in Item
'Range loop
996 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
998 pragma Loop_Invariant
999 (for all K
in 0 .. size_t
(J
- Item
'First) =>
1001 pragma Loop_Invariant
1002 (for all K
in Item
'First .. J
=>
1003 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
1006 R
(R
'Last) := char16_nul
;
1009 (for all J
in Item
'Range =>
1010 R
(size_t
(J
- Item
'First)) = To_C
(Item
(J
)));
1016 -- A nasty case, if the string is null, we must return a null
1017 -- char16_array. The lower bound of this array is required to be zero
1018 -- (RM B.3(50)) but that is of course impossible given that size_t
1019 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
1020 -- Constraint_Error. This is also the appropriate behavior in Ada 95,
1021 -- since nothing else makes sense.
1023 if Item
'Length = 0 then
1024 raise Constraint_Error
;
1028 R
: char16_array
(0 .. Item
'Length - 1)
1029 with Relaxed_Initialization
;
1032 for J
in Item
'Range loop
1033 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
1035 pragma Loop_Invariant
1036 (for all K
in 0 .. size_t
(J
- Item
'First) =>
1038 pragma Loop_Invariant
1039 (for all K
in Item
'First .. J
=>
1040 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
1049 -- Convert Wide_String to char16_array (procedure form)
1052 (Item
: Wide_String;
1053 Target
: out char16_array
;
1055 Append_Nul
: Boolean := True)
1060 if Target
'Length < Item
'Length then
1061 raise Constraint_Error
;
1065 for From
in Item
'Range loop
1066 Target
(To
) := To_C
(Item
(From
));
1068 pragma Loop_Invariant
(To
in Target
'Range);
1069 pragma Loop_Invariant
1070 (To
- Target
'First = size_t
(From
- Item
'First));
1071 pragma Loop_Invariant
1072 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
1073 pragma Loop_Invariant
1074 (Target
(Target
'First .. To
)'Initialized);
1075 pragma Loop_Invariant
1076 (for all J
in Item
'First .. From
=>
1077 Target
(Target
'First + size_t
(J
- Item
'First)) =
1084 (for all J
in Item
'Range =>
1085 Target
(Target
'First + size_t
(J
- Item
'First)) =
1088 (if Item
'Length /= 0 then
1089 Target
(Target
'First ..
1090 Target
'First + (Item
'Length - 1))'Initialized);
1093 if To
> Target
'Last then
1094 raise Constraint_Error
;
1096 Target
(To
) := char16_nul
;
1097 Count
:= Item
'Length + 1;
1101 Count
:= Item
'Length;
1106 -- Convert Wide_Character to char32_t
1108 function To_C
(Item
: Wide_Wide_Character
) return char32_t
is
1110 return char32_t
'Val (Wide_Wide_Character
'Pos (Item
));
1113 -- Convert Wide_Wide_String to char32_array (function form)
1116 (Item
: Wide_Wide_String
;
1117 Append_Nul
: Boolean := True) return char32_array
1122 R
: char32_array
(0 .. Item
'Length) with Relaxed_Initialization
;
1125 for J
in Item
'Range loop
1126 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
1128 pragma Loop_Invariant
1129 (for all K
in 0 .. size_t
(J
- Item
'First) =>
1131 pragma Loop_Invariant
1132 (for all K
in Item
'First .. J
=>
1133 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
1136 R
(R
'Last) := char32_nul
;
1139 (for all J
in Item
'Range =>
1140 R
(size_t
(J
- Item
'First)) = To_C
(Item
(J
)));
1146 -- A nasty case, if the string is null, we must return a null
1147 -- char32_array. The lower bound of this array is required to be zero
1148 -- (RM B.3(50)) but that is of course impossible given that size_t
1149 -- is unsigned. According to Ada 2005 AI-258, the result is to raise
1150 -- Constraint_Error.
1152 if Item
'Length = 0 then
1153 raise Constraint_Error
;
1157 R
: char32_array
(0 .. Item
'Length - 1)
1158 with Relaxed_Initialization
;
1161 for J
in Item
'Range loop
1162 R
(size_t
(J
- Item
'First)) := To_C
(Item
(J
));
1164 pragma Loop_Invariant
1165 (for all K
in 0 .. size_t
(J
- Item
'First) =>
1167 pragma Loop_Invariant
1168 (for all K
in Item
'First .. J
=>
1169 R
(size_t
(K
- Item
'First)) = To_C
(Item
(K
)));
1178 -- Convert Wide_Wide_String to char32_array (procedure form)
1181 (Item
: Wide_Wide_String
;
1182 Target
: out char32_array
;
1184 Append_Nul
: Boolean := True)
1189 if Target
'Length < Item
'Length + (if Append_Nul
then 1 else 0) then
1190 raise Constraint_Error
;
1194 for From
in Item
'Range loop
1195 Target
(To
) := To_C
(Item
(From
));
1197 pragma Loop_Invariant
(To
in Target
'Range);
1198 pragma Loop_Invariant
1199 (To
- Target
'First = size_t
(From
- Item
'First));
1200 pragma Loop_Invariant
1201 (for all J
in Target
'First .. To
=> Target
(J
)'Initialized);
1202 pragma Loop_Invariant
1203 (Target
(Target
'First .. To
)'Initialized);
1204 pragma Loop_Invariant
1205 (for all J
in Item
'First .. From
=>
1206 Target
(Target
'First + size_t
(J
- Item
'First)) =
1213 (for all J
in Item
'Range =>
1214 Target
(Target
'First + size_t
(J
- Item
'First)) =
1217 (if Item
'Length /= 0 then
1218 Target
(Target
'First ..
1219 Target
'First + (Item
'Length - 1))'Initialized);
1222 Target
(To
) := char32_nul
;
1223 Count
:= Item
'Length + 1;
1225 Count
:= Item
'Length;
1229 pragma Annotate
(CodePeer
, False_Positive
, "validity check",
1230 "Count is only uninitialized on abnormal return.");