1 ------------------------------------------------------------------------------
3 -- GNAT RUNTIME COMPONENTS --
5 -- A D A . S T R I N G S . W I D E _ B O U N D E D --
9 -- Copyright (C) 1992-2001 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 2, 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. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING. If not, write --
19 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
20 -- MA 02111-1307, USA. --
22 -- As a special exception, if other files instantiate generics from this --
23 -- unit, or you link this unit with other files to produce an executable, --
24 -- this unit does not by itself cause the resulting executable to be --
25 -- covered by the GNU General Public License. This exception does not --
26 -- however invalidate any other reasons why the executable file might be --
27 -- covered by the GNU Public License. --
29 -- GNAT was originally developed by the GNAT team at New York University. --
30 -- Extensive contributions were provided by Ada Core Technologies Inc. --
32 ------------------------------------------------------------------------------
34 with Ada.Strings.Wide_Maps; use Ada.Strings.Wide_Maps;
35 with Ada.Strings.Wide_Search;
37 package body Ada.Strings.Wide_Bounded is
39 package body Generic_Bounded_Length is
46 (Left : in Bounded_Wide_String;
47 Right : in Bounded_Wide_String)
48 return Bounded_Wide_String
50 Result : Bounded_Wide_String;
51 Llen : constant Length_Range := Left.Length;
52 Rlen : constant Length_Range := Right.Length;
53 Nlen : constant Natural := Llen + Rlen;
56 if Nlen > Max_Length then
57 raise Ada.Strings.Length_Error;
59 Result.Length := Nlen;
60 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
61 Result.Data (Llen + 1 .. Nlen) := Right.Data (1 .. Rlen);
68 (Left : in Bounded_Wide_String;
69 Right : in Wide_String)
70 return Bounded_Wide_String
72 Result : Bounded_Wide_String;
73 Llen : constant Length_Range := Left.Length;
75 Nlen : constant Natural := Llen + Right'Length;
78 if Nlen > Max_Length then
79 raise Ada.Strings.Length_Error;
81 Result.Length := Nlen;
82 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
83 Result.Data (Llen + 1 .. Nlen) := Right;
89 (Left : in Wide_String;
90 Right : in Bounded_Wide_String)
91 return Bounded_Wide_String
93 Result : Bounded_Wide_String;
94 Llen : constant Length_Range := Left'Length;
95 Rlen : constant Length_Range := Right.Length;
96 Nlen : constant Natural := Llen + Rlen;
99 if Nlen > Max_Length then
100 raise Ada.Strings.Length_Error;
102 Result.Length := Nlen;
103 Result.Data (1 .. Llen) := Left;
104 Result.Data (Llen + 1 .. Nlen) := Right.Data (1 .. Rlen);
111 (Left : in Bounded_Wide_String;
112 Right : in Wide_Character)
113 return Bounded_Wide_String
115 Result : Bounded_Wide_String;
116 Llen : constant Length_Range := Left.Length;
119 if Llen = Max_Length then
120 raise Ada.Strings.Length_Error;
122 Result.Length := Llen + 1;
123 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
124 Result.Data (Result.Length) := Right;
131 (Left : in Wide_Character;
132 Right : in Bounded_Wide_String)
133 return Bounded_Wide_String
135 Result : Bounded_Wide_String;
136 Rlen : Length_Range := Right.Length;
139 if Rlen = Max_Length then
140 raise Ada.Strings.Length_Error;
142 Result.Length := Rlen + 1;
143 Result.Data (1) := Left;
144 Result.Data (2 .. Result.Length) := Right.Data (1 .. Rlen);
156 Right : in Wide_Character)
157 return Bounded_Wide_String
159 Result : Bounded_Wide_String;
162 if Left > Max_Length then
163 raise Ada.Strings.Length_Error;
165 Result.Length := Left;
167 for J in 1 .. Left loop
168 Result.Data (J) := Right;
177 Right : in Wide_String)
178 return Bounded_Wide_String
180 Result : Bounded_Wide_String;
182 Rlen : constant Natural := Right'Length;
183 Nlen : constant Natural := Left * Rlen;
186 if Nlen > Max_Length then
187 raise Ada.Strings.Index_Error;
189 Result.Length := Nlen;
192 for J in 1 .. Left loop
193 Result.Data (Pos .. Pos + Rlen - 1) := Right;
204 Right : in Bounded_Wide_String)
205 return Bounded_Wide_String
207 Result : Bounded_Wide_String;
209 Rlen : constant Length_Range := Right.Length;
210 Nlen : constant Natural := Left * Rlen;
213 if Nlen > Max_Length then
214 raise Ada.Strings.Length_Error;
217 Result.Length := Nlen;
220 for J in 1 .. Left loop
221 Result.Data (Pos .. Pos + Rlen - 1) :=
222 Right.Data (1 .. Rlen);
236 (Left : in Bounded_Wide_String;
237 Right : in Bounded_Wide_String)
241 return Left.Data (1 .. Left.Length) < Right.Data (1 .. Right.Length);
245 (Left : in Bounded_Wide_String;
246 Right : in Wide_String)
250 return Left.Data (1 .. Left.Length) < Right;
254 (Left : in Wide_String;
255 Right : in Bounded_Wide_String)
259 return Left < Right.Data (1 .. Right.Length);
267 (Left : in Bounded_Wide_String;
268 Right : in Bounded_Wide_String)
272 return Left.Data (1 .. Left.Length) <= Right.Data (1 .. Right.Length);
276 (Left : in Bounded_Wide_String;
277 Right : in Wide_String)
281 return Left.Data (1 .. Left.Length) <= Right;
285 (Left : in Wide_String;
286 Right : in Bounded_Wide_String)
290 return Left <= Right.Data (1 .. Right.Length);
298 (Left : in Bounded_Wide_String;
299 Right : in Bounded_Wide_String)
303 return Left.Length = Right.Length
304 and then Left.Data (1 .. Left.Length) =
305 Right.Data (1 .. Right.Length);
309 (Left : in Bounded_Wide_String;
310 Right : in Wide_String)
314 return Left.Length = Right'Length
315 and then Left.Data (1 .. Left.Length) = Right;
319 (Left : in Wide_String;
320 Right : in Bounded_Wide_String)
324 return Left'Length = Right.Length
325 and then Left = Right.Data (1 .. Right.Length);
333 (Left : in Bounded_Wide_String;
334 Right : in Bounded_Wide_String)
338 return Left.Data (1 .. Left.Length) > Right.Data (1 .. Right.Length);
342 (Left : in Bounded_Wide_String;
343 Right : in Wide_String)
347 return Left.Data (1 .. Left.Length) > Right;
351 (Left : in Wide_String;
352 Right : in Bounded_Wide_String)
356 return Left > Right.Data (1 .. Right.Length);
364 (Left : in Bounded_Wide_String;
365 Right : in Bounded_Wide_String)
369 return Left.Data (1 .. Left.Length) >= Right.Data (1 .. Right.Length);
373 (Left : in Bounded_Wide_String;
374 Right : in Wide_String)
378 return Left.Data (1 .. Left.Length) >= Right;
382 (Left : in Wide_String;
383 Right : in Bounded_Wide_String)
387 return Left >= Right.Data (1 .. Right.Length);
394 -- Case of Bounded_Wide_String and Bounded_Wide_String
397 (Left, Right : in Bounded_Wide_String;
398 Drop : in Strings.Truncation := Strings.Error)
399 return Bounded_Wide_String
401 Result : Bounded_Wide_String;
402 Llen : constant Length_Range := Left.Length;
403 Rlen : constant Length_Range := Right.Length;
404 Nlen : constant Natural := Llen + Rlen;
407 if Nlen <= Max_Length then
408 Result.Length := Nlen;
409 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
410 Result.Data (Llen + 1 .. Nlen) := Right.Data (1 .. Rlen);
413 Result.Length := Max_Length;
416 when Strings.Right =>
417 if Llen >= Max_Length then -- only case is Llen = Max_Length
418 Result.Data := Right.Data;
421 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
422 Result.Data (Llen + 1 .. Max_Length) :=
423 Right.Data (1 .. Max_Length - Llen);
427 if Rlen >= Max_Length then -- only case is Rlen = Max_Length
428 Result.Data := Right.Data;
431 Result.Data (1 .. Max_Length - Rlen) :=
432 Left.Data (Llen - (Max_Length - Rlen - 1) .. Llen);
433 Result.Data (Max_Length - Rlen + 1 .. Max_Length) :=
434 Right.Data (1 .. Rlen);
437 when Strings.Error =>
438 raise Ada.Strings.Length_Error;
446 (Source : in out Bounded_Wide_String;
447 New_Item : in Bounded_Wide_String;
448 Drop : in Truncation := Error)
450 Llen : constant Length_Range := Source.Length;
451 Rlen : constant Length_Range := New_Item.Length;
452 Nlen : constant Natural := Llen + Rlen;
455 if Nlen <= Max_Length then
456 Source.Length := Nlen;
457 Source.Data (Llen + 1 .. Nlen) := New_Item.Data (1 .. Rlen);
460 Source.Length := Max_Length;
463 when Strings.Right =>
464 if Llen < Max_Length then
465 Source.Data (Llen + 1 .. Max_Length) :=
466 New_Item.Data (1 .. Max_Length - Llen);
470 if Rlen >= Max_Length then -- only case is Rlen = Max_Length
471 Source.Data := New_Item.Data;
474 Source.Data (1 .. Max_Length - Rlen) :=
475 Source.Data (Llen - (Max_Length - Rlen - 1) .. Llen);
476 Source.Data (Max_Length - Rlen + 1 .. Max_Length) :=
477 New_Item.Data (1 .. Rlen);
480 when Strings.Error =>
481 raise Ada.Strings.Length_Error;
487 -- Case of Bounded_Wide_String and Wide_String
490 (Left : in Bounded_Wide_String;
491 Right : in Wide_String;
492 Drop : in Strings.Truncation := Strings.Error)
493 return Bounded_Wide_String
495 Result : Bounded_Wide_String;
496 Llen : constant Length_Range := Left.Length;
497 Rlen : constant Length_Range := Right'Length;
498 Nlen : constant Natural := Llen + Rlen;
501 if Nlen <= Max_Length then
502 Result.Length := Nlen;
503 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
504 Result.Data (Llen + 1 .. Nlen) := Right;
507 Result.Length := Max_Length;
510 when Strings.Right =>
511 if Llen >= Max_Length then -- only case is Llen = Max_Length
512 Result.Data := Left.Data;
515 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
516 Result.Data (Llen + 1 .. Max_Length) :=
517 Right (Right'First .. Right'First - 1 +
523 if Rlen >= Max_Length then
524 Result.Data (1 .. Max_Length) :=
525 Right (Right'Last - (Max_Length - 1) .. Right'Last);
528 Result.Data (1 .. Max_Length - Rlen) :=
529 Left.Data (Llen - (Max_Length - Rlen - 1) .. Llen);
530 Result.Data (Max_Length - Rlen + 1 .. Max_Length) :=
534 when Strings.Error =>
535 raise Ada.Strings.Length_Error;
543 (Source : in out Bounded_Wide_String;
544 New_Item : in Wide_String;
545 Drop : in Truncation := Error)
547 Llen : constant Length_Range := Source.Length;
548 Rlen : constant Length_Range := New_Item'Length;
549 Nlen : constant Natural := Llen + Rlen;
552 if Nlen <= Max_Length then
553 Source.Length := Nlen;
554 Source.Data (Llen + 1 .. Nlen) := New_Item;
557 Source.Length := Max_Length;
560 when Strings.Right =>
561 if Llen < Max_Length then
562 Source.Data (Llen + 1 .. Max_Length) :=
563 New_Item (New_Item'First ..
564 New_Item'First - 1 + Max_Length - Llen);
568 if Rlen >= Max_Length then
569 Source.Data (1 .. Max_Length) :=
570 New_Item (New_Item'Last - (Max_Length - 1) ..
574 Source.Data (1 .. Max_Length - Rlen) :=
575 Source.Data (Llen - (Max_Length - Rlen - 1) .. Llen);
576 Source.Data (Max_Length - Rlen + 1 .. Max_Length) :=
580 when Strings.Error =>
581 raise Ada.Strings.Length_Error;
587 -- Case of Wide_String and Bounded_Wide_String
590 (Left : in Wide_String;
591 Right : in Bounded_Wide_String;
592 Drop : in Strings.Truncation := Strings.Error)
593 return Bounded_Wide_String
595 Result : Bounded_Wide_String;
596 Llen : constant Length_Range := Left'Length;
597 Rlen : constant Length_Range := Right.Length;
598 Nlen : constant Natural := Llen + Rlen;
601 if Nlen <= Max_Length then
602 Result.Length := Nlen;
603 Result.Data (1 .. Llen) := Left;
604 Result.Data (Llen + 1 .. Llen + Rlen) := Right.Data (1 .. Rlen);
607 Result.Length := Max_Length;
610 when Strings.Right =>
611 if Llen >= Max_Length then
612 Result.Data (1 .. Max_Length) :=
613 Left (Left'First .. Left'First + (Max_Length - 1));
616 Result.Data (1 .. Llen) := Left;
617 Result.Data (Llen + 1 .. Max_Length) :=
618 Right.Data (1 .. Max_Length - Llen);
622 if Rlen >= Max_Length then
623 Result.Data (1 .. Max_Length) :=
624 Right.Data (Rlen - (Max_Length - 1) .. Rlen);
627 Result.Data (1 .. Max_Length - Rlen) :=
628 Left (Left'Last - (Max_Length - Rlen - 1) .. Left'Last);
629 Result.Data (Max_Length - Rlen + 1 .. Max_Length) :=
630 Right.Data (1 .. Rlen);
633 when Strings.Error =>
634 raise Ada.Strings.Length_Error;
641 -- Case of Bounded_Wide_String and Wide_Character
644 (Left : in Bounded_Wide_String;
645 Right : in Wide_Character;
646 Drop : in Strings.Truncation := Strings.Error)
647 return Bounded_Wide_String
649 Result : Bounded_Wide_String;
650 Llen : constant Length_Range := Left.Length;
653 if Llen < Max_Length then
654 Result.Length := Llen + 1;
655 Result.Data (1 .. Llen) := Left.Data (1 .. Llen);
656 Result.Data (Llen + 1) := Right;
661 when Strings.Right =>
665 Result.Length := Max_Length;
666 Result.Data (1 .. Max_Length - 1) :=
667 Left.Data (2 .. Max_Length);
668 Result.Data (Max_Length) := Right;
671 when Strings.Error =>
672 raise Ada.Strings.Length_Error;
678 (Source : in out Bounded_Wide_String;
679 New_Item : in Wide_Character;
680 Drop : in Truncation := Error)
682 Llen : constant Length_Range := Source.Length;
685 if Llen < Max_Length then
686 Source.Length := Llen + 1;
687 Source.Data (Llen + 1) := New_Item;
690 Source.Length := Max_Length;
693 when Strings.Right =>
697 Source.Data (1 .. Max_Length - 1) :=
698 Source.Data (2 .. Max_Length);
699 Source.Data (Max_Length) := New_Item;
701 when Strings.Error =>
702 raise Ada.Strings.Length_Error;
708 -- Case of Wide_Character and Bounded_Wide_String
711 (Left : in Wide_Character;
712 Right : in Bounded_Wide_String;
713 Drop : in Strings.Truncation := Strings.Error)
714 return Bounded_Wide_String
716 Result : Bounded_Wide_String;
717 Rlen : constant Length_Range := Right.Length;
720 if Rlen < Max_Length then
721 Result.Length := Rlen + 1;
722 Result.Data (1) := Left;
723 Result.Data (2 .. Rlen + 1) := Right.Data (1 .. Rlen);
728 when Strings.Right =>
729 Result.Length := Max_Length;
730 Result.Data (1) := Left;
731 Result.Data (2 .. Max_Length) :=
732 Right.Data (1 .. Max_Length - 1);
738 when Strings.Error =>
739 raise Ada.Strings.Length_Error;
749 (Source : in Bounded_Wide_String;
750 Pattern : in Wide_String;
751 Mapping : in Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
757 (Source.Data (1 .. Source.Length), Pattern, Mapping);
761 (Source : in Bounded_Wide_String;
762 Pattern : in Wide_String;
763 Mapping : in Wide_Maps.Wide_Character_Mapping_Function)
769 (Source.Data (1 .. Source.Length), Pattern, Mapping);
773 (Source : in Bounded_Wide_String;
774 Set : in Wide_Maps.Wide_Character_Set)
778 return Wide_Search.Count (Source.Data (1 .. Source.Length), Set);
786 (Source : in Bounded_Wide_String;
788 Through : in Natural)
789 return Bounded_Wide_String
791 Slen : constant Natural := Source.Length;
792 Num_Delete : constant Integer := Through - From + 1;
793 Result : Bounded_Wide_String;
796 if Num_Delete <= 0 then
799 elsif From > Slen + 1 then
800 raise Ada.Strings.Index_Error;
802 elsif Through >= Slen then
803 Result.Length := From - 1;
804 Result.Data (1 .. From - 1) := Source.Data (1 .. From - 1);
808 Result.Length := Slen - Num_Delete;
809 Result.Data (1 .. From - 1) := Source.Data (1 .. From - 1);
810 Result.Data (From .. Result.Length) :=
811 Source.Data (Through + 1 .. Slen);
817 (Source : in out Bounded_Wide_String;
819 Through : in Natural)
821 Slen : constant Natural := Source.Length;
822 Num_Delete : constant Integer := Through - From + 1;
825 if Num_Delete <= 0 then
828 elsif From > Slen + 1 then
829 raise Ada.Strings.Index_Error;
831 elsif Through >= Slen then
832 Source.Length := From - 1;
835 Source.Length := Slen - Num_Delete;
836 Source.Data (From .. Source.Length) :=
837 Source.Data (Through + 1 .. Slen);
846 (Source : in Bounded_Wide_String;
848 return Wide_Character
851 if Index in 1 .. Source.Length then
852 return Source.Data (Index);
854 raise Strings.Index_Error;
863 (Source : in Bounded_Wide_String;
864 Set : in Wide_Maps.Wide_Character_Set;
865 Test : in Strings.Membership;
866 First : out Positive;
870 Wide_Search.Find_Token
871 (Source.Data (1 .. Source.Length), Set, Test, First, Last);
880 (Source : in Bounded_Wide_String;
882 Pad : in Wide_Character := Wide_Space;
883 Drop : in Strings.Truncation := Strings.Error)
884 return Bounded_Wide_String
886 Result : Bounded_Wide_String;
887 Slen : constant Natural := Source.Length;
888 Npad : constant Integer := Count - Slen;
892 Result.Length := Count;
893 Result.Data (1 .. Count) := Source.Data (1 .. Count);
895 elsif Count <= Max_Length then
896 Result.Length := Count;
897 Result.Data (1 .. Slen) := Source.Data (1 .. Slen);
898 Result.Data (Slen + 1 .. Count) := (others => Pad);
901 Result.Length := Max_Length;
904 when Strings.Right =>
905 Result.Data (1 .. Slen) := Source.Data (1 .. Slen);
906 Result.Data (Slen + 1 .. Max_Length) := (others => Pad);
909 if Npad >= Max_Length then
910 Result.Data := (others => Pad);
913 Result.Data (1 .. Max_Length - Npad) :=
914 Source.Data (Count - Max_Length + 1 .. Slen);
915 Result.Data (Max_Length - Npad + 1 .. Max_Length) :=
919 when Strings.Error =>
920 raise Ada.Strings.Length_Error;
928 (Source : in out Bounded_Wide_String;
930 Pad : in Wide_Character := Wide_Space;
931 Drop : in Truncation := Error)
933 Slen : constant Natural := Source.Length;
934 Npad : constant Integer := Count - Slen;
935 Temp : Wide_String (1 .. Max_Length);
939 Source.Length := Count;
941 elsif Count <= Max_Length then
942 Source.Length := Count;
943 Source.Data (Slen + 1 .. Count) := (others => Pad);
946 Source.Length := Max_Length;
949 when Strings.Right =>
950 Source.Data (Slen + 1 .. Max_Length) := (others => Pad);
953 if Npad > Max_Length then
954 Source.Data := (others => Pad);
958 Source.Data (1 .. Max_Length - Npad) :=
959 Temp (Count - Max_Length + 1 .. Slen);
961 for J in Max_Length - Npad + 1 .. Max_Length loop
962 Source.Data (J) := Pad;
966 when Strings.Error =>
967 raise Ada.Strings.Length_Error;
978 (Source : in Bounded_Wide_String;
979 Pattern : in Wide_String;
980 Going : in Strings.Direction := Strings.Forward;
981 Mapping : in Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
985 return Wide_Search.Index
986 (Source.Data (1 .. Source.Length), Pattern, Going, Mapping);
990 (Source : in Bounded_Wide_String;
991 Pattern : in Wide_String;
992 Going : in Direction := Forward;
993 Mapping : in Wide_Maps.Wide_Character_Mapping_Function)
997 return Wide_Search.Index
998 (Source.Data (1 .. Source.Length), Pattern, Going, Mapping);
1002 (Source : in Bounded_Wide_String;
1003 Set : in Wide_Maps.Wide_Character_Set;
1004 Test : in Strings.Membership := Strings.Inside;
1005 Going : in Strings.Direction := Strings.Forward)
1009 return Wide_Search.Index
1010 (Source.Data (1 .. Source.Length), Set, Test, Going);
1013 ---------------------
1014 -- Index_Non_Blank --
1015 ---------------------
1017 function Index_Non_Blank
1018 (Source : in Bounded_Wide_String;
1019 Going : in Strings.Direction := Strings.Forward)
1024 Wide_Search.Index_Non_Blank
1025 (Source.Data (1 .. Source.Length), Going);
1026 end Index_Non_Blank;
1033 (Source : in Bounded_Wide_String;
1034 Before : in Positive;
1035 New_Item : in Wide_String;
1036 Drop : in Strings.Truncation := Strings.Error)
1037 return Bounded_Wide_String
1039 Slen : constant Natural := Source.Length;
1040 Nlen : constant Natural := New_Item'Length;
1041 Tlen : constant Natural := Slen + Nlen;
1042 Blen : constant Natural := Before - 1;
1043 Alen : constant Integer := Slen - Blen;
1044 Droplen : constant Integer := Tlen - Max_Length;
1045 Result : Bounded_Wide_String;
1047 -- Tlen is the length of the total string before possible truncation.
1048 -- Blen, Alen are the lengths of the before and after pieces of the
1053 raise Ada.Strings.Index_Error;
1055 elsif Droplen <= 0 then
1056 Result.Length := Tlen;
1057 Result.Data (1 .. Blen) := Source.Data (1 .. Blen);
1058 Result.Data (Before .. Before + Nlen - 1) := New_Item;
1059 Result.Data (Before + Nlen .. Tlen) :=
1060 Source.Data (Before .. Slen);
1063 Result.Length := Max_Length;
1066 when Strings.Right =>
1067 Result.Data (1 .. Blen) := Source.Data (1 .. Blen);
1069 if Droplen > Alen then
1070 Result.Data (Before .. Max_Length) :=
1071 New_Item (New_Item'First
1072 .. New_Item'First + Max_Length - Before);
1074 Result.Data (Before .. Before + Nlen - 1) := New_Item;
1075 Result.Data (Before + Nlen .. Max_Length) :=
1076 Source.Data (Before .. Slen - Droplen);
1079 when Strings.Left =>
1080 Result.Data (Max_Length - (Alen - 1) .. Max_Length) :=
1081 Source.Data (Before .. Slen);
1083 if Droplen >= Blen then
1084 Result.Data (1 .. Max_Length - Alen) :=
1085 New_Item (New_Item'Last - (Max_Length - Alen) + 1
1089 (Blen - Droplen + 1 .. Max_Length - Alen) :=
1091 Result.Data (1 .. Blen - Droplen) :=
1092 Source.Data (Droplen + 1 .. Blen);
1095 when Strings.Error =>
1096 raise Ada.Strings.Length_Error;
1104 (Source : in out Bounded_Wide_String;
1105 Before : in Positive;
1106 New_Item : in Wide_String;
1107 Drop : in Strings.Truncation := Strings.Error)
1110 -- We do a double copy here because this is one of the situations
1111 -- in which we move data to the right, and at least at the moment,
1112 -- GNAT is not handling such cases correctly ???
1114 Source := Insert (Source, Before, New_Item, Drop);
1121 function Length (Source : in Bounded_Wide_String) return Length_Range is
1123 return Source.Length;
1131 (Source : in Bounded_Wide_String;
1132 Position : in Positive;
1133 New_Item : in Wide_String;
1134 Drop : in Strings.Truncation := Strings.Error)
1135 return Bounded_Wide_String
1137 Result : Bounded_Wide_String;
1138 Endpos : constant Natural := Position + New_Item'Length - 1;
1139 Slen : constant Natural := Source.Length;
1143 if Position > Slen + 1 then
1144 raise Ada.Strings.Index_Error;
1146 elsif New_Item'Length = 0 then
1149 elsif Endpos <= Slen then
1150 Result.Length := Source.Length;
1151 Result.Data (1 .. Slen) := Source.Data (1 .. Slen);
1152 Result.Data (Position .. Endpos) := New_Item;
1155 elsif Endpos <= Max_Length then
1156 Result.Length := Endpos;
1157 Result.Data (1 .. Position - 1) := Source.Data (1 .. Position - 1);
1158 Result.Data (Position .. Endpos) := New_Item;
1162 Result.Length := Max_Length;
1163 Droplen := Endpos - Max_Length;
1166 when Strings.Right =>
1167 Result.Data (1 .. Position - 1) :=
1168 Source.Data (1 .. Position - 1);
1170 Result.Data (Position .. Max_Length) :=
1171 New_Item (New_Item'First .. New_Item'Last - Droplen);
1174 when Strings.Left =>
1175 if New_Item'Length >= Max_Length then
1176 Result.Data (1 .. Max_Length) :=
1177 New_Item (New_Item'Last - Max_Length + 1 ..
1182 Result.Data (1 .. Max_Length - New_Item'Length) :=
1183 Source.Data (Droplen + 1 .. Position - 1);
1185 (Max_Length - New_Item'Length + 1 .. Max_Length) :=
1190 when Strings.Error =>
1191 raise Ada.Strings.Length_Error;
1197 (Source : in out Bounded_Wide_String;
1198 Position : in Positive;
1199 New_Item : in Wide_String;
1200 Drop : in Strings.Truncation := Strings.Error)
1202 Endpos : constant Positive := Position + New_Item'Length - 1;
1203 Slen : constant Natural := Source.Length;
1207 if Position > Slen + 1 then
1208 raise Ada.Strings.Index_Error;
1210 elsif Endpos <= Slen then
1211 Source.Data (Position .. Endpos) := New_Item;
1213 elsif Endpos <= Max_Length then
1214 Source.Data (Position .. Endpos) := New_Item;
1215 Source.Length := Endpos;
1218 Source.Length := Max_Length;
1219 Droplen := Endpos - Max_Length;
1222 when Strings.Right =>
1223 Source.Data (Position .. Max_Length) :=
1224 New_Item (New_Item'First .. New_Item'Last - Droplen);
1226 when Strings.Left =>
1227 if New_Item'Length > Max_Length then
1228 Source.Data (1 .. Max_Length) :=
1229 New_Item (New_Item'Last - Max_Length + 1 ..
1233 Source.Data (1 .. Max_Length - New_Item'Length) :=
1234 Source.Data (Droplen + 1 .. Position - 1);
1237 (Max_Length - New_Item'Length + 1 .. Max_Length) :=
1241 when Strings.Error =>
1242 raise Ada.Strings.Length_Error;
1247 ---------------------
1248 -- Replace_Element --
1249 ---------------------
1251 procedure Replace_Element
1252 (Source : in out Bounded_Wide_String;
1253 Index : in Positive;
1254 By : in Wide_Character)
1257 if Index <= Source.Length then
1258 Source.Data (Index) := By;
1260 raise Ada.Strings.Index_Error;
1262 end Replace_Element;
1268 function Replace_Slice
1269 (Source : in Bounded_Wide_String;
1272 By : in Wide_String;
1273 Drop : in Strings.Truncation := Strings.Error)
1274 return Bounded_Wide_String
1276 Slen : constant Natural := Source.Length;
1279 if Low > Slen + 1 then
1280 raise Strings.Index_Error;
1282 elsif High < Low then
1283 return Insert (Source, Low, By, Drop);
1287 Blen : constant Natural := Natural'Max (0, Low - 1);
1288 Alen : constant Natural := Natural'Max (0, Slen - High);
1289 Tlen : constant Natural := Blen + By'Length + Alen;
1290 Droplen : constant Integer := Tlen - Max_Length;
1291 Result : Bounded_Wide_String;
1293 -- Tlen is the total length of the result string before any
1294 -- truncation. Blen and Alen are the lengths of the pieces
1295 -- of the original string that end up in the result string
1296 -- before and after the replaced slice.
1299 if Droplen <= 0 then
1300 Result.Length := Tlen;
1301 Result.Data (1 .. Blen) := Source.Data (1 .. Blen);
1302 Result.Data (Low .. Low + By'Length - 1) := By;
1303 Result.Data (Low + By'Length .. Tlen) :=
1304 Source.Data (High + 1 .. Slen);
1307 Result.Length := Max_Length;
1310 when Strings.Right =>
1311 Result.Data (1 .. Blen) := Source.Data (1 .. Blen);
1313 if Droplen > Alen then
1314 Result.Data (Low .. Max_Length) :=
1315 By (By'First .. By'First + Max_Length - Low);
1317 Result.Data (Low .. Low + By'Length - 1) := By;
1318 Result.Data (Low + By'Length .. Max_Length) :=
1319 Source.Data (High + 1 .. Slen - Droplen);
1322 when Strings.Left =>
1323 Result.Data (Max_Length - (Alen - 1) .. Max_Length) :=
1324 Source.Data (High + 1 .. Slen);
1326 if Droplen >= Blen then
1327 Result.Data (1 .. Max_Length - Alen) :=
1328 By (By'Last - (Max_Length - Alen) + 1 .. By'Last);
1331 (Blen - Droplen + 1 .. Max_Length - Alen) := By;
1332 Result.Data (1 .. Blen - Droplen) :=
1333 Source.Data (Droplen + 1 .. Blen);
1336 when Strings.Error =>
1337 raise Ada.Strings.Length_Error;
1346 procedure Replace_Slice
1347 (Source : in out Bounded_Wide_String;
1350 By : in Wide_String;
1351 Drop : in Strings.Truncation := Strings.Error)
1354 -- We do a double copy here because this is one of the situations
1355 -- in which we move data to the right, and at least at the moment,
1356 -- GNAT is not handling such cases correctly ???
1358 Source := Replace_Slice (Source, Low, High, By, Drop);
1366 (Count : in Natural;
1367 Item : in Wide_Character;
1368 Drop : in Strings.Truncation := Strings.Error)
1369 return Bounded_Wide_String
1371 Result : Bounded_Wide_String;
1374 if Count <= Max_Length then
1375 Result.Length := Count;
1377 elsif Drop = Strings.Error then
1378 raise Ada.Strings.Length_Error;
1381 Result.Length := Max_Length;
1384 Result.Data (1 .. Result.Length) := (others => Item);
1389 (Count : in Natural;
1390 Item : in Wide_String;
1391 Drop : in Strings.Truncation := Strings.Error)
1392 return Bounded_Wide_String
1394 Length : constant Integer := Count * Item'Length;
1395 Result : Bounded_Wide_String;
1399 if Length <= Max_Length then
1400 Result.Length := Length;
1405 for J in 1 .. Count loop
1406 Result.Data (Indx .. Indx + Item'Length - 1) := Item;
1407 Indx := Indx + Item'Length;
1412 Result.Length := Max_Length;
1415 when Strings.Right =>
1418 while Indx + Item'Length <= Max_Length + 1 loop
1419 Result.Data (Indx .. Indx + Item'Length - 1) := Item;
1420 Indx := Indx + Item'Length;
1423 Result.Data (Indx .. Max_Length) :=
1424 Item (Item'First .. Item'First + Max_Length - Indx);
1426 when Strings.Left =>
1429 while Indx - Item'Length >= 1 loop
1430 Result.Data (Indx - (Item'Length - 1) .. Indx) := Item;
1431 Indx := Indx - Item'Length;
1434 Result.Data (1 .. Indx) :=
1435 Item (Item'Last - Indx + 1 .. Item'Last);
1437 when Strings.Error =>
1438 raise Ada.Strings.Length_Error;
1446 (Count : in Natural;
1447 Item : in Bounded_Wide_String;
1448 Drop : in Strings.Truncation := Strings.Error)
1449 return Bounded_Wide_String
1452 return Replicate (Count, Item.Data (1 .. Item.Length), Drop);
1460 (Source : Bounded_Wide_String;
1466 -- Note: test of High > Length is in accordance with AI95-00128
1468 if Low > Source.Length + 1 or else High > Source.Length then
1473 Result : Wide_String (1 .. High - Low + 1);
1476 Result := Source.Data (Low .. High);
1487 (Source : in Bounded_Wide_String;
1489 Pad : in Wide_Character := Wide_Space;
1490 Drop : in Strings.Truncation := Strings.Error)
1491 return Bounded_Wide_String
1493 Result : Bounded_Wide_String;
1494 Slen : constant Natural := Source.Length;
1495 Npad : constant Integer := Count - Slen;
1499 Result.Length := Count;
1500 Result.Data (1 .. Count) :=
1501 Source.Data (Slen - (Count - 1) .. Slen);
1503 elsif Count <= Max_Length then
1504 Result.Length := Count;
1505 Result.Data (1 .. Npad) := (others => Pad);
1506 Result.Data (Npad + 1 .. Count) := Source.Data (1 .. Slen);
1509 Result.Length := Max_Length;
1512 when Strings.Right =>
1513 if Npad >= Max_Length then
1514 Result.Data := (others => Pad);
1517 Result.Data (1 .. Npad) := (others => Pad);
1518 Result.Data (Npad + 1 .. Max_Length) :=
1519 Source.Data (1 .. Max_Length - Npad);
1522 when Strings.Left =>
1523 Result.Data (1 .. Max_Length - Slen) := (others => Pad);
1524 Result.Data (Max_Length - Slen + 1 .. Max_Length) :=
1525 Source.Data (1 .. Slen);
1527 when Strings.Error =>
1528 raise Ada.Strings.Length_Error;
1536 (Source : in out Bounded_Wide_String;
1538 Pad : in Wide_Character := Wide_Space;
1539 Drop : in Truncation := Error)
1541 Slen : constant Natural := Source.Length;
1542 Npad : constant Integer := Count - Slen;
1543 Temp : Wide_String (1 .. Max_Length) := Source.Data;
1547 Source.Length := Count;
1548 Source.Data (1 .. Count) :=
1549 Temp (Slen - (Count - 1) .. Slen);
1551 elsif Count <= Max_Length then
1552 Source.Length := Count;
1553 Source.Data (1 .. Npad) := (others => Pad);
1554 Source.Data (Npad + 1 .. Count) := Temp (1 .. Slen);
1557 Source.Length := Max_Length;
1560 when Strings.Right =>
1561 if Npad >= Max_Length then
1562 Source.Data := (others => Pad);
1565 Source.Data (1 .. Npad) := (others => Pad);
1566 Source.Data (Npad + 1 .. Max_Length) :=
1567 Temp (1 .. Max_Length - Npad);
1570 when Strings.Left =>
1571 for J in 1 .. Max_Length - Slen loop
1572 Source.Data (J) := Pad;
1575 Source.Data (Max_Length - Slen + 1 .. Max_Length) :=
1578 when Strings.Error =>
1579 raise Ada.Strings.Length_Error;
1585 ----------------------------
1586 -- To_Bounded_Wide_String --
1587 ----------------------------
1589 function To_Bounded_Wide_String
1590 (Source : in Wide_String;
1591 Drop : in Strings.Truncation := Strings.Error)
1592 return Bounded_Wide_String
1594 Slen : constant Natural := Source'Length;
1595 Result : Bounded_Wide_String;
1598 if Slen <= Max_Length then
1599 Result.Length := Slen;
1600 Result.Data (1 .. Slen) := Source;
1604 when Strings.Right =>
1605 Result.Length := Max_Length;
1606 Result.Data (1 .. Max_Length) :=
1607 Source (Source'First .. Source'First - 1 + Max_Length);
1609 when Strings.Left =>
1610 Result.Length := Max_Length;
1611 Result.Data (1 .. Max_Length) :=
1612 Source (Source'Last - (Max_Length - 1) .. Source'Last);
1614 when Strings.Error =>
1615 raise Ada.Strings.Length_Error;
1620 end To_Bounded_Wide_String;
1622 --------------------
1623 -- To_Wide_String --
1624 --------------------
1626 function To_Wide_String
1627 (Source : in Bounded_Wide_String)
1631 return Source.Data (1 .. Source.Length);
1639 (Source : in Bounded_Wide_String;
1640 Mapping : in Wide_Maps.Wide_Character_Mapping)
1641 return Bounded_Wide_String
1643 Result : Bounded_Wide_String;
1646 Result.Length := Source.Length;
1648 for J in 1 .. Source.Length loop
1649 Result.Data (J) := Value (Mapping, Source.Data (J));
1656 (Source : in out Bounded_Wide_String;
1657 Mapping : in Wide_Maps.Wide_Character_Mapping)
1660 for J in 1 .. Source.Length loop
1661 Source.Data (J) := Value (Mapping, Source.Data (J));
1666 (Source : in Bounded_Wide_String;
1667 Mapping : in Wide_Maps.Wide_Character_Mapping_Function)
1668 return Bounded_Wide_String
1670 Result : Bounded_Wide_String;
1673 Result.Length := Source.Length;
1675 for J in 1 .. Source.Length loop
1676 Result.Data (J) := Mapping.all (Source.Data (J));
1683 (Source : in out Bounded_Wide_String;
1684 Mapping : in Wide_Maps.Wide_Character_Mapping_Function)
1687 for J in 1 .. Source.Length loop
1688 Source.Data (J) := Mapping.all (Source.Data (J));
1697 (Source : in Bounded_Wide_String;
1699 return Bounded_Wide_String
1701 Result : Bounded_Wide_String;
1702 Last : Natural := Source.Length;
1703 First : Positive := 1;
1706 if Side = Left or else Side = Both then
1707 while First <= Last and then Source.Data (First) = ' ' loop
1712 if Side = Right or else Side = Both then
1713 while Last >= First and then Source.Data (Last) = ' ' loop
1718 Result.Length := Last - First + 1;
1719 Result.Data (1 .. Result.Length) := Source.Data (First .. Last);
1725 (Source : in out Bounded_Wide_String;
1728 Last : Length_Range := Source.Length;
1729 First : Positive := 1;
1730 Temp : Wide_String (1 .. Max_Length);
1733 Temp (1 .. Last) := Source.Data (1 .. Last);
1735 if Side = Left or else Side = Both then
1736 while First <= Last and then Temp (First) = ' ' loop
1741 if Side = Right or else Side = Both then
1742 while Last >= First and then Temp (Last) = ' ' loop
1747 Source.Length := Last - First + 1;
1748 Source.Data (1 .. Source.Length) := Temp (First .. Last);
1753 (Source : in Bounded_Wide_String;
1754 Left : in Wide_Maps.Wide_Character_Set;
1755 Right : in Wide_Maps.Wide_Character_Set)
1756 return Bounded_Wide_String
1758 Result : Bounded_Wide_String;
1761 for First in 1 .. Source.Length loop
1762 if not Is_In (Source.Data (First), Left) then
1763 for Last in reverse First .. Source.Length loop
1764 if not Is_In (Source.Data (Last), Right) then
1765 Result.Length := Last - First + 1;
1766 Result.Data (1 .. Result.Length) :=
1767 Source.Data (First .. Last);
1779 (Source : in out Bounded_Wide_String;
1780 Left : in Wide_Maps.Wide_Character_Set;
1781 Right : in Wide_Maps.Wide_Character_Set)
1784 for First in 1 .. Source.Length loop
1785 if not Is_In (Source.Data (First), Left) then
1786 for Last in reverse First .. Source.Length loop
1787 if not Is_In (Source.Data (Last), Right) then
1789 Source.Length := Last;
1792 Source.Length := Last - First + 1;
1793 Source.Data (1 .. Source.Length) :=
1794 Source.Data (First .. Last);
1808 end Generic_Bounded_Length;
1810 end Ada.Strings.Wide_Bounded;