1 ------------------------------------------------------------------------------
3 -- GNAT RUN-TIME COMPONENTS --
5 -- A D A . S T R I N G S . W I D E _ W I D E _ S U P E R B O U N D E D --
9 -- Copyright (C) 2003-2024, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
22 -- You should have received a copy of the GNU General Public License and --
23 -- a copy of the GCC Runtime Library Exception along with this program; --
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
25 -- <http://www.gnu.org/licenses/>. --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
30 ------------------------------------------------------------------------------
32 with Ada
.Strings
.Wide_Wide_Maps
; use Ada
.Strings
.Wide_Wide_Maps
;
33 with Ada
.Strings
.Wide_Wide_Search
;
35 package body Ada
.Strings
.Wide_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_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
;
87 (Left
: Wide_Wide_String
;
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_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_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_Wide_String
) return Boolean
171 return Left
.Current_Length
= Right
'Length
172 and then Left
.Data
(1 .. Left
.Current_Length
) = Right
;
176 (Left
: Wide_Wide_String
;
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_Wide_String
) return Boolean
202 return Left
.Data
(1 .. Left
.Current_Length
) > Right
;
206 (Left
: Wide_Wide_String
;
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_Wide_String
) return Boolean
231 return Left
.Data
(1 .. Left
.Current_Length
) >= Right
;
232 end Greater_Or_Equal
;
234 function Greater_Or_Equal
235 (Left
: Wide_Wide_String
;
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_Wide_String
) return Boolean
260 return Left
.Data
(1 .. Left
.Current_Length
) < Right
;
264 (Left
: Wide_Wide_String
;
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_Wide_String
) return Boolean
289 return Left
.Data
(1 .. Left
.Current_Length
) <= Right
;
292 function Less_Or_Equal
293 (Left
: Wide_Wide_String
;
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_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_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_Wide_String
447 function Super_Append
448 (Left
: Super_String
;
449 Right
: Wide_Wide_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_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
;
545 -- Case of Wide_Wide_String and Super_String
547 function Super_Append
548 (Left
: Wide_Wide_String
;
549 Right
: Super_String
;
550 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
552 Max_Length
: constant Positive := Right
.Max_Length
;
553 Result
: Super_String
(Max_Length
);
554 Llen
: constant Natural := Left
'Length;
555 Rlen
: constant Natural := Right
.Current_Length
;
556 Nlen
: constant Natural := Llen
+ Rlen
;
559 if Nlen
<= Max_Length
then
560 Result
.Current_Length
:= Nlen
;
561 Result
.Data
(1 .. Llen
) := Left
;
562 Result
.Data
(Llen
+ 1 .. Llen
+ Rlen
) := Right
.Data
(1 .. Rlen
);
565 Result
.Current_Length
:= Max_Length
;
568 when Strings
.Right
=>
569 if Llen
>= Max_Length
then
570 Result
.Data
(1 .. Max_Length
) :=
571 Left
(Left
'First .. Left
'First + (Max_Length
- 1));
574 Result
.Data
(1 .. Llen
) := Left
;
575 Result
.Data
(Llen
+ 1 .. Max_Length
) :=
576 Right
.Data
(1 .. Max_Length
- Llen
);
580 if Rlen
>= Max_Length
then
581 Result
.Data
(1 .. Max_Length
) :=
582 Right
.Data
(Rlen
- (Max_Length
- 1) .. Rlen
);
585 Result
.Data
(1 .. Max_Length
- Rlen
) :=
586 Left
(Left
'Last - (Max_Length
- Rlen
- 1) .. Left
'Last);
587 Result
.Data
(Max_Length
- Rlen
+ 1 .. Max_Length
) :=
588 Right
.Data
(1 .. Rlen
);
591 when Strings
.Error
=>
592 raise Ada
.Strings
.Length_Error
;
599 -- Case of Super_String and Wide_Wide_Character
601 function Super_Append
602 (Left
: Super_String
;
603 Right
: Wide_Wide_Character
;
604 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
606 Max_Length
: constant Positive := Left
.Max_Length
;
607 Result
: Super_String
(Max_Length
);
608 Llen
: constant Natural := Left
.Current_Length
;
611 if Llen
< Max_Length
then
612 Result
.Current_Length
:= Llen
+ 1;
613 Result
.Data
(1 .. Llen
) := Left
.Data
(1 .. Llen
);
614 Result
.Data
(Llen
+ 1) := Right
;
619 when Strings
.Right
=>
623 Result
.Current_Length
:= Max_Length
;
624 Result
.Data
(1 .. Max_Length
- 1) :=
625 Left
.Data
(2 .. Max_Length
);
626 Result
.Data
(Max_Length
) := Right
;
629 when Strings
.Error
=>
630 raise Ada
.Strings
.Length_Error
;
635 procedure Super_Append
636 (Source
: in out Super_String
;
637 New_Item
: Wide_Wide_Character
;
638 Drop
: Truncation
:= Error
)
640 Max_Length
: constant Positive := Source
.Max_Length
;
641 Llen
: constant Natural := Source
.Current_Length
;
644 if Llen
< Max_Length
then
645 Source
.Current_Length
:= Llen
+ 1;
646 Source
.Data
(Llen
+ 1) := New_Item
;
649 Source
.Current_Length
:= Max_Length
;
652 when Strings
.Right
=>
656 Source
.Data
(1 .. Max_Length
- 1) :=
657 Source
.Data
(2 .. Max_Length
);
658 Source
.Data
(Max_Length
) := New_Item
;
660 when Strings
.Error
=>
661 raise Ada
.Strings
.Length_Error
;
667 -- Case of Wide_Wide_Character and Super_String
669 function Super_Append
670 (Left
: Wide_Wide_Character
;
671 Right
: Super_String
;
672 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
674 Max_Length
: constant Positive := Right
.Max_Length
;
675 Result
: Super_String
(Max_Length
);
676 Rlen
: constant Natural := Right
.Current_Length
;
679 if Rlen
< Max_Length
then
680 Result
.Current_Length
:= Rlen
+ 1;
681 Result
.Data
(1) := Left
;
682 Result
.Data
(2 .. Rlen
+ 1) := Right
.Data
(1 .. Rlen
);
687 when Strings
.Right
=>
688 Result
.Current_Length
:= Max_Length
;
689 Result
.Data
(1) := Left
;
690 Result
.Data
(2 .. Max_Length
) :=
691 Right
.Data
(1 .. Max_Length
- 1);
697 when Strings
.Error
=>
698 raise Ada
.Strings
.Length_Error
;
708 (Source
: Super_String
;
709 Pattern
: Wide_Wide_String
;
710 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
711 Wide_Wide_Maps
.Identity
) return Natural
715 Wide_Wide_Search
.Count
716 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
720 (Source
: Super_String
;
721 Pattern
: Wide_Wide_String
;
722 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
727 Wide_Wide_Search
.Count
728 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Mapping
);
732 (Source
: Super_String
;
733 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
) return Natural
736 return Wide_Wide_Search
.Count
737 (Source
.Data
(1 .. Source
.Current_Length
), Set
);
744 function Super_Delete
745 (Source
: Super_String
;
747 Through
: Natural) return Super_String
749 Result
: Super_String
(Source
.Max_Length
);
750 Slen
: constant Natural := Source
.Current_Length
;
751 Num_Delete
: constant Integer := Through
- From
+ 1;
754 if Num_Delete
<= 0 then
757 elsif From
> Slen
+ 1 then
758 raise Ada
.Strings
.Index_Error
;
760 elsif Through
>= Slen
then
761 Result
.Current_Length
:= From
- 1;
762 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
766 Result
.Current_Length
:= Slen
- Num_Delete
;
767 Result
.Data
(1 .. From
- 1) := Source
.Data
(1 .. From
- 1);
768 Result
.Data
(From
.. Result
.Current_Length
) :=
769 Source
.Data
(Through
+ 1 .. Slen
);
774 procedure Super_Delete
775 (Source
: in out Super_String
;
779 Slen
: constant Natural := Source
.Current_Length
;
780 Num_Delete
: constant Integer := Through
- From
+ 1;
783 if Num_Delete
<= 0 then
786 elsif From
> Slen
+ 1 then
787 raise Ada
.Strings
.Index_Error
;
789 elsif Through
>= Slen
then
790 Source
.Current_Length
:= From
- 1;
793 Source
.Current_Length
:= Slen
- Num_Delete
;
794 Source
.Data
(From
.. Source
.Current_Length
) :=
795 Source
.Data
(Through
+ 1 .. Slen
);
803 function Super_Element
804 (Source
: Super_String
;
805 Index
: Positive) return Wide_Wide_Character
808 if Index
<= Source
.Current_Length
then
809 return Source
.Data
(Index
);
811 raise Strings
.Index_Error
;
815 ----------------------
816 -- Super_Find_Token --
817 ----------------------
819 procedure Super_Find_Token
820 (Source
: Super_String
;
821 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
823 Test
: Strings
.Membership
;
824 First
: out Positive;
828 Wide_Wide_Search
.Find_Token
829 (Source
.Data
(From
.. Source
.Current_Length
), Set
, Test
, First
, Last
);
830 end Super_Find_Token
;
832 procedure Super_Find_Token
833 (Source
: Super_String
;
834 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
835 Test
: Strings
.Membership
;
836 First
: out Positive;
840 Wide_Wide_Search
.Find_Token
841 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, First
, Last
);
842 end Super_Find_Token
;
849 (Source
: Super_String
;
851 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
;
852 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
854 Max_Length
: constant Positive := Source
.Max_Length
;
855 Result
: Super_String
(Max_Length
);
856 Slen
: constant Natural := Source
.Current_Length
;
857 Npad
: constant Integer := Count
- Slen
;
861 Result
.Current_Length
:= Count
;
862 Result
.Data
(1 .. Count
) := Source
.Data
(1 .. Count
);
864 elsif Count
<= Max_Length
then
865 Result
.Current_Length
:= Count
;
866 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
867 Result
.Data
(Slen
+ 1 .. Count
) := [others => Pad
];
870 Result
.Current_Length
:= Max_Length
;
873 when Strings
.Right
=>
874 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
875 Result
.Data
(Slen
+ 1 .. Max_Length
) := [others => Pad
];
878 if Npad
>= Max_Length
then
879 Result
.Data
:= [others => Pad
];
882 Result
.Data
(1 .. Max_Length
- Npad
) :=
883 Source
.Data
(Count
- Max_Length
+ 1 .. Slen
);
884 Result
.Data
(Max_Length
- Npad
+ 1 .. Max_Length
) :=
888 when Strings
.Error
=>
889 raise Ada
.Strings
.Length_Error
;
897 (Source
: in out Super_String
;
899 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
;
900 Drop
: Truncation
:= Error
)
902 Max_Length
: constant Positive := Source
.Max_Length
;
903 Slen
: constant Natural := Source
.Current_Length
;
904 Npad
: constant Integer := Count
- Slen
;
905 Temp
: Wide_Wide_String
(1 .. Max_Length
);
909 Source
.Current_Length
:= Count
;
911 elsif Count
<= Max_Length
then
912 Source
.Current_Length
:= Count
;
913 Source
.Data
(Slen
+ 1 .. Count
) := [others => Pad
];
916 Source
.Current_Length
:= Max_Length
;
919 when Strings
.Right
=>
920 Source
.Data
(Slen
+ 1 .. Max_Length
) := [others => Pad
];
923 if Npad
> Max_Length
then
924 Source
.Data
:= [others => Pad
];
928 Source
.Data
(1 .. Max_Length
- Npad
) :=
929 Temp
(Count
- Max_Length
+ 1 .. Slen
);
931 for J
in Max_Length
- Npad
+ 1 .. Max_Length
loop
932 Source
.Data
(J
) := Pad
;
936 when Strings
.Error
=>
937 raise Ada
.Strings
.Length_Error
;
947 (Source
: Super_String
;
948 Pattern
: Wide_Wide_String
;
949 Going
: Strings
.Direction
:= Strings
.Forward
;
950 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
951 Wide_Wide_Maps
.Identity
) return Natural
954 return Wide_Wide_Search
.Index
955 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
959 (Source
: Super_String
;
960 Pattern
: Wide_Wide_String
;
961 Going
: Direction
:= Forward
;
962 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
966 return Wide_Wide_Search
.Index
967 (Source
.Data
(1 .. Source
.Current_Length
), Pattern
, Going
, Mapping
);
971 (Source
: Super_String
;
972 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
973 Test
: Strings
.Membership
:= Strings
.Inside
;
974 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
977 return Wide_Wide_Search
.Index
978 (Source
.Data
(1 .. Source
.Current_Length
), Set
, Test
, Going
);
982 (Source
: Super_String
;
983 Pattern
: Wide_Wide_String
;
985 Going
: Direction
:= Forward
;
986 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
:=
987 Wide_Wide_Maps
.Identity
) return Natural
990 return Wide_Wide_Search
.Index
991 (Source
.Data
(1 .. Source
.Current_Length
),
992 Pattern
, From
, Going
, Mapping
);
996 (Source
: Super_String
;
997 Pattern
: Wide_Wide_String
;
999 Going
: Direction
:= Forward
;
1000 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
1004 return Wide_Wide_Search
.Index
1005 (Source
.Data
(1 .. Source
.Current_Length
),
1006 Pattern
, From
, Going
, Mapping
);
1009 function Super_Index
1010 (Source
: Super_String
;
1011 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1013 Test
: Membership
:= Inside
;
1014 Going
: Direction
:= Forward
) return Natural
1017 return Wide_Wide_Search
.Index
1018 (Source
.Data
(1 .. Source
.Current_Length
), Set
, From
, Test
, Going
);
1021 ---------------------------
1022 -- Super_Index_Non_Blank --
1023 ---------------------------
1025 function Super_Index_Non_Blank
1026 (Source
: Super_String
;
1027 Going
: Strings
.Direction
:= Strings
.Forward
) return Natural
1031 Wide_Wide_Search
.Index_Non_Blank
1032 (Source
.Data
(1 .. Source
.Current_Length
), Going
);
1033 end Super_Index_Non_Blank
;
1035 function Super_Index_Non_Blank
1036 (Source
: Super_String
;
1038 Going
: Direction
:= Forward
) return Natural
1042 Wide_Wide_Search
.Index_Non_Blank
1043 (Source
.Data
(1 .. Source
.Current_Length
), From
, Going
);
1044 end Super_Index_Non_Blank
;
1050 function Super_Insert
1051 (Source
: Super_String
;
1053 New_Item
: Wide_Wide_String
;
1054 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1056 Max_Length
: constant Positive := Source
.Max_Length
;
1057 Result
: Super_String
(Max_Length
);
1058 Slen
: constant Natural := Source
.Current_Length
;
1059 Nlen
: constant Natural := New_Item
'Length;
1060 Tlen
: constant Natural := Slen
+ Nlen
;
1061 Blen
: constant Natural := Before
- 1;
1062 Alen
: constant Integer := Slen
- Blen
;
1063 Droplen
: constant Integer := Tlen
- Max_Length
;
1065 -- Tlen is the length of the total string before possible truncation.
1066 -- Blen, Alen are the lengths of the before and after pieces of the
1071 raise Ada
.Strings
.Index_Error
;
1073 elsif Droplen
<= 0 then
1074 Result
.Current_Length
:= Tlen
;
1075 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1076 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1077 Result
.Data
(Before
+ Nlen
.. Tlen
) :=
1078 Source
.Data
(Before
.. Slen
);
1081 Result
.Current_Length
:= Max_Length
;
1084 when Strings
.Right
=>
1085 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1087 if Droplen
> Alen
then
1088 Result
.Data
(Before
.. Max_Length
) :=
1089 New_Item
(New_Item
'First
1090 .. New_Item
'First + Max_Length
- Before
);
1092 Result
.Data
(Before
.. Before
+ Nlen
- 1) := New_Item
;
1093 Result
.Data
(Before
+ Nlen
.. Max_Length
) :=
1094 Source
.Data
(Before
.. Slen
- Droplen
);
1097 when Strings
.Left
=>
1098 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1099 Source
.Data
(Before
.. Slen
);
1101 if Droplen
>= Blen
then
1102 Result
.Data
(1 .. Max_Length
- Alen
) :=
1103 New_Item
(New_Item
'Last - (Max_Length
- Alen
) + 1
1107 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) :=
1109 Result
.Data
(1 .. Blen
- Droplen
) :=
1110 Source
.Data
(Droplen
+ 1 .. Blen
);
1113 when Strings
.Error
=>
1114 raise Ada
.Strings
.Length_Error
;
1121 procedure Super_Insert
1122 (Source
: in out Super_String
;
1124 New_Item
: Wide_Wide_String
;
1125 Drop
: Strings
.Truncation
:= Strings
.Error
)
1128 -- We do a double copy here because this is one of the situations
1129 -- in which we move data to the right, and at least at the moment,
1130 -- GNAT is not handling such cases correctly ???
1132 Source
:= Super_Insert
(Source
, Before
, New_Item
, Drop
);
1139 function Super_Length
(Source
: Super_String
) return Natural is
1141 return Source
.Current_Length
;
1144 ---------------------
1145 -- Super_Overwrite --
1146 ---------------------
1148 function Super_Overwrite
1149 (Source
: Super_String
;
1150 Position
: Positive;
1151 New_Item
: Wide_Wide_String
;
1152 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1154 Max_Length
: constant Positive := Source
.Max_Length
;
1155 Result
: Super_String
(Max_Length
);
1156 Endpos
: constant Natural := Position
+ New_Item
'Length - 1;
1157 Slen
: constant Natural := Source
.Current_Length
;
1161 if Position
> Slen
+ 1 then
1162 raise Ada
.Strings
.Index_Error
;
1164 elsif New_Item
'Length = 0 then
1167 elsif Endpos
<= Slen
then
1168 Result
.Current_Length
:= Source
.Current_Length
;
1169 Result
.Data
(1 .. Slen
) := Source
.Data
(1 .. Slen
);
1170 Result
.Data
(Position
.. Endpos
) := New_Item
;
1173 elsif Endpos
<= Max_Length
then
1174 Result
.Current_Length
:= Endpos
;
1175 Result
.Data
(1 .. Position
- 1) := Source
.Data
(1 .. Position
- 1);
1176 Result
.Data
(Position
.. Endpos
) := New_Item
;
1180 Result
.Current_Length
:= Max_Length
;
1181 Droplen
:= Endpos
- Max_Length
;
1184 when Strings
.Right
=>
1185 Result
.Data
(1 .. Position
- 1) :=
1186 Source
.Data
(1 .. Position
- 1);
1188 Result
.Data
(Position
.. Max_Length
) :=
1189 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1192 when Strings
.Left
=>
1193 if New_Item
'Length >= Max_Length
then
1194 Result
.Data
(1 .. Max_Length
) :=
1195 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1200 Result
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1201 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1203 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1208 when Strings
.Error
=>
1209 raise Ada
.Strings
.Length_Error
;
1212 end Super_Overwrite
;
1214 procedure Super_Overwrite
1215 (Source
: in out Super_String
;
1216 Position
: Positive;
1217 New_Item
: Wide_Wide_String
;
1218 Drop
: Strings
.Truncation
:= Strings
.Error
)
1220 Max_Length
: constant Positive := Source
.Max_Length
;
1221 Endpos
: constant Positive := Position
+ New_Item
'Length - 1;
1222 Slen
: constant Natural := Source
.Current_Length
;
1226 if Position
> Slen
+ 1 then
1227 raise Ada
.Strings
.Index_Error
;
1229 elsif Endpos
<= Slen
then
1230 Source
.Data
(Position
.. Endpos
) := New_Item
;
1232 elsif Endpos
<= Max_Length
then
1233 Source
.Data
(Position
.. Endpos
) := New_Item
;
1234 Source
.Current_Length
:= Endpos
;
1237 Source
.Current_Length
:= Max_Length
;
1238 Droplen
:= Endpos
- Max_Length
;
1241 when Strings
.Right
=>
1242 Source
.Data
(Position
.. Max_Length
) :=
1243 New_Item
(New_Item
'First .. New_Item
'Last - Droplen
);
1245 when Strings
.Left
=>
1246 if New_Item
'Length > Max_Length
then
1247 Source
.Data
(1 .. Max_Length
) :=
1248 New_Item
(New_Item
'Last - Max_Length
+ 1 ..
1252 Source
.Data
(1 .. Max_Length
- New_Item
'Length) :=
1253 Source
.Data
(Droplen
+ 1 .. Position
- 1);
1256 (Max_Length
- New_Item
'Length + 1 .. Max_Length
) :=
1260 when Strings
.Error
=>
1261 raise Ada
.Strings
.Length_Error
;
1264 end Super_Overwrite
;
1266 ---------------------------
1267 -- Super_Replace_Element --
1268 ---------------------------
1270 procedure Super_Replace_Element
1271 (Source
: in out Super_String
;
1273 By
: Wide_Wide_Character
)
1276 if Index
<= Source
.Current_Length
then
1277 Source
.Data
(Index
) := By
;
1279 raise Ada
.Strings
.Index_Error
;
1281 end Super_Replace_Element
;
1283 -------------------------
1284 -- Super_Replace_Slice --
1285 -------------------------
1287 function Super_Replace_Slice
1288 (Source
: Super_String
;
1291 By
: Wide_Wide_String
;
1292 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1294 Max_Length
: constant Positive := Source
.Max_Length
;
1295 Slen
: constant Natural := Source
.Current_Length
;
1298 if Low
> Slen
+ 1 then
1299 raise Strings
.Index_Error
;
1301 elsif High
< Low
then
1302 return Super_Insert
(Source
, Low
, By
, Drop
);
1306 Blen
: constant Natural := Natural'Max (0, Low
- 1);
1307 Alen
: constant Natural := Natural'Max (0, Slen
- High
);
1308 Tlen
: constant Natural := Blen
+ By
'Length + Alen
;
1309 Droplen
: constant Integer := Tlen
- Max_Length
;
1310 Result
: Super_String
(Max_Length
);
1312 -- Tlen is the total length of the result string before any
1313 -- truncation. Blen and Alen are the lengths of the pieces
1314 -- of the original string that end up in the result string
1315 -- before and after the replaced slice.
1318 if Droplen
<= 0 then
1319 Result
.Current_Length
:= Tlen
;
1320 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1321 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1322 Result
.Data
(Low
+ By
'Length .. Tlen
) :=
1323 Source
.Data
(High
+ 1 .. Slen
);
1326 Result
.Current_Length
:= Max_Length
;
1329 when Strings
.Right
=>
1330 Result
.Data
(1 .. Blen
) := Source
.Data
(1 .. Blen
);
1332 if Droplen
> Alen
then
1333 Result
.Data
(Low
.. Max_Length
) :=
1334 By
(By
'First .. By
'First + Max_Length
- Low
);
1336 Result
.Data
(Low
.. Low
+ By
'Length - 1) := By
;
1337 Result
.Data
(Low
+ By
'Length .. Max_Length
) :=
1338 Source
.Data
(High
+ 1 .. Slen
- Droplen
);
1341 when Strings
.Left
=>
1342 Result
.Data
(Max_Length
- (Alen
- 1) .. Max_Length
) :=
1343 Source
.Data
(High
+ 1 .. Slen
);
1345 if Droplen
>= Blen
then
1346 Result
.Data
(1 .. Max_Length
- Alen
) :=
1347 By
(By
'Last - (Max_Length
- Alen
) + 1 .. By
'Last);
1350 (Blen
- Droplen
+ 1 .. Max_Length
- Alen
) := By
;
1351 Result
.Data
(1 .. Blen
- Droplen
) :=
1352 Source
.Data
(Droplen
+ 1 .. Blen
);
1355 when Strings
.Error
=>
1356 raise Ada
.Strings
.Length_Error
;
1363 end Super_Replace_Slice
;
1365 procedure Super_Replace_Slice
1366 (Source
: in out Super_String
;
1369 By
: Wide_Wide_String
;
1370 Drop
: Strings
.Truncation
:= Strings
.Error
)
1373 -- We do a double copy here because this is one of the situations
1374 -- in which we move data to the right, and at least at the moment,
1375 -- GNAT is not handling such cases correctly ???
1377 Source
:= Super_Replace_Slice
(Source
, Low
, High
, By
, Drop
);
1378 end Super_Replace_Slice
;
1380 ---------------------
1381 -- Super_Replicate --
1382 ---------------------
1384 function Super_Replicate
1386 Item
: Wide_Wide_Character
;
1387 Drop
: Truncation
:= Error
;
1388 Max_Length
: Positive) return Super_String
1390 Result
: Super_String
(Max_Length
);
1393 if Count
<= Max_Length
then
1394 Result
.Current_Length
:= Count
;
1396 elsif Drop
= Strings
.Error
then
1397 raise Ada
.Strings
.Length_Error
;
1400 Result
.Current_Length
:= Max_Length
;
1403 Result
.Data
(1 .. Result
.Current_Length
) := [others => Item
];
1405 end Super_Replicate
;
1407 function Super_Replicate
1409 Item
: Wide_Wide_String
;
1410 Drop
: Truncation
:= Error
;
1411 Max_Length
: Positive) return Super_String
1413 Length
: constant Integer := Count
* Item
'Length;
1414 Result
: Super_String
(Max_Length
);
1418 if Length
<= Max_Length
then
1419 Result
.Current_Length
:= Length
;
1424 for J
in 1 .. Count
loop
1425 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1426 Indx
:= Indx
+ Item
'Length;
1431 Result
.Current_Length
:= Max_Length
;
1434 when Strings
.Right
=>
1437 while Indx
+ Item
'Length <= Max_Length
+ 1 loop
1438 Result
.Data
(Indx
.. Indx
+ Item
'Length - 1) := Item
;
1439 Indx
:= Indx
+ Item
'Length;
1442 Result
.Data
(Indx
.. Max_Length
) :=
1443 Item
(Item
'First .. Item
'First + Max_Length
- Indx
);
1445 when Strings
.Left
=>
1448 while Indx
- Item
'Length >= 1 loop
1449 Result
.Data
(Indx
- (Item
'Length - 1) .. Indx
) := Item
;
1450 Indx
:= Indx
- Item
'Length;
1453 Result
.Data
(1 .. Indx
) :=
1454 Item
(Item
'Last - Indx
+ 1 .. Item
'Last);
1456 when Strings
.Error
=>
1457 raise Ada
.Strings
.Length_Error
;
1462 end Super_Replicate
;
1464 function Super_Replicate
1466 Item
: Super_String
;
1467 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1473 Item
.Data
(1 .. Item
.Current_Length
),
1476 end Super_Replicate
;
1482 function Super_Slice
1483 (Source
: Super_String
;
1485 High
: Natural) return Wide_Wide_String
1488 -- Note: test of High > Length is in accordance with AI95-00128
1490 return R
: Wide_Wide_String
(Low
.. High
) do
1491 if Low
> Source
.Current_Length
+ 1
1492 or else High
> Source
.Current_Length
1497 R
:= Source
.Data
(Low
.. High
);
1501 function Super_Slice
1502 (Source
: Super_String
;
1504 High
: Natural) return Super_String
1507 return Result
: Super_String
(Source
.Max_Length
) do
1508 if Low
> Source
.Current_Length
+ 1
1509 or else High
> Source
.Current_Length
1514 Result
.Current_Length
:= (if Low
> High
then 0 else High
- Low
+ 1);
1515 Result
.Data
(1 .. Result
.Current_Length
) :=
1516 Source
.Data
(Low
.. High
);
1520 procedure Super_Slice
1521 (Source
: Super_String
;
1522 Target
: out Super_String
;
1527 if Low
> Source
.Current_Length
+ 1
1528 or else High
> Source
.Current_Length
1533 Target
.Current_Length
:= (if Low
> High
then 0 else High
- Low
+ 1);
1534 Target
.Data
(1 .. Target
.Current_Length
) := Source
.Data
(Low
.. High
);
1542 (Source
: Super_String
;
1544 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
;
1545 Drop
: Strings
.Truncation
:= Strings
.Error
) return Super_String
1547 Max_Length
: constant Positive := Source
.Max_Length
;
1548 Result
: Super_String
(Max_Length
);
1549 Slen
: constant Natural := Source
.Current_Length
;
1550 Npad
: constant Integer := Count
- Slen
;
1554 Result
.Current_Length
:= Count
;
1555 Result
.Data
(1 .. Count
) :=
1556 Source
.Data
(Slen
- (Count
- 1) .. Slen
);
1558 elsif Count
<= Max_Length
then
1559 Result
.Current_Length
:= Count
;
1560 Result
.Data
(1 .. Npad
) := [others => Pad
];
1561 Result
.Data
(Npad
+ 1 .. Count
) := Source
.Data
(1 .. Slen
);
1564 Result
.Current_Length
:= Max_Length
;
1567 when Strings
.Right
=>
1568 if Npad
>= Max_Length
then
1569 Result
.Data
:= [others => Pad
];
1572 Result
.Data
(1 .. Npad
) := [others => Pad
];
1573 Result
.Data
(Npad
+ 1 .. Max_Length
) :=
1574 Source
.Data
(1 .. Max_Length
- Npad
);
1577 when Strings
.Left
=>
1578 Result
.Data
(1 .. Max_Length
- Slen
) := [others => Pad
];
1579 Result
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1580 Source
.Data
(1 .. Slen
);
1582 when Strings
.Error
=>
1583 raise Ada
.Strings
.Length_Error
;
1590 procedure Super_Tail
1591 (Source
: in out Super_String
;
1593 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
;
1594 Drop
: Truncation
:= Error
)
1596 Max_Length
: constant Positive := Source
.Max_Length
;
1597 Slen
: constant Natural := Source
.Current_Length
;
1598 Npad
: constant Integer := Count
- Slen
;
1600 Temp
: constant Wide_Wide_String
(1 .. Max_Length
) := Source
.Data
;
1604 Source
.Current_Length
:= Count
;
1605 Source
.Data
(1 .. Count
) :=
1606 Temp
(Slen
- (Count
- 1) .. Slen
);
1608 elsif Count
<= Max_Length
then
1609 Source
.Current_Length
:= Count
;
1610 Source
.Data
(1 .. Npad
) := [others => Pad
];
1611 Source
.Data
(Npad
+ 1 .. Count
) := Temp
(1 .. Slen
);
1614 Source
.Current_Length
:= Max_Length
;
1617 when Strings
.Right
=>
1618 if Npad
>= Max_Length
then
1619 Source
.Data
:= [others => Pad
];
1622 Source
.Data
(1 .. Npad
) := [others => Pad
];
1623 Source
.Data
(Npad
+ 1 .. Max_Length
) :=
1624 Temp
(1 .. Max_Length
- Npad
);
1627 when Strings
.Left
=>
1628 for J
in 1 .. Max_Length
- Slen
loop
1629 Source
.Data
(J
) := Pad
;
1632 Source
.Data
(Max_Length
- Slen
+ 1 .. Max_Length
) :=
1635 when Strings
.Error
=>
1636 raise Ada
.Strings
.Length_Error
;
1641 ---------------------
1642 -- Super_To_String --
1643 ---------------------
1645 function Super_To_String
1646 (Source
: Super_String
) return Wide_Wide_String
1649 return R
: Wide_Wide_String
(1 .. Source
.Current_Length
) do
1650 R
:= Source
.Data
(1 .. Source
.Current_Length
);
1652 end Super_To_String
;
1654 ---------------------
1655 -- Super_Translate --
1656 ---------------------
1658 function Super_Translate
1659 (Source
: Super_String
;
1660 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
)
1663 Result
: Super_String
(Source
.Max_Length
);
1666 Result
.Current_Length
:= Source
.Current_Length
;
1668 for J
in 1 .. Source
.Current_Length
loop
1669 Result
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1673 end Super_Translate
;
1675 procedure Super_Translate
1676 (Source
: in out Super_String
;
1677 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
)
1680 for J
in 1 .. Source
.Current_Length
loop
1681 Source
.Data
(J
) := Value
(Mapping
, Source
.Data
(J
));
1683 end Super_Translate
;
1685 function Super_Translate
1686 (Source
: Super_String
;
1687 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
1690 Result
: Super_String
(Source
.Max_Length
);
1693 Result
.Current_Length
:= Source
.Current_Length
;
1695 for J
in 1 .. Source
.Current_Length
loop
1696 Result
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1700 end Super_Translate
;
1702 procedure Super_Translate
1703 (Source
: in out Super_String
;
1704 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
1707 for J
in 1 .. Source
.Current_Length
loop
1708 Source
.Data
(J
) := Mapping
.all (Source
.Data
(J
));
1710 end Super_Translate
;
1717 (Source
: Super_String
;
1718 Side
: Trim_End
) return Super_String
1720 Result
: Super_String
(Source
.Max_Length
);
1721 Last
: Natural := Source
.Current_Length
;
1722 First
: Positive := 1;
1725 if Side
= Left
or else Side
= Both
then
1726 while First
<= Last
and then Source
.Data
(First
) = ' ' loop
1731 if Side
= Right
or else Side
= Both
then
1732 while Last
>= First
and then Source
.Data
(Last
) = ' ' loop
1737 Result
.Current_Length
:= Last
- First
+ 1;
1738 Result
.Data
(1 .. Result
.Current_Length
) := Source
.Data
(First
.. Last
);
1742 procedure Super_Trim
1743 (Source
: in out Super_String
;
1746 Max_Length
: constant Positive := Source
.Max_Length
;
1747 Last
: Natural := Source
.Current_Length
;
1748 First
: Positive := 1;
1749 Temp
: Wide_Wide_String
(1 .. Max_Length
);
1752 Temp
(1 .. Last
) := Source
.Data
(1 .. Last
);
1754 if Side
= Left
or else Side
= Both
then
1755 while First
<= Last
and then Temp
(First
) = ' ' loop
1760 if Side
= Right
or else Side
= Both
then
1761 while Last
>= First
and then Temp
(Last
) = ' ' loop
1766 Source
.Data
:= [others => Wide_Wide_NUL
];
1767 Source
.Current_Length
:= Last
- First
+ 1;
1768 Source
.Data
(1 .. Source
.Current_Length
) := Temp
(First
.. Last
);
1772 (Source
: Super_String
;
1773 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1774 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
) return Super_String
1776 Result
: Super_String
(Source
.Max_Length
);
1779 for First
in 1 .. Source
.Current_Length
loop
1780 if not Is_In
(Source
.Data
(First
), Left
) then
1781 for Last
in reverse First
.. Source
.Current_Length
loop
1782 if not Is_In
(Source
.Data
(Last
), Right
) then
1783 Result
.Current_Length
:= Last
- First
+ 1;
1784 Result
.Data
(1 .. Result
.Current_Length
) :=
1785 Source
.Data
(First
.. Last
);
1792 Result
.Current_Length
:= 0;
1796 procedure Super_Trim
1797 (Source
: in out Super_String
;
1798 Left
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
1799 Right
: Wide_Wide_Maps
.Wide_Wide_Character_Set
)
1802 for First
in 1 .. Source
.Current_Length
loop
1803 if not Is_In
(Source
.Data
(First
), Left
) then
1804 for Last
in reverse First
.. Source
.Current_Length
loop
1805 if not Is_In
(Source
.Data
(Last
), Right
) then
1807 Source
.Current_Length
:= Last
;
1810 Source
.Current_Length
:= Last
- First
+ 1;
1811 Source
.Data
(1 .. Source
.Current_Length
) :=
1812 Source
.Data
(First
.. Last
);
1814 for J
in Source
.Current_Length
+ 1 ..
1817 Source
.Data
(J
) := Wide_Wide_NUL
;
1825 Source
.Current_Length
:= 0;
1830 Source
.Current_Length
:= 0;
1839 Right
: Wide_Wide_Character
;
1840 Max_Length
: Positive) return Super_String
1842 Result
: Super_String
(Max_Length
);
1845 if Left
> Max_Length
then
1846 raise Ada
.Strings
.Length_Error
;
1849 Result
.Current_Length
:= Left
;
1851 for J
in 1 .. Left
loop
1852 Result
.Data
(J
) := Right
;
1861 Right
: Wide_Wide_String
;
1862 Max_Length
: Positive) return Super_String
1864 Result
: Super_String
(Max_Length
);
1865 Pos
: Positive := 1;
1866 Rlen
: constant Natural := Right
'Length;
1867 Nlen
: constant Natural := Left
* Rlen
;
1870 if Nlen
> Max_Length
then
1871 raise Ada
.Strings
.Index_Error
;
1874 Result
.Current_Length
:= Nlen
;
1877 for J
in 1 .. Left
loop
1878 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) := Right
;
1889 Right
: Super_String
) return Super_String
1891 Result
: Super_String
(Right
.Max_Length
);
1892 Pos
: Positive := 1;
1893 Rlen
: constant Natural := Right
.Current_Length
;
1894 Nlen
: constant Natural := Left
* Rlen
;
1897 if Nlen
> Right
.Max_Length
then
1898 raise Ada
.Strings
.Length_Error
;
1901 Result
.Current_Length
:= Nlen
;
1904 for J
in 1 .. Left
loop
1905 Result
.Data
(Pos
.. Pos
+ Rlen
- 1) :=
1906 Right
.Data
(1 .. Rlen
);
1915 ---------------------
1916 -- To_Super_String --
1917 ---------------------
1919 function To_Super_String
1920 (Source
: Wide_Wide_String
;
1921 Max_Length
: Natural;
1922 Drop
: Truncation
:= Error
) return Super_String
1924 Result
: Super_String
(Max_Length
);
1925 Slen
: constant Natural := Source
'Length;
1928 if Slen
<= Max_Length
then
1929 Result
.Current_Length
:= Slen
;
1930 Result
.Data
(1 .. Slen
) := Source
;
1934 when Strings
.Right
=>
1935 Result
.Current_Length
:= Max_Length
;
1936 Result
.Data
(1 .. Max_Length
) :=
1937 Source
(Source
'First .. Source
'First - 1 + Max_Length
);
1939 when Strings
.Left
=>
1940 Result
.Current_Length
:= Max_Length
;
1941 Result
.Data
(1 .. Max_Length
) :=
1942 Source
(Source
'Last - (Max_Length
- 1) .. Source
'Last);
1944 when Strings
.Error
=>
1945 raise Ada
.Strings
.Length_Error
;
1950 end To_Super_String
;
1952 end Ada
.Strings
.Wide_Wide_Superbounded
;