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-2010, 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
45 Result
: Super_String
(Left
.Max_Length
);
46 Llen
: constant Natural := Left
.Current_Length
;
47 Rlen
: constant Natural := Right
.Current_Length
;
48 Nlen
: constant Natural := Llen
+ Rlen
;
51 if Nlen
> Left
.Max_Length
then
52 raise Ada
.Strings
.Length_Error
;
54 Result
.Current_Length
:= Nlen
;
55 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
56 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
64 Right
: Wide_String) return Super_String
66 Result
: Super_String
(Left
.Max_Length
);
67 Llen
: constant Natural := Left
.Current_Length
;
69 Nlen
: constant Natural := Llen
+ Right
'Length;
72 if Nlen
> Left
.Max_Length
then
73 raise Ada
.Strings
.Length_Error
;
75 Result
.Current_Length
:= Nlen
;
76 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
77 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
84 Right
: Super_String
) return Super_String
86 Result
: Super_String
(Right
.Max_Length
);
87 Llen
: constant Natural := Left
'Length;
88 Rlen
: constant Natural := Right
.Current_Length
;
89 Nlen
: constant Natural := Llen
+ Rlen
;
92 if Nlen
> Right
.Max_Length
then
93 raise Ada
.Strings
.Length_Error
;
95 Result
.Current_Length
:= Nlen
;
96 Result
.Data
(1 .. Llen
) := Left
;
97 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
104 (Left
: Super_String
;
105 Right
: Wide_Character) return Super_String
107 Result
: Super_String
(Left
.Max_Length
);
108 Llen
: constant Natural := Left
.Current_Length
;
111 if Llen
= Left
.Max_Length
then
112 raise Ada
.Strings
.Length_Error
;
114 Result
.Current_Length
:= Llen
+ 1;
115 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
116 Result
.Data
(Result
.Current_Length
) := Right
;
123 (Left
: Wide_Character;
124 Right
: Super_String
) return Super_String
126 Result
: Super_String
(Right
.Max_Length
);
127 Rlen
: constant Natural := Right
.Current_Length
;
130 if Rlen
= Right
.Max_Length
then
131 raise Ada
.Strings
.Length_Error
;
133 Result
.Current_Length
:= Rlen
+ 1;
134 Result
.Data
(1) := Left
;
135 Result
.Data
(2 .. Result
.Current_Length
) := Right
.Data
(1 .. Rlen
);
146 (Left
: Super_String
;
147 Right
: Super_String
) return Boolean
150 return Left
.Current_Length
= Right
.Current_Length
151 and then Left
.Data
(1 .. Left
.Current_Length
) =
152 Right
.Data
(1 .. Right
.Current_Length
);
156 (Left
: Super_String
;
157 Right
: Wide_String) return Boolean
160 return Left
.Current_Length
= Right
'Length
161 and then Left
.Data
(1 .. Left
.Current_Length
) = Right
;
166 Right
: Super_String
) return Boolean
169 return Left
'Length = Right
.Current_Length
170 and then Left
= Right
.Data
(1 .. Right
.Current_Length
);
178 (Left
: Super_String
;
179 Right
: Super_String
) return Boolean
182 return Left
.Data
(1 .. Left
.Current_Length
) >
183 Right
.Data
(1 .. Right
.Current_Length
);
187 (Left
: Super_String
;
188 Right
: Wide_String) return Boolean
191 return Left
.Data
(1 .. Left
.Current_Length
) > Right
;
196 Right
: Super_String
) return Boolean
199 return Left
> Right
.Data
(1 .. Right
.Current_Length
);
202 ----------------------
203 -- Greater_Or_Equal --
204 ----------------------
206 function Greater_Or_Equal
207 (Left
: Super_String
;
208 Right
: Super_String
) return Boolean
211 return Left
.Data
(1 .. Left
.Current_Length
) >=
212 Right
.Data
(1 .. Right
.Current_Length
);
213 end Greater_Or_Equal
;
215 function Greater_Or_Equal
216 (Left
: Super_String
;
217 Right
: Wide_String) return Boolean
220 return Left
.Data
(1 .. Left
.Current_Length
) >= Right
;
221 end Greater_Or_Equal
;
223 function Greater_Or_Equal
225 Right
: Super_String
) return Boolean
228 return Left
>= Right
.Data
(1 .. Right
.Current_Length
);
229 end Greater_Or_Equal
;
236 (Left
: Super_String
;
237 Right
: Super_String
) return Boolean
240 return Left
.Data
(1 .. Left
.Current_Length
) <
241 Right
.Data
(1 .. Right
.Current_Length
);
245 (Left
: Super_String
;
246 Right
: Wide_String) return Boolean
249 return Left
.Data
(1 .. Left
.Current_Length
) < Right
;
254 Right
: Super_String
) return Boolean
257 return Left
< Right
.Data
(1 .. Right
.Current_Length
);
264 function Less_Or_Equal
265 (Left
: Super_String
;
266 Right
: Super_String
) return Boolean
269 return Left
.Data
(1 .. Left
.Current_Length
) <=
270 Right
.Data
(1 .. Right
.Current_Length
);
273 function Less_Or_Equal
274 (Left
: Super_String
;
275 Right
: Wide_String) return Boolean
278 return Left
.Data
(1 .. Left
.Current_Length
) <= Right
;
281 function Less_Or_Equal
283 Right
: Super_String
) return Boolean
286 return Left
<= Right
.Data
(1 .. Right
.Current_Length
);
289 ----------------------
290 -- Set_Super_String --
291 ----------------------
293 procedure Set_Super_String
294 (Target
: out Super_String
;
295 Source
: Wide_String;
296 Drop
: Truncation
:= Error
)
298 Slen
: constant Natural := Source
'Length;
299 Max_Length
: constant Positive := Target
.Max_Length
;
302 if Slen
<= Max_Length
then
303 Target
.Current_Length
:= Slen
;
304 Target
.Data
(1 .. Slen
) := Source
;
308 when Strings
.Right
=>
309 Target
.Current_Length
:= Max_Length
;
310 Target
.Data
(1 .. Max_Length
) :=
311 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
314 Target
.Current_Length
:= Max_Length
;
315 Target
.Data
(1 .. Max_Length
) :=
316 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
318 when Strings
.Error
=>
319 raise Ada
.Strings
.Length_Error
;
322 end Set_Super_String
;
328 -- Case of Super_String and Super_String
330 function Super_Append
331 (Left
: Super_String
;
332 Right
: Super_String
;
333 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
335 Max_Length
: constant Positive := Left
.Max_Length
;
336 Result
: Super_String
(Max_Length
);
337 Llen
: constant Natural := Left
.Current_Length
;
338 Rlen
: constant Natural := Right
.Current_Length
;
339 Nlen
: constant Natural := Llen
+ Rlen
;
342 if Nlen
<= Max_Length
then
343 Result
.Current_Length
:= Nlen
;
344 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
345 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
.Data
(1 .. Rlen
);
348 Result
.Current_Length
:= Max_Length
;
351 when Strings
.Right
=>
352 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
353 Result
.Data
:= Left
.Data
;
356 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
357 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
358 Right
.Data
(1 .. Max_Length
- Llen
);
362 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
363 Result
.Data
:= Right
.Data
;
366 Result
.Data
(1 .. Max_Length
- Rlen
) :=
367 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
368 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
369 Right
.Data
(1 .. Rlen
);
372 when Strings
.Error
=>
373 raise Ada
.Strings
.Length_Error
;
380 procedure Super_Append
381 (Source
: in out Super_String
;
382 New_Item
: Super_String
;
383 Drop
: Truncation
:= Error
)
385 Max_Length
: constant Positive := Source
.Max_Length
;
386 Llen
: constant Natural := Source
.Current_Length
;
387 Rlen
: constant Natural := New_Item
.Current_Length
;
388 Nlen
: constant Natural := Llen
+ Rlen
;
391 if Nlen
<= Max_Length
then
392 Source
.Current_Length
:= Nlen
;
393 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
.Data
(1 .. Rlen
);
396 Source
.Current_Length
:= Max_Length
;
399 when Strings
.Right
=>
400 if Llen
< Max_Length
then
401 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
402 New_Item
.Data
(1 .. Max_Length
- Llen
);
406 if Rlen
>= Max_Length
then -- only case is Rlen = Max_Length
407 Source
.Data
:= New_Item
.Data
;
410 Source
.Data
(1 .. Max_Length
- Rlen
) :=
411 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
412 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
413 New_Item
.Data
(1 .. Rlen
);
416 when Strings
.Error
=>
417 raise Ada
.Strings
.Length_Error
;
423 -- Case of Super_String and Wide_String
425 function Super_Append
426 (Left
: Super_String
;
428 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
430 Max_Length
: constant Positive := Left
.Max_Length
;
431 Result
: Super_String
(Max_Length
);
432 Llen
: constant Natural := Left
.Current_Length
;
433 Rlen
: constant Natural := Right
'Length;
434 Nlen
: constant Natural := Llen
+ Rlen
;
437 if Nlen
<= Max_Length
then
438 Result
.Current_Length
:= Nlen
;
439 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
440 Result
.Data
(Llen
+ 1 .. Nlen
) := Right
;
443 Result
.Current_Length
:= Max_Length
;
446 when Strings
.Right
=>
447 if Llen
>= Max_Length
then -- only case is Llen = Max_Length
448 Result
.Data
:= Left
.Data
;
451 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
452 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
453 Right
(Right
'First .. Right
'First - 1 +
459 if Rlen
>= Max_Length
then
460 Result
.Data
(1 .. Max_Length
) :=
461 Right
(Right
'Last - (Max_Length
- 1) .. Right
'Last);
464 Result
.Data
(1 .. Max_Length
- Rlen
) :=
465 Left
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
466 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
470 when Strings
.Error
=>
471 raise Ada
.Strings
.Length_Error
;
478 procedure Super_Append
479 (Source
: in out Super_String
;
480 New_Item
: Wide_String;
481 Drop
: Truncation
:= Error
)
483 Max_Length
: constant Positive := Source
.Max_Length
;
484 Llen
: constant Natural := Source
.Current_Length
;
485 Rlen
: constant Natural := New_Item
'Length;
486 Nlen
: constant Natural := Llen
+ Rlen
;
489 if Nlen
<= Max_Length
then
490 Source
.Current_Length
:= Nlen
;
491 Source
.Data
(Llen
+ 1 .. Nlen
) := New_Item
;
494 Source
.Current_Length
:= Max_Length
;
497 when Strings
.Right
=>
498 if Llen
< Max_Length
then
499 Source
.Data
(Llen
+ 1 .. Max_Length
) :=
500 New_Item
(New_Item
'First ..
501 New_Item
'First - 1 + Max_Length
- Llen
);
505 if Rlen
>= Max_Length
then
506 Source
.Data
(1 .. Max_Length
) :=
507 New_Item
(New_Item
'Last - (Max_Length
- 1) ..
511 Source
.Data
(1 .. Max_Length
- Rlen
) :=
512 Source
.Data
(Llen
- (Max_Length
- Rlen
- 1) .. Llen
);
513 Source
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
517 when Strings
.Error
=>
518 raise Ada
.Strings
.Length_Error
;
524 -- Case of Wide_String and Super_String
526 function Super_Append
528 Right
: Super_String
;
529 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
531 Max_Length
: constant Positive := Right
.Max_Length
;
532 Result
: Super_String
(Max_Length
);
533 Llen
: constant Natural := Left
'Length;
534 Rlen
: constant Natural := Right
.Current_Length
;
535 Nlen
: constant Natural := Llen
+ Rlen
;
538 if Nlen
<= Max_Length
then
539 Result
.Current_Length
:= Nlen
;
540 Result
.Data
(1 .. Llen
) := Left
;
541 Result
.Data
(Llen
+ 1 .. Llen
+ Rlen
) := Right
.Data
(1 .. Rlen
);
544 Result
.Current_Length
:= Max_Length
;
547 when Strings
.Right
=>
548 if Llen
>= Max_Length
then
549 Result
.Data
(1 .. Max_Length
) :=
550 Left
(Left
'First .. Left
'First + (Max_Length
- 1));
553 Result
.Data
(1 .. Llen
) := Left
;
554 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
555 Right
.Data
(1 .. Max_Length
- Llen
);
559 if Rlen
>= Max_Length
then
560 Result
.Data
(1 .. Max_Length
) :=
561 Right
.Data
(Rlen
- (Max_Length
- 1) .. Rlen
);
564 Result
.Data
(1 .. Max_Length
- Rlen
) :=
565 Left
(Left
'Last - (Max_Length
- Rlen
- 1) .. Left
'Last);
566 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
567 Right
.Data
(1 .. Rlen
);
570 when Strings
.Error
=>
571 raise Ada
.Strings
.Length_Error
;
578 -- Case of Super_String and Wide_Character
580 function Super_Append
581 (Left
: Super_String
;
582 Right
: Wide_Character;
583 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
585 Max_Length
: constant Positive := Left
.Max_Length
;
586 Result
: Super_String
(Max_Length
);
587 Llen
: constant Natural := Left
.Current_Length
;
590 if Llen
< Max_Length
then
591 Result
.Current_Length
:= Llen
+ 1;
592 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
593 Result
.Data
(Llen
+ 1) := Right
;
598 when Strings
.Right
=>
602 Result
.Current_Length
:= Max_Length
;
603 Result
.Data
(1 .. Max_Length
- 1) :=
604 Left
.Data
(2 .. Max_Length
);
605 Result
.Data
(Max_Length
) := Right
;
608 when Strings
.Error
=>
609 raise Ada
.Strings
.Length_Error
;
614 procedure Super_Append
615 (Source
: in out Super_String
;
616 New_Item
: Wide_Character;
617 Drop
: Truncation
:= Error
)
619 Max_Length
: constant Positive := Source
.Max_Length
;
620 Llen
: constant Natural := Source
.Current_Length
;
623 if Llen
< Max_Length
then
624 Source
.Current_Length
:= Llen
+ 1;
625 Source
.Data
(Llen
+ 1) := New_Item
;
628 Source
.Current_Length
:= Max_Length
;
631 when Strings
.Right
=>
635 Source
.Data
(1 .. Max_Length
- 1) :=
636 Source
.Data
(2 .. Max_Length
);
637 Source
.Data
(Max_Length
) := New_Item
;
639 when Strings
.Error
=>
640 raise Ada
.Strings
.Length_Error
;
646 -- Case of Wide_Character and Super_String
648 function Super_Append
649 (Left
: Wide_Character;
650 Right
: Super_String
;
651 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
653 Max_Length
: constant Positive := Right
.Max_Length
;
654 Result
: Super_String
(Max_Length
);
655 Rlen
: constant Natural := Right
.Current_Length
;
658 if Rlen
< Max_Length
then
659 Result
.Current_Length
:= Rlen
+ 1;
660 Result
.Data
(1) := Left
;
661 Result
.Data
(2 .. Rlen
+ 1) := Right
.Data
(1 .. Rlen
);
666 when Strings
.Right
=>
667 Result
.Current_Length
:= Max_Length
;
668 Result
.Data
(1) := Left
;
669 Result
.Data
(2 .. Max_Length
) :=
670 Right
.Data
(1 .. Max_Length
- 1);
676 when Strings
.Error
=>
677 raise Ada
.Strings
.Length_Error
;
687 (Source
: Super_String
;
688 Pattern
: Wide_String;
689 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
695 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
699 (Source
: Super_String
;
700 Pattern
: Wide_String;
701 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
706 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
710 (Source
: Super_String
;
711 Set
: Wide_Maps
.Wide_Character_Set
) return Natural
714 return Wide_Search
.Count
(Source
.Data
(1 .. Source
.Current_Length
), Set
);
721 function Super_Delete
722 (Source
: Super_String
;
724 Through
: Natural) return Super_String
726 Result
: Super_String
(Source
.Max_Length
);
727 Slen
: constant Natural := Source
.Current_Length
;
728 Num_Delete
: constant Integer := Through
- From
+ 1;
731 if Num_Delete
<= 0 then
734 elsif From
> Slen
+ 1 then
735 raise Ada
.Strings
.Index_Error
;
737 elsif Through
>= Slen
then
738 Result
.Current_Length
:= From
- 1;
739 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
743 Result
.Current_Length
:= Slen
- Num_Delete
;
744 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
745 Result
.Data
(From
.. Result
.Current_Length
) :=
746 Source
.Data
(Through
+ 1 .. Slen
);
751 procedure Super_Delete
752 (Source
: in out Super_String
;
756 Slen
: constant Natural := Source
.Current_Length
;
757 Num_Delete
: constant Integer := Through
- From
+ 1;
760 if Num_Delete
<= 0 then
763 elsif From
> Slen
+ 1 then
764 raise Ada
.Strings
.Index_Error
;
766 elsif Through
>= Slen
then
767 Source
.Current_Length
:= From
- 1;
770 Source
.Current_Length
:= Slen
- Num_Delete
;
771 Source
.Data
(From
.. Source
.Current_Length
) :=
772 Source
.Data
(Through
+ 1 .. Slen
);
780 function Super_Element
781 (Source
: Super_String
;
782 Index
: Positive) return Wide_Character
785 if Index
<= Source
.Current_Length
then
786 return Source
.Data
(Index
);
788 raise Strings
.Index_Error
;
792 ----------------------
793 -- Super_Find_Token --
794 ----------------------
796 procedure Super_Find_Token
797 (Source
: Super_String
;
798 Set
: Wide_Maps
.Wide_Character_Set
;
800 Test
: Strings
.Membership
;
801 First
: out Positive;
805 Wide_Search
.Find_Token
806 (Source
.Data
(From
.. Source
.Current_Length
), Set
, Test
, First
, Last
);
807 end Super_Find_Token
;
809 procedure Super_Find_Token
810 (Source
: Super_String
;
811 Set
: Wide_Maps
.Wide_Character_Set
;
812 Test
: Strings
.Membership
;
813 First
: out Positive;
817 Wide_Search
.Find_Token
818 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, First
, Last
);
819 end Super_Find_Token
;
826 (Source
: Super_String
;
828 Pad
: Wide_Character := Wide_Space
;
829 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
831 Max_Length
: constant Positive := Source
.Max_Length
;
832 Result
: Super_String
(Max_Length
);
833 Slen
: constant Natural := Source
.Current_Length
;
834 Npad
: constant Integer := Count
- Slen
;
838 Result
.Current_Length
:= Count
;
839 Result
.Data
(1 .. Count
) := Source
.Data
(1 .. Count
);
841 elsif Count
<= Max_Length
then
842 Result
.Current_Length
:= Count
;
843 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
844 Result
.Data
(Slen
+ 1 .. Count
) := (others => Pad
);
847 Result
.Current_Length
:= Max_Length
;
850 when Strings
.Right
=>
851 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
852 Result
.Data
(Slen
+ 1 .. Max_Length
) := (others => Pad
);
855 if Npad
>= Max_Length
then
856 Result
.Data
:= (others => Pad
);
859 Result
.Data
(1 .. Max_Length
- Npad
) :=
860 Source
.Data
(Count
- Max_Length
+ 1 .. Slen
);
861 Result
.Data
(Max_Length
- Npad
+ 1 .. Max_Length
) :=
865 when Strings
.Error
=>
866 raise Ada
.Strings
.Length_Error
;
874 (Source
: in out Super_String
;
876 Pad
: Wide_Character := Wide_Space
;
877 Drop
: Truncation
:= Error
)
879 Max_Length
: constant Positive := Source
.Max_Length
;
880 Slen
: constant Natural := Source
.Current_Length
;
881 Npad
: constant Integer := Count
- Slen
;
882 Temp
: Wide_String (1 .. Max_Length
);
886 Source
.Current_Length
:= Count
;
888 elsif Count
<= Max_Length
then
889 Source
.Current_Length
:= Count
;
890 Source
.Data
(Slen
+ 1 .. Count
) := (others => Pad
);
893 Source
.Current_Length
:= Max_Length
;
896 when Strings
.Right
=>
897 Source
.Data
(Slen
+ 1 .. Max_Length
) := (others => Pad
);
900 if Npad
> Max_Length
then
901 Source
.Data
:= (others => Pad
);
905 Source
.Data
(1 .. Max_Length
- Npad
) :=
906 Temp
(Count
- Max_Length
+ 1 .. Slen
);
908 for J
in Max_Length
- Npad
+ 1 .. Max_Length
loop
909 Source
.Data
(J
) := Pad
;
913 when Strings
.Error
=>
914 raise Ada
.Strings
.Length_Error
;
924 (Source
: Super_String
;
925 Pattern
: Wide_String;
926 Going
: Strings
.Direction
:= Strings
.Forward
;
927 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
931 return Wide_Search
.Index
932 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
936 (Source
: Super_String
;
937 Pattern
: Wide_String;
938 Going
: Direction
:= Forward
;
939 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
942 return Wide_Search
.Index
943 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
947 (Source
: Super_String
;
948 Set
: Wide_Maps
.Wide_Character_Set
;
949 Test
: Strings
.Membership
:= Strings
.Inside
;
950 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
953 return Wide_Search
.Index
954 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, Going
);
958 (Source
: Super_String
;
959 Pattern
: Wide_String;
961 Going
: Direction
:= Forward
;
962 Mapping
: Wide_Maps
.Wide_Character_Mapping
:= Wide_Maps
.Identity
)
966 return Wide_Search
.Index
967 (Source
.Data
(1 .. Source
.Current_Length
),
968 Pattern
, From
, Going
, Mapping
);
972 (Source
: Super_String
;
973 Pattern
: Wide_String;
975 Going
: Direction
:= Forward
;
976 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Natural
979 return Wide_Search
.Index
980 (Source
.Data
(1 .. Source
.Current_Length
),
981 Pattern
, From
, Going
, Mapping
);
985 (Source
: Super_String
;
986 Set
: Wide_Maps
.Wide_Character_Set
;
988 Test
: Membership
:= Inside
;
989 Going
: Direction
:= Forward
) return Natural
992 return Wide_Search
.Index
993 (Source
.Data
(1 .. Source
.Current_Length
), Set
, From
, Test
, Going
);
996 ---------------------------
997 -- Super_Index_Non_Blank --
998 ---------------------------
1000 function Super_Index_Non_Blank
1001 (Source
: Super_String
;
1002 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
1006 Wide_Search
.Index_Non_Blank
1007 (Source
.Data
(1 .. Source
.Current_Length
), Going
);
1008 end Super_Index_Non_Blank
;
1010 function Super_Index_Non_Blank
1011 (Source
: Super_String
;
1013 Going
: Direction
:= Forward
) return Natural
1017 Wide_Search
.Index_Non_Blank
1018 (Source
.Data
(1 .. Source
.Current_Length
), From
, Going
);
1019 end Super_Index_Non_Blank
;
1025 function Super_Insert
1026 (Source
: Super_String
;
1028 New_Item
: Wide_String;
1029 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1031 Max_Length
: constant Positive := Source
.Max_Length
;
1032 Result
: Super_String
(Max_Length
);
1033 Slen
: constant Natural := Source
.Current_Length
;
1034 Nlen
: constant Natural := New_Item
'Length;
1035 Tlen
: constant Natural := Slen
+ Nlen
;
1036 Blen
: constant Natural := Before
- 1;
1037 Alen
: constant Integer := Slen
- Blen
;
1038 Droplen
: constant Integer := Tlen
- Max_Length
;
1040 -- Tlen is the length of the total string before possible truncation.
1041 -- Blen, Alen are the lengths of the before and after pieces of the
1046 raise Ada
.Strings
.Index_Error
;
1048 elsif Droplen
<= 0 then
1049 Result
.Current_Length
:= Tlen
;
1050 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1051 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1052 Result
.Data
(Before
+ Nlen
.. Tlen
) :=
1053 Source
.Data
(Before
.. Slen
);
1056 Result
.Current_Length
:= Max_Length
;
1059 when Strings
.Right
=>
1060 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1062 if Droplen
> Alen
then
1063 Result
.Data
(Before
.. Max_Length
) :=
1064 New_Item
(New_Item
'First
1065 .. New_Item
'First + Max_Length
- Before
);
1067 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1068 Result
.Data
(Before
+ Nlen
.. Max_Length
) :=
1069 Source
.Data
(Before
.. Slen
- Droplen
);
1072 when Strings
.Left
=>
1073 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1074 Source
.Data
(Before
.. Slen
);
1076 if Droplen
>= Blen
then
1077 Result
.Data
(1 .. Max_Length
- Alen
) :=
1078 New_Item
(New_Item
'Last - (Max_Length
- Alen
) + 1
1082 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) :=
1084 Result
.Data
(1 .. Blen
- Droplen
) :=
1085 Source
.Data
(Droplen
+ 1 .. Blen
);
1088 when Strings
.Error
=>
1089 raise Ada
.Strings
.Length_Error
;
1096 procedure Super_Insert
1097 (Source
: in out Super_String
;
1099 New_Item
: Wide_String;
1100 Drop
: Strings
.Truncation
:= Strings
.Error
)
1103 -- We do a double copy here because this is one of the situations
1104 -- in which we move data to the right, and at least at the moment,
1105 -- GNAT is not handling such cases correctly ???
1107 Source
:= Super_Insert
(Source
, Before
, New_Item
, Drop
);
1114 function Super_Length
(Source
: Super_String
) return Natural is
1116 return Source
.Current_Length
;
1119 ---------------------
1120 -- Super_Overwrite --
1121 ---------------------
1123 function Super_Overwrite
1124 (Source
: Super_String
;
1125 Position
: Positive;
1126 New_Item
: Wide_String;
1127 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1129 Max_Length
: constant Positive := Source
.Max_Length
;
1130 Result
: Super_String
(Max_Length
);
1131 Endpos
: constant Natural := Position
+ New_Item
'Length - 1;
1132 Slen
: constant Natural := Source
.Current_Length
;
1136 if Position
> Slen
+ 1 then
1137 raise Ada
.Strings
.Index_Error
;
1139 elsif New_Item
'Length = 0 then
1142 elsif Endpos
<= Slen
then
1143 Result
.Current_Length
:= Source
.Current_Length
;
1144 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
1145 Result
.Data
(Position
.. Endpos
) := New_Item
;
1148 elsif Endpos
<= Max_Length
then
1149 Result
.Current_Length
:= Endpos
;
1150 Result
.Data
(1 .. Position
- 1) := Source
.Data
(1 .. Position
- 1);
1151 Result
.Data
(Position
.. Endpos
) := New_Item
;
1155 Result
.Current_Length
:= Max_Length
;
1156 Droplen
:= Endpos
- Max_Length
;
1159 when Strings
.Right
=>
1160 Result
.Data
(1 .. Position
- 1) :=
1161 Source
.Data
(1 .. Position
- 1);
1163 Result
.Data
(Position
.. Max_Length
) :=
1164 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1167 when Strings
.Left
=>
1168 if New_Item
'Length >= Max_Length
then
1169 Result
.Data
(1 .. Max_Length
) :=
1170 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1175 Result
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1176 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1178 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1183 when Strings
.Error
=>
1184 raise Ada
.Strings
.Length_Error
;
1187 end Super_Overwrite
;
1189 procedure Super_Overwrite
1190 (Source
: in out Super_String
;
1191 Position
: Positive;
1192 New_Item
: Wide_String;
1193 Drop
: Strings
.Truncation
:= Strings
.Error
)
1195 Max_Length
: constant Positive := Source
.Max_Length
;
1196 Endpos
: constant Positive := Position
+ New_Item
'Length - 1;
1197 Slen
: constant Natural := Source
.Current_Length
;
1201 if Position
> Slen
+ 1 then
1202 raise Ada
.Strings
.Index_Error
;
1204 elsif Endpos
<= Slen
then
1205 Source
.Data
(Position
.. Endpos
) := New_Item
;
1207 elsif Endpos
<= Max_Length
then
1208 Source
.Data
(Position
.. Endpos
) := New_Item
;
1209 Source
.Current_Length
:= Endpos
;
1212 Source
.Current_Length
:= Max_Length
;
1213 Droplen
:= Endpos
- Max_Length
;
1216 when Strings
.Right
=>
1217 Source
.Data
(Position
.. Max_Length
) :=
1218 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1220 when Strings
.Left
=>
1221 if New_Item
'Length > Max_Length
then
1222 Source
.Data
(1 .. Max_Length
) :=
1223 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1227 Source
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1228 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1231 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1235 when Strings
.Error
=>
1236 raise Ada
.Strings
.Length_Error
;
1239 end Super_Overwrite
;
1241 ---------------------------
1242 -- Super_Replace_Element --
1243 ---------------------------
1245 procedure Super_Replace_Element
1246 (Source
: in out Super_String
;
1248 By
: Wide_Character)
1251 if Index
<= Source
.Current_Length
then
1252 Source
.Data
(Index
) := By
;
1254 raise Ada
.Strings
.Index_Error
;
1256 end Super_Replace_Element
;
1258 -------------------------
1259 -- Super_Replace_Slice --
1260 -------------------------
1262 function Super_Replace_Slice
1263 (Source
: Super_String
;
1267 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1269 Max_Length
: constant Positive := Source
.Max_Length
;
1270 Slen
: constant Natural := Source
.Current_Length
;
1273 if Low
> Slen
+ 1 then
1274 raise Strings
.Index_Error
;
1276 elsif High
< Low
then
1277 return Super_Insert
(Source
, Low
, By
, Drop
);
1281 Blen
: constant Natural := Natural'Max (0, Low
- 1);
1282 Alen
: constant Natural := Natural'Max (0, Slen
- High
);
1283 Tlen
: constant Natural := Blen
+ By
'Length + Alen
;
1284 Droplen
: constant Integer := Tlen
- Max_Length
;
1285 Result
: Super_String
(Max_Length
);
1287 -- Tlen is the total length of the result string before any
1288 -- truncation. Blen and Alen are the lengths of the pieces
1289 -- of the original string that end up in the result string
1290 -- before and after the replaced slice.
1293 if Droplen
<= 0 then
1294 Result
.Current_Length
:= Tlen
;
1295 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1296 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1297 Result
.Data
(Low
+ By
'Length .. Tlen
) :=
1298 Source
.Data
(High
+ 1 .. Slen
);
1301 Result
.Current_Length
:= Max_Length
;
1304 when Strings
.Right
=>
1305 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1307 if Droplen
> Alen
then
1308 Result
.Data
(Low
.. Max_Length
) :=
1309 By
(By
'First .. By
'First + Max_Length
- Low
);
1311 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1312 Result
.Data
(Low
+ By
'Length .. Max_Length
) :=
1313 Source
.Data
(High
+ 1 .. Slen
- Droplen
);
1316 when Strings
.Left
=>
1317 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1318 Source
.Data
(High
+ 1 .. Slen
);
1320 if Droplen
>= Blen
then
1321 Result
.Data
(1 .. Max_Length
- Alen
) :=
1322 By
(By
'Last - (Max_Length
- Alen
) + 1 .. By
'Last);
1325 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) := By
;
1326 Result
.Data
(1 .. Blen
- Droplen
) :=
1327 Source
.Data
(Droplen
+ 1 .. Blen
);
1330 when Strings
.Error
=>
1331 raise Ada
.Strings
.Length_Error
;
1338 end Super_Replace_Slice
;
1340 procedure Super_Replace_Slice
1341 (Source
: in out Super_String
;
1345 Drop
: Strings
.Truncation
:= Strings
.Error
)
1348 -- We do a double copy here because this is one of the situations
1349 -- in which we move data to the right, and at least at the moment,
1350 -- GNAT is not handling such cases correctly ???
1352 Source
:= Super_Replace_Slice
(Source
, Low
, High
, By
, Drop
);
1353 end Super_Replace_Slice
;
1355 ---------------------
1356 -- Super_Replicate --
1357 ---------------------
1359 function Super_Replicate
1361 Item
: Wide_Character;
1362 Drop
: Truncation
:= Error
;
1363 Max_Length
: Positive) return Super_String
1365 Result
: Super_String
(Max_Length
);
1368 if Count
<= Max_Length
then
1369 Result
.Current_Length
:= Count
;
1371 elsif Drop
= Strings
.Error
then
1372 raise Ada
.Strings
.Length_Error
;
1375 Result
.Current_Length
:= Max_Length
;
1378 Result
.Data
(1 .. Result
.Current_Length
) := (others => Item
);
1380 end Super_Replicate
;
1382 function Super_Replicate
1385 Drop
: Truncation
:= Error
;
1386 Max_Length
: Positive) return Super_String
1388 Length
: constant Integer := Count
* Item
'Length;
1389 Result
: Super_String
(Max_Length
);
1393 if Length
<= Max_Length
then
1394 Result
.Current_Length
:= Length
;
1399 for J
in 1 .. Count
loop
1400 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1401 Indx
:= Indx
+ Item
'Length;
1406 Result
.Current_Length
:= Max_Length
;
1409 when Strings
.Right
=>
1412 while Indx
+ Item
'Length <= Max_Length
+ 1 loop
1413 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1414 Indx
:= Indx
+ Item
'Length;
1417 Result
.Data
(Indx
.. Max_Length
) :=
1418 Item
(Item
'First .. Item
'First + Max_Length
- Indx
);
1420 when Strings
.Left
=>
1423 while Indx
- Item
'Length >= 1 loop
1424 Result
.Data
(Indx
- (Item
'Length - 1) .. Indx
) := Item
;
1425 Indx
:= Indx
- Item
'Length;
1428 Result
.Data
(1 .. Indx
) :=
1429 Item
(Item
'Last - Indx
+ 1 .. Item
'Last);
1431 when Strings
.Error
=>
1432 raise Ada
.Strings
.Length_Error
;
1437 end Super_Replicate
;
1439 function Super_Replicate
1441 Item
: Super_String
;
1442 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1448 Item
.Data
(1 .. Item
.Current_Length
),
1451 end Super_Replicate
;
1457 function Super_Slice
1458 (Source
: Super_String
;
1460 High
: Natural) return Wide_String
1463 -- Note: test of High > Length is in accordance with AI95-00128
1465 if Low
> Source
.Current_Length
+ 1
1466 or else High
> Source
.Current_Length
1470 return Source
.Data
(Low
.. High
);
1474 function Super_Slice
1475 (Source
: Super_String
;
1477 High
: Natural) return Super_String
1479 Result
: Super_String
(Source
.Max_Length
);
1482 if Low
> Source
.Current_Length
+ 1
1483 or else High
> Source
.Current_Length
1487 Result
.Current_Length
:= High
- Low
+ 1;
1488 Result
.Data
(1 .. Result
.Current_Length
) := Source
.Data
(Low
.. High
);
1494 procedure Super_Slice
1495 (Source
: Super_String
;
1496 Target
: out Super_String
;
1501 if Low
> Source
.Current_Length
+ 1
1502 or else High
> Source
.Current_Length
1506 Target
.Current_Length
:= High
- Low
+ 1;
1507 Target
.Data
(1 .. Target
.Current_Length
) := Source
.Data
(Low
.. High
);
1516 (Source
: Super_String
;
1518 Pad
: Wide_Character := Wide_Space
;
1519 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1521 Max_Length
: constant Positive := Source
.Max_Length
;
1522 Result
: Super_String
(Max_Length
);
1523 Slen
: constant Natural := Source
.Current_Length
;
1524 Npad
: constant Integer := Count
- Slen
;
1528 Result
.Current_Length
:= Count
;
1529 Result
.Data
(1 .. Count
) :=
1530 Source
.Data
(Slen
- (Count
- 1) .. Slen
);
1532 elsif Count
<= Max_Length
then
1533 Result
.Current_Length
:= Count
;
1534 Result
.Data
(1 .. Npad
) := (others => Pad
);
1535 Result
.Data
(Npad
+ 1 .. Count
) := Source
.Data
(1 .. Slen
);
1538 Result
.Current_Length
:= Max_Length
;
1541 when Strings
.Right
=>
1542 if Npad
>= Max_Length
then
1543 Result
.Data
:= (others => Pad
);
1546 Result
.Data
(1 .. Npad
) := (others => Pad
);
1547 Result
.Data
(Npad
+ 1 .. Max_Length
) :=
1548 Source
.Data
(1 .. Max_Length
- Npad
);
1551 when Strings
.Left
=>
1552 Result
.Data
(1 .. Max_Length
- Slen
) := (others => Pad
);
1553 Result
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1554 Source
.Data
(1 .. Slen
);
1556 when Strings
.Error
=>
1557 raise Ada
.Strings
.Length_Error
;
1564 procedure Super_Tail
1565 (Source
: in out Super_String
;
1567 Pad
: Wide_Character := Wide_Space
;
1568 Drop
: Truncation
:= Error
)
1570 Max_Length
: constant Positive := Source
.Max_Length
;
1571 Slen
: constant Natural := Source
.Current_Length
;
1572 Npad
: constant Integer := Count
- Slen
;
1574 Temp
: constant Wide_String (1 .. Max_Length
) := Source
.Data
;
1578 Source
.Current_Length
:= Count
;
1579 Source
.Data
(1 .. Count
) :=
1580 Temp
(Slen
- (Count
- 1) .. Slen
);
1582 elsif Count
<= Max_Length
then
1583 Source
.Current_Length
:= Count
;
1584 Source
.Data
(1 .. Npad
) := (others => Pad
);
1585 Source
.Data
(Npad
+ 1 .. Count
) := Temp
(1 .. Slen
);
1588 Source
.Current_Length
:= Max_Length
;
1591 when Strings
.Right
=>
1592 if Npad
>= Max_Length
then
1593 Source
.Data
:= (others => Pad
);
1596 Source
.Data
(1 .. Npad
) := (others => Pad
);
1597 Source
.Data
(Npad
+ 1 .. Max_Length
) :=
1598 Temp
(1 .. Max_Length
- Npad
);
1601 when Strings
.Left
=>
1602 for J
in 1 .. Max_Length
- Slen
loop
1603 Source
.Data
(J
) := Pad
;
1606 Source
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1609 when Strings
.Error
=>
1610 raise Ada
.Strings
.Length_Error
;
1615 ---------------------
1616 -- Super_To_String --
1617 ---------------------
1619 function Super_To_String
(Source
: Super_String
) return Wide_String is
1621 return Source
.Data
(1 .. Source
.Current_Length
);
1622 end Super_To_String
;
1624 ---------------------
1625 -- Super_Translate --
1626 ---------------------
1628 function Super_Translate
1629 (Source
: Super_String
;
1630 Mapping
: Wide_Maps
.Wide_Character_Mapping
) return Super_String
1632 Result
: Super_String
(Source
.Max_Length
);
1635 Result
.Current_Length
:= Source
.Current_Length
;
1637 for J
in 1 .. Source
.Current_Length
loop
1638 Result
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1642 end Super_Translate
;
1644 procedure Super_Translate
1645 (Source
: in out Super_String
;
1646 Mapping
: Wide_Maps
.Wide_Character_Mapping
)
1649 for J
in 1 .. Source
.Current_Length
loop
1650 Source
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1652 end Super_Translate
;
1654 function Super_Translate
1655 (Source
: Super_String
;
1656 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
) return Super_String
1658 Result
: Super_String
(Source
.Max_Length
);
1661 Result
.Current_Length
:= Source
.Current_Length
;
1663 for J
in 1 .. Source
.Current_Length
loop
1664 Result
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1668 end Super_Translate
;
1670 procedure Super_Translate
1671 (Source
: in out Super_String
;
1672 Mapping
: Wide_Maps
.Wide_Character_Mapping_Function
)
1675 for J
in 1 .. Source
.Current_Length
loop
1676 Source
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1678 end Super_Translate
;
1685 (Source
: Super_String
;
1686 Side
: Trim_End
) return Super_String
1688 Result
: Super_String
(Source
.Max_Length
);
1689 Last
: Natural := Source
.Current_Length
;
1690 First
: Positive := 1;
1693 if Side
= Left
or else Side
= Both
then
1694 while First
<= Last
and then Source
.Data
(First
) = ' ' loop
1699 if Side
= Right
or else Side
= Both
then
1700 while Last
>= First
and then Source
.Data
(Last
) = ' ' loop
1705 Result
.Current_Length
:= Last
- First
+ 1;
1706 Result
.Data
(1 .. Result
.Current_Length
) := Source
.Data
(First
.. Last
);
1710 procedure Super_Trim
1711 (Source
: in out Super_String
;
1714 Max_Length
: constant Positive := Source
.Max_Length
;
1715 Last
: Natural := Source
.Current_Length
;
1716 First
: Positive := 1;
1717 Temp
: Wide_String (1 .. Max_Length
);
1720 Temp
(1 .. Last
) := Source
.Data
(1 .. Last
);
1722 if Side
= Left
or else Side
= Both
then
1723 while First
<= Last
and then Temp
(First
) = ' ' loop
1728 if Side
= Right
or else Side
= Both
then
1729 while Last
>= First
and then Temp
(Last
) = ' ' loop
1734 Source
.Data
:= (others => Wide_NUL
);
1735 Source
.Current_Length
:= Last
- First
+ 1;
1736 Source
.Data
(1 .. Source
.Current_Length
) := Temp
(First
.. Last
);
1740 (Source
: Super_String
;
1741 Left
: Wide_Maps
.Wide_Character_Set
;
1742 Right
: Wide_Maps
.Wide_Character_Set
) return Super_String
1744 Result
: Super_String
(Source
.Max_Length
);
1747 for First
in 1 .. Source
.Current_Length
loop
1748 if not Is_In
(Source
.Data
(First
), Left
) then
1749 for Last
in reverse First
.. Source
.Current_Length
loop
1750 if not Is_In
(Source
.Data
(Last
), Right
) then
1751 Result
.Current_Length
:= Last
- First
+ 1;
1752 Result
.Data
(1 .. Result
.Current_Length
) :=
1753 Source
.Data
(First
.. Last
);
1760 Result
.Current_Length
:= 0;
1764 procedure Super_Trim
1765 (Source
: in out Super_String
;
1766 Left
: Wide_Maps
.Wide_Character_Set
;
1767 Right
: Wide_Maps
.Wide_Character_Set
)
1770 for First
in 1 .. Source
.Current_Length
loop
1771 if not Is_In
(Source
.Data
(First
), Left
) then
1772 for Last
in reverse First
.. Source
.Current_Length
loop
1773 if not Is_In
(Source
.Data
(Last
), Right
) then
1775 Source
.Current_Length
:= Last
;
1778 Source
.Current_Length
:= Last
- First
+ 1;
1779 Source
.Data
(1 .. Source
.Current_Length
) :=
1780 Source
.Data
(First
.. Last
);
1782 for J
in Source
.Current_Length
+ 1 ..
1785 Source
.Data
(J
) := Wide_NUL
;
1793 Source
.Current_Length
:= 0;
1798 Source
.Current_Length
:= 0;
1807 Right
: Wide_Character;
1808 Max_Length
: Positive) return Super_String
1810 Result
: Super_String
(Max_Length
);
1813 if Left
> Max_Length
then
1814 raise Ada
.Strings
.Length_Error
;
1817 Result
.Current_Length
:= Left
;
1819 for J
in 1 .. Left
loop
1820 Result
.Data
(J
) := Right
;
1829 Right
: Wide_String;
1830 Max_Length
: Positive) return Super_String
1832 Result
: Super_String
(Max_Length
);
1833 Pos
: Positive := 1;
1834 Rlen
: constant Natural := Right
'Length;
1835 Nlen
: constant Natural := Left
* Rlen
;
1838 if Nlen
> Max_Length
then
1839 raise Ada
.Strings
.Index_Error
;
1842 Result
.Current_Length
:= Nlen
;
1845 for J
in 1 .. Left
loop
1846 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) := Right
;
1857 Right
: Super_String
) return Super_String
1859 Result
: Super_String
(Right
.Max_Length
);
1860 Pos
: Positive := 1;
1861 Rlen
: constant Natural := Right
.Current_Length
;
1862 Nlen
: constant Natural := Left
* Rlen
;
1865 if Nlen
> Right
.Max_Length
then
1866 raise Ada
.Strings
.Length_Error
;
1869 Result
.Current_Length
:= Nlen
;
1872 for J
in 1 .. Left
loop
1873 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) :=
1874 Right
.Data
(1 .. Rlen
);
1883 ---------------------
1884 -- To_Super_String --
1885 ---------------------
1887 function To_Super_String
1888 (Source
: Wide_String;
1889 Max_Length
: Natural;
1890 Drop
: Truncation
:= Error
) return Super_String
1892 Result
: Super_String
(Max_Length
);
1893 Slen
: constant Natural := Source
'Length;
1896 if Slen
<= Max_Length
then
1897 Result
.Current_Length
:= Slen
;
1898 Result
.Data
(1 .. Slen
) := Source
;
1902 when Strings
.Right
=>
1903 Result
.Current_Length
:= Max_Length
;
1904 Result
.Data
(1 .. Max_Length
) :=
1905 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
1907 when Strings
.Left
=>
1908 Result
.Current_Length
:= Max_Length
;
1909 Result
.Data
(1 .. Max_Length
) :=
1910 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
1912 when Strings
.Error
=>
1913 raise Ada
.Strings
.Length_Error
;
1918 end To_Super_String
;
1920 end Ada
.Strings
.Wide_Superbounded
;