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-2012, 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 with Ada
.Strings
.Wide_Wide_Fixed
;
33 with Ada
.Strings
.Wide_Wide_Search
;
34 with Ada
.Unchecked_Deallocation
;
36 package body Ada
.Strings
.Wide_Wide_Unbounded
is
45 (Left
: Unbounded_Wide_Wide_String
;
46 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
48 L_Length
: constant Natural := Left
.Last
;
49 R_Length
: constant Natural := Right
.Last
;
50 Result
: Unbounded_Wide_Wide_String
;
53 Result
.Last
:= L_Length
+ R_Length
;
55 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
57 Result
.Reference
(1 .. L_Length
) :=
58 Left
.Reference
(1 .. Left
.Last
);
59 Result
.Reference
(L_Length
+ 1 .. Result
.Last
) :=
60 Right
.Reference
(1 .. Right
.Last
);
66 (Left
: Unbounded_Wide_Wide_String
;
67 Right
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
69 L_Length
: constant Natural := Left
.Last
;
70 Result
: Unbounded_Wide_Wide_String
;
73 Result
.Last
:= L_Length
+ Right
'Length;
75 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
77 Result
.Reference
(1 .. L_Length
) := Left
.Reference
(1 .. Left
.Last
);
78 Result
.Reference
(L_Length
+ 1 .. Result
.Last
) := Right
;
84 (Left
: Wide_Wide_String
;
85 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
87 R_Length
: constant Natural := Right
.Last
;
88 Result
: Unbounded_Wide_Wide_String
;
91 Result
.Last
:= Left
'Length + R_Length
;
93 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
95 Result
.Reference
(1 .. Left
'Length) := Left
;
96 Result
.Reference
(Left
'Length + 1 .. Result
.Last
) :=
97 Right
.Reference
(1 .. Right
.Last
);
103 (Left
: Unbounded_Wide_Wide_String
;
104 Right
: Wide_Wide_Character
) return Unbounded_Wide_Wide_String
106 Result
: Unbounded_Wide_Wide_String
;
109 Result
.Last
:= Left
.Last
+ 1;
111 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
113 Result
.Reference
(1 .. Result
.Last
- 1) :=
114 Left
.Reference
(1 .. Left
.Last
);
115 Result
.Reference
(Result
.Last
) := Right
;
121 (Left
: Wide_Wide_Character
;
122 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
124 Result
: Unbounded_Wide_Wide_String
;
127 Result
.Last
:= Right
.Last
+ 1;
129 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
130 Result
.Reference
(1) := Left
;
131 Result
.Reference
(2 .. Result
.Last
) :=
132 Right
.Reference
(1 .. Right
.Last
);
142 Right
: Wide_Wide_Character
) return Unbounded_Wide_Wide_String
144 Result
: Unbounded_Wide_Wide_String
;
149 Result
.Reference
:= new Wide_Wide_String
(1 .. Left
);
150 for J
in Result
.Reference
'Range loop
151 Result
.Reference
(J
) := Right
;
159 Right
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
161 Len
: constant Natural := Right
'Length;
163 Result
: Unbounded_Wide_Wide_String
;
166 Result
.Last
:= Left
* Len
;
168 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
171 for J
in 1 .. Left
loop
172 Result
.Reference
(K
.. K
+ Len
- 1) := Right
;
181 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
183 Len
: constant Natural := Right
.Last
;
185 Result
: Unbounded_Wide_Wide_String
;
188 Result
.Last
:= Left
* Len
;
190 Result
.Reference
:= new Wide_Wide_String
(1 .. Result
.Last
);
193 for J
in 1 .. Left
loop
194 Result
.Reference
(K
.. K
+ Len
- 1) :=
195 Right
.Reference
(1 .. Right
.Last
);
207 (Left
: Unbounded_Wide_Wide_String
;
208 Right
: Unbounded_Wide_Wide_String
) return Boolean
212 Left
.Reference
(1 .. Left
.Last
) < Right
.Reference
(1 .. Right
.Last
);
216 (Left
: Unbounded_Wide_Wide_String
;
217 Right
: Wide_Wide_String
) return Boolean
220 return Left
.Reference
(1 .. Left
.Last
) < Right
;
224 (Left
: Wide_Wide_String
;
225 Right
: Unbounded_Wide_Wide_String
) return Boolean
228 return Left
< Right
.Reference
(1 .. Right
.Last
);
236 (Left
: Unbounded_Wide_Wide_String
;
237 Right
: Unbounded_Wide_Wide_String
) return Boolean
241 Left
.Reference
(1 .. Left
.Last
) <= Right
.Reference
(1 .. Right
.Last
);
245 (Left
: Unbounded_Wide_Wide_String
;
246 Right
: Wide_Wide_String
) return Boolean
249 return Left
.Reference
(1 .. Left
.Last
) <= Right
;
253 (Left
: Wide_Wide_String
;
254 Right
: Unbounded_Wide_Wide_String
) return Boolean
257 return Left
<= Right
.Reference
(1 .. Right
.Last
);
265 (Left
: Unbounded_Wide_Wide_String
;
266 Right
: Unbounded_Wide_Wide_String
) return Boolean
270 Left
.Reference
(1 .. Left
.Last
) = Right
.Reference
(1 .. Right
.Last
);
274 (Left
: Unbounded_Wide_Wide_String
;
275 Right
: Wide_Wide_String
) return Boolean
278 return Left
.Reference
(1 .. Left
.Last
) = Right
;
282 (Left
: Wide_Wide_String
;
283 Right
: Unbounded_Wide_Wide_String
) return Boolean
286 return Left
= Right
.Reference
(1 .. Right
.Last
);
294 (Left
: Unbounded_Wide_Wide_String
;
295 Right
: Unbounded_Wide_Wide_String
) return Boolean
299 Left
.Reference
(1 .. Left
.Last
) > Right
.Reference
(1 .. Right
.Last
);
303 (Left
: Unbounded_Wide_Wide_String
;
304 Right
: Wide_Wide_String
) return Boolean
307 return Left
.Reference
(1 .. Left
.Last
) > Right
;
311 (Left
: Wide_Wide_String
;
312 Right
: Unbounded_Wide_Wide_String
) return Boolean
315 return Left
> Right
.Reference
(1 .. Right
.Last
);
323 (Left
: Unbounded_Wide_Wide_String
;
324 Right
: Unbounded_Wide_Wide_String
) return Boolean
328 Left
.Reference
(1 .. Left
.Last
) >= Right
.Reference
(1 .. Right
.Last
);
332 (Left
: Unbounded_Wide_Wide_String
;
333 Right
: Wide_Wide_String
) return Boolean
336 return Left
.Reference
(1 .. Left
.Last
) >= Right
;
340 (Left
: Wide_Wide_String
;
341 Right
: Unbounded_Wide_Wide_String
) return Boolean
344 return Left
>= Right
.Reference
(1 .. Right
.Last
);
351 procedure Adjust
(Object
: in out Unbounded_Wide_Wide_String
) is
353 -- Copy string, except we do not copy the statically allocated null
354 -- string, since it can never be deallocated. Note that we do not copy
355 -- extra string room here to avoid dragging unused allocated memory.
357 if Object
.Reference
/= Null_Wide_Wide_String
'Access then
359 new Wide_Wide_String
'(Object.Reference (1 .. Object.Last));
368 (Source : in out Unbounded_Wide_Wide_String;
369 New_Item : Unbounded_Wide_Wide_String)
372 Realloc_For_Chunk (Source, New_Item.Last);
373 Source.Reference (Source.Last + 1 .. Source.Last + New_Item.Last) :=
374 New_Item.Reference (1 .. New_Item.Last);
375 Source.Last := Source.Last + New_Item.Last;
379 (Source : in out Unbounded_Wide_Wide_String;
380 New_Item : Wide_Wide_String)
383 Realloc_For_Chunk (Source, New_Item'Length);
384 Source.Reference (Source.Last + 1 .. Source.Last + New_Item'Length) :=
386 Source.Last := Source.Last + New_Item'Length;
390 (Source : in out Unbounded_Wide_Wide_String;
391 New_Item : Wide_Wide_Character)
394 Realloc_For_Chunk (Source, 1);
395 Source.Reference (Source.Last + 1) := New_Item;
396 Source.Last := Source.Last + 1;
404 (Source : Unbounded_Wide_Wide_String;
405 Pattern : Wide_Wide_String;
406 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
407 Wide_Wide_Maps.Identity) return Natural
411 Wide_Wide_Search.Count
412 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
416 (Source : Unbounded_Wide_Wide_String;
417 Pattern : Wide_Wide_String;
418 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
423 Wide_Wide_Search.Count
424 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
428 (Source : Unbounded_Wide_Wide_String;
429 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural
433 Wide_Wide_Search.Count
434 (Source.Reference (1 .. Source.Last), Set);
442 (Source : Unbounded_Wide_Wide_String;
444 Through : Natural) return Unbounded_Wide_Wide_String
448 To_Unbounded_Wide_Wide_String
449 (Wide_Wide_Fixed.Delete
450 (Source.Reference (1 .. Source.Last), From, Through));
454 (Source : in out Unbounded_Wide_Wide_String;
459 if From > Through then
462 elsif From < Source.Reference'First or else Through > Source.Last then
467 Len : constant Natural := Through - From + 1;
470 Source.Reference (From .. Source.Last - Len) :=
471 Source.Reference (Through + 1 .. Source.Last);
472 Source.Last := Source.Last - Len;
482 (Source : Unbounded_Wide_Wide_String;
483 Index : Positive) return Wide_Wide_Character
486 if Index <= Source.Last then
487 return Source.Reference (Index);
489 raise Strings.Index_Error;
497 procedure Finalize (Object : in out Unbounded_Wide_Wide_String) is
498 procedure Deallocate is
499 new Ada.Unchecked_Deallocation
500 (Wide_Wide_String, Wide_Wide_String_Access);
503 -- Note: Don't try to free statically allocated null string
505 if Object.Reference /= Null_Wide_Wide_String'Access then
506 Deallocate (Object.Reference);
507 Object.Reference := Null_Unbounded_Wide_Wide_String.Reference;
517 (Source : Unbounded_Wide_Wide_String;
518 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
520 Test : Strings.Membership;
521 First : out Positive;
525 Wide_Wide_Search.Find_Token
526 (Source.Reference (From .. Source.Last), Set, Test, First, Last);
530 (Source : Unbounded_Wide_Wide_String;
531 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
532 Test : Strings.Membership;
533 First : out Positive;
537 Wide_Wide_Search.Find_Token
538 (Source.Reference (1 .. Source.Last), Set, Test, First, Last);
545 procedure Free (X : in out Wide_Wide_String_Access) is
546 procedure Deallocate is
547 new Ada.Unchecked_Deallocation
548 (Wide_Wide_String, Wide_Wide_String_Access);
551 -- Note: Do not try to free statically allocated null string
553 if X /= Null_Unbounded_Wide_Wide_String.Reference then
563 (Source : Unbounded_Wide_Wide_String;
565 Pad : Wide_Wide_Character := Wide_Wide_Space)
566 return Unbounded_Wide_Wide_String
569 return To_Unbounded_Wide_Wide_String
570 (Wide_Wide_Fixed.Head
571 (Source.Reference (1 .. Source.Last), Count, Pad));
575 (Source : in out Unbounded_Wide_Wide_String;
577 Pad : Wide_Wide_Character := Wide_Wide_Space)
579 Old : Wide_Wide_String_Access := Source.Reference;
582 new Wide_Wide_String'
583 (Wide_Wide_Fixed
.Head
584 (Source
.Reference
(1 .. Source
.Last
), Count
, Pad
));
585 Source
.Last
:= Source
.Reference
'Length;
594 (Source
: Unbounded_Wide_Wide_String
;
595 Pattern
: Wide_Wide_String
;
596 Going
: Strings
.Direction
:= Strings
.Forward
;
597 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
598 Wide_Wide_Maps
.Identity
) return Natural
602 Wide_Wide_Search
.Index
603 (Source
.Reference
(1 .. Source
.Last
), Pattern
, Going
, Mapping
);
607 (Source
: Unbounded_Wide_Wide_String
;
608 Pattern
: Wide_Wide_String
;
609 Going
: Direction
:= Forward
;
610 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
615 Wide_Wide_Search
.Index
616 (Source
.Reference
(1 .. Source
.Last
), Pattern
, Going
, Mapping
);
620 (Source
: Unbounded_Wide_Wide_String
;
621 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
622 Test
: Strings
.Membership
:= Strings
.Inside
;
623 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
626 return Wide_Wide_Search
.Index
627 (Source
.Reference
(1 .. Source
.Last
), Set
, Test
, Going
);
631 (Source
: Unbounded_Wide_Wide_String
;
632 Pattern
: Wide_Wide_String
;
634 Going
: Direction
:= Forward
;
635 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
636 Wide_Wide_Maps
.Identity
) return Natural
640 Wide_Wide_Search
.Index
641 (Source
.Reference
(1 .. Source
.Last
), Pattern
, From
, Going
, Mapping
);
645 (Source
: Unbounded_Wide_Wide_String
;
646 Pattern
: Wide_Wide_String
;
648 Going
: Direction
:= Forward
;
649 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
654 Wide_Wide_Search
.Index
655 (Source
.Reference
(1 .. Source
.Last
), Pattern
, From
, Going
, Mapping
);
659 (Source
: Unbounded_Wide_Wide_String
;
660 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
662 Test
: Membership
:= Inside
;
663 Going
: Direction
:= Forward
) return Natural
667 Wide_Wide_Search
.Index
668 (Source
.Reference
(1 .. Source
.Last
), Set
, From
, Test
, Going
);
671 function Index_Non_Blank
672 (Source
: Unbounded_Wide_Wide_String
;
673 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
677 Wide_Wide_Search
.Index_Non_Blank
678 (Source
.Reference
(1 .. Source
.Last
), Going
);
681 function Index_Non_Blank
682 (Source
: Unbounded_Wide_Wide_String
;
684 Going
: Direction
:= Forward
) return Natural
688 Wide_Wide_Search
.Index_Non_Blank
689 (Source
.Reference
(1 .. Source
.Last
), From
, Going
);
696 procedure Initialize
(Object
: in out Unbounded_Wide_Wide_String
) is
698 Object
.Reference
:= Null_Unbounded_Wide_Wide_String
.Reference
;
707 (Source
: Unbounded_Wide_Wide_String
;
709 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
713 To_Unbounded_Wide_Wide_String
714 (Wide_Wide_Fixed
.Insert
715 (Source
.Reference
(1 .. Source
.Last
), Before
, New_Item
));
719 (Source
: in out Unbounded_Wide_Wide_String
;
721 New_Item
: Wide_Wide_String
)
724 if Before
not in Source
.Reference
'First .. Source
.Last
+ 1 then
728 Realloc_For_Chunk
(Source
, New_Item
'Length);
731 (Before
+ New_Item
'Length .. Source
.Last
+ New_Item
'Length) :=
732 Source
.Reference
(Before
.. Source
.Last
);
734 Source
.Reference
(Before
.. Before
+ New_Item
'Length - 1) := New_Item
;
735 Source
.Last
:= Source
.Last
+ New_Item
'Length;
742 function Length
(Source
: Unbounded_Wide_Wide_String
) return Natural is
752 (Source
: Unbounded_Wide_Wide_String
;
754 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
758 To_Unbounded_Wide_Wide_String
759 (Wide_Wide_Fixed
.Overwrite
760 (Source
.Reference
(1 .. Source
.Last
), Position
, New_Item
));
764 (Source
: in out Unbounded_Wide_Wide_String
;
766 New_Item
: Wide_Wide_String
)
768 NL
: constant Natural := New_Item
'Length;
770 if Position
<= Source
.Last
- NL
+ 1 then
771 Source
.Reference
(Position
.. Position
+ NL
- 1) := New_Item
;
774 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
776 Source
.Reference
:= new Wide_Wide_String
'
777 (Wide_Wide_Fixed.Overwrite
778 (Source.Reference (1 .. Source.Last), Position, New_Item));
779 Source.Last := Source.Reference'Length;
785 -----------------------
786 -- Realloc_For_Chunk --
787 -----------------------
789 procedure Realloc_For_Chunk
790 (Source : in out Unbounded_Wide_Wide_String;
791 Chunk_Size : Natural)
793 Growth_Factor : constant := 32;
794 -- The growth factor controls how much extra space is allocated when
795 -- we have to increase the size of an allocated unbounded string. By
796 -- allocating extra space, we avoid the need to reallocate on every
797 -- append, particularly important when a string is built up by repeated
798 -- append operations of small pieces. This is expressed as a factor so
799 -- 32 means add 1/32 of the length of the string as growth space.
801 Min_Mul_Alloc : constant := Standard'Maximum_Alignment;
802 -- Allocation will be done by a multiple of Min_Mul_Alloc This causes
803 -- no memory loss as most (all?) malloc implementations are obliged to
804 -- align the returned memory on the maximum alignment as malloc does not
805 -- know the target alignment.
807 S_Length : constant Natural := Source.Reference'Length;
810 if Chunk_Size > S_Length - Source.Last then
812 New_Size : constant Positive :=
813 S_Length + Chunk_Size + (S_Length / Growth_Factor);
815 New_Rounded_Up_Size : constant Positive :=
816 ((New_Size - 1) / Min_Mul_Alloc + 1) * Min_Mul_Alloc;
818 Tmp : constant Wide_Wide_String_Access :=
819 new Wide_Wide_String (1 .. New_Rounded_Up_Size);
822 Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
823 Free (Source.Reference);
824 Source.Reference := Tmp;
827 end Realloc_For_Chunk;
829 ---------------------
830 -- Replace_Element --
831 ---------------------
833 procedure Replace_Element
834 (Source : in out Unbounded_Wide_Wide_String;
836 By : Wide_Wide_Character)
839 if Index <= Source.Last then
840 Source.Reference (Index) := By;
842 raise Strings.Index_Error;
850 function Replace_Slice
851 (Source : Unbounded_Wide_Wide_String;
854 By : Wide_Wide_String) return Unbounded_Wide_Wide_String
857 return To_Unbounded_Wide_Wide_String
858 (Wide_Wide_Fixed.Replace_Slice
859 (Source.Reference (1 .. Source.Last), Low, High, By));
862 procedure Replace_Slice
863 (Source : in out Unbounded_Wide_Wide_String;
866 By : Wide_Wide_String)
868 Old : Wide_Wide_String_Access := Source.Reference;
870 Source.Reference := new Wide_Wide_String'
871 (Wide_Wide_Fixed
.Replace_Slice
872 (Source
.Reference
(1 .. Source
.Last
), Low
, High
, By
));
873 Source
.Last
:= Source
.Reference
'Length;
877 ------------------------------------
878 -- Set_Unbounded_Wide_Wide_String --
879 ------------------------------------
881 procedure Set_Unbounded_Wide_Wide_String
882 (Target
: out Unbounded_Wide_Wide_String
;
883 Source
: Wide_Wide_String
)
886 Target
.Last
:= Source
'Length;
887 Target
.Reference
:= new Wide_Wide_String
(1 .. Source
'Length);
888 Target
.Reference
.all := Source
;
889 end Set_Unbounded_Wide_Wide_String
;
896 (Source
: Unbounded_Wide_Wide_String
;
898 High
: Natural) return Wide_Wide_String
901 -- Note: test of High > Length is in accordance with AI95-00128
903 if Low
> Source
.Last
+ 1 or else High
> Source
.Last
then
906 return Source
.Reference
(Low
.. High
);
915 (Source
: Unbounded_Wide_Wide_String
;
917 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
918 return Unbounded_Wide_Wide_String
is
920 return To_Unbounded_Wide_Wide_String
921 (Wide_Wide_Fixed
.Tail
922 (Source
.Reference
(1 .. Source
.Last
), Count
, Pad
));
926 (Source
: in out Unbounded_Wide_Wide_String
;
928 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
930 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
932 Source
.Reference
:= new Wide_Wide_String
'
933 (Wide_Wide_Fixed.Tail
934 (Source.Reference (1 .. Source.Last), Count, Pad));
935 Source.Last := Source.Reference'Length;
939 -----------------------------------
940 -- To_Unbounded_Wide_Wide_String --
941 -----------------------------------
943 function To_Unbounded_Wide_Wide_String
944 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String
946 Result : Unbounded_Wide_Wide_String;
948 Result.Last := Source'Length;
949 Result.Reference := new Wide_Wide_String (1 .. Source'Length);
950 Result.Reference.all := Source;
952 end To_Unbounded_Wide_Wide_String;
954 function To_Unbounded_Wide_Wide_String
955 (Length : Natural) return Unbounded_Wide_Wide_String
957 Result : Unbounded_Wide_Wide_String;
959 Result.Last := Length;
960 Result.Reference := new Wide_Wide_String (1 .. Length);
962 end To_Unbounded_Wide_Wide_String;
964 -------------------------
965 -- To_Wide_Wide_String --
966 -------------------------
968 function To_Wide_Wide_String
969 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String
972 return Source.Reference (1 .. Source.Last);
973 end To_Wide_Wide_String;
980 (Source : Unbounded_Wide_Wide_String;
981 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
982 return Unbounded_Wide_Wide_String
986 To_Unbounded_Wide_Wide_String
987 (Wide_Wide_Fixed.Translate
988 (Source.Reference (1 .. Source.Last), Mapping));
992 (Source : in out Unbounded_Wide_Wide_String;
993 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
996 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
1000 (Source : Unbounded_Wide_Wide_String;
1001 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
1002 return Unbounded_Wide_Wide_String
1006 To_Unbounded_Wide_Wide_String
1007 (Wide_Wide_Fixed.Translate
1008 (Source.Reference (1 .. Source.Last), Mapping));
1012 (Source : in out Unbounded_Wide_Wide_String;
1013 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
1016 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
1024 (Source : Unbounded_Wide_Wide_String;
1025 Side : Trim_End) return Unbounded_Wide_Wide_String
1029 To_Unbounded_Wide_Wide_String
1030 (Wide_Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
1034 (Source : in out Unbounded_Wide_Wide_String;
1037 Old : Wide_Wide_String_Access := Source.Reference;
1040 new Wide_Wide_String'
1041 (Wide_Wide_Fixed
.Trim
(Source
.Reference
(1 .. Source
.Last
), Side
));
1042 Source
.Last
:= Source
.Reference
'Length;
1047 (Source
: Unbounded_Wide_Wide_String
;
1048 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1049 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
)
1050 return Unbounded_Wide_Wide_String
1054 To_Unbounded_Wide_Wide_String
1055 (Wide_Wide_Fixed
.Trim
1056 (Source
.Reference
(1 .. Source
.Last
), Left
, Right
));
1060 (Source
: in out Unbounded_Wide_Wide_String
;
1061 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1062 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
)
1064 Old
: Wide_Wide_String_Access
:= Source
.Reference
;
1067 new Wide_Wide_String
'
1068 (Wide_Wide_Fixed.Trim
1069 (Source.Reference (1 .. Source.Last), Left, Right));
1070 Source.Last := Source.Reference'Length;
1074 ---------------------
1075 -- Unbounded_Slice --
1076 ---------------------
1078 function Unbounded_Slice
1079 (Source : Unbounded_Wide_Wide_String;
1081 High : Natural) return Unbounded_Wide_Wide_String
1084 if Low > Source.Last + 1 or else High > Source.Last then
1088 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
1090 end Unbounded_Slice;
1092 procedure Unbounded_Slice
1093 (Source : Unbounded_Wide_Wide_String;
1094 Target : out Unbounded_Wide_Wide_String;
1099 if Low > Source.Last + 1 or else High > Source.Last then
1103 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
1105 end Unbounded_Slice;
1107 end Ada.Strings.Wide_Wide_Unbounded;