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 --
11 -- Copyright (C) 1992-2001 Free Software Foundation, Inc. --
13 -- GNAT is free software; you can redistribute it and/or modify it under --
14 -- terms of the GNU General Public License as published by the Free Soft- --
15 -- ware Foundation; either version 2, or (at your option) any later ver- --
16 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
17 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
18 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
19 -- for more details. You should have received a copy of the GNU General --
20 -- Public License distributed with GNAT; see file COPYING. If not, write --
21 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
22 -- MA 02111-1307, USA. --
24 -- As a special exception, if other files instantiate generics from this --
25 -- unit, or you link this unit with other files to produce an executable, --
26 -- this unit does not by itself cause the resulting executable to be --
27 -- covered by the GNU General Public License. This exception does not --
28 -- however invalidate any other reasons why the executable file might be --
29 -- covered by the GNU Public License. --
31 -- GNAT was originally developed by the GNAT team at New York University. --
32 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
34 ------------------------------------------------------------------------------
36 with Ada
.Strings
.Wide_Maps
; use Ada
.Strings
.Wide_Maps
;
37 with Ada
.Strings
.Wide_Search
;
39 package body Ada
.Strings
.Wide_Bounded
is
41 package body Generic_Bounded_Length
is
48 (Left
: in Bounded_Wide_String
;
49 Right
: in Bounded_Wide_String
)
50 return Bounded_Wide_String
52 Result
: Bounded_Wide_String
;
53 Llen
: constant Length_Range
:= Left
.Length
;
54 Rlen
: constant Length_Range
:= Right
.Length
;
55 Nlen
: constant Natural := Llen
+ Rlen
;
58 if Nlen
> Max_Length
then
59 raise Ada
.Strings
.Length_Error
;
61 Result
.Length
:= Nlen
;
62 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
63 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
70 (Left
: in Bounded_Wide_String
;
71 Right
: in Wide_String)
72 return Bounded_Wide_String
74 Result
: Bounded_Wide_String
;
75 Llen
: constant Length_Range
:= Left
.Length
;
77 Nlen
: constant Natural := Llen
+ Right
'Length;
80 if Nlen
> Max_Length
then
81 raise Ada
.Strings
.Length_Error
;
83 Result
.Length
:= Nlen
;
84 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
85 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
91 (Left
: in Wide_String;
92 Right
: in Bounded_Wide_String
)
93 return Bounded_Wide_String
95 Result
: Bounded_Wide_String
;
96 Llen
: constant Length_Range
:= Left
'Length;
97 Rlen
: constant Length_Range
:= Right
.Length
;
98 Nlen
: constant Natural := Llen
+ Rlen
;
101 if Nlen
> Max_Length
then
102 raise Ada
.Strings
.Length_Error
;
104 Result
.Length
:= Nlen
;
105 Result
.Data
(1 .. Llen
) := Left
;
106 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
113 (Left
: in Bounded_Wide_String
;
114 Right
: in Wide_Character)
115 return Bounded_Wide_String
117 Result
: Bounded_Wide_String
;
118 Llen
: constant Length_Range
:= Left
.Length
;
121 if Llen
= Max_Length
then
122 raise Ada
.Strings
.Length_Error
;
124 Result
.Length
:= Llen
+ 1;
125 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
126 Result
.Data
(Result
.Length
) := Right
;
133 (Left
: in Wide_Character;
134 Right
: in Bounded_Wide_String
)
135 return Bounded_Wide_String
137 Result
: Bounded_Wide_String
;
138 Rlen
: Length_Range
:= Right
.Length
;
141 if Rlen
= Max_Length
then
142 raise Ada
.Strings
.Length_Error
;
144 Result
.Length
:= Rlen
+ 1;
145 Result
.Data
(1) := Left
;
146 Result
.Data
(2 .. Result
.Length
) := Right
.Data
(1 .. Rlen
);
158 Right
: in Wide_Character)
159 return Bounded_Wide_String
161 Result
: Bounded_Wide_String
;
164 if Left
> Max_Length
then
165 raise Ada
.Strings
.Length_Error
;
167 Result
.Length
:= Left
;
169 for J
in 1 .. Left
loop
170 Result
.Data
(J
) := Right
;
179 Right
: in Wide_String)
180 return Bounded_Wide_String
182 Result
: Bounded_Wide_String
;
184 Rlen
: constant Natural := Right
'Length;
185 Nlen
: constant Natural := Left
* Rlen
;
188 if Nlen
> Max_Length
then
189 raise Ada
.Strings
.Index_Error
;
191 Result
.Length
:= Nlen
;
194 for J
in 1 .. Left
loop
195 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) := Right
;
206 Right
: in Bounded_Wide_String
)
207 return Bounded_Wide_String
209 Result
: Bounded_Wide_String
;
211 Rlen
: constant Length_Range
:= Right
.Length
;
212 Nlen
: constant Natural := Left
* Rlen
;
215 if Nlen
> Max_Length
then
216 raise Ada
.Strings
.Length_Error
;
219 Result
.Length
:= Nlen
;
222 for J
in 1 .. Left
loop
223 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) :=
224 Right
.Data
(1 .. Rlen
);
238 (Left
: in Bounded_Wide_String
;
239 Right
: in Bounded_Wide_String
)
243 return Left
.Data
(1 .. Left
.Length
) < Right
.Data
(1 .. Right
.Length
);
247 (Left
: in Bounded_Wide_String
;
248 Right
: in Wide_String)
252 return Left
.Data
(1 .. Left
.Length
) < Right
;
256 (Left
: in Wide_String;
257 Right
: in Bounded_Wide_String
)
261 return Left
< Right
.Data
(1 .. Right
.Length
);
269 (Left
: in Bounded_Wide_String
;
270 Right
: in Bounded_Wide_String
)
274 return Left
.Data
(1 .. Left
.Length
) <= Right
.Data
(1 .. Right
.Length
);
278 (Left
: in Bounded_Wide_String
;
279 Right
: in Wide_String)
283 return Left
.Data
(1 .. Left
.Length
) <= Right
;
287 (Left
: in Wide_String;
288 Right
: in Bounded_Wide_String
)
292 return Left
<= Right
.Data
(1 .. Right
.Length
);
300 (Left
: in Bounded_Wide_String
;
301 Right
: in Bounded_Wide_String
)
305 return Left
.Length
= Right
.Length
306 and then Left
.Data
(1 .. Left
.Length
) =
307 Right
.Data
(1 .. Right
.Length
);
311 (Left
: in Bounded_Wide_String
;
312 Right
: in Wide_String)
316 return Left
.Length
= Right
'Length
317 and then Left
.Data
(1 .. Left
.Length
) = Right
;
321 (Left
: in Wide_String;
322 Right
: in Bounded_Wide_String
)
326 return Left
'Length = Right
.Length
327 and then Left
= Right
.Data
(1 .. Right
.Length
);
335 (Left
: in Bounded_Wide_String
;
336 Right
: in Bounded_Wide_String
)
340 return Left
.Data
(1 .. Left
.Length
) > Right
.Data
(1 .. Right
.Length
);
344 (Left
: in Bounded_Wide_String
;
345 Right
: in Wide_String)
349 return Left
.Data
(1 .. Left
.Length
) > Right
;
353 (Left
: in Wide_String;
354 Right
: in Bounded_Wide_String
)
358 return Left
> Right
.Data
(1 .. Right
.Length
);
366 (Left
: in Bounded_Wide_String
;
367 Right
: in Bounded_Wide_String
)
371 return Left
.Data
(1 .. Left
.Length
) >= Right
.Data
(1 .. Right
.Length
);
375 (Left
: in Bounded_Wide_String
;
376 Right
: in Wide_String)
380 return Left
.Data
(1 .. Left
.Length
) >= Right
;
384 (Left
: in Wide_String;
385 Right
: in Bounded_Wide_String
)
389 return Left
>= Right
.Data
(1 .. Right
.Length
);
396 -- Case of Bounded_Wide_String and Bounded_Wide_String
399 (Left
, Right
: in Bounded_Wide_String
;
400 Drop
: in Strings
.Truncation
:= Strings
.Error
)
401 return Bounded_Wide_String
403 Result
: Bounded_Wide_String
;
404 Llen
: constant Length_Range
:= Left
.Length
;
405 Rlen
: constant Length_Range
:= Right
.Length
;
406 Nlen
: constant Natural := Llen
+ Rlen
;
409 if Nlen
<= Max_Length
then
410 Result
.Length
:= Nlen
;
411 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
412 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
415 Result
.Length
:= Max_Length
;
418 when Strings
.Right
=>
419 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
420 Result
.Data
:= Right
.Data
;
423 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
424 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
425 Right
.Data
(1 .. Max_Length
- Llen
);
429 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
430 Result
.Data
:= Right
.Data
;
433 Result
.Data
(1 .. Max_Length
- Rlen
) :=
434 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
435 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
436 Right
.Data
(1 .. Rlen
);
439 when Strings
.Error
=>
440 raise Ada
.Strings
.Length_Error
;
448 (Source
: in out Bounded_Wide_String
;
449 New_Item
: in Bounded_Wide_String
;
450 Drop
: in Truncation
:= Error
)
452 Llen
: constant Length_Range
:= Source
.Length
;
453 Rlen
: constant Length_Range
:= New_Item
.Length
;
454 Nlen
: constant Natural := Llen
+ Rlen
;
457 if Nlen
<= Max_Length
then
458 Source
.Length
:= Nlen
;
459 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
.Data
(1 .. Rlen
);
462 Source
.Length
:= Max_Length
;
465 when Strings
.Right
=>
466 if Llen
< Max_Length
then
467 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
468 New_Item
.Data
(1 .. Max_Length
- Llen
);
472 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
473 Source
.Data
:= New_Item
.Data
;
476 Source
.Data
(1 .. Max_Length
- Rlen
) :=
477 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
478 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
479 New_Item
.Data
(1 .. Rlen
);
482 when Strings
.Error
=>
483 raise Ada
.Strings
.Length_Error
;
489 -- Case of Bounded_Wide_String and Wide_String
492 (Left
: in Bounded_Wide_String
;
493 Right
: in Wide_String;
494 Drop
: in Strings
.Truncation
:= Strings
.Error
)
495 return Bounded_Wide_String
497 Result
: Bounded_Wide_String
;
498 Llen
: constant Length_Range
:= Left
.Length
;
499 Rlen
: constant Length_Range
:= Right
'Length;
500 Nlen
: constant Natural := Llen
+ Rlen
;
503 if Nlen
<= Max_Length
then
504 Result
.Length
:= Nlen
;
505 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
506 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
509 Result
.Length
:= Max_Length
;
512 when Strings
.Right
=>
513 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
514 Result
.Data
:= Left
.Data
;
517 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
518 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
519 Right
(Right
'First .. Right
'First - 1 +
525 if Rlen
>= Max_Length
then
526 Result
.Data
(1 .. Max_Length
) :=
527 Right
(Right
'Last - (Max_Length
- 1) .. Right
'Last);
530 Result
.Data
(1 .. Max_Length
- Rlen
) :=
531 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
532 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
536 when Strings
.Error
=>
537 raise Ada
.Strings
.Length_Error
;
545 (Source
: in out Bounded_Wide_String
;
546 New_Item
: in Wide_String;
547 Drop
: in Truncation
:= Error
)
549 Llen
: constant Length_Range
:= Source
.Length
;
550 Rlen
: constant Length_Range
:= New_Item
'Length;
551 Nlen
: constant Natural := Llen
+ Rlen
;
554 if Nlen
<= Max_Length
then
555 Source
.Length
:= Nlen
;
556 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
;
559 Source
.Length
:= Max_Length
;
562 when Strings
.Right
=>
563 if Llen
< Max_Length
then
564 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
565 New_Item
(New_Item
'First ..
566 New_Item
'First - 1 + Max_Length
- Llen
);
570 if Rlen
>= Max_Length
then
571 Source
.Data
(1 .. Max_Length
) :=
572 New_Item
(New_Item
'Last - (Max_Length
- 1) ..
576 Source
.Data
(1 .. Max_Length
- Rlen
) :=
577 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
578 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
582 when Strings
.Error
=>
583 raise Ada
.Strings
.Length_Error
;
589 -- Case of Wide_String and Bounded_Wide_String
592 (Left
: in Wide_String;
593 Right
: in Bounded_Wide_String
;
594 Drop
: in Strings
.Truncation
:= Strings
.Error
)
595 return Bounded_Wide_String
597 Result
: Bounded_Wide_String
;
598 Llen
: constant Length_Range
:= Left
'Length;
599 Rlen
: constant Length_Range
:= Right
.Length
;
600 Nlen
: constant Natural := Llen
+ Rlen
;
603 if Nlen
<= Max_Length
then
604 Result
.Length
:= Nlen
;
605 Result
.Data
(1 .. Llen
) := Left
;
606 Result
.Data
(Llen
+ 1 .. Llen
+ Rlen
) := Right
.Data
(1 .. Rlen
);
609 Result
.Length
:= Max_Length
;
612 when Strings
.Right
=>
613 if Llen
>= Max_Length
then
614 Result
.Data
(1 .. Max_Length
) :=
615 Left
(Left
'First .. Left
'First + (Max_Length
- 1));
618 Result
.Data
(1 .. Llen
) := Left
;
619 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
620 Right
.Data
(1 .. Max_Length
- Llen
);
624 if Rlen
>= Max_Length
then
625 Result
.Data
(1 .. Max_Length
) :=
626 Right
.Data
(Rlen
- (Max_Length
- 1) .. Rlen
);
629 Result
.Data
(1 .. Max_Length
- Rlen
) :=
630 Left
(Left
'Last - (Max_Length
- Rlen
- 1) .. Left
'Last);
631 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
632 Right
.Data
(1 .. Rlen
);
635 when Strings
.Error
=>
636 raise Ada
.Strings
.Length_Error
;
643 -- Case of Bounded_Wide_String and Wide_Character
646 (Left
: in Bounded_Wide_String
;
647 Right
: in Wide_Character;
648 Drop
: in Strings
.Truncation
:= Strings
.Error
)
649 return Bounded_Wide_String
651 Result
: Bounded_Wide_String
;
652 Llen
: constant Length_Range
:= Left
.Length
;
655 if Llen
< Max_Length
then
656 Result
.Length
:= Llen
+ 1;
657 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
658 Result
.Data
(Llen
+ 1) := Right
;
663 when Strings
.Right
=>
667 Result
.Length
:= Max_Length
;
668 Result
.Data
(1 .. Max_Length
- 1) :=
669 Left
.Data
(2 .. Max_Length
);
670 Result
.Data
(Max_Length
) := Right
;
673 when Strings
.Error
=>
674 raise Ada
.Strings
.Length_Error
;
680 (Source
: in out Bounded_Wide_String
;
681 New_Item
: in Wide_Character;
682 Drop
: in Truncation
:= Error
)
684 Llen
: constant Length_Range
:= Source
.Length
;
687 if Llen
< Max_Length
then
688 Source
.Length
:= Llen
+ 1;
689 Source
.Data
(Llen
+ 1) := New_Item
;
692 Source
.Length
:= Max_Length
;
695 when Strings
.Right
=>
699 Source
.Data
(1 .. Max_Length
- 1) :=
700 Source
.Data
(2 .. Max_Length
);
701 Source
.Data
(Max_Length
) := New_Item
;
703 when Strings
.Error
=>
704 raise Ada
.Strings
.Length_Error
;
710 -- Case of Wide_Character and Bounded_Wide_String
713 (Left
: in Wide_Character;
714 Right
: in Bounded_Wide_String
;
715 Drop
: in Strings
.Truncation
:= Strings
.Error
)
716 return Bounded_Wide_String
718 Result
: Bounded_Wide_String
;
719 Rlen
: constant Length_Range
:= Right
.Length
;
722 if Rlen
< Max_Length
then
723 Result
.Length
:= Rlen
+ 1;
724 Result
.Data
(1) := Left
;
725 Result
.Data
(2 .. Rlen
+ 1) := Right
.Data
(1 .. Rlen
);
730 when Strings
.Right
=>
731 Result
.Length
:= Max_Length
;
732 Result
.Data
(1) := Left
;
733 Result
.Data
(2 .. Max_Length
) :=
734 Right
.Data
(1 .. Max_Length
- 1);
740 when Strings
.Error
=>
741 raise Ada
.Strings
.Length_Error
;
751 (Source
: in Bounded_Wide_String
;
752 Pattern
: in Wide_String;
753 Mapping
: in Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
759 (Source
.Data
(1 .. Source
.Length
), Pattern
, Mapping
);
763 (Source
: in Bounded_Wide_String
;
764 Pattern
: in Wide_String;
765 Mapping
: in Wide_Maps
.Wide_Character_Mapping_Function
)
771 (Source
.Data
(1 .. Source
.Length
), Pattern
, Mapping
);
775 (Source
: in Bounded_Wide_String
;
776 Set
: in Wide_Maps
.Wide_Character_Set
)
780 return Wide_Search
.Count
(Source
.Data
(1 .. Source
.Length
), Set
);
788 (Source
: in Bounded_Wide_String
;
790 Through
: in Natural)
791 return Bounded_Wide_String
793 Slen
: constant Natural := Source
.Length
;
794 Num_Delete
: constant Integer := Through
- From
+ 1;
795 Result
: Bounded_Wide_String
;
798 if Num_Delete
<= 0 then
801 elsif From
> Slen
+ 1 then
802 raise Ada
.Strings
.Index_Error
;
804 elsif Through
>= Slen
then
805 Result
.Length
:= From
- 1;
806 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
810 Result
.Length
:= Slen
- Num_Delete
;
811 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
812 Result
.Data
(From
.. Result
.Length
) :=
813 Source
.Data
(Through
+ 1 .. Slen
);
819 (Source
: in out Bounded_Wide_String
;
821 Through
: in Natural)
823 Slen
: constant Natural := Source
.Length
;
824 Num_Delete
: constant Integer := Through
- From
+ 1;
827 if Num_Delete
<= 0 then
830 elsif From
> Slen
+ 1 then
831 raise Ada
.Strings
.Index_Error
;
833 elsif Through
>= Slen
then
834 Source
.Length
:= From
- 1;
837 Source
.Length
:= Slen
- Num_Delete
;
838 Source
.Data
(From
.. Source
.Length
) :=
839 Source
.Data
(Through
+ 1 .. Slen
);
848 (Source
: in Bounded_Wide_String
;
850 return Wide_Character
853 if Index
in 1 .. Source
.Length
then
854 return Source
.Data
(Index
);
856 raise Strings
.Index_Error
;
865 (Source
: in Bounded_Wide_String
;
866 Set
: in Wide_Maps
.Wide_Character_Set
;
867 Test
: in Strings
.Membership
;
868 First
: out Positive;
872 Wide_Search
.Find_Token
873 (Source
.Data
(1 .. Source
.Length
), Set
, Test
, First
, Last
);
882 (Source
: in Bounded_Wide_String
;
884 Pad
: in Wide_Character := Wide_Space
;
885 Drop
: in Strings
.Truncation
:= Strings
.Error
)
886 return Bounded_Wide_String
888 Result
: Bounded_Wide_String
;
889 Slen
: constant Natural := Source
.Length
;
890 Npad
: constant Integer := Count
- Slen
;
894 Result
.Length
:= Count
;
895 Result
.Data
(1 .. Count
) := Source
.Data
(1 .. Count
);
897 elsif Count
<= Max_Length
then
898 Result
.Length
:= Count
;
899 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
900 Result
.Data
(Slen
+ 1 .. Count
) := (others => Pad
);
903 Result
.Length
:= Max_Length
;
906 when Strings
.Right
=>
907 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
908 Result
.Data
(Slen
+ 1 .. Max_Length
) := (others => Pad
);
911 if Npad
>= Max_Length
then
912 Result
.Data
:= (others => Pad
);
915 Result
.Data
(1 .. Max_Length
- Npad
) :=
916 Source
.Data
(Count
- Max_Length
+ 1 .. Slen
);
917 Result
.Data
(Max_Length
- Npad
+ 1 .. Max_Length
) :=
921 when Strings
.Error
=>
922 raise Ada
.Strings
.Length_Error
;
930 (Source
: in out Bounded_Wide_String
;
932 Pad
: in Wide_Character := Wide_Space
;
933 Drop
: in Truncation
:= Error
)
935 Slen
: constant Natural := Source
.Length
;
936 Npad
: constant Integer := Count
- Slen
;
937 Temp
: Wide_String (1 .. Max_Length
);
941 Source
.Length
:= Count
;
943 elsif Count
<= Max_Length
then
944 Source
.Length
:= Count
;
945 Source
.Data
(Slen
+ 1 .. Count
) := (others => Pad
);
948 Source
.Length
:= Max_Length
;
951 when Strings
.Right
=>
952 Source
.Data
(Slen
+ 1 .. Max_Length
) := (others => Pad
);
955 if Npad
> Max_Length
then
956 Source
.Data
:= (others => Pad
);
960 Source
.Data
(1 .. Max_Length
- Npad
) :=
961 Temp
(Count
- Max_Length
+ 1 .. Slen
);
963 for J
in Max_Length
- Npad
+ 1 .. Max_Length
loop
964 Source
.Data
(J
) := Pad
;
968 when Strings
.Error
=>
969 raise Ada
.Strings
.Length_Error
;
980 (Source
: in Bounded_Wide_String
;
981 Pattern
: in Wide_String;
982 Going
: in Strings
.Direction
:= Strings
.Forward
;
983 Mapping
: in Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
987 return Wide_Search
.Index
988 (Source
.Data
(1 .. Source
.Length
), Pattern
, Going
, Mapping
);
992 (Source
: in Bounded_Wide_String
;
993 Pattern
: in Wide_String;
994 Going
: in Direction
:= Forward
;
995 Mapping
: in Wide_Maps
.Wide_Character_Mapping_Function
)
999 return Wide_Search
.Index
1000 (Source
.Data
(1 .. Source
.Length
), Pattern
, Going
, Mapping
);
1004 (Source
: in Bounded_Wide_String
;
1005 Set
: in Wide_Maps
.Wide_Character_Set
;
1006 Test
: in Strings
.Membership
:= Strings
.Inside
;
1007 Going
: in Strings
.Direction
:= Strings
.Forward
)
1011 return Wide_Search
.Index
1012 (Source
.Data
(1 .. Source
.Length
), Set
, Test
, Going
);
1015 ---------------------
1016 -- Index_Non_Blank --
1017 ---------------------
1019 function Index_Non_Blank
1020 (Source
: in Bounded_Wide_String
;
1021 Going
: in Strings
.Direction
:= Strings
.Forward
)
1026 Wide_Search
.Index_Non_Blank
1027 (Source
.Data
(1 .. Source
.Length
), Going
);
1028 end Index_Non_Blank
;
1035 (Source
: in Bounded_Wide_String
;
1036 Before
: in Positive;
1037 New_Item
: in Wide_String;
1038 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1039 return Bounded_Wide_String
1041 Slen
: constant Natural := Source
.Length
;
1042 Nlen
: constant Natural := New_Item
'Length;
1043 Tlen
: constant Natural := Slen
+ Nlen
;
1044 Blen
: constant Natural := Before
- 1;
1045 Alen
: constant Integer := Slen
- Blen
;
1046 Droplen
: constant Integer := Tlen
- Max_Length
;
1047 Result
: Bounded_Wide_String
;
1049 -- Tlen is the length of the total string before possible truncation.
1050 -- Blen, Alen are the lengths of the before and after pieces of the
1055 raise Ada
.Strings
.Index_Error
;
1057 elsif Droplen
<= 0 then
1058 Result
.Length
:= Tlen
;
1059 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1060 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1061 Result
.Data
(Before
+ Nlen
.. Tlen
) :=
1062 Source
.Data
(Before
.. Slen
);
1065 Result
.Length
:= Max_Length
;
1068 when Strings
.Right
=>
1069 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1071 if Droplen
> Alen
then
1072 Result
.Data
(Before
.. Max_Length
) :=
1073 New_Item
(New_Item
'First
1074 .. New_Item
'First + Max_Length
- Before
);
1076 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1077 Result
.Data
(Before
+ Nlen
.. Max_Length
) :=
1078 Source
.Data
(Before
.. Slen
- Droplen
);
1081 when Strings
.Left
=>
1082 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1083 Source
.Data
(Before
.. Slen
);
1085 if Droplen
>= Blen
then
1086 Result
.Data
(1 .. Max_Length
- Alen
) :=
1087 New_Item
(New_Item
'Last - (Max_Length
- Alen
) + 1
1091 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) :=
1093 Result
.Data
(1 .. Blen
- Droplen
) :=
1094 Source
.Data
(Droplen
+ 1 .. Blen
);
1097 when Strings
.Error
=>
1098 raise Ada
.Strings
.Length_Error
;
1106 (Source
: in out Bounded_Wide_String
;
1107 Before
: in Positive;
1108 New_Item
: in Wide_String;
1109 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1112 -- We do a double copy here because this is one of the situations
1113 -- in which we move data to the right, and at least at the moment,
1114 -- GNAT is not handling such cases correctly ???
1116 Source
:= Insert
(Source
, Before
, New_Item
, Drop
);
1123 function Length
(Source
: in Bounded_Wide_String
) return Length_Range
is
1125 return Source
.Length
;
1133 (Source
: in Bounded_Wide_String
;
1134 Position
: in Positive;
1135 New_Item
: in Wide_String;
1136 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1137 return Bounded_Wide_String
1139 Result
: Bounded_Wide_String
;
1140 Endpos
: constant Natural := Position
+ New_Item
'Length - 1;
1141 Slen
: constant Natural := Source
.Length
;
1145 if Position
> Slen
+ 1 then
1146 raise Ada
.Strings
.Index_Error
;
1148 elsif New_Item
'Length = 0 then
1151 elsif Endpos
<= Slen
then
1152 Result
.Length
:= Source
.Length
;
1153 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
1154 Result
.Data
(Position
.. Endpos
) := New_Item
;
1157 elsif Endpos
<= Max_Length
then
1158 Result
.Length
:= Endpos
;
1159 Result
.Data
(1 .. Position
- 1) := Source
.Data
(1 .. Position
- 1);
1160 Result
.Data
(Position
.. Endpos
) := New_Item
;
1164 Result
.Length
:= Max_Length
;
1165 Droplen
:= Endpos
- Max_Length
;
1168 when Strings
.Right
=>
1169 Result
.Data
(1 .. Position
- 1) :=
1170 Source
.Data
(1 .. Position
- 1);
1172 Result
.Data
(Position
.. Max_Length
) :=
1173 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1176 when Strings
.Left
=>
1177 if New_Item
'Length >= Max_Length
then
1178 Result
.Data
(1 .. Max_Length
) :=
1179 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1184 Result
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1185 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1187 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1192 when Strings
.Error
=>
1193 raise Ada
.Strings
.Length_Error
;
1199 (Source
: in out Bounded_Wide_String
;
1200 Position
: in Positive;
1201 New_Item
: in Wide_String;
1202 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1204 Endpos
: constant Positive := Position
+ New_Item
'Length - 1;
1205 Slen
: constant Natural := Source
.Length
;
1209 if Position
> Slen
+ 1 then
1210 raise Ada
.Strings
.Index_Error
;
1212 elsif Endpos
<= Slen
then
1213 Source
.Data
(Position
.. Endpos
) := New_Item
;
1215 elsif Endpos
<= Max_Length
then
1216 Source
.Data
(Position
.. Endpos
) := New_Item
;
1217 Source
.Length
:= Endpos
;
1220 Source
.Length
:= Max_Length
;
1221 Droplen
:= Endpos
- Max_Length
;
1224 when Strings
.Right
=>
1225 Source
.Data
(Position
.. Max_Length
) :=
1226 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1228 when Strings
.Left
=>
1229 if New_Item
'Length > Max_Length
then
1230 Source
.Data
(1 .. Max_Length
) :=
1231 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1235 Source
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1236 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1239 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1243 when Strings
.Error
=>
1244 raise Ada
.Strings
.Length_Error
;
1249 ---------------------
1250 -- Replace_Element --
1251 ---------------------
1253 procedure Replace_Element
1254 (Source
: in out Bounded_Wide_String
;
1255 Index
: in Positive;
1256 By
: in Wide_Character)
1259 if Index
<= Source
.Length
then
1260 Source
.Data
(Index
) := By
;
1262 raise Ada
.Strings
.Index_Error
;
1264 end Replace_Element
;
1270 function Replace_Slice
1271 (Source
: in Bounded_Wide_String
;
1274 By
: in Wide_String;
1275 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1276 return Bounded_Wide_String
1278 Slen
: constant Natural := Source
.Length
;
1281 if Low
> Slen
+ 1 then
1282 raise Strings
.Index_Error
;
1284 elsif High
< Low
then
1285 return Insert
(Source
, Low
, By
, Drop
);
1289 Blen
: constant Natural := Natural'Max (0, Low
- 1);
1290 Alen
: constant Natural := Natural'Max (0, Slen
- High
);
1291 Tlen
: constant Natural := Blen
+ By
'Length + Alen
;
1292 Droplen
: constant Integer := Tlen
- Max_Length
;
1293 Result
: Bounded_Wide_String
;
1295 -- Tlen is the total length of the result string before any
1296 -- truncation. Blen and Alen are the lengths of the pieces
1297 -- of the original string that end up in the result string
1298 -- before and after the replaced slice.
1301 if Droplen
<= 0 then
1302 Result
.Length
:= Tlen
;
1303 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1304 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1305 Result
.Data
(Low
+ By
'Length .. Tlen
) :=
1306 Source
.Data
(High
+ 1 .. Slen
);
1309 Result
.Length
:= Max_Length
;
1312 when Strings
.Right
=>
1313 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1315 if Droplen
> Alen
then
1316 Result
.Data
(Low
.. Max_Length
) :=
1317 By
(By
'First .. By
'First + Max_Length
- Low
);
1319 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1320 Result
.Data
(Low
+ By
'Length .. Max_Length
) :=
1321 Source
.Data
(High
+ 1 .. Slen
- Droplen
);
1324 when Strings
.Left
=>
1325 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1326 Source
.Data
(High
+ 1 .. Slen
);
1328 if Droplen
>= Blen
then
1329 Result
.Data
(1 .. Max_Length
- Alen
) :=
1330 By
(By
'Last - (Max_Length
- Alen
) + 1 .. By
'Last);
1333 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) := By
;
1334 Result
.Data
(1 .. Blen
- Droplen
) :=
1335 Source
.Data
(Droplen
+ 1 .. Blen
);
1338 when Strings
.Error
=>
1339 raise Ada
.Strings
.Length_Error
;
1348 procedure Replace_Slice
1349 (Source
: in out Bounded_Wide_String
;
1352 By
: in Wide_String;
1353 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1356 -- We do a double copy here because this is one of the situations
1357 -- in which we move data to the right, and at least at the moment,
1358 -- GNAT is not handling such cases correctly ???
1360 Source
:= Replace_Slice
(Source
, Low
, High
, By
, Drop
);
1368 (Count
: in Natural;
1369 Item
: in Wide_Character;
1370 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1371 return Bounded_Wide_String
1373 Result
: Bounded_Wide_String
;
1376 if Count
<= Max_Length
then
1377 Result
.Length
:= Count
;
1379 elsif Drop
= Strings
.Error
then
1380 raise Ada
.Strings
.Length_Error
;
1383 Result
.Length
:= Max_Length
;
1386 Result
.Data
(1 .. Result
.Length
) := (others => Item
);
1391 (Count
: in Natural;
1392 Item
: in Wide_String;
1393 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1394 return Bounded_Wide_String
1396 Length
: constant Integer := Count
* Item
'Length;
1397 Result
: Bounded_Wide_String
;
1401 if Length
<= Max_Length
then
1402 Result
.Length
:= Length
;
1407 for J
in 1 .. Count
loop
1408 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1409 Indx
:= Indx
+ Item
'Length;
1414 Result
.Length
:= Max_Length
;
1417 when Strings
.Right
=>
1420 while Indx
+ Item
'Length <= Max_Length
+ 1 loop
1421 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1422 Indx
:= Indx
+ Item
'Length;
1425 Result
.Data
(Indx
.. Max_Length
) :=
1426 Item
(Item
'First .. Item
'First + Max_Length
- Indx
);
1428 when Strings
.Left
=>
1431 while Indx
- Item
'Length >= 1 loop
1432 Result
.Data
(Indx
- (Item
'Length - 1) .. Indx
) := Item
;
1433 Indx
:= Indx
- Item
'Length;
1436 Result
.Data
(1 .. Indx
) :=
1437 Item
(Item
'Last - Indx
+ 1 .. Item
'Last);
1439 when Strings
.Error
=>
1440 raise Ada
.Strings
.Length_Error
;
1448 (Count
: in Natural;
1449 Item
: in Bounded_Wide_String
;
1450 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1451 return Bounded_Wide_String
1454 return Replicate
(Count
, Item
.Data
(1 .. Item
.Length
), Drop
);
1462 (Source
: Bounded_Wide_String
;
1468 -- Note: test of High > Length is in accordance with AI95-00128
1470 if Low
> Source
.Length
+ 1 or else High
> Source
.Length
then
1475 Result
: Wide_String (1 .. High
- Low
+ 1);
1478 Result
:= Source
.Data
(Low
.. High
);
1489 (Source
: in Bounded_Wide_String
;
1491 Pad
: in Wide_Character := Wide_Space
;
1492 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1493 return Bounded_Wide_String
1495 Result
: Bounded_Wide_String
;
1496 Slen
: constant Natural := Source
.Length
;
1497 Npad
: constant Integer := Count
- Slen
;
1501 Result
.Length
:= Count
;
1502 Result
.Data
(1 .. Count
) :=
1503 Source
.Data
(Slen
- (Count
- 1) .. Slen
);
1505 elsif Count
<= Max_Length
then
1506 Result
.Length
:= Count
;
1507 Result
.Data
(1 .. Npad
) := (others => Pad
);
1508 Result
.Data
(Npad
+ 1 .. Count
) := Source
.Data
(1 .. Slen
);
1511 Result
.Length
:= Max_Length
;
1514 when Strings
.Right
=>
1515 if Npad
>= Max_Length
then
1516 Result
.Data
:= (others => Pad
);
1519 Result
.Data
(1 .. Npad
) := (others => Pad
);
1520 Result
.Data
(Npad
+ 1 .. Max_Length
) :=
1521 Source
.Data
(1 .. Max_Length
- Npad
);
1524 when Strings
.Left
=>
1525 Result
.Data
(1 .. Max_Length
- Slen
) := (others => Pad
);
1526 Result
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1527 Source
.Data
(1 .. Slen
);
1529 when Strings
.Error
=>
1530 raise Ada
.Strings
.Length_Error
;
1538 (Source
: in out Bounded_Wide_String
;
1540 Pad
: in Wide_Character := Wide_Space
;
1541 Drop
: in Truncation
:= Error
)
1543 Slen
: constant Natural := Source
.Length
;
1544 Npad
: constant Integer := Count
- Slen
;
1545 Temp
: Wide_String (1 .. Max_Length
) := Source
.Data
;
1549 Source
.Length
:= Count
;
1550 Source
.Data
(1 .. Count
) :=
1551 Temp
(Slen
- (Count
- 1) .. Slen
);
1553 elsif Count
<= Max_Length
then
1554 Source
.Length
:= Count
;
1555 Source
.Data
(1 .. Npad
) := (others => Pad
);
1556 Source
.Data
(Npad
+ 1 .. Count
) := Temp
(1 .. Slen
);
1559 Source
.Length
:= Max_Length
;
1562 when Strings
.Right
=>
1563 if Npad
>= Max_Length
then
1564 Source
.Data
:= (others => Pad
);
1567 Source
.Data
(1 .. Npad
) := (others => Pad
);
1568 Source
.Data
(Npad
+ 1 .. Max_Length
) :=
1569 Temp
(1 .. Max_Length
- Npad
);
1572 when Strings
.Left
=>
1573 for J
in 1 .. Max_Length
- Slen
loop
1574 Source
.Data
(J
) := Pad
;
1577 Source
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1580 when Strings
.Error
=>
1581 raise Ada
.Strings
.Length_Error
;
1587 ----------------------------
1588 -- To_Bounded_Wide_String --
1589 ----------------------------
1591 function To_Bounded_Wide_String
1592 (Source
: in Wide_String;
1593 Drop
: in Strings
.Truncation
:= Strings
.Error
)
1594 return Bounded_Wide_String
1596 Slen
: constant Natural := Source
'Length;
1597 Result
: Bounded_Wide_String
;
1600 if Slen
<= Max_Length
then
1601 Result
.Length
:= Slen
;
1602 Result
.Data
(1 .. Slen
) := Source
;
1606 when Strings
.Right
=>
1607 Result
.Length
:= Max_Length
;
1608 Result
.Data
(1 .. Max_Length
) :=
1609 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
1611 when Strings
.Left
=>
1612 Result
.Length
:= Max_Length
;
1613 Result
.Data
(1 .. Max_Length
) :=
1614 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
1616 when Strings
.Error
=>
1617 raise Ada
.Strings
.Length_Error
;
1622 end To_Bounded_Wide_String
;
1624 --------------------
1625 -- To_Wide_String --
1626 --------------------
1628 function To_Wide_String
1629 (Source
: in Bounded_Wide_String
)
1633 return Source
.Data
(1 .. Source
.Length
);
1641 (Source
: in Bounded_Wide_String
;
1642 Mapping
: in Wide_Maps
.Wide_Character_Mapping
)
1643 return Bounded_Wide_String
1645 Result
: Bounded_Wide_String
;
1648 Result
.Length
:= Source
.Length
;
1650 for J
in 1 .. Source
.Length
loop
1651 Result
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1658 (Source
: in out Bounded_Wide_String
;
1659 Mapping
: in Wide_Maps
.Wide_Character_Mapping
)
1662 for J
in 1 .. Source
.Length
loop
1663 Source
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1668 (Source
: in Bounded_Wide_String
;
1669 Mapping
: in Wide_Maps
.Wide_Character_Mapping_Function
)
1670 return Bounded_Wide_String
1672 Result
: Bounded_Wide_String
;
1675 Result
.Length
:= Source
.Length
;
1677 for J
in 1 .. Source
.Length
loop
1678 Result
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1685 (Source
: in out Bounded_Wide_String
;
1686 Mapping
: in Wide_Maps
.Wide_Character_Mapping_Function
)
1689 for J
in 1 .. Source
.Length
loop
1690 Source
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1699 (Source
: in Bounded_Wide_String
;
1701 return Bounded_Wide_String
1703 Result
: Bounded_Wide_String
;
1704 Last
: Natural := Source
.Length
;
1705 First
: Positive := 1;
1708 if Side
= Left
or else Side
= Both
then
1709 while First
<= Last
and then Source
.Data
(First
) = ' ' loop
1714 if Side
= Right
or else Side
= Both
then
1715 while Last
>= First
and then Source
.Data
(Last
) = ' ' loop
1720 Result
.Length
:= Last
- First
+ 1;
1721 Result
.Data
(1 .. Result
.Length
) := Source
.Data
(First
.. Last
);
1727 (Source
: in out Bounded_Wide_String
;
1730 Last
: Length_Range
:= Source
.Length
;
1731 First
: Positive := 1;
1732 Temp
: Wide_String (1 .. Max_Length
);
1735 Temp
(1 .. Last
) := Source
.Data
(1 .. Last
);
1737 if Side
= Left
or else Side
= Both
then
1738 while First
<= Last
and then Temp
(First
) = ' ' loop
1743 if Side
= Right
or else Side
= Both
then
1744 while Last
>= First
and then Temp
(Last
) = ' ' loop
1749 Source
.Length
:= Last
- First
+ 1;
1750 Source
.Data
(1 .. Source
.Length
) := Temp
(First
.. Last
);
1755 (Source
: in Bounded_Wide_String
;
1756 Left
: in Wide_Maps
.Wide_Character_Set
;
1757 Right
: in Wide_Maps
.Wide_Character_Set
)
1758 return Bounded_Wide_String
1760 Result
: Bounded_Wide_String
;
1763 for First
in 1 .. Source
.Length
loop
1764 if not Is_In
(Source
.Data
(First
), Left
) then
1765 for Last
in reverse First
.. Source
.Length
loop
1766 if not Is_In
(Source
.Data
(Last
), Right
) then
1767 Result
.Length
:= Last
- First
+ 1;
1768 Result
.Data
(1 .. Result
.Length
) :=
1769 Source
.Data
(First
.. Last
);
1781 (Source
: in out Bounded_Wide_String
;
1782 Left
: in Wide_Maps
.Wide_Character_Set
;
1783 Right
: in Wide_Maps
.Wide_Character_Set
)
1786 for First
in 1 .. Source
.Length
loop
1787 if not Is_In
(Source
.Data
(First
), Left
) then
1788 for Last
in reverse First
.. Source
.Length
loop
1789 if not Is_In
(Source
.Data
(Last
), Right
) then
1791 Source
.Length
:= Last
;
1794 Source
.Length
:= Last
- First
+ 1;
1795 Source
.Data
(1 .. Source
.Length
) :=
1796 Source
.Data
(First
.. Last
);
1810 end Generic_Bounded_Length
;
1812 end Ada
.Strings
.Wide_Bounded
;