1 ------------------------------------------------------------------------------
3 -- GNAT RUN-TIME COMPONENTS --
5 -- A D A . S T R I N G S . W I D E _ S U P E R B O U N D E D --
9 -- Copyright (C) 2003-2023, 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_Maps
; use Ada
.Strings
.Wide_Maps
;
33 with Ada
.Strings
.Wide_Search
;
35 package body Ada
.Strings
.Wide_Superbounded
is
43 Right
: Super_String
) return Super_String
46 return Result
: Super_String
(Left
.Max_Length
) do
48 Llen
: constant Natural := Left
.Current_Length
;
49 Rlen
: constant Natural := Right
.Current_Length
;
50 Nlen
: constant Natural := Llen
+ Rlen
;
53 if Nlen
> Left
.Max_Length
then
54 raise Ada
.Strings
.Length_Error
;
56 Result
.Current_Length
:= Nlen
;
57 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
58 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
66 Right
: Wide_String) return Super_String
69 return Result
: Super_String
(Left
.Max_Length
) do
71 Llen
: constant Natural := Left
.Current_Length
;
72 Nlen
: constant Natural := Llen
+ Right
'Length;
75 if Nlen
> Left
.Max_Length
then
76 raise Ada
.Strings
.Length_Error
;
78 Result
.Current_Length
:= Nlen
;
79 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
80 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
88 Right
: Super_String
) return Super_String
91 return Result
: Super_String
(Right
.Max_Length
) do
93 Llen
: constant Natural := Left
'Length;
94 Rlen
: constant Natural := Right
.Current_Length
;
95 Nlen
: constant Natural := Llen
+ Rlen
;
98 if Nlen
> Right
.Max_Length
then
99 raise Ada
.Strings
.Length_Error
;
101 Result
.Current_Length
:= Nlen
;
102 Result
.Data
(1 .. Llen
) := Left
;
103 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
110 (Left
: Super_String
;
111 Right
: Wide_Character) return Super_String
114 return Result
: Super_String
(Left
.Max_Length
) do
116 Llen
: constant Natural := Left
.Current_Length
;
119 if Llen
= Left
.Max_Length
then
120 raise Ada
.Strings
.Length_Error
;
122 Result
.Current_Length
:= Llen
+ 1;
123 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
124 Result
.Data
(Result
.Current_Length
) := Right
;
131 (Left
: Wide_Character;
132 Right
: Super_String
) return Super_String
135 return Result
: Super_String
(Right
.Max_Length
) do
137 Rlen
: constant Natural := Right
.Current_Length
;
140 if Rlen
= Right
.Max_Length
then
141 raise Ada
.Strings
.Length_Error
;
143 Result
.Current_Length
:= Rlen
+ 1;
144 Result
.Data
(1) := Left
;
145 Result
.Data
(2 .. Result
.Current_Length
) :=
146 Right
.Data
(1 .. Rlen
);
157 (Left
: Super_String
;
158 Right
: Super_String
) return Boolean
161 return Left
.Current_Length
= Right
.Current_Length
162 and then Left
.Data
(1 .. Left
.Current_Length
) =
163 Right
.Data
(1 .. Right
.Current_Length
);
167 (Left
: Super_String
;
168 Right
: Wide_String) return Boolean
171 return Left
.Current_Length
= Right
'Length
172 and then Left
.Data
(1 .. Left
.Current_Length
) = Right
;
177 Right
: Super_String
) return Boolean
180 return Left
'Length = Right
.Current_Length
181 and then Left
= Right
.Data
(1 .. Right
.Current_Length
);
189 (Left
: Super_String
;
190 Right
: Super_String
) return Boolean
193 return Left
.Data
(1 .. Left
.Current_Length
) >
194 Right
.Data
(1 .. Right
.Current_Length
);
198 (Left
: Super_String
;
199 Right
: Wide_String) return Boolean
202 return Left
.Data
(1 .. Left
.Current_Length
) > Right
;
207 Right
: Super_String
) return Boolean
210 return Left
> Right
.Data
(1 .. Right
.Current_Length
);
213 ----------------------
214 -- Greater_Or_Equal --
215 ----------------------
217 function Greater_Or_Equal
218 (Left
: Super_String
;
219 Right
: Super_String
) return Boolean
222 return Left
.Data
(1 .. Left
.Current_Length
) >=
223 Right
.Data
(1 .. Right
.Current_Length
);
224 end Greater_Or_Equal
;
226 function Greater_Or_Equal
227 (Left
: Super_String
;
228 Right
: Wide_String) return Boolean
231 return Left
.Data
(1 .. Left
.Current_Length
) >= Right
;
232 end Greater_Or_Equal
;
234 function Greater_Or_Equal
236 Right
: Super_String
) return Boolean
239 return Left
>= Right
.Data
(1 .. Right
.Current_Length
);
240 end Greater_Or_Equal
;
247 (Left
: Super_String
;
248 Right
: Super_String
) return Boolean
251 return Left
.Data
(1 .. Left
.Current_Length
) <
252 Right
.Data
(1 .. Right
.Current_Length
);
256 (Left
: Super_String
;
257 Right
: Wide_String) return Boolean
260 return Left
.Data
(1 .. Left
.Current_Length
) < Right
;
265 Right
: Super_String
) return Boolean
268 return Left
< Right
.Data
(1 .. Right
.Current_Length
);
275 function Less_Or_Equal
276 (Left
: Super_String
;
277 Right
: Super_String
) return Boolean
280 return Left
.Data
(1 .. Left
.Current_Length
) <=
281 Right
.Data
(1 .. Right
.Current_Length
);
284 function Less_Or_Equal
285 (Left
: Super_String
;
286 Right
: Wide_String) return Boolean
289 return Left
.Data
(1 .. Left
.Current_Length
) <= Right
;
292 function Less_Or_Equal
294 Right
: Super_String
) return Boolean
297 return Left
<= Right
.Data
(1 .. Right
.Current_Length
);
305 (S
: in out Ada
.Strings
.Text_Buffers
.Root_Buffer_Type
'Class;
306 Source
: Super_String
) is
308 Wide_String'Put_Image (S
, Super_To_String
(Source
));
311 ----------------------
312 -- Set_Super_String --
313 ----------------------
315 procedure Set_Super_String
316 (Target
: out Super_String
;
317 Source
: Wide_String;
318 Drop
: Truncation
:= Error
)
320 Slen
: constant Natural := Source
'Length;
321 Max_Length
: constant Positive := Target
.Max_Length
;
324 if Slen
<= Max_Length
then
325 Target
.Current_Length
:= Slen
;
326 Target
.Data
(1 .. Slen
) := Source
;
330 when Strings
.Right
=>
331 Target
.Current_Length
:= Max_Length
;
332 Target
.Data
(1 .. Max_Length
) :=
333 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
336 Target
.Current_Length
:= Max_Length
;
337 Target
.Data
(1 .. Max_Length
) :=
338 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
340 when Strings
.Error
=>
341 raise Ada
.Strings
.Length_Error
;
344 end Set_Super_String
;
350 -- Case of Super_String and Super_String
352 function Super_Append
353 (Left
: Super_String
;
354 Right
: Super_String
;
355 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
357 Max_Length
: constant Positive := Left
.Max_Length
;
358 Result
: Super_String
(Max_Length
);
359 Llen
: constant Natural := Left
.Current_Length
;
360 Rlen
: constant Natural := Right
.Current_Length
;
361 Nlen
: constant Natural := Llen
+ Rlen
;
364 if Nlen
<= Max_Length
then
365 Result
.Current_Length
:= Nlen
;
366 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
367 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
370 Result
.Current_Length
:= Max_Length
;
373 when Strings
.Right
=>
374 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
375 Result
.Data
:= Left
.Data
;
378 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
379 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
380 Right
.Data
(1 .. Max_Length
- Llen
);
384 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
385 Result
.Data
:= Right
.Data
;
388 Result
.Data
(1 .. Max_Length
- Rlen
) :=
389 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
390 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
391 Right
.Data
(1 .. Rlen
);
394 when Strings
.Error
=>
395 raise Ada
.Strings
.Length_Error
;
402 procedure Super_Append
403 (Source
: in out Super_String
;
404 New_Item
: Super_String
;
405 Drop
: Truncation
:= Error
)
407 Max_Length
: constant Positive := Source
.Max_Length
;
408 Llen
: constant Natural := Source
.Current_Length
;
409 Rlen
: constant Natural := New_Item
.Current_Length
;
410 Nlen
: constant Natural := Llen
+ Rlen
;
413 if Nlen
<= Max_Length
then
414 Source
.Current_Length
:= Nlen
;
415 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
.Data
(1 .. Rlen
);
418 Source
.Current_Length
:= Max_Length
;
421 when Strings
.Right
=>
422 if Llen
< Max_Length
then
423 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
424 New_Item
.Data
(1 .. Max_Length
- Llen
);
428 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
429 Source
.Data
:= New_Item
.Data
;
432 Source
.Data
(1 .. Max_Length
- Rlen
) :=
433 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
434 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
435 New_Item
.Data
(1 .. Rlen
);
438 when Strings
.Error
=>
439 raise Ada
.Strings
.Length_Error
;
445 -- Case of Super_String and Wide_String
447 function Super_Append
448 (Left
: Super_String
;
450 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
452 Max_Length
: constant Positive := Left
.Max_Length
;
453 Result
: Super_String
(Max_Length
);
454 Llen
: constant Natural := Left
.Current_Length
;
455 Rlen
: constant Natural := Right
'Length;
456 Nlen
: constant Natural := Llen
+ Rlen
;
459 if Nlen
<= Max_Length
then
460 Result
.Current_Length
:= Nlen
;
461 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
462 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
465 Result
.Current_Length
:= Max_Length
;
468 when Strings
.Right
=>
469 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
470 Result
.Data
:= Left
.Data
;
473 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
474 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
475 Right
(Right
'First .. Right
'First - 1 +
481 if Rlen
>= Max_Length
then
482 Result
.Data
(1 .. Max_Length
) :=
483 Right
(Right
'Last - (Max_Length
- 1) .. Right
'Last);
486 Result
.Data
(1 .. Max_Length
- Rlen
) :=
487 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
488 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
492 when Strings
.Error
=>
493 raise Ada
.Strings
.Length_Error
;
500 procedure Super_Append
501 (Source
: in out Super_String
;
502 New_Item
: Wide_String;
503 Drop
: Truncation
:= Error
)
505 Max_Length
: constant Positive := Source
.Max_Length
;
506 Llen
: constant Natural := Source
.Current_Length
;
507 Rlen
: constant Natural := New_Item
'Length;
508 Nlen
: constant Natural := Llen
+ Rlen
;
511 if Nlen
<= Max_Length
then
512 Source
.Current_Length
:= Nlen
;
513 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
;
516 Source
.Current_Length
:= Max_Length
;
519 when Strings
.Right
=>
520 if Llen
< Max_Length
then
521 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
522 New_Item
(New_Item
'First ..
523 New_Item
'First - 1 + Max_Length
- Llen
);
527 if Rlen
>= Max_Length
then
528 Source
.Data
(1 .. Max_Length
) :=
529 New_Item
(New_Item
'Last - (Max_Length
- 1) ..
533 Source
.Data
(1 .. Max_Length
- Rlen
) :=
534 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
535 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
539 when Strings
.Error
=>
540 raise Ada
.Strings
.Length_Error
;
546 -- Case of Wide_String and Super_String
548 function Super_Append
550 Right
: Super_String
;
551 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
553 Max_Length
: constant Positive := Right
.Max_Length
;
554 Result
: Super_String
(Max_Length
);
555 Llen
: constant Natural := Left
'Length;
556 Rlen
: constant Natural := Right
.Current_Length
;
557 Nlen
: constant Natural := Llen
+ Rlen
;
560 if Nlen
<= Max_Length
then
561 Result
.Current_Length
:= Nlen
;
562 Result
.Data
(1 .. Llen
) := Left
;
563 Result
.Data
(Llen
+ 1 .. Llen
+ Rlen
) := Right
.Data
(1 .. Rlen
);
566 Result
.Current_Length
:= Max_Length
;
569 when Strings
.Right
=>
570 if Llen
>= Max_Length
then
571 Result
.Data
(1 .. Max_Length
) :=
572 Left
(Left
'First .. Left
'First + (Max_Length
- 1));
575 Result
.Data
(1 .. Llen
) := Left
;
576 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
577 Right
.Data
(1 .. Max_Length
- Llen
);
581 if Rlen
>= Max_Length
then
582 Result
.Data
(1 .. Max_Length
) :=
583 Right
.Data
(Rlen
- (Max_Length
- 1) .. Rlen
);
586 Result
.Data
(1 .. Max_Length
- Rlen
) :=
587 Left
(Left
'Last - (Max_Length
- Rlen
- 1) .. Left
'Last);
588 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
589 Right
.Data
(1 .. Rlen
);
592 when Strings
.Error
=>
593 raise Ada
.Strings
.Length_Error
;
600 -- Case of Super_String and Wide_Character
602 function Super_Append
603 (Left
: Super_String
;
604 Right
: Wide_Character;
605 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
607 Max_Length
: constant Positive := Left
.Max_Length
;
608 Result
: Super_String
(Max_Length
);
609 Llen
: constant Natural := Left
.Current_Length
;
612 if Llen
< Max_Length
then
613 Result
.Current_Length
:= Llen
+ 1;
614 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
615 Result
.Data
(Llen
+ 1) := Right
;
620 when Strings
.Right
=>
624 Result
.Current_Length
:= Max_Length
;
625 Result
.Data
(1 .. Max_Length
- 1) :=
626 Left
.Data
(2 .. Max_Length
);
627 Result
.Data
(Max_Length
) := Right
;
630 when Strings
.Error
=>
631 raise Ada
.Strings
.Length_Error
;
636 procedure Super_Append
637 (Source
: in out Super_String
;
638 New_Item
: Wide_Character;
639 Drop
: Truncation
:= Error
)
641 Max_Length
: constant Positive := Source
.Max_Length
;
642 Llen
: constant Natural := Source
.Current_Length
;
645 if Llen
< Max_Length
then
646 Source
.Current_Length
:= Llen
+ 1;
647 Source
.Data
(Llen
+ 1) := New_Item
;
650 Source
.Current_Length
:= Max_Length
;
653 when Strings
.Right
=>
657 Source
.Data
(1 .. Max_Length
- 1) :=
658 Source
.Data
(2 .. Max_Length
);
659 Source
.Data
(Max_Length
) := New_Item
;
661 when Strings
.Error
=>
662 raise Ada
.Strings
.Length_Error
;
668 -- Case of Wide_Character and Super_String
670 function Super_Append
671 (Left
: Wide_Character;
672 Right
: Super_String
;
673 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
675 Max_Length
: constant Positive := Right
.Max_Length
;
676 Result
: Super_String
(Max_Length
);
677 Rlen
: constant Natural := Right
.Current_Length
;
680 if Rlen
< Max_Length
then
681 Result
.Current_Length
:= Rlen
+ 1;
682 Result
.Data
(1) := Left
;
683 Result
.Data
(2 .. Rlen
+ 1) := Right
.Data
(1 .. Rlen
);
688 when Strings
.Right
=>
689 Result
.Current_Length
:= Max_Length
;
690 Result
.Data
(1) := Left
;
691 Result
.Data
(2 .. Max_Length
) :=
692 Right
.Data
(1 .. Max_Length
- 1);
698 when Strings
.Error
=>
699 raise Ada
.Strings
.Length_Error
;
709 (Source
: Super_String
;
710 Pattern
: Wide_String;
711 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
717 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
721 (Source
: Super_String
;
722 Pattern
: Wide_String;
723 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
728 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
732 (Source
: Super_String
;
733 Set
: Wide_Maps
.Wide_Character_Set
) return Natural
736 return Wide_Search
.Count
(Source
.Data
(1 .. Source
.Current_Length
), Set
);
743 function Super_Delete
744 (Source
: Super_String
;
746 Through
: Natural) return Super_String
748 Result
: Super_String
(Source
.Max_Length
);
749 Slen
: constant Natural := Source
.Current_Length
;
750 Num_Delete
: constant Integer := Through
- From
+ 1;
753 if Num_Delete
<= 0 then
756 elsif From
> Slen
+ 1 then
757 raise Ada
.Strings
.Index_Error
;
759 elsif Through
>= Slen
then
760 Result
.Current_Length
:= From
- 1;
761 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
765 Result
.Current_Length
:= Slen
- Num_Delete
;
766 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
767 Result
.Data
(From
.. Result
.Current_Length
) :=
768 Source
.Data
(Through
+ 1 .. Slen
);
773 procedure Super_Delete
774 (Source
: in out Super_String
;
778 Slen
: constant Natural := Source
.Current_Length
;
779 Num_Delete
: constant Integer := Through
- From
+ 1;
782 if Num_Delete
<= 0 then
785 elsif From
> Slen
+ 1 then
786 raise Ada
.Strings
.Index_Error
;
788 elsif Through
>= Slen
then
789 Source
.Current_Length
:= From
- 1;
792 Source
.Current_Length
:= Slen
- Num_Delete
;
793 Source
.Data
(From
.. Source
.Current_Length
) :=
794 Source
.Data
(Through
+ 1 .. Slen
);
802 function Super_Element
803 (Source
: Super_String
;
804 Index
: Positive) return Wide_Character
807 if Index
<= Source
.Current_Length
then
808 return Source
.Data
(Index
);
810 raise Strings
.Index_Error
;
814 ----------------------
815 -- Super_Find_Token --
816 ----------------------
818 procedure Super_Find_Token
819 (Source
: Super_String
;
820 Set
: Wide_Maps
.Wide_Character_Set
;
822 Test
: Strings
.Membership
;
823 First
: out Positive;
827 Wide_Search
.Find_Token
828 (Source
.Data
(From
.. Source
.Current_Length
), Set
, Test
, First
, Last
);
829 end Super_Find_Token
;
831 procedure Super_Find_Token
832 (Source
: Super_String
;
833 Set
: Wide_Maps
.Wide_Character_Set
;
834 Test
: Strings
.Membership
;
835 First
: out Positive;
839 Wide_Search
.Find_Token
840 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, First
, Last
);
841 end Super_Find_Token
;
848 (Source
: Super_String
;
850 Pad
: Wide_Character := Wide_Space
;
851 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
853 Max_Length
: constant Positive := Source
.Max_Length
;
854 Result
: Super_String
(Max_Length
);
855 Slen
: constant Natural := Source
.Current_Length
;
856 Npad
: constant Integer := Count
- Slen
;
860 Result
.Current_Length
:= Count
;
861 Result
.Data
(1 .. Count
) := Source
.Data
(1 .. Count
);
863 elsif Count
<= Max_Length
then
864 Result
.Current_Length
:= Count
;
865 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
866 Result
.Data
(Slen
+ 1 .. Count
) := [others => Pad
];
869 Result
.Current_Length
:= Max_Length
;
872 when Strings
.Right
=>
873 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
874 Result
.Data
(Slen
+ 1 .. Max_Length
) := [others => Pad
];
877 if Npad
>= Max_Length
then
878 Result
.Data
:= [others => Pad
];
881 Result
.Data
(1 .. Max_Length
- Npad
) :=
882 Source
.Data
(Count
- Max_Length
+ 1 .. Slen
);
883 Result
.Data
(Max_Length
- Npad
+ 1 .. Max_Length
) :=
887 when Strings
.Error
=>
888 raise Ada
.Strings
.Length_Error
;
896 (Source
: in out Super_String
;
898 Pad
: Wide_Character := Wide_Space
;
899 Drop
: Truncation
:= Error
)
901 Max_Length
: constant Positive := Source
.Max_Length
;
902 Slen
: constant Natural := Source
.Current_Length
;
903 Npad
: constant Integer := Count
- Slen
;
904 Temp
: Wide_String (1 .. Max_Length
);
908 Source
.Current_Length
:= Count
;
910 elsif Count
<= Max_Length
then
911 Source
.Current_Length
:= Count
;
912 Source
.Data
(Slen
+ 1 .. Count
) := [others => Pad
];
915 Source
.Current_Length
:= Max_Length
;
918 when Strings
.Right
=>
919 Source
.Data
(Slen
+ 1 .. Max_Length
) := [others => Pad
];
922 if Npad
> Max_Length
then
923 Source
.Data
:= [others => Pad
];
927 Source
.Data
(1 .. Max_Length
- Npad
) :=
928 Temp
(Count
- Max_Length
+ 1 .. Slen
);
930 for J
in Max_Length
- Npad
+ 1 .. Max_Length
loop
931 Source
.Data
(J
) := Pad
;
935 when Strings
.Error
=>
936 raise Ada
.Strings
.Length_Error
;
946 (Source
: Super_String
;
947 Pattern
: Wide_String;
948 Going
: Strings
.Direction
:= Strings
.Forward
;
949 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
953 return Wide_Search
.Index
954 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
958 (Source
: Super_String
;
959 Pattern
: Wide_String;
960 Going
: Direction
:= Forward
;
961 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
964 return Wide_Search
.Index
965 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
969 (Source
: Super_String
;
970 Set
: Wide_Maps
.Wide_Character_Set
;
971 Test
: Strings
.Membership
:= Strings
.Inside
;
972 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
975 return Wide_Search
.Index
976 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, Going
);
980 (Source
: Super_String
;
981 Pattern
: Wide_String;
983 Going
: Direction
:= Forward
;
984 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
988 return Wide_Search
.Index
989 (Source
.Data
(1 .. Source
.Current_Length
),
990 Pattern
, From
, Going
, Mapping
);
994 (Source
: Super_String
;
995 Pattern
: Wide_String;
997 Going
: Direction
:= Forward
;
998 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
1001 return Wide_Search
.Index
1002 (Source
.Data
(1 .. Source
.Current_Length
),
1003 Pattern
, From
, Going
, Mapping
);
1006 function Super_Index
1007 (Source
: Super_String
;
1008 Set
: Wide_Maps
.Wide_Character_Set
;
1010 Test
: Membership
:= Inside
;
1011 Going
: Direction
:= Forward
) return Natural
1014 return Wide_Search
.Index
1015 (Source
.Data
(1 .. Source
.Current_Length
), Set
, From
, Test
, Going
);
1018 ---------------------------
1019 -- Super_Index_Non_Blank --
1020 ---------------------------
1022 function Super_Index_Non_Blank
1023 (Source
: Super_String
;
1024 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
1028 Wide_Search
.Index_Non_Blank
1029 (Source
.Data
(1 .. Source
.Current_Length
), Going
);
1030 end Super_Index_Non_Blank
;
1032 function Super_Index_Non_Blank
1033 (Source
: Super_String
;
1035 Going
: Direction
:= Forward
) return Natural
1039 Wide_Search
.Index_Non_Blank
1040 (Source
.Data
(1 .. Source
.Current_Length
), From
, Going
);
1041 end Super_Index_Non_Blank
;
1047 function Super_Insert
1048 (Source
: Super_String
;
1050 New_Item
: Wide_String;
1051 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1053 Max_Length
: constant Positive := Source
.Max_Length
;
1054 Result
: Super_String
(Max_Length
);
1055 Slen
: constant Natural := Source
.Current_Length
;
1056 Nlen
: constant Natural := New_Item
'Length;
1057 Tlen
: constant Natural := Slen
+ Nlen
;
1058 Blen
: constant Natural := Before
- 1;
1059 Alen
: constant Integer := Slen
- Blen
;
1060 Droplen
: constant Integer := Tlen
- Max_Length
;
1062 -- Tlen is the length of the total string before possible truncation.
1063 -- Blen, Alen are the lengths of the before and after pieces of the
1068 raise Ada
.Strings
.Index_Error
;
1070 elsif Droplen
<= 0 then
1071 Result
.Current_Length
:= Tlen
;
1072 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1073 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1074 Result
.Data
(Before
+ Nlen
.. Tlen
) :=
1075 Source
.Data
(Before
.. Slen
);
1078 Result
.Current_Length
:= Max_Length
;
1081 when Strings
.Right
=>
1082 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1084 if Droplen
> Alen
then
1085 Result
.Data
(Before
.. Max_Length
) :=
1086 New_Item
(New_Item
'First
1087 .. New_Item
'First + Max_Length
- Before
);
1089 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1090 Result
.Data
(Before
+ Nlen
.. Max_Length
) :=
1091 Source
.Data
(Before
.. Slen
- Droplen
);
1094 when Strings
.Left
=>
1095 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1096 Source
.Data
(Before
.. Slen
);
1098 if Droplen
>= Blen
then
1099 Result
.Data
(1 .. Max_Length
- Alen
) :=
1100 New_Item
(New_Item
'Last - (Max_Length
- Alen
) + 1
1104 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) :=
1106 Result
.Data
(1 .. Blen
- Droplen
) :=
1107 Source
.Data
(Droplen
+ 1 .. Blen
);
1110 when Strings
.Error
=>
1111 raise Ada
.Strings
.Length_Error
;
1118 procedure Super_Insert
1119 (Source
: in out Super_String
;
1121 New_Item
: Wide_String;
1122 Drop
: Strings
.Truncation
:= Strings
.Error
)
1125 -- We do a double copy here because this is one of the situations
1126 -- in which we move data to the right, and at least at the moment,
1127 -- GNAT is not handling such cases correctly ???
1129 Source
:= Super_Insert
(Source
, Before
, New_Item
, Drop
);
1136 function Super_Length
(Source
: Super_String
) return Natural is
1138 return Source
.Current_Length
;
1141 ---------------------
1142 -- Super_Overwrite --
1143 ---------------------
1145 function Super_Overwrite
1146 (Source
: Super_String
;
1147 Position
: Positive;
1148 New_Item
: Wide_String;
1149 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1151 Max_Length
: constant Positive := Source
.Max_Length
;
1152 Result
: Super_String
(Max_Length
);
1153 Endpos
: constant Natural := Position
+ New_Item
'Length - 1;
1154 Slen
: constant Natural := Source
.Current_Length
;
1158 if Position
> Slen
+ 1 then
1159 raise Ada
.Strings
.Index_Error
;
1161 elsif New_Item
'Length = 0 then
1164 elsif Endpos
<= Slen
then
1165 Result
.Current_Length
:= Source
.Current_Length
;
1166 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
1167 Result
.Data
(Position
.. Endpos
) := New_Item
;
1170 elsif Endpos
<= Max_Length
then
1171 Result
.Current_Length
:= Endpos
;
1172 Result
.Data
(1 .. Position
- 1) := Source
.Data
(1 .. Position
- 1);
1173 Result
.Data
(Position
.. Endpos
) := New_Item
;
1177 Result
.Current_Length
:= Max_Length
;
1178 Droplen
:= Endpos
- Max_Length
;
1181 when Strings
.Right
=>
1182 Result
.Data
(1 .. Position
- 1) :=
1183 Source
.Data
(1 .. Position
- 1);
1185 Result
.Data
(Position
.. Max_Length
) :=
1186 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1189 when Strings
.Left
=>
1190 if New_Item
'Length >= Max_Length
then
1191 Result
.Data
(1 .. Max_Length
) :=
1192 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1197 Result
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1198 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1200 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1205 when Strings
.Error
=>
1206 raise Ada
.Strings
.Length_Error
;
1209 end Super_Overwrite
;
1211 procedure Super_Overwrite
1212 (Source
: in out Super_String
;
1213 Position
: Positive;
1214 New_Item
: Wide_String;
1215 Drop
: Strings
.Truncation
:= Strings
.Error
)
1217 Max_Length
: constant Positive := Source
.Max_Length
;
1218 Endpos
: constant Positive := Position
+ New_Item
'Length - 1;
1219 Slen
: constant Natural := Source
.Current_Length
;
1223 if Position
> Slen
+ 1 then
1224 raise Ada
.Strings
.Index_Error
;
1226 elsif Endpos
<= Slen
then
1227 Source
.Data
(Position
.. Endpos
) := New_Item
;
1229 elsif Endpos
<= Max_Length
then
1230 Source
.Data
(Position
.. Endpos
) := New_Item
;
1231 Source
.Current_Length
:= Endpos
;
1234 Source
.Current_Length
:= Max_Length
;
1235 Droplen
:= Endpos
- Max_Length
;
1238 when Strings
.Right
=>
1239 Source
.Data
(Position
.. Max_Length
) :=
1240 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1242 when Strings
.Left
=>
1243 if New_Item
'Length > Max_Length
then
1244 Source
.Data
(1 .. Max_Length
) :=
1245 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1249 Source
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1250 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1253 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1257 when Strings
.Error
=>
1258 raise Ada
.Strings
.Length_Error
;
1261 end Super_Overwrite
;
1263 ---------------------------
1264 -- Super_Replace_Element --
1265 ---------------------------
1267 procedure Super_Replace_Element
1268 (Source
: in out Super_String
;
1270 By
: Wide_Character)
1273 if Index
<= Source
.Current_Length
then
1274 Source
.Data
(Index
) := By
;
1276 raise Ada
.Strings
.Index_Error
;
1278 end Super_Replace_Element
;
1280 -------------------------
1281 -- Super_Replace_Slice --
1282 -------------------------
1284 function Super_Replace_Slice
1285 (Source
: Super_String
;
1289 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1291 Max_Length
: constant Positive := Source
.Max_Length
;
1292 Slen
: constant Natural := Source
.Current_Length
;
1295 if Low
> Slen
+ 1 then
1296 raise Strings
.Index_Error
;
1298 elsif High
< Low
then
1299 return Super_Insert
(Source
, Low
, By
, Drop
);
1303 Blen
: constant Natural := Natural'Max (0, Low
- 1);
1304 Alen
: constant Natural := Natural'Max (0, Slen
- High
);
1305 Tlen
: constant Natural := Blen
+ By
'Length + Alen
;
1306 Droplen
: constant Integer := Tlen
- Max_Length
;
1307 Result
: Super_String
(Max_Length
);
1309 -- Tlen is the total length of the result string before any
1310 -- truncation. Blen and Alen are the lengths of the pieces
1311 -- of the original string that end up in the result string
1312 -- before and after the replaced slice.
1315 if Droplen
<= 0 then
1316 Result
.Current_Length
:= Tlen
;
1317 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1318 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1319 Result
.Data
(Low
+ By
'Length .. Tlen
) :=
1320 Source
.Data
(High
+ 1 .. Slen
);
1323 Result
.Current_Length
:= Max_Length
;
1326 when Strings
.Right
=>
1327 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1329 if Droplen
> Alen
then
1330 Result
.Data
(Low
.. Max_Length
) :=
1331 By
(By
'First .. By
'First + Max_Length
- Low
);
1333 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1334 Result
.Data
(Low
+ By
'Length .. Max_Length
) :=
1335 Source
.Data
(High
+ 1 .. Slen
- Droplen
);
1338 when Strings
.Left
=>
1339 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1340 Source
.Data
(High
+ 1 .. Slen
);
1342 if Droplen
>= Blen
then
1343 Result
.Data
(1 .. Max_Length
- Alen
) :=
1344 By
(By
'Last - (Max_Length
- Alen
) + 1 .. By
'Last);
1347 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) := By
;
1348 Result
.Data
(1 .. Blen
- Droplen
) :=
1349 Source
.Data
(Droplen
+ 1 .. Blen
);
1352 when Strings
.Error
=>
1353 raise Ada
.Strings
.Length_Error
;
1360 end Super_Replace_Slice
;
1362 procedure Super_Replace_Slice
1363 (Source
: in out Super_String
;
1367 Drop
: Strings
.Truncation
:= Strings
.Error
)
1370 -- We do a double copy here because this is one of the situations
1371 -- in which we move data to the right, and at least at the moment,
1372 -- GNAT is not handling such cases correctly ???
1374 Source
:= Super_Replace_Slice
(Source
, Low
, High
, By
, Drop
);
1375 end Super_Replace_Slice
;
1377 ---------------------
1378 -- Super_Replicate --
1379 ---------------------
1381 function Super_Replicate
1383 Item
: Wide_Character;
1384 Drop
: Truncation
:= Error
;
1385 Max_Length
: Positive) return Super_String
1387 Result
: Super_String
(Max_Length
);
1390 if Count
<= Max_Length
then
1391 Result
.Current_Length
:= Count
;
1393 elsif Drop
= Strings
.Error
then
1394 raise Ada
.Strings
.Length_Error
;
1397 Result
.Current_Length
:= Max_Length
;
1400 Result
.Data
(1 .. Result
.Current_Length
) := [others => Item
];
1402 end Super_Replicate
;
1404 function Super_Replicate
1407 Drop
: Truncation
:= Error
;
1408 Max_Length
: Positive) return Super_String
1410 Length
: constant Integer := Count
* Item
'Length;
1411 Result
: Super_String
(Max_Length
);
1415 if Length
<= Max_Length
then
1416 Result
.Current_Length
:= Length
;
1421 for J
in 1 .. Count
loop
1422 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1423 Indx
:= Indx
+ Item
'Length;
1428 Result
.Current_Length
:= Max_Length
;
1431 when Strings
.Right
=>
1434 while Indx
+ Item
'Length <= Max_Length
+ 1 loop
1435 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1436 Indx
:= Indx
+ Item
'Length;
1439 Result
.Data
(Indx
.. Max_Length
) :=
1440 Item
(Item
'First .. Item
'First + Max_Length
- Indx
);
1442 when Strings
.Left
=>
1445 while Indx
- Item
'Length >= 1 loop
1446 Result
.Data
(Indx
- (Item
'Length - 1) .. Indx
) := Item
;
1447 Indx
:= Indx
- Item
'Length;
1450 Result
.Data
(1 .. Indx
) :=
1451 Item
(Item
'Last - Indx
+ 1 .. Item
'Last);
1453 when Strings
.Error
=>
1454 raise Ada
.Strings
.Length_Error
;
1459 end Super_Replicate
;
1461 function Super_Replicate
1463 Item
: Super_String
;
1464 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1470 Item
.Data
(1 .. Item
.Current_Length
),
1473 end Super_Replicate
;
1479 function Super_Slice
1480 (Source
: Super_String
;
1482 High
: Natural) return Wide_String
1485 -- Note: test of High > Length is in accordance with AI95-00128
1487 return R
: Wide_String (Low
.. High
) do
1488 if Low
> Source
.Current_Length
+ 1
1489 or else High
> Source
.Current_Length
1494 R
:= Source
.Data
(Low
.. High
);
1498 function Super_Slice
1499 (Source
: Super_String
;
1501 High
: Natural) return Super_String
1504 return Result
: Super_String
(Source
.Max_Length
) do
1505 if Low
> Source
.Current_Length
+ 1
1506 or else High
> Source
.Current_Length
1511 Result
.Current_Length
:= (if Low
> High
then 0 else High
- Low
+ 1);
1512 Result
.Data
(1 .. Result
.Current_Length
) := Source
.Data
(Low
.. High
);
1516 procedure Super_Slice
1517 (Source
: Super_String
;
1518 Target
: out Super_String
;
1523 if Low
> Source
.Current_Length
+ 1
1524 or else High
> Source
.Current_Length
1529 Target
.Current_Length
:= (if Low
> High
then 0 else High
- Low
+ 1);
1530 Target
.Data
(1 .. Target
.Current_Length
) := Source
.Data
(Low
.. High
);
1538 (Source
: Super_String
;
1540 Pad
: Wide_Character := Wide_Space
;
1541 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1543 Max_Length
: constant Positive := Source
.Max_Length
;
1544 Result
: Super_String
(Max_Length
);
1545 Slen
: constant Natural := Source
.Current_Length
;
1546 Npad
: constant Integer := Count
- Slen
;
1550 Result
.Current_Length
:= Count
;
1551 Result
.Data
(1 .. Count
) :=
1552 Source
.Data
(Slen
- (Count
- 1) .. Slen
);
1554 elsif Count
<= Max_Length
then
1555 Result
.Current_Length
:= Count
;
1556 Result
.Data
(1 .. Npad
) := [others => Pad
];
1557 Result
.Data
(Npad
+ 1 .. Count
) := Source
.Data
(1 .. Slen
);
1560 Result
.Current_Length
:= Max_Length
;
1563 when Strings
.Right
=>
1564 if Npad
>= Max_Length
then
1565 Result
.Data
:= [others => Pad
];
1568 Result
.Data
(1 .. Npad
) := [others => Pad
];
1569 Result
.Data
(Npad
+ 1 .. Max_Length
) :=
1570 Source
.Data
(1 .. Max_Length
- Npad
);
1573 when Strings
.Left
=>
1574 Result
.Data
(1 .. Max_Length
- Slen
) := [others => Pad
];
1575 Result
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1576 Source
.Data
(1 .. Slen
);
1578 when Strings
.Error
=>
1579 raise Ada
.Strings
.Length_Error
;
1586 procedure Super_Tail
1587 (Source
: in out Super_String
;
1589 Pad
: Wide_Character := Wide_Space
;
1590 Drop
: Truncation
:= Error
)
1592 Max_Length
: constant Positive := Source
.Max_Length
;
1593 Slen
: constant Natural := Source
.Current_Length
;
1594 Npad
: constant Integer := Count
- Slen
;
1596 Temp
: constant Wide_String (1 .. Max_Length
) := Source
.Data
;
1600 Source
.Current_Length
:= Count
;
1601 Source
.Data
(1 .. Count
) :=
1602 Temp
(Slen
- (Count
- 1) .. Slen
);
1604 elsif Count
<= Max_Length
then
1605 Source
.Current_Length
:= Count
;
1606 Source
.Data
(1 .. Npad
) := [others => Pad
];
1607 Source
.Data
(Npad
+ 1 .. Count
) := Temp
(1 .. Slen
);
1610 Source
.Current_Length
:= Max_Length
;
1613 when Strings
.Right
=>
1614 if Npad
>= Max_Length
then
1615 Source
.Data
:= [others => Pad
];
1618 Source
.Data
(1 .. Npad
) := [others => Pad
];
1619 Source
.Data
(Npad
+ 1 .. Max_Length
) :=
1620 Temp
(1 .. Max_Length
- Npad
);
1623 when Strings
.Left
=>
1624 for J
in 1 .. Max_Length
- Slen
loop
1625 Source
.Data
(J
) := Pad
;
1628 Source
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1631 when Strings
.Error
=>
1632 raise Ada
.Strings
.Length_Error
;
1637 ---------------------
1638 -- Super_To_String --
1639 ---------------------
1641 function Super_To_String
(Source
: Super_String
) return Wide_String is
1643 return R
: Wide_String (1 .. Source
.Current_Length
) do
1644 R
:= Source
.Data
(1 .. Source
.Current_Length
);
1646 end Super_To_String
;
1648 ---------------------
1649 -- Super_Translate --
1650 ---------------------
1652 function Super_Translate
1653 (Source
: Super_String
;
1654 Mapping
: Wide_Maps
.Wide_Character_Mapping
) return Super_String
1656 Result
: Super_String
(Source
.Max_Length
);
1659 Result
.Current_Length
:= Source
.Current_Length
;
1661 for J
in 1 .. Source
.Current_Length
loop
1662 Result
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1666 end Super_Translate
;
1668 procedure Super_Translate
1669 (Source
: in out Super_String
;
1670 Mapping
: Wide_Maps
.Wide_Character_Mapping
)
1673 for J
in 1 .. Source
.Current_Length
loop
1674 Source
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1676 end Super_Translate
;
1678 function Super_Translate
1679 (Source
: Super_String
;
1680 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Super_String
1682 Result
: Super_String
(Source
.Max_Length
);
1685 Result
.Current_Length
:= Source
.Current_Length
;
1687 for J
in 1 .. Source
.Current_Length
loop
1688 Result
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1692 end Super_Translate
;
1694 procedure Super_Translate
1695 (Source
: in out Super_String
;
1696 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
)
1699 for J
in 1 .. Source
.Current_Length
loop
1700 Source
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1702 end Super_Translate
;
1709 (Source
: Super_String
;
1710 Side
: Trim_End
) return Super_String
1712 Result
: Super_String
(Source
.Max_Length
);
1713 Last
: Natural := Source
.Current_Length
;
1714 First
: Positive := 1;
1717 if Side
= Left
or else Side
= Both
then
1718 while First
<= Last
and then Source
.Data
(First
) = ' ' loop
1723 if Side
= Right
or else Side
= Both
then
1724 while Last
>= First
and then Source
.Data
(Last
) = ' ' loop
1729 Result
.Current_Length
:= Last
- First
+ 1;
1730 Result
.Data
(1 .. Result
.Current_Length
) := Source
.Data
(First
.. Last
);
1734 procedure Super_Trim
1735 (Source
: in out Super_String
;
1738 Max_Length
: constant Positive := Source
.Max_Length
;
1739 Last
: Natural := Source
.Current_Length
;
1740 First
: Positive := 1;
1741 Temp
: Wide_String (1 .. Max_Length
);
1744 Temp
(1 .. Last
) := Source
.Data
(1 .. Last
);
1746 if Side
= Left
or else Side
= Both
then
1747 while First
<= Last
and then Temp
(First
) = ' ' loop
1752 if Side
= Right
or else Side
= Both
then
1753 while Last
>= First
and then Temp
(Last
) = ' ' loop
1758 Source
.Data
:= [others => Wide_NUL
];
1759 Source
.Current_Length
:= Last
- First
+ 1;
1760 Source
.Data
(1 .. Source
.Current_Length
) := Temp
(First
.. Last
);
1764 (Source
: Super_String
;
1765 Left
: Wide_Maps
.Wide_Character_Set
;
1766 Right
: Wide_Maps
.Wide_Character_Set
) return Super_String
1768 Result
: Super_String
(Source
.Max_Length
);
1771 for First
in 1 .. Source
.Current_Length
loop
1772 if not Is_In
(Source
.Data
(First
), Left
) then
1773 for Last
in reverse First
.. Source
.Current_Length
loop
1774 if not Is_In
(Source
.Data
(Last
), Right
) then
1775 Result
.Current_Length
:= Last
- First
+ 1;
1776 Result
.Data
(1 .. Result
.Current_Length
) :=
1777 Source
.Data
(First
.. Last
);
1784 Result
.Current_Length
:= 0;
1788 procedure Super_Trim
1789 (Source
: in out Super_String
;
1790 Left
: Wide_Maps
.Wide_Character_Set
;
1791 Right
: Wide_Maps
.Wide_Character_Set
)
1794 for First
in 1 .. Source
.Current_Length
loop
1795 if not Is_In
(Source
.Data
(First
), Left
) then
1796 for Last
in reverse First
.. Source
.Current_Length
loop
1797 if not Is_In
(Source
.Data
(Last
), Right
) then
1799 Source
.Current_Length
:= Last
;
1802 Source
.Current_Length
:= Last
- First
+ 1;
1803 Source
.Data
(1 .. Source
.Current_Length
) :=
1804 Source
.Data
(First
.. Last
);
1806 for J
in Source
.Current_Length
+ 1 ..
1809 Source
.Data
(J
) := Wide_NUL
;
1817 Source
.Current_Length
:= 0;
1822 Source
.Current_Length
:= 0;
1831 Right
: Wide_Character;
1832 Max_Length
: Positive) return Super_String
1834 Result
: Super_String
(Max_Length
);
1837 if Left
> Max_Length
then
1838 raise Ada
.Strings
.Length_Error
;
1841 Result
.Current_Length
:= Left
;
1843 for J
in 1 .. Left
loop
1844 Result
.Data
(J
) := Right
;
1853 Right
: Wide_String;
1854 Max_Length
: Positive) return Super_String
1856 Result
: Super_String
(Max_Length
);
1857 Pos
: Positive := 1;
1858 Rlen
: constant Natural := Right
'Length;
1859 Nlen
: constant Natural := Left
* Rlen
;
1862 if Nlen
> Max_Length
then
1863 raise Ada
.Strings
.Index_Error
;
1866 Result
.Current_Length
:= Nlen
;
1869 for J
in 1 .. Left
loop
1870 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) := Right
;
1881 Right
: Super_String
) return Super_String
1883 Result
: Super_String
(Right
.Max_Length
);
1884 Pos
: Positive := 1;
1885 Rlen
: constant Natural := Right
.Current_Length
;
1886 Nlen
: constant Natural := Left
* Rlen
;
1889 if Nlen
> Right
.Max_Length
then
1890 raise Ada
.Strings
.Length_Error
;
1893 Result
.Current_Length
:= Nlen
;
1896 for J
in 1 .. Left
loop
1897 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) :=
1898 Right
.Data
(1 .. Rlen
);
1907 ---------------------
1908 -- To_Super_String --
1909 ---------------------
1911 function To_Super_String
1912 (Source
: Wide_String;
1913 Max_Length
: Natural;
1914 Drop
: Truncation
:= Error
) return Super_String
1916 Result
: Super_String
(Max_Length
);
1917 Slen
: constant Natural := Source
'Length;
1920 if Slen
<= Max_Length
then
1921 Result
.Current_Length
:= Slen
;
1922 Result
.Data
(1 .. Slen
) := Source
;
1926 when Strings
.Right
=>
1927 Result
.Current_Length
:= Max_Length
;
1928 Result
.Data
(1 .. Max_Length
) :=
1929 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
1931 when Strings
.Left
=>
1932 Result
.Current_Length
:= Max_Length
;
1933 Result
.Data
(1 .. Max_Length
) :=
1934 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
1936 when Strings
.Error
=>
1937 raise Ada
.Strings
.Length_Error
;
1942 end To_Super_String
;
1944 end Ada
.Strings
.Wide_Superbounded
;