1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT RUN-TIME COMPONENTS                         --
4--                                                                          --
5--      A D A . S T R I N G S . W I D E _ W I D E _ U N B O U N D E D       --
6--                                                                          --
7--                                 S p e c                                  --
8--                                                                          --
9--          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
10--                                                                          --
11-- This specification is derived from the Ada Reference Manual for use with --
12-- GNAT. The copyright notice above, and the license provisions that follow --
13-- apply solely to the  contents of the part following the private keyword. --
14--                                                                          --
15-- GNAT is free software;  you can  redistribute it  and/or modify it under --
16-- terms of the  GNU General Public License as published  by the Free Soft- --
17-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
18-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
19-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
20-- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
21--                                                                          --
22-- As a special exception under Section 7 of GPL version 3, you are granted --
23-- additional permissions described in the GCC Runtime Library Exception,   --
24-- version 3.1, as published by the Free Software Foundation.               --
25--                                                                          --
26-- You should have received a copy of the GNU General Public License and    --
27-- a copy of the GCC Runtime Library Exception along with this program;     --
28-- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
29-- <http://www.gnu.org/licenses/>.                                          --
30--                                                                          --
31-- GNAT was originally developed  by the GNAT team at  New York University. --
32-- Extensive contributions were provided by Ada Core Technologies Inc.      --
33--                                                                          --
34------------------------------------------------------------------------------
35
36with Ada.Strings.Wide_Wide_Maps;
37with Ada.Finalization;
38
39package Ada.Strings.Wide_Wide_Unbounded is
40   pragma Preelaborate;
41
42   type Unbounded_Wide_Wide_String is private;
43   pragma Preelaborable_Initialization (Unbounded_Wide_Wide_String);
44
45   Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String;
46
47   function Length (Source : Unbounded_Wide_Wide_String) return Natural;
48
49   type Wide_Wide_String_Access is access all Wide_Wide_String;
50
51   procedure Free (X : in out Wide_Wide_String_Access);
52
53   --------------------------------------------------------
54   -- Conversion, Concatenation, and Selection Functions --
55   --------------------------------------------------------
56
57   function To_Unbounded_Wide_Wide_String
58     (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String;
59
60   function To_Unbounded_Wide_Wide_String
61     (Length : Natural) return Unbounded_Wide_Wide_String;
62
63   function To_Wide_Wide_String
64     (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String;
65
66   procedure Set_Unbounded_Wide_Wide_String
67     (Target : out Unbounded_Wide_Wide_String;
68      Source : Wide_Wide_String);
69   pragma Ada_05 (Set_Unbounded_Wide_Wide_String);
70
71   procedure Append
72     (Source   : in out Unbounded_Wide_Wide_String;
73      New_Item : Unbounded_Wide_Wide_String);
74
75   procedure Append
76     (Source   : in out Unbounded_Wide_Wide_String;
77      New_Item : Wide_Wide_String);
78
79   procedure Append
80     (Source   : in out Unbounded_Wide_Wide_String;
81      New_Item : Wide_Wide_Character);
82
83   function "&"
84     (Left  : Unbounded_Wide_Wide_String;
85      Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
86
87   function "&"
88     (Left  : Unbounded_Wide_Wide_String;
89      Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
90
91   function "&"
92     (Left  : Wide_Wide_String;
93      Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
94
95   function "&"
96     (Left  : Unbounded_Wide_Wide_String;
97      Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
98
99   function "&"
100     (Left  : Wide_Wide_Character;
101      Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
102
103   function Element
104     (Source : Unbounded_Wide_Wide_String;
105      Index  : Positive) return Wide_Wide_Character;
106
107   procedure Replace_Element
108     (Source : in out Unbounded_Wide_Wide_String;
109      Index  : Positive;
110      By     : Wide_Wide_Character);
111
112   function Slice
113     (Source : Unbounded_Wide_Wide_String;
114      Low    : Positive;
115      High   : Natural) return Wide_Wide_String;
116
117   function Unbounded_Slice
118     (Source : Unbounded_Wide_Wide_String;
119      Low    : Positive;
120      High   : Natural) return Unbounded_Wide_Wide_String;
121      pragma Ada_05 (Unbounded_Slice);
122
123   procedure Unbounded_Slice
124     (Source : Unbounded_Wide_Wide_String;
125      Target : out Unbounded_Wide_Wide_String;
126      Low    : Positive;
127      High   : Natural);
128      pragma Ada_05 (Unbounded_Slice);
129
130   function "="
131     (Left  : Unbounded_Wide_Wide_String;
132      Right : Unbounded_Wide_Wide_String) return Boolean;
133
134   function "="
135     (Left  : Unbounded_Wide_Wide_String;
136      Right : Wide_Wide_String) return Boolean;
137
138   function "="
139     (Left  : Wide_Wide_String;
140      Right : Unbounded_Wide_Wide_String) return Boolean;
141
142   function "<"
143     (Left  : Unbounded_Wide_Wide_String;
144      Right : Unbounded_Wide_Wide_String) return Boolean;
145
146   function "<"
147     (Left  : Unbounded_Wide_Wide_String;
148      Right : Wide_Wide_String) return Boolean;
149
150   function "<"
151     (Left  : Wide_Wide_String;
152      Right : Unbounded_Wide_Wide_String) return Boolean;
153
154   function "<="
155     (Left  : Unbounded_Wide_Wide_String;
156      Right : Unbounded_Wide_Wide_String) return Boolean;
157
158   function "<="
159     (Left  : Unbounded_Wide_Wide_String;
160      Right : Wide_Wide_String) return Boolean;
161
162   function "<="
163     (Left  : Wide_Wide_String;
164      Right : Unbounded_Wide_Wide_String) return Boolean;
165
166   function ">"
167     (Left  : Unbounded_Wide_Wide_String;
168      Right : Unbounded_Wide_Wide_String) return Boolean;
169
170   function ">"
171     (Left  : Unbounded_Wide_Wide_String;
172      Right : Wide_Wide_String) return Boolean;
173
174   function ">"
175     (Left  : Wide_Wide_String;
176      Right : Unbounded_Wide_Wide_String) return Boolean;
177
178   function ">="
179     (Left  : Unbounded_Wide_Wide_String;
180      Right : Unbounded_Wide_Wide_String) return Boolean;
181
182   function ">="
183     (Left  : Unbounded_Wide_Wide_String;
184      Right : Wide_Wide_String) return Boolean;
185
186   function ">="
187     (Left  : Wide_Wide_String;
188      Right : Unbounded_Wide_Wide_String) return Boolean;
189
190   ------------------------
191   -- Search Subprograms --
192   ------------------------
193
194   function Index
195     (Source  : Unbounded_Wide_Wide_String;
196      Pattern : Wide_Wide_String;
197      Going   : Direction := Forward;
198      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
199                  Wide_Wide_Maps.Identity)
200      return Natural;
201
202   function Index
203     (Source  : Unbounded_Wide_Wide_String;
204      Pattern : Wide_Wide_String;
205      Going   : Direction := Forward;
206      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
207      return Natural;
208
209   function Index
210     (Source : Unbounded_Wide_Wide_String;
211      Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
212      Test   : Membership := Inside;
213      Going  : Direction  := Forward) return Natural;
214
215   function Index
216     (Source  : Unbounded_Wide_Wide_String;
217      Pattern : Wide_Wide_String;
218      From    : Positive;
219      Going   : Direction := Forward;
220      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
221                  Wide_Wide_Maps.Identity)
222      return Natural;
223   pragma Ada_05 (Index);
224
225   function Index
226     (Source  : Unbounded_Wide_Wide_String;
227      Pattern : Wide_Wide_String;
228      From    : Positive;
229      Going   : Direction := Forward;
230      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
231      return Natural;
232   pragma Ada_05 (Index);
233
234   function Index
235     (Source : Unbounded_Wide_Wide_String;
236      Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
237      From   : Positive;
238      Test   : Membership := Inside;
239      Going  : Direction := Forward) return Natural;
240   pragma Ada_05 (Index);
241
242   function Index_Non_Blank
243     (Source : Unbounded_Wide_Wide_String;
244      Going  : Direction := Forward) return Natural;
245
246   function Index_Non_Blank
247     (Source : Unbounded_Wide_Wide_String;
248      From   : Positive;
249      Going  : Direction := Forward) return Natural;
250   pragma Ada_05 (Index_Non_Blank);
251
252   function Count
253     (Source  : Unbounded_Wide_Wide_String;
254      Pattern : Wide_Wide_String;
255      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
256                  Wide_Wide_Maps.Identity)
257      return Natural;
258
259   function Count
260     (Source  : Unbounded_Wide_Wide_String;
261      Pattern : Wide_Wide_String;
262      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
263      return Natural;
264
265   function Count
266     (Source : Unbounded_Wide_Wide_String;
267      Set    : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural;
268
269   procedure Find_Token
270     (Source : Unbounded_Wide_Wide_String;
271      Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
272      From   : Positive;
273      Test   : Membership;
274      First  : out Positive;
275      Last   : out Natural);
276   pragma Ada_2012 (Find_Token);
277
278   procedure Find_Token
279     (Source : Unbounded_Wide_Wide_String;
280      Set    : Wide_Wide_Maps.Wide_Wide_Character_Set;
281      Test   : Membership;
282      First  : out Positive;
283      Last   : out Natural);
284
285   ------------------------------------
286   -- String Translation Subprograms --
287   ------------------------------------
288
289   function Translate
290     (Source  : Unbounded_Wide_Wide_String;
291      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
292      return Unbounded_Wide_Wide_String;
293
294   procedure Translate
295     (Source  : in out Unbounded_Wide_Wide_String;
296      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping);
297
298   function Translate
299     (Source  : Unbounded_Wide_Wide_String;
300      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
301      return Unbounded_Wide_Wide_String;
302
303   procedure Translate
304     (Source  : in out Unbounded_Wide_Wide_String;
305      Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function);
306
307   ---------------------------------------
308   -- String Transformation Subprograms --
309   ---------------------------------------
310
311   function Replace_Slice
312     (Source : Unbounded_Wide_Wide_String;
313      Low    : Positive;
314      High   : Natural;
315      By     : Wide_Wide_String) return Unbounded_Wide_Wide_String;
316
317   procedure Replace_Slice
318     (Source : in out Unbounded_Wide_Wide_String;
319      Low    : Positive;
320      High   : Natural;
321      By     : Wide_Wide_String);
322
323   function Insert
324     (Source   : Unbounded_Wide_Wide_String;
325      Before   : Positive;
326      New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
327
328   procedure Insert
329     (Source   : in out Unbounded_Wide_Wide_String;
330      Before   : Positive;
331      New_Item : Wide_Wide_String);
332
333   function Overwrite
334     (Source   : Unbounded_Wide_Wide_String;
335      Position : Positive;
336      New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
337
338   procedure Overwrite
339     (Source   : in out Unbounded_Wide_Wide_String;
340      Position : Positive;
341      New_Item : Wide_Wide_String);
342
343   function Delete
344     (Source  : Unbounded_Wide_Wide_String;
345      From    : Positive;
346      Through : Natural) return Unbounded_Wide_Wide_String;
347
348   procedure Delete
349     (Source  : in out Unbounded_Wide_Wide_String;
350      From    : Positive;
351      Through : Natural);
352
353   function Trim
354     (Source : Unbounded_Wide_Wide_String;
355      Side   : Trim_End) return Unbounded_Wide_Wide_String;
356
357   procedure Trim
358     (Source : in out Unbounded_Wide_Wide_String;
359      Side   : Trim_End);
360
361   function Trim
362     (Source : Unbounded_Wide_Wide_String;
363      Left   : Wide_Wide_Maps.Wide_Wide_Character_Set;
364      Right  : Wide_Wide_Maps.Wide_Wide_Character_Set)
365      return Unbounded_Wide_Wide_String;
366
367   procedure Trim
368     (Source : in out Unbounded_Wide_Wide_String;
369      Left   : Wide_Wide_Maps.Wide_Wide_Character_Set;
370      Right  : Wide_Wide_Maps.Wide_Wide_Character_Set);
371
372   function Head
373     (Source : Unbounded_Wide_Wide_String;
374      Count  : Natural;
375      Pad    : Wide_Wide_Character := Wide_Wide_Space)
376      return Unbounded_Wide_Wide_String;
377
378   procedure Head
379     (Source : in out Unbounded_Wide_Wide_String;
380      Count  : Natural;
381      Pad    : Wide_Wide_Character := Wide_Wide_Space);
382
383   function Tail
384     (Source : Unbounded_Wide_Wide_String;
385      Count  : Natural;
386      Pad    : Wide_Wide_Character := Wide_Wide_Space)
387      return Unbounded_Wide_Wide_String;
388
389   procedure Tail
390     (Source : in out Unbounded_Wide_Wide_String;
391      Count  : Natural;
392      Pad    : Wide_Wide_Character := Wide_Wide_Space);
393
394   function "*"
395     (Left  : Natural;
396      Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
397
398   function "*"
399     (Left  : Natural;
400      Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
401
402   function "*"
403     (Left  : Natural;
404      Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
405
406private
407   pragma Inline (Length);
408
409   package AF renames Ada.Finalization;
410
411   Null_Wide_Wide_String : aliased Wide_Wide_String := "";
412
413   function To_Unbounded_Wide
414     (S : Wide_Wide_String) return Unbounded_Wide_Wide_String
415     renames To_Unbounded_Wide_Wide_String;
416
417   type Unbounded_Wide_Wide_String is new AF.Controlled with record
418      Reference : Wide_Wide_String_Access := Null_Wide_Wide_String'Access;
419      Last      : Natural            := 0;
420   end record;
421
422   --  The Unbounded_Wide_Wide_String is using a buffered implementation to
423   --  increase speed of the Append/Delete/Insert procedures. The Reference
424   --  string pointer above contains the current string value and extra room
425   --  at the end to be used by the next Append routine. Last is the index of
426   --  the string ending character. So the current string value is really
427   --  Reference (1 .. Last).
428
429   pragma Stream_Convert
430     (Unbounded_Wide_Wide_String, To_Unbounded_Wide, To_Wide_Wide_String);
431
432   pragma Finalize_Storage_Only (Unbounded_Wide_Wide_String);
433   --  Finalization is required only for freeing storage
434
435   procedure Initialize (Object : in out Unbounded_Wide_Wide_String);
436   procedure Adjust     (Object : in out Unbounded_Wide_Wide_String);
437   procedure Finalize   (Object : in out Unbounded_Wide_Wide_String);
438   procedure Realloc_For_Chunk
439     (Source     : in out Unbounded_Wide_Wide_String;
440      Chunk_Size : Natural);
441   --  Adjust the size allocated for the string. Add at least Chunk_Size so it
442   --  is safe to add a string of this size at the end of the current content.
443   --  The real size allocated for the string is Chunk_Size + x of the current
444   --  string size. This buffered handling makes the Append unbounded string
445   --  routines very fast.
446
447   Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String :=
448                                       (AF.Controlled with
449                                          Reference =>
450                                            Null_Wide_Wide_String'Access,
451                                          Last => 0);
452end Ada.Strings.Wide_Wide_Unbounded;
453