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
;