1 ------------------------------------------------------------------------------
3 -- GNAT RUN-TIME COMPONENTS --
5 -- A D A . S T R I N G S . W I D E _ W I D E _ U N B O U N D E D --
9 -- Copyright (C) 1992-2005, 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, 51 Franklin Street, Fifth Floor, --
20 -- Boston, MA 02110-1301, 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_Wide_Fixed
;
35 with Ada
.Strings
.Wide_Wide_Search
;
36 with Ada
.Unchecked_Deallocation
;
38 package body Ada
.Strings
.Wide_Wide_Unbounded
is
47 (Left
: Unbounded_Wide_Wide_String
;
48 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
50 L_Length
: constant Natural := Left
.Last
;
51 R_Length
: constant Natural := Right
.Last
;
52 Result
: Unbounded_Wide_Wide_String
;
55 Result
.Last
:= L_Length
+ R_Length
;
57 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
59 Result
.Reference
(1 .. L_Length
) :=
60 Left
.Reference
(1 .. Left
.Last
);
61 Result
.Reference
(L_Length
+ 1 .. Result
.Last
) :=
62 Right
.Reference
(1 .. Right
.Last
);
68 (Left
: Unbounded_Wide_Wide_String
;
69 Right
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
71 L_Length
: constant Natural := Left
.Last
;
72 Result
: Unbounded_Wide_Wide_String
;
75 Result
.Last
:= L_Length
+ Right
'Length;
77 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
79 Result
.Reference
(1 .. L_Length
) := Left
.Reference
(1 .. Left
.Last
);
80 Result
.Reference
(L_Length
+ 1 .. Result
.Last
) := Right
;
86 (Left
: Wide_Wide_String
;
87 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
89 R_Length
: constant Natural := Right
.Last
;
90 Result
: Unbounded_Wide_Wide_String
;
93 Result
.Last
:= Left
'Length + R_Length
;
95 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
97 Result
.Reference
(1 .. Left
'Length) := Left
;
98 Result
.Reference
(Left
'Length + 1 .. Result
.Last
) :=
99 Right
.Reference
(1 .. Right
.Last
);
105 (Left
: Unbounded_Wide_Wide_String
;
106 Right
: Wide_Wide_Character
) return Unbounded_Wide_Wide_String
108 Result
: Unbounded_Wide_Wide_String
;
111 Result
.Last
:= Left
.Last
+ 1;
113 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
115 Result
.Reference
(1 .. Result
.Last
- 1) :=
116 Left
.Reference
(1 .. Left
.Last
);
117 Result
.Reference
(Result
.Last
) := Right
;
123 (Left
: Wide_Wide_Character
;
124 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
126 Result
: Unbounded_Wide_Wide_String
;
129 Result
.Last
:= Right
.Last
+ 1;
131 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
132 Result
.Reference
(1) := Left
;
133 Result
.Reference
(2 .. Result
.Last
) :=
134 Right
.Reference
(1 .. Right
.Last
);
144 Right
: Wide_Wide_Character
) return Unbounded_Wide_Wide_String
146 Result
: Unbounded_Wide_Wide_String
;
151 Result
.Reference
:= new Wide_Wide_String
(1 .. Left
);
152 for J
in Result
.Reference
'Range loop
153 Result
.Reference
(J
) := Right
;
161 Right
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
163 Len
: constant Natural := Right
'Length;
165 Result
: Unbounded_Wide_Wide_String
;
168 Result
.Last
:= Left
* Len
;
170 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
173 for J
in 1 .. Left
loop
174 Result
.Reference
(K
.. K
+ Len
- 1) := Right
;
183 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
185 Len
: constant Natural := Right
.Last
;
187 Result
: Unbounded_Wide_Wide_String
;
190 Result
.Last
:= Left
* Len
;
192 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
195 for J
in 1 .. Left
loop
196 Result
.Reference
(K
.. K
+ Len
- 1) :=
197 Right
.Reference
(1 .. Right
.Last
);
209 (Left
: Unbounded_Wide_Wide_String
;
210 Right
: Unbounded_Wide_Wide_String
) return Boolean
214 Left
.Reference
(1 .. Left
.Last
) < Right
.Reference
(1 .. Right
.Last
);
218 (Left
: Unbounded_Wide_Wide_String
;
219 Right
: Wide_Wide_String
) return Boolean
222 return Left
.Reference
(1 .. Left
.Last
) < Right
;
226 (Left
: Wide_Wide_String
;
227 Right
: Unbounded_Wide_Wide_String
) return Boolean
230 return Left
< Right
.Reference
(1 .. Right
.Last
);
238 (Left
: Unbounded_Wide_Wide_String
;
239 Right
: Unbounded_Wide_Wide_String
) return Boolean
243 Left
.Reference
(1 .. Left
.Last
) <= Right
.Reference
(1 .. Right
.Last
);
247 (Left
: Unbounded_Wide_Wide_String
;
248 Right
: Wide_Wide_String
) return Boolean
251 return Left
.Reference
(1 .. Left
.Last
) <= Right
;
255 (Left
: Wide_Wide_String
;
256 Right
: Unbounded_Wide_Wide_String
) return Boolean
259 return Left
<= Right
.Reference
(1 .. Right
.Last
);
267 (Left
: Unbounded_Wide_Wide_String
;
268 Right
: Unbounded_Wide_Wide_String
) return Boolean
272 Left
.Reference
(1 .. Left
.Last
) = Right
.Reference
(1 .. Right
.Last
);
276 (Left
: Unbounded_Wide_Wide_String
;
277 Right
: Wide_Wide_String
) return Boolean
280 return Left
.Reference
(1 .. Left
.Last
) = Right
;
284 (Left
: Wide_Wide_String
;
285 Right
: Unbounded_Wide_Wide_String
) return Boolean
288 return Left
= Right
.Reference
(1 .. Right
.Last
);
296 (Left
: Unbounded_Wide_Wide_String
;
297 Right
: Unbounded_Wide_Wide_String
) return Boolean
301 Left
.Reference
(1 .. Left
.Last
) > Right
.Reference
(1 .. Right
.Last
);
305 (Left
: Unbounded_Wide_Wide_String
;
306 Right
: Wide_Wide_String
) return Boolean
309 return Left
.Reference
(1 .. Left
.Last
) > Right
;
313 (Left
: Wide_Wide_String
;
314 Right
: Unbounded_Wide_Wide_String
) return Boolean
317 return Left
> Right
.Reference
(1 .. Right
.Last
);
325 (Left
: Unbounded_Wide_Wide_String
;
326 Right
: Unbounded_Wide_Wide_String
) return Boolean
330 Left
.Reference
(1 .. Left
.Last
) >= Right
.Reference
(1 .. Right
.Last
);
334 (Left
: Unbounded_Wide_Wide_String
;
335 Right
: Wide_Wide_String
) return Boolean
338 return Left
.Reference
(1 .. Left
.Last
) >= Right
;
342 (Left
: Wide_Wide_String
;
343 Right
: Unbounded_Wide_Wide_String
) return Boolean
346 return Left
>= Right
.Reference
(1 .. Right
.Last
);
353 procedure Adjust
(Object
: in out Unbounded_Wide_Wide_String
) is
355 -- Copy string, except we do not copy the statically allocated null
356 -- string, since it can never be deallocated. Note that we do not copy
357 -- extra string room here to avoid dragging unused allocated memory.
359 if Object
.Reference
/= Null_Wide_Wide_String
'Access then
361 new Wide_Wide_String
'(Object.Reference (1 .. Object.Last));
370 (Source : in out Unbounded_Wide_Wide_String;
371 New_Item : Unbounded_Wide_Wide_String)
374 Realloc_For_Chunk (Source, New_Item.Last);
375 Source.Reference (Source.Last + 1 .. Source.Last + New_Item.Last) :=
376 New_Item.Reference (1 .. New_Item.Last);
377 Source.Last := Source.Last + New_Item.Last;
381 (Source : in out Unbounded_Wide_Wide_String;
382 New_Item : Wide_Wide_String)
385 Realloc_For_Chunk (Source, New_Item'Length);
386 Source.Reference (Source.Last + 1 .. Source.Last + New_Item'Length) :=
388 Source.Last := Source.Last + New_Item'Length;
392 (Source : in out Unbounded_Wide_Wide_String;
393 New_Item : Wide_Wide_Character)
396 Realloc_For_Chunk (Source, 1);
397 Source.Reference (Source.Last + 1) := New_Item;
398 Source.Last := Source.Last + 1;
406 (Source : Unbounded_Wide_Wide_String;
407 Pattern : Wide_Wide_String;
408 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
409 Wide_Wide_Maps.Identity)
414 Wide_Wide_Search.Count
415 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
419 (Source : Unbounded_Wide_Wide_String;
420 Pattern : Wide_Wide_String;
421 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
426 Wide_Wide_Search.Count
427 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
431 (Source : Unbounded_Wide_Wide_String;
432 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural
436 Wide_Wide_Search.Count
437 (Source.Reference (1 .. Source.Last), Set);
445 (Source : Unbounded_Wide_Wide_String;
447 Through : Natural) return Unbounded_Wide_Wide_String
451 To_Unbounded_Wide_Wide_String
452 (Wide_Wide_Fixed.Delete
453 (Source.Reference (1 .. Source.Last), From, Through));
457 (Source : in out Unbounded_Wide_Wide_String;
462 if From > Through then
465 elsif From < Source.Reference'First or else Through > Source.Last then
470 Len : constant Natural := Through - From + 1;
473 Source.Reference (From .. Source.Last - Len) :=
474 Source.Reference (Through + 1 .. Source.Last);
475 Source.Last := Source.Last - Len;
485 (Source : Unbounded_Wide_Wide_String;
486 Index : Positive) return Wide_Wide_Character
489 if Index <= Source.Last then
490 return Source.Reference (Index);
492 raise Strings.Index_Error;
500 procedure Finalize (Object : in out Unbounded_Wide_Wide_String) is
501 procedure Deallocate is
502 new Ada.Unchecked_Deallocation
503 (Wide_Wide_String, Wide_Wide_String_Access);
506 -- Note: Don't try to free statically allocated null string
508 if Object.Reference /= Null_Wide_Wide_String'Access then
509 Deallocate (Object.Reference);
510 Object.Reference := Null_Unbounded_Wide_Wide_String.Reference;
520 (Source : Unbounded_Wide_Wide_String;
521 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
522 Test : Strings.Membership;
523 First : out Positive;
527 Wide_Wide_Search.Find_Token
528 (Source.Reference (1 .. Source.Last), Set, Test, First, Last);
535 procedure Free (X : in out Wide_Wide_String_Access) is
536 procedure Deallocate is
537 new Ada.Unchecked_Deallocation
538 (Wide_Wide_String, Wide_Wide_String_Access);
541 -- Note: Do not try to free statically allocated null string
543 if X /= Null_Unbounded_Wide_Wide_String.Reference then
553 (Source : Unbounded_Wide_Wide_String;
555 Pad : Wide_Wide_Character := Wide_Wide_Space)
556 return Unbounded_Wide_Wide_String
559 return To_Unbounded_Wide_Wide_String
560 (Wide_Wide_Fixed.Head
561 (Source.Reference (1 .. Source.Last), Count, Pad));
565 (Source : in out Unbounded_Wide_Wide_String;
567 Pad : Wide_Wide_Character := Wide_Wide_Space)
569 Old : Wide_Wide_String_Access := Source.Reference;
572 new Wide_Wide_String'
573 (Wide_Wide_Fixed
.Head
574 (Source
.Reference
(1 .. Source
.Last
), Count
, Pad
));
575 Source
.Last
:= Source
.Reference
'Length;
584 (Source
: Unbounded_Wide_Wide_String
;
585 Pattern
: Wide_Wide_String
;
586 Going
: Strings
.Direction
:= Strings
.Forward
;
587 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
588 Wide_Wide_Maps
.Identity
)
593 Wide_Wide_Search
.Index
594 (Source
.Reference
(1 .. Source
.Last
), Pattern
, Going
, Mapping
);
598 (Source
: Unbounded_Wide_Wide_String
;
599 Pattern
: Wide_Wide_String
;
600 Going
: Direction
:= Forward
;
601 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
606 Wide_Wide_Search
.Index
607 (Source
.Reference
(1 .. Source
.Last
), Pattern
, Going
, Mapping
);
611 (Source
: Unbounded_Wide_Wide_String
;
612 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
613 Test
: Strings
.Membership
:= Strings
.Inside
;
614 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
617 return Wide_Wide_Search
.Index
618 (Source
.Reference
(1 .. Source
.Last
), Set
, Test
, Going
);
622 (Source
: Unbounded_Wide_Wide_String
;
623 Pattern
: Wide_Wide_String
;
625 Going
: Direction
:= Forward
;
626 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
627 Wide_Wide_Maps
.Identity
)
632 Wide_Wide_Search
.Index
633 (Source
.Reference
(1 .. Source
.Last
), Pattern
, From
, Going
, Mapping
);
637 (Source
: Unbounded_Wide_Wide_String
;
638 Pattern
: Wide_Wide_String
;
640 Going
: Direction
:= Forward
;
641 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
646 Wide_Wide_Search
.Index
647 (Source
.Reference
(1 .. Source
.Last
), Pattern
, From
, Going
, Mapping
);
651 (Source
: Unbounded_Wide_Wide_String
;
652 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
654 Test
: Membership
:= Inside
;
655 Going
: Direction
:= Forward
) return Natural
659 Wide_Wide_Search
.Index
660 (Source
.Reference
(1 .. Source
.Last
), Set
, From
, Test
, Going
);
663 function Index_Non_Blank
664 (Source
: Unbounded_Wide_Wide_String
;
665 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
669 Wide_Wide_Search
.Index_Non_Blank
670 (Source
.Reference
(1 .. Source
.Last
), Going
);
673 function Index_Non_Blank
674 (Source
: Unbounded_Wide_Wide_String
;
676 Going
: Direction
:= Forward
) return Natural
680 Wide_Wide_Search
.Index_Non_Blank
681 (Source
.Reference
(1 .. Source
.Last
), From
, Going
);
688 procedure Initialize
(Object
: in out Unbounded_Wide_Wide_String
) is
690 Object
.Reference
:= Null_Unbounded_Wide_Wide_String
.Reference
;
699 (Source
: Unbounded_Wide_Wide_String
;
701 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
705 To_Unbounded_Wide_Wide_String
706 (Wide_Wide_Fixed
.Insert
707 (Source
.Reference
(1 .. Source
.Last
), Before
, New_Item
));
711 (Source
: in out Unbounded_Wide_Wide_String
;
713 New_Item
: Wide_Wide_String
)
716 if Before
not in Source
.Reference
'First .. Source
.Last
+ 1 then
720 Realloc_For_Chunk
(Source
, New_Item
'Size);
723 (Before
+ New_Item
'Length .. Source
.Last
+ New_Item
'Length) :=
724 Source
.Reference
(Before
.. Source
.Last
);
726 Source
.Reference
(Before
.. Before
+ New_Item
'Length - 1) := New_Item
;
727 Source
.Last
:= Source
.Last
+ New_Item
'Length;
734 function Length
(Source
: Unbounded_Wide_Wide_String
) return Natural is
744 (Source
: Unbounded_Wide_Wide_String
;
746 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
750 To_Unbounded_Wide_Wide_String
751 (Wide_Wide_Fixed
.Overwrite
752 (Source
.Reference
(1 .. Source
.Last
), Position
, New_Item
));
756 (Source
: in out Unbounded_Wide_Wide_String
;
758 New_Item
: Wide_Wide_String
)
760 NL
: constant Natural := New_Item
'Length;
762 if Position
<= Source
.Last
- NL
+ 1 then
763 Source
.Reference
(Position
.. Position
+ NL
- 1) := New_Item
;
766 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
768 Source
.Reference
:= new Wide_Wide_String
'
769 (Wide_Wide_Fixed.Overwrite
770 (Source.Reference (1 .. Source.Last), Position, New_Item));
771 Source.Last := Source.Reference'Length;
777 -----------------------
778 -- Realloc_For_Chunk --
779 -----------------------
781 procedure Realloc_For_Chunk
782 (Source : in out Unbounded_Wide_Wide_String;
783 Chunk_Size : Natural)
785 Growth_Factor : constant := 32;
786 -- The growth factor controls how much extra space is allocated when
787 -- we have to increase the size of an allocated unbounded string. By
788 -- allocating extra space, we avoid the need to reallocate on every
789 -- append, particularly important when a string is built up by repeated
790 -- append operations of small pieces. This is expressed as a factor so
791 -- 32 means add 1/32 of the length of the string as growth space.
793 Min_Mul_Alloc : constant := Standard'Maximum_Alignment;
794 -- Allocation will be done by a multiple of Min_Mul_Alloc This causes
795 -- no memory loss as most (all?) malloc implementations are obliged to
796 -- align the returned memory on the maximum alignment as malloc does not
797 -- know the target alignment.
799 S_Length : constant Natural := Source.Reference'Length;
802 if Chunk_Size > S_Length - Source.Last then
804 New_Size : constant Positive :=
805 S_Length + Chunk_Size + (S_Length / Growth_Factor);
807 New_Rounded_Up_Size : constant Positive :=
808 ((New_Size - 1) / Min_Mul_Alloc + 1) *
811 Tmp : constant Wide_Wide_String_Access :=
812 new Wide_Wide_String (1 .. New_Rounded_Up_Size);
815 Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
816 Free (Source.Reference);
817 Source.Reference := Tmp;
820 end Realloc_For_Chunk;
822 ---------------------
823 -- Replace_Element --
824 ---------------------
826 procedure Replace_Element
827 (Source : in out Unbounded_Wide_Wide_String;
829 By : Wide_Wide_Character)
832 if Index <= Source.Last then
833 Source.Reference (Index) := By;
835 raise Strings.Index_Error;
843 function Replace_Slice
844 (Source : Unbounded_Wide_Wide_String;
847 By : Wide_Wide_String) return Unbounded_Wide_Wide_String
850 return To_Unbounded_Wide_Wide_String
851 (Wide_Wide_Fixed.Replace_Slice
852 (Source.Reference (1 .. Source.Last), Low, High, By));
855 procedure Replace_Slice
856 (Source : in out Unbounded_Wide_Wide_String;
859 By : Wide_Wide_String)
861 Old : Wide_Wide_String_Access := Source.Reference;
863 Source.Reference := new Wide_Wide_String'
864 (Wide_Wide_Fixed
.Replace_Slice
865 (Source
.Reference
(1 .. Source
.Last
), Low
, High
, By
));
866 Source
.Last
:= Source
.Reference
'Length;
870 ------------------------------------
871 -- Set_Unbounded_Wide_Wide_String --
872 ------------------------------------
874 procedure Set_Unbounded_Wide_Wide_String
875 (Target
: out Unbounded_Wide_Wide_String
;
876 Source
: Wide_Wide_String
)
879 Target
.Last
:= Source
'Length;
880 Target
.Reference
:= new Wide_Wide_String
(1 .. Source
'Length);
881 Target
.Reference
.all := Source
;
882 end Set_Unbounded_Wide_Wide_String
;
889 (Source
: Unbounded_Wide_Wide_String
;
891 High
: Natural) return Wide_Wide_String
894 -- Note: test of High > Length is in accordance with AI95-00128
896 if Low
> Source
.Last
+ 1 or else High
> Source
.Last
then
899 return Source
.Reference
(Low
.. High
);
908 (Source
: Unbounded_Wide_Wide_String
;
910 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
911 return Unbounded_Wide_Wide_String
is
913 return To_Unbounded_Wide_Wide_String
914 (Wide_Wide_Fixed
.Tail
915 (Source
.Reference
(1 .. Source
.Last
), Count
, Pad
));
919 (Source
: in out Unbounded_Wide_Wide_String
;
921 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
923 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
925 Source
.Reference
:= new Wide_Wide_String
'
926 (Wide_Wide_Fixed.Tail
927 (Source.Reference (1 .. Source.Last), Count, Pad));
928 Source.Last := Source.Reference'Length;
932 -----------------------------------
933 -- To_Unbounded_Wide_Wide_String --
934 -----------------------------------
936 function To_Unbounded_Wide_Wide_String
937 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String
939 Result : Unbounded_Wide_Wide_String;
941 Result.Last := Source'Length;
942 Result.Reference := new Wide_Wide_String (1 .. Source'Length);
943 Result.Reference.all := Source;
945 end To_Unbounded_Wide_Wide_String;
947 function To_Unbounded_Wide_Wide_String
948 (Length : Natural) return Unbounded_Wide_Wide_String
950 Result : Unbounded_Wide_Wide_String;
952 Result.Last := Length;
953 Result.Reference := new Wide_Wide_String (1 .. Length);
955 end To_Unbounded_Wide_Wide_String;
957 -------------------------
958 -- To_Wide_Wide_String --
959 -------------------------
961 function To_Wide_Wide_String
962 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String
965 return Source.Reference (1 .. Source.Last);
966 end To_Wide_Wide_String;
973 (Source : Unbounded_Wide_Wide_String;
974 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
975 return Unbounded_Wide_Wide_String
979 To_Unbounded_Wide_Wide_String
980 (Wide_Wide_Fixed.Translate
981 (Source.Reference (1 .. Source.Last), Mapping));
985 (Source : in out Unbounded_Wide_Wide_String;
986 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
989 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
993 (Source : Unbounded_Wide_Wide_String;
994 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
995 return Unbounded_Wide_Wide_String
999 To_Unbounded_Wide_Wide_String
1000 (Wide_Wide_Fixed.Translate
1001 (Source.Reference (1 .. Source.Last), Mapping));
1005 (Source : in out Unbounded_Wide_Wide_String;
1006 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
1009 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
1017 (Source : Unbounded_Wide_Wide_String;
1018 Side : Trim_End) return Unbounded_Wide_Wide_String
1022 To_Unbounded_Wide_Wide_String
1023 (Wide_Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
1027 (Source : in out Unbounded_Wide_Wide_String;
1030 Old : Wide_Wide_String_Access := Source.Reference;
1033 new Wide_Wide_String'
1034 (Wide_Wide_Fixed
.Trim
(Source
.Reference
(1 .. Source
.Last
), Side
));
1035 Source
.Last
:= Source
.Reference
'Length;
1040 (Source
: Unbounded_Wide_Wide_String
;
1041 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1042 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
)
1043 return Unbounded_Wide_Wide_String
1047 To_Unbounded_Wide_Wide_String
1048 (Wide_Wide_Fixed
.Trim
1049 (Source
.Reference
(1 .. Source
.Last
), Left
, Right
));
1053 (Source
: in out Unbounded_Wide_Wide_String
;
1054 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1055 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
)
1057 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
1060 new Wide_Wide_String
'
1061 (Wide_Wide_Fixed.Trim
1062 (Source.Reference (1 .. Source.Last), Left, Right));
1063 Source.Last := Source.Reference'Length;
1067 ---------------------
1068 -- Unbounded_Slice --
1069 ---------------------
1071 function Unbounded_Slice
1072 (Source : Unbounded_Wide_Wide_String;
1074 High : Natural) return Unbounded_Wide_Wide_String
1077 if Low > Source.Last + 1 or else High > Source.Last then
1081 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
1083 end Unbounded_Slice;
1085 procedure Unbounded_Slice
1086 (Source : Unbounded_Wide_Wide_String;
1087 Target : out Unbounded_Wide_Wide_String;
1092 if Low > Source.Last + 1 or else High > Source.Last then
1096 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
1098 end Unbounded_Slice;
1100 end Ada.Strings.Wide_Wide_Unbounded;