comparison gcc/ada/libgnat/a-stwiun.adb @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 84e7813d76e9
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- A D A . S T R I N G S . W I D E _ U N B O U N D E D --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 1992-2017, Free Software Foundation, Inc. --
10 -- --
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. --
17 -- --
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. --
21 -- --
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/>. --
26 -- --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
29 -- --
30 ------------------------------------------------------------------------------
31
32 with Ada.Strings.Wide_Fixed;
33 with Ada.Strings.Wide_Search;
34 with Ada.Unchecked_Deallocation;
35
36 package body Ada.Strings.Wide_Unbounded is
37
38 ---------
39 -- "&" --
40 ---------
41
42 function "&"
43 (Left : Unbounded_Wide_String;
44 Right : Unbounded_Wide_String) return Unbounded_Wide_String
45 is
46 L_Length : constant Natural := Left.Last;
47 R_Length : constant Natural := Right.Last;
48 Result : Unbounded_Wide_String;
49
50 begin
51 Result.Last := L_Length + R_Length;
52
53 Result.Reference := new Wide_String (1 .. Result.Last);
54
55 Result.Reference (1 .. L_Length) :=
56 Left.Reference (1 .. Left.Last);
57 Result.Reference (L_Length + 1 .. Result.Last) :=
58 Right.Reference (1 .. Right.Last);
59
60 return Result;
61 end "&";
62
63 function "&"
64 (Left : Unbounded_Wide_String;
65 Right : Wide_String) return Unbounded_Wide_String
66 is
67 L_Length : constant Natural := Left.Last;
68 Result : Unbounded_Wide_String;
69
70 begin
71 Result.Last := L_Length + Right'Length;
72
73 Result.Reference := new Wide_String (1 .. Result.Last);
74
75 Result.Reference (1 .. L_Length) := Left.Reference (1 .. Left.Last);
76 Result.Reference (L_Length + 1 .. Result.Last) := Right;
77
78 return Result;
79 end "&";
80
81 function "&"
82 (Left : Wide_String;
83 Right : Unbounded_Wide_String) return Unbounded_Wide_String
84 is
85 R_Length : constant Natural := Right.Last;
86 Result : Unbounded_Wide_String;
87
88 begin
89 Result.Last := Left'Length + R_Length;
90
91 Result.Reference := new Wide_String (1 .. Result.Last);
92
93 Result.Reference (1 .. Left'Length) := Left;
94 Result.Reference (Left'Length + 1 .. Result.Last) :=
95 Right.Reference (1 .. Right.Last);
96
97 return Result;
98 end "&";
99
100 function "&"
101 (Left : Unbounded_Wide_String;
102 Right : Wide_Character) return Unbounded_Wide_String
103 is
104 Result : Unbounded_Wide_String;
105
106 begin
107 Result.Last := Left.Last + 1;
108
109 Result.Reference := new Wide_String (1 .. Result.Last);
110
111 Result.Reference (1 .. Result.Last - 1) :=
112 Left.Reference (1 .. Left.Last);
113 Result.Reference (Result.Last) := Right;
114
115 return Result;
116 end "&";
117
118 function "&"
119 (Left : Wide_Character;
120 Right : Unbounded_Wide_String) return Unbounded_Wide_String
121 is
122 Result : Unbounded_Wide_String;
123
124 begin
125 Result.Last := Right.Last + 1;
126
127 Result.Reference := new Wide_String (1 .. Result.Last);
128 Result.Reference (1) := Left;
129 Result.Reference (2 .. Result.Last) :=
130 Right.Reference (1 .. Right.Last);
131 return Result;
132 end "&";
133
134 ---------
135 -- "*" --
136 ---------
137
138 function "*"
139 (Left : Natural;
140 Right : Wide_Character) return Unbounded_Wide_String
141 is
142 Result : Unbounded_Wide_String;
143
144 begin
145 Result.Last := Left;
146
147 Result.Reference := new Wide_String (1 .. Left);
148 for J in Result.Reference'Range loop
149 Result.Reference (J) := Right;
150 end loop;
151
152 return Result;
153 end "*";
154
155 function "*"
156 (Left : Natural;
157 Right : Wide_String) return Unbounded_Wide_String
158 is
159 Len : constant Natural := Right'Length;
160 K : Positive;
161 Result : Unbounded_Wide_String;
162
163 begin
164 Result.Last := Left * Len;
165
166 Result.Reference := new Wide_String (1 .. Result.Last);
167
168 K := 1;
169 for J in 1 .. Left loop
170 Result.Reference (K .. K + Len - 1) := Right;
171 K := K + Len;
172 end loop;
173
174 return Result;
175 end "*";
176
177 function "*"
178 (Left : Natural;
179 Right : Unbounded_Wide_String) return Unbounded_Wide_String
180 is
181 Len : constant Natural := Right.Last;
182 K : Positive;
183 Result : Unbounded_Wide_String;
184
185 begin
186 Result.Last := Left * Len;
187
188 Result.Reference := new Wide_String (1 .. Result.Last);
189
190 K := 1;
191 for J in 1 .. Left loop
192 Result.Reference (K .. K + Len - 1) :=
193 Right.Reference (1 .. Right.Last);
194 K := K + Len;
195 end loop;
196
197 return Result;
198 end "*";
199
200 ---------
201 -- "<" --
202 ---------
203
204 function "<"
205 (Left : Unbounded_Wide_String;
206 Right : Unbounded_Wide_String) return Boolean
207 is
208 begin
209 return
210 Left.Reference (1 .. Left.Last) < Right.Reference (1 .. Right.Last);
211 end "<";
212
213 function "<"
214 (Left : Unbounded_Wide_String;
215 Right : Wide_String) return Boolean
216 is
217 begin
218 return Left.Reference (1 .. Left.Last) < Right;
219 end "<";
220
221 function "<"
222 (Left : Wide_String;
223 Right : Unbounded_Wide_String) return Boolean
224 is
225 begin
226 return Left < Right.Reference (1 .. Right.Last);
227 end "<";
228
229 ----------
230 -- "<=" --
231 ----------
232
233 function "<="
234 (Left : Unbounded_Wide_String;
235 Right : Unbounded_Wide_String) return Boolean
236 is
237 begin
238 return
239 Left.Reference (1 .. Left.Last) <= Right.Reference (1 .. Right.Last);
240 end "<=";
241
242 function "<="
243 (Left : Unbounded_Wide_String;
244 Right : Wide_String) return Boolean
245 is
246 begin
247 return Left.Reference (1 .. Left.Last) <= Right;
248 end "<=";
249
250 function "<="
251 (Left : Wide_String;
252 Right : Unbounded_Wide_String) return Boolean
253 is
254 begin
255 return Left <= Right.Reference (1 .. Right.Last);
256 end "<=";
257
258 ---------
259 -- "=" --
260 ---------
261
262 function "="
263 (Left : Unbounded_Wide_String;
264 Right : Unbounded_Wide_String) return Boolean
265 is
266 begin
267 return
268 Left.Reference (1 .. Left.Last) = Right.Reference (1 .. Right.Last);
269 end "=";
270
271 function "="
272 (Left : Unbounded_Wide_String;
273 Right : Wide_String) return Boolean
274 is
275 begin
276 return Left.Reference (1 .. Left.Last) = Right;
277 end "=";
278
279 function "="
280 (Left : Wide_String;
281 Right : Unbounded_Wide_String) return Boolean
282 is
283 begin
284 return Left = Right.Reference (1 .. Right.Last);
285 end "=";
286
287 ---------
288 -- ">" --
289 ---------
290
291 function ">"
292 (Left : Unbounded_Wide_String;
293 Right : Unbounded_Wide_String) return Boolean
294 is
295 begin
296 return
297 Left.Reference (1 .. Left.Last) > Right.Reference (1 .. Right.Last);
298 end ">";
299
300 function ">"
301 (Left : Unbounded_Wide_String;
302 Right : Wide_String) return Boolean
303 is
304 begin
305 return Left.Reference (1 .. Left.Last) > Right;
306 end ">";
307
308 function ">"
309 (Left : Wide_String;
310 Right : Unbounded_Wide_String) return Boolean
311 is
312 begin
313 return Left > Right.Reference (1 .. Right.Last);
314 end ">";
315
316 ----------
317 -- ">=" --
318 ----------
319
320 function ">="
321 (Left : Unbounded_Wide_String;
322 Right : Unbounded_Wide_String) return Boolean
323 is
324 begin
325 return
326 Left.Reference (1 .. Left.Last) >= Right.Reference (1 .. Right.Last);
327 end ">=";
328
329 function ">="
330 (Left : Unbounded_Wide_String;
331 Right : Wide_String) return Boolean
332 is
333 begin
334 return Left.Reference (1 .. Left.Last) >= Right;
335 end ">=";
336
337 function ">="
338 (Left : Wide_String;
339 Right : Unbounded_Wide_String) return Boolean
340 is
341 begin
342 return Left >= Right.Reference (1 .. Right.Last);
343 end ">=";
344
345 ------------
346 -- Adjust --
347 ------------
348
349 procedure Adjust (Object : in out Unbounded_Wide_String) is
350 begin
351 -- Copy string, except we do not copy the statically allocated null
352 -- string, since it can never be deallocated. Note that we do not copy
353 -- extra string room here to avoid dragging unused allocated memory.
354
355 if Object.Reference /= Null_Wide_String'Access then
356 Object.Reference :=
357 new Wide_String'(Object.Reference (1 .. Object.Last));
358 end if;
359 end Adjust;
360
361 ------------
362 -- Append --
363 ------------
364
365 procedure Append
366 (Source : in out Unbounded_Wide_String;
367 New_Item : Unbounded_Wide_String)
368 is
369 begin
370 Realloc_For_Chunk (Source, New_Item.Last);
371 Source.Reference (Source.Last + 1 .. Source.Last + New_Item.Last) :=
372 New_Item.Reference (1 .. New_Item.Last);
373 Source.Last := Source.Last + New_Item.Last;
374 end Append;
375
376 procedure Append
377 (Source : in out Unbounded_Wide_String;
378 New_Item : Wide_String)
379 is
380 begin
381 Realloc_For_Chunk (Source, New_Item'Length);
382 Source.Reference (Source.Last + 1 .. Source.Last + New_Item'Length) :=
383 New_Item;
384 Source.Last := Source.Last + New_Item'Length;
385 end Append;
386
387 procedure Append
388 (Source : in out Unbounded_Wide_String;
389 New_Item : Wide_Character)
390 is
391 begin
392 Realloc_For_Chunk (Source, 1);
393 Source.Reference (Source.Last + 1) := New_Item;
394 Source.Last := Source.Last + 1;
395 end Append;
396
397 -----------
398 -- Count --
399 -----------
400
401 function Count
402 (Source : Unbounded_Wide_String;
403 Pattern : Wide_String;
404 Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
405 return Natural
406 is
407 begin
408 return
409 Wide_Search.Count
410 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
411 end Count;
412
413 function Count
414 (Source : Unbounded_Wide_String;
415 Pattern : Wide_String;
416 Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
417 is
418 begin
419 return
420 Wide_Search.Count
421 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
422 end Count;
423
424 function Count
425 (Source : Unbounded_Wide_String;
426 Set : Wide_Maps.Wide_Character_Set) return Natural
427 is
428 begin
429 return
430 Wide_Search.Count
431 (Source.Reference (1 .. Source.Last), Set);
432 end Count;
433
434 ------------
435 -- Delete --
436 ------------
437
438 function Delete
439 (Source : Unbounded_Wide_String;
440 From : Positive;
441 Through : Natural) return Unbounded_Wide_String
442 is
443 begin
444 return
445 To_Unbounded_Wide_String
446 (Wide_Fixed.Delete
447 (Source.Reference (1 .. Source.Last), From, Through));
448 end Delete;
449
450 procedure Delete
451 (Source : in out Unbounded_Wide_String;
452 From : Positive;
453 Through : Natural)
454 is
455 begin
456 if From > Through then
457 null;
458
459 elsif From < Source.Reference'First or else Through > Source.Last then
460 raise Index_Error;
461
462 else
463 declare
464 Len : constant Natural := Through - From + 1;
465
466 begin
467 Source.Reference (From .. Source.Last - Len) :=
468 Source.Reference (Through + 1 .. Source.Last);
469 Source.Last := Source.Last - Len;
470 end;
471 end if;
472 end Delete;
473
474 -------------
475 -- Element --
476 -------------
477
478 function Element
479 (Source : Unbounded_Wide_String;
480 Index : Positive) return Wide_Character
481 is
482 begin
483 if Index <= Source.Last then
484 return Source.Reference (Index);
485 else
486 raise Strings.Index_Error;
487 end if;
488 end Element;
489
490 --------------
491 -- Finalize --
492 --------------
493
494 procedure Finalize (Object : in out Unbounded_Wide_String) is
495 procedure Deallocate is
496 new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
497
498 begin
499 -- Note: Don't try to free statically allocated null string
500
501 if Object.Reference /= Null_Wide_String'Access then
502 Deallocate (Object.Reference);
503 Object.Reference := Null_Unbounded_Wide_String.Reference;
504 Object.Last := 0;
505 end if;
506 end Finalize;
507
508 ----------------
509 -- Find_Token --
510 ----------------
511
512 procedure Find_Token
513 (Source : Unbounded_Wide_String;
514 Set : Wide_Maps.Wide_Character_Set;
515 From : Positive;
516 Test : Strings.Membership;
517 First : out Positive;
518 Last : out Natural)
519 is
520 begin
521 Wide_Search.Find_Token
522 (Source.Reference (From .. Source.Last), Set, Test, First, Last);
523 end Find_Token;
524
525 procedure Find_Token
526 (Source : Unbounded_Wide_String;
527 Set : Wide_Maps.Wide_Character_Set;
528 Test : Strings.Membership;
529 First : out Positive;
530 Last : out Natural)
531 is
532 begin
533 Wide_Search.Find_Token
534 (Source.Reference (1 .. Source.Last), Set, Test, First, Last);
535 end Find_Token;
536
537 ----------
538 -- Free --
539 ----------
540
541 procedure Free (X : in out Wide_String_Access) is
542 procedure Deallocate is
543 new Ada.Unchecked_Deallocation (Wide_String, Wide_String_Access);
544
545 begin
546 -- Note: Do not try to free statically allocated null string
547
548 if X /= Null_Unbounded_Wide_String.Reference then
549 Deallocate (X);
550 end if;
551 end Free;
552
553 ----------
554 -- Head --
555 ----------
556
557 function Head
558 (Source : Unbounded_Wide_String;
559 Count : Natural;
560 Pad : Wide_Character := Wide_Space) return Unbounded_Wide_String
561 is
562 begin
563 return To_Unbounded_Wide_String
564 (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
565 end Head;
566
567 procedure Head
568 (Source : in out Unbounded_Wide_String;
569 Count : Natural;
570 Pad : Wide_Character := Wide_Space)
571 is
572 Old : Wide_String_Access := Source.Reference;
573 begin
574 Source.Reference :=
575 new Wide_String'
576 (Wide_Fixed.Head (Source.Reference (1 .. Source.Last), Count, Pad));
577 Source.Last := Source.Reference'Length;
578 Free (Old);
579 end Head;
580
581 -----------
582 -- Index --
583 -----------
584
585 function Index
586 (Source : Unbounded_Wide_String;
587 Pattern : Wide_String;
588 Going : Strings.Direction := Strings.Forward;
589 Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
590 return Natural
591 is
592 begin
593 return
594 Wide_Search.Index
595 (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
596 end Index;
597
598 function Index
599 (Source : Unbounded_Wide_String;
600 Pattern : Wide_String;
601 Going : Direction := Forward;
602 Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
603 is
604 begin
605 return
606 Wide_Search.Index
607 (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
608 end Index;
609
610 function Index
611 (Source : Unbounded_Wide_String;
612 Set : Wide_Maps.Wide_Character_Set;
613 Test : Strings.Membership := Strings.Inside;
614 Going : Strings.Direction := Strings.Forward) return Natural
615 is
616 begin
617 return Wide_Search.Index
618 (Source.Reference (1 .. Source.Last), Set, Test, Going);
619 end Index;
620
621 function Index
622 (Source : Unbounded_Wide_String;
623 Pattern : Wide_String;
624 From : Positive;
625 Going : Direction := Forward;
626 Mapping : Wide_Maps.Wide_Character_Mapping := Wide_Maps.Identity)
627 return Natural
628 is
629 begin
630 return
631 Wide_Search.Index
632 (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
633 end Index;
634
635 function Index
636 (Source : Unbounded_Wide_String;
637 Pattern : Wide_String;
638 From : Positive;
639 Going : Direction := Forward;
640 Mapping : Wide_Maps.Wide_Character_Mapping_Function) return Natural
641 is
642 begin
643 return
644 Wide_Search.Index
645 (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
646 end Index;
647
648 function Index
649 (Source : Unbounded_Wide_String;
650 Set : Wide_Maps.Wide_Character_Set;
651 From : Positive;
652 Test : Membership := Inside;
653 Going : Direction := Forward) return Natural
654 is
655 begin
656 return
657 Wide_Search.Index
658 (Source.Reference (1 .. Source.Last), Set, From, Test, Going);
659 end Index;
660
661 function Index_Non_Blank
662 (Source : Unbounded_Wide_String;
663 Going : Strings.Direction := Strings.Forward) return Natural
664 is
665 begin
666 return
667 Wide_Search.Index_Non_Blank
668 (Source.Reference (1 .. Source.Last), Going);
669 end Index_Non_Blank;
670
671 function Index_Non_Blank
672 (Source : Unbounded_Wide_String;
673 From : Positive;
674 Going : Direction := Forward) return Natural
675 is
676 begin
677 return
678 Wide_Search.Index_Non_Blank
679 (Source.Reference (1 .. Source.Last), From, Going);
680 end Index_Non_Blank;
681
682 ----------------
683 -- Initialize --
684 ----------------
685
686 procedure Initialize (Object : in out Unbounded_Wide_String) is
687 begin
688 Object.Reference := Null_Unbounded_Wide_String.Reference;
689 Object.Last := 0;
690 end Initialize;
691
692 ------------
693 -- Insert --
694 ------------
695
696 function Insert
697 (Source : Unbounded_Wide_String;
698 Before : Positive;
699 New_Item : Wide_String) return Unbounded_Wide_String
700 is
701 begin
702 return
703 To_Unbounded_Wide_String
704 (Wide_Fixed.Insert
705 (Source.Reference (1 .. Source.Last), Before, New_Item));
706 end Insert;
707
708 procedure Insert
709 (Source : in out Unbounded_Wide_String;
710 Before : Positive;
711 New_Item : Wide_String)
712 is
713 begin
714 if Before not in Source.Reference'First .. Source.Last + 1 then
715 raise Index_Error;
716 end if;
717
718 Realloc_For_Chunk (Source, New_Item'Length);
719
720 Source.Reference
721 (Before + New_Item'Length .. Source.Last + New_Item'Length) :=
722 Source.Reference (Before .. Source.Last);
723
724 Source.Reference (Before .. Before + New_Item'Length - 1) := New_Item;
725 Source.Last := Source.Last + New_Item'Length;
726 end Insert;
727
728 ------------
729 -- Length --
730 ------------
731
732 function Length (Source : Unbounded_Wide_String) return Natural is
733 begin
734 return Source.Last;
735 end Length;
736
737 ---------------
738 -- Overwrite --
739 ---------------
740
741 function Overwrite
742 (Source : Unbounded_Wide_String;
743 Position : Positive;
744 New_Item : Wide_String) return Unbounded_Wide_String
745 is
746 begin
747 return
748 To_Unbounded_Wide_String
749 (Wide_Fixed.Overwrite
750 (Source.Reference (1 .. Source.Last), Position, New_Item));
751 end Overwrite;
752
753 procedure Overwrite
754 (Source : in out Unbounded_Wide_String;
755 Position : Positive;
756 New_Item : Wide_String)
757 is
758 NL : constant Natural := New_Item'Length;
759 begin
760 if Position <= Source.Last - NL + 1 then
761 Source.Reference (Position .. Position + NL - 1) := New_Item;
762 else
763 declare
764 Old : Wide_String_Access := Source.Reference;
765 begin
766 Source.Reference := new Wide_String'
767 (Wide_Fixed.Overwrite
768 (Source.Reference (1 .. Source.Last), Position, New_Item));
769 Source.Last := Source.Reference'Length;
770 Free (Old);
771 end;
772 end if;
773 end Overwrite;
774
775 -----------------------
776 -- Realloc_For_Chunk --
777 -----------------------
778
779 procedure Realloc_For_Chunk
780 (Source : in out Unbounded_Wide_String;
781 Chunk_Size : Natural)
782 is
783 Growth_Factor : constant := 32;
784 -- The growth factor controls how much extra space is allocated when
785 -- we have to increase the size of an allocated unbounded string. By
786 -- allocating extra space, we avoid the need to reallocate on every
787 -- append, particularly important when a string is built up by repeated
788 -- append operations of small pieces. This is expressed as a factor so
789 -- 32 means add 1/32 of the length of the string as growth space.
790
791 Min_Mul_Alloc : constant := Standard'Maximum_Alignment;
792 -- Allocation will be done by a multiple of Min_Mul_Alloc This causes
793 -- no memory loss as most (all?) malloc implementations are obliged to
794 -- align the returned memory on the maximum alignment as malloc does not
795 -- know the target alignment.
796
797 S_Length : constant Natural := Source.Reference'Length;
798
799 begin
800 if Chunk_Size > S_Length - Source.Last then
801 declare
802 New_Size : constant Positive :=
803 S_Length + Chunk_Size + (S_Length / Growth_Factor);
804
805 New_Rounded_Up_Size : constant Positive :=
806 ((New_Size - 1) / Min_Mul_Alloc + 1) * Min_Mul_Alloc;
807
808 Tmp : constant Wide_String_Access :=
809 new Wide_String (1 .. New_Rounded_Up_Size);
810
811 begin
812 Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
813 Free (Source.Reference);
814 Source.Reference := Tmp;
815 end;
816 end if;
817 end Realloc_For_Chunk;
818
819 ---------------------
820 -- Replace_Element --
821 ---------------------
822
823 procedure Replace_Element
824 (Source : in out Unbounded_Wide_String;
825 Index : Positive;
826 By : Wide_Character)
827 is
828 begin
829 if Index <= Source.Last then
830 Source.Reference (Index) := By;
831 else
832 raise Strings.Index_Error;
833 end if;
834 end Replace_Element;
835
836 -------------------
837 -- Replace_Slice --
838 -------------------
839
840 function Replace_Slice
841 (Source : Unbounded_Wide_String;
842 Low : Positive;
843 High : Natural;
844 By : Wide_String) return Unbounded_Wide_String
845 is
846 begin
847 return To_Unbounded_Wide_String
848 (Wide_Fixed.Replace_Slice
849 (Source.Reference (1 .. Source.Last), Low, High, By));
850 end Replace_Slice;
851
852 procedure Replace_Slice
853 (Source : in out Unbounded_Wide_String;
854 Low : Positive;
855 High : Natural;
856 By : Wide_String)
857 is
858 Old : Wide_String_Access := Source.Reference;
859 begin
860 Source.Reference := new Wide_String'
861 (Wide_Fixed.Replace_Slice
862 (Source.Reference (1 .. Source.Last), Low, High, By));
863 Source.Last := Source.Reference'Length;
864 Free (Old);
865 end Replace_Slice;
866
867 -------------------------------
868 -- Set_Unbounded_Wide_String --
869 -------------------------------
870
871 procedure Set_Unbounded_Wide_String
872 (Target : out Unbounded_Wide_String;
873 Source : Wide_String)
874 is
875 begin
876 Target.Last := Source'Length;
877 Target.Reference := new Wide_String (1 .. Source'Length);
878 Target.Reference.all := Source;
879 end Set_Unbounded_Wide_String;
880
881 -----------
882 -- Slice --
883 -----------
884
885 function Slice
886 (Source : Unbounded_Wide_String;
887 Low : Positive;
888 High : Natural) return Wide_String
889 is
890 begin
891 -- Note: test of High > Length is in accordance with AI95-00128
892
893 if Low > Source.Last + 1 or else High > Source.Last then
894 raise Index_Error;
895 else
896 return Source.Reference (Low .. High);
897 end if;
898 end Slice;
899
900 ----------
901 -- Tail --
902 ----------
903
904 function Tail
905 (Source : Unbounded_Wide_String;
906 Count : Natural;
907 Pad : Wide_Character := Wide_Space) return Unbounded_Wide_String is
908 begin
909 return To_Unbounded_Wide_String
910 (Wide_Fixed.Tail (Source.Reference (1 .. Source.Last), Count, Pad));
911 end Tail;
912
913 procedure Tail
914 (Source : in out Unbounded_Wide_String;
915 Count : Natural;
916 Pad : Wide_Character := Wide_Space)
917 is
918 Old : Wide_String_Access := Source.Reference;
919 begin
920 Source.Reference := new Wide_String'
921 (Wide_Fixed.Tail (Source.Reference (1 .. Source.Last), Count, Pad));
922 Source.Last := Source.Reference'Length;
923 Free (Old);
924 end Tail;
925
926 ------------------------------
927 -- To_Unbounded_Wide_String --
928 ------------------------------
929
930 function To_Unbounded_Wide_String
931 (Source : Wide_String)
932 return Unbounded_Wide_String
933 is
934 Result : Unbounded_Wide_String;
935 begin
936 Result.Last := Source'Length;
937 Result.Reference := new Wide_String (1 .. Source'Length);
938 Result.Reference.all := Source;
939 return Result;
940 end To_Unbounded_Wide_String;
941
942 function To_Unbounded_Wide_String
943 (Length : Natural) return Unbounded_Wide_String
944 is
945 Result : Unbounded_Wide_String;
946 begin
947 Result.Last := Length;
948 Result.Reference := new Wide_String (1 .. Length);
949 return Result;
950 end To_Unbounded_Wide_String;
951
952 -------------------
953 -- To_Wide_String --
954 --------------------
955
956 function To_Wide_String
957 (Source : Unbounded_Wide_String)
958 return Wide_String
959 is
960 begin
961 return Source.Reference (1 .. Source.Last);
962 end To_Wide_String;
963
964 ---------------
965 -- Translate --
966 ---------------
967
968 function Translate
969 (Source : Unbounded_Wide_String;
970 Mapping : Wide_Maps.Wide_Character_Mapping)
971 return Unbounded_Wide_String
972 is
973 begin
974 return
975 To_Unbounded_Wide_String
976 (Wide_Fixed.Translate
977 (Source.Reference (1 .. Source.Last), Mapping));
978 end Translate;
979
980 procedure Translate
981 (Source : in out Unbounded_Wide_String;
982 Mapping : Wide_Maps.Wide_Character_Mapping)
983 is
984 begin
985 Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
986 end Translate;
987
988 function Translate
989 (Source : Unbounded_Wide_String;
990 Mapping : Wide_Maps.Wide_Character_Mapping_Function)
991 return Unbounded_Wide_String
992 is
993 begin
994 return
995 To_Unbounded_Wide_String
996 (Wide_Fixed.Translate
997 (Source.Reference (1 .. Source.Last), Mapping));
998 end Translate;
999
1000 procedure Translate
1001 (Source : in out Unbounded_Wide_String;
1002 Mapping : Wide_Maps.Wide_Character_Mapping_Function)
1003 is
1004 begin
1005 Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
1006 end Translate;
1007
1008 ----------
1009 -- Trim --
1010 ----------
1011
1012 function Trim
1013 (Source : Unbounded_Wide_String;
1014 Side : Trim_End) return Unbounded_Wide_String
1015 is
1016 begin
1017 return
1018 To_Unbounded_Wide_String
1019 (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
1020 end Trim;
1021
1022 procedure Trim
1023 (Source : in out Unbounded_Wide_String;
1024 Side : Trim_End)
1025 is
1026 Old : Wide_String_Access := Source.Reference;
1027 begin
1028 Source.Reference :=
1029 new Wide_String'
1030 (Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
1031 Source.Last := Source.Reference'Length;
1032 Free (Old);
1033 end Trim;
1034
1035 function Trim
1036 (Source : Unbounded_Wide_String;
1037 Left : Wide_Maps.Wide_Character_Set;
1038 Right : Wide_Maps.Wide_Character_Set)
1039 return Unbounded_Wide_String
1040 is
1041 begin
1042 return
1043 To_Unbounded_Wide_String
1044 (Wide_Fixed.Trim
1045 (Source.Reference (1 .. Source.Last), Left, Right));
1046 end Trim;
1047
1048 procedure Trim
1049 (Source : in out Unbounded_Wide_String;
1050 Left : Wide_Maps.Wide_Character_Set;
1051 Right : Wide_Maps.Wide_Character_Set)
1052 is
1053 Old : Wide_String_Access := Source.Reference;
1054 begin
1055 Source.Reference :=
1056 new Wide_String'
1057 (Wide_Fixed.Trim
1058 (Source.Reference (1 .. Source.Last), Left, Right));
1059 Source.Last := Source.Reference'Length;
1060 Free (Old);
1061 end Trim;
1062
1063 ---------------------
1064 -- Unbounded_Slice --
1065 ---------------------
1066
1067 function Unbounded_Slice
1068 (Source : Unbounded_Wide_String;
1069 Low : Positive;
1070 High : Natural) return Unbounded_Wide_String
1071 is
1072 begin
1073 if Low > Source.Last + 1 or else High > Source.Last then
1074 raise Index_Error;
1075 else
1076 return To_Unbounded_Wide_String (Source.Reference.all (Low .. High));
1077 end if;
1078 end Unbounded_Slice;
1079
1080 procedure Unbounded_Slice
1081 (Source : Unbounded_Wide_String;
1082 Target : out Unbounded_Wide_String;
1083 Low : Positive;
1084 High : Natural)
1085 is
1086 begin
1087 if Low > Source.Last + 1 or else High > Source.Last then
1088 raise Index_Error;
1089 else
1090 Target :=
1091 To_Unbounded_Wide_String (Source.Reference.all (Low .. High));
1092 end if;
1093 end Unbounded_Slice;
1094
1095 end Ada.Strings.Wide_Unbounded;