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 _ U N B O U N D E D --
9 -- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
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. --
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 2, 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. See the GNU General Public License --
21 -- for more details. You should have received a copy of the GNU General --
22 -- Public License distributed with GNAT; see file COPYING. If not, write --
23 -- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
24 -- Boston, MA 02110-1301, USA. --
26 -- As a special exception, if other files instantiate generics from this --
27 -- unit, or you link this unit with other files to produce an executable, --
28 -- this unit does not by itself cause the resulting executable to be --
29 -- covered by the GNU General Public License. This exception does not --
30 -- however invalidate any other reasons why the executable file might be --
31 -- covered by the GNU Public License. --
33 -- GNAT was originally developed by the GNAT team at New York University. --
34 -- Extensive contributions were provided by Ada Core Technologies Inc. --
36 ------------------------------------------------------------------------------
38 with Ada.Strings.Wide_Wide_Maps;
39 with Ada.Finalization;
41 package Ada.Strings.Wide_Wide_Unbounded is
42 pragma Preelaborate (Wide_Wide_Unbounded);
43 type Unbounded_Wide_Wide_String is private;
45 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String;
47 function Length (Source : Unbounded_Wide_Wide_String) return Natural;
49 type Wide_Wide_String_Access is access all Wide_Wide_String;
51 procedure Free (X : in out Wide_Wide_String_Access);
53 --------------------------------------------------------
54 -- Conversion, Concatenation, and Selection Functions --
55 --------------------------------------------------------
57 function To_Unbounded_Wide_Wide_String
58 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String;
60 function To_Unbounded_Wide_Wide_String
61 (Length : Natural) return Unbounded_Wide_Wide_String;
63 function To_Wide_Wide_String
64 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String;
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);
72 (Source : in out Unbounded_Wide_Wide_String;
73 New_Item : Unbounded_Wide_Wide_String);
76 (Source : in out Unbounded_Wide_Wide_String;
77 New_Item : Wide_Wide_String);
80 (Source : in out Unbounded_Wide_Wide_String;
81 New_Item : Wide_Wide_Character);
84 (Left : Unbounded_Wide_Wide_String;
85 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
88 (Left : Unbounded_Wide_Wide_String;
89 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
92 (Left : Wide_Wide_String;
93 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
96 (Left : Unbounded_Wide_Wide_String;
97 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
100 (Left : Wide_Wide_Character;
101 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
104 (Source : Unbounded_Wide_Wide_String;
105 Index : Positive) return Wide_Wide_Character;
107 procedure Replace_Element
108 (Source : in out Unbounded_Wide_Wide_String;
110 By : Wide_Wide_Character);
113 (Source : Unbounded_Wide_Wide_String;
115 High : Natural) return Wide_Wide_String;
117 function Unbounded_Slice
118 (Source : Unbounded_Wide_Wide_String;
120 High : Natural) return Unbounded_Wide_Wide_String;
121 pragma Ada_05 (Unbounded_Slice);
123 procedure Unbounded_Slice
124 (Source : Unbounded_Wide_Wide_String;
125 Target : out Unbounded_Wide_Wide_String;
128 pragma Ada_05 (Unbounded_Slice);
131 (Left : Unbounded_Wide_Wide_String;
132 Right : Unbounded_Wide_Wide_String) return Boolean;
135 (Left : Unbounded_Wide_Wide_String;
136 Right : Wide_Wide_String) return Boolean;
139 (Left : Wide_Wide_String;
140 Right : Unbounded_Wide_Wide_String) return Boolean;
143 (Left : Unbounded_Wide_Wide_String;
144 Right : Unbounded_Wide_Wide_String) return Boolean;
147 (Left : Unbounded_Wide_Wide_String;
148 Right : Wide_Wide_String) return Boolean;
151 (Left : Wide_Wide_String;
152 Right : Unbounded_Wide_Wide_String) return Boolean;
155 (Left : Unbounded_Wide_Wide_String;
156 Right : Unbounded_Wide_Wide_String) return Boolean;
159 (Left : Unbounded_Wide_Wide_String;
160 Right : Wide_Wide_String) return Boolean;
163 (Left : Wide_Wide_String;
164 Right : Unbounded_Wide_Wide_String) return Boolean;
167 (Left : Unbounded_Wide_Wide_String;
168 Right : Unbounded_Wide_Wide_String) return Boolean;
171 (Left : Unbounded_Wide_Wide_String;
172 Right : Wide_Wide_String) return Boolean;
175 (Left : Wide_Wide_String;
176 Right : Unbounded_Wide_Wide_String) return Boolean;
179 (Left : Unbounded_Wide_Wide_String;
180 Right : Unbounded_Wide_Wide_String) return Boolean;
183 (Left : Unbounded_Wide_Wide_String;
184 Right : Wide_Wide_String) return Boolean;
187 (Left : Wide_Wide_String;
188 Right : Unbounded_Wide_Wide_String) return Boolean;
190 ------------------------
191 -- Search Subprograms --
192 ------------------------
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)
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)
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;
216 (Source : Unbounded_Wide_Wide_String;
217 Pattern : Wide_Wide_String;
219 Going : Direction := Forward;
220 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
221 Wide_Wide_Maps.Identity)
223 pragma Ada_05 (Index);
226 (Source : Unbounded_Wide_Wide_String;
227 Pattern : Wide_Wide_String;
229 Going : Direction := Forward;
230 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
232 pragma Ada_05 (Index);
235 (Source : Unbounded_Wide_Wide_String;
236 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
238 Test : Membership := Inside;
239 Going : Direction := Forward) return Natural;
240 pragma Ada_05 (Index);
242 function Index_Non_Blank
243 (Source : Unbounded_Wide_Wide_String;
244 Going : Direction := Forward) return Natural;
246 function Index_Non_Blank
247 (Source : Unbounded_Wide_Wide_String;
249 Going : Direction := Forward) return Natural;
250 pragma Ada_05 (Index_Non_Blank);
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)
260 (Source : Unbounded_Wide_Wide_String;
261 Pattern : Wide_Wide_String;
262 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
266 (Source : Unbounded_Wide_Wide_String;
267 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural;
270 (Source : Unbounded_Wide_Wide_String;
271 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
273 First : out Positive;
276 ------------------------------------
277 -- String Translation Subprograms --
278 ------------------------------------
281 (Source : Unbounded_Wide_Wide_String;
282 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
283 return Unbounded_Wide_Wide_String;
286 (Source : in out Unbounded_Wide_Wide_String;
287 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping);
290 (Source : Unbounded_Wide_Wide_String;
291 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
292 return Unbounded_Wide_Wide_String;
295 (Source : in out Unbounded_Wide_Wide_String;
296 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function);
298 ---------------------------------------
299 -- String Transformation Subprograms --
300 ---------------------------------------
302 function Replace_Slice
303 (Source : Unbounded_Wide_Wide_String;
306 By : Wide_Wide_String) return Unbounded_Wide_Wide_String;
308 procedure Replace_Slice
309 (Source : in out Unbounded_Wide_Wide_String;
312 By : Wide_Wide_String);
315 (Source : Unbounded_Wide_Wide_String;
317 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
320 (Source : in out Unbounded_Wide_Wide_String;
322 New_Item : Wide_Wide_String);
325 (Source : Unbounded_Wide_Wide_String;
327 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String;
330 (Source : in out Unbounded_Wide_Wide_String;
332 New_Item : Wide_Wide_String);
335 (Source : Unbounded_Wide_Wide_String;
337 Through : Natural) return Unbounded_Wide_Wide_String;
340 (Source : in out Unbounded_Wide_Wide_String;
345 (Source : Unbounded_Wide_Wide_String;
346 Side : Trim_End) return Unbounded_Wide_Wide_String;
349 (Source : in out Unbounded_Wide_Wide_String;
353 (Source : Unbounded_Wide_Wide_String;
354 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
355 Right : Wide_Wide_Maps.Wide_Wide_Character_Set)
356 return Unbounded_Wide_Wide_String;
359 (Source : in out Unbounded_Wide_Wide_String;
360 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
361 Right : Wide_Wide_Maps.Wide_Wide_Character_Set);
364 (Source : Unbounded_Wide_Wide_String;
366 Pad : Wide_Wide_Character := Wide_Wide_Space)
367 return Unbounded_Wide_Wide_String;
370 (Source : in out Unbounded_Wide_Wide_String;
372 Pad : Wide_Wide_Character := Wide_Wide_Space);
375 (Source : Unbounded_Wide_Wide_String;
377 Pad : Wide_Wide_Character := Wide_Wide_Space)
378 return Unbounded_Wide_Wide_String;
381 (Source : in out Unbounded_Wide_Wide_String;
383 Pad : Wide_Wide_Character := Wide_Wide_Space);
387 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String;
391 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String;
395 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String;
398 pragma Inline (Length);
400 package AF renames Ada.Finalization;
402 Null_Wide_Wide_String : aliased Wide_Wide_String := "";
404 function To_Unbounded_Wide
405 (S : Wide_Wide_String) return Unbounded_Wide_Wide_String
406 renames To_Unbounded_Wide_Wide_String;
408 type Unbounded_Wide_Wide_String is new AF.Controlled with record
409 Reference : Wide_Wide_String_Access := Null_Wide_Wide_String'Access;
413 -- The Unbounded_Wide_Wide_String is using a buffered implementation to
414 -- increase speed of the Append/Delete/Insert procedures. The Reference
415 -- string pointer above contains the current string value and extra room
416 -- at the end to be used by the next Append routine. Last is the index of
417 -- the string ending character. So the current string value is really
418 -- Reference (1 .. Last).
420 pragma Stream_Convert
421 (Unbounded_Wide_Wide_String, To_Unbounded_Wide, To_Wide_Wide_String);
423 pragma Finalize_Storage_Only (Unbounded_Wide_Wide_String);
424 -- Finalization is required only for freeing storage
426 procedure Initialize (Object : in out Unbounded_Wide_Wide_String);
427 procedure Adjust (Object : in out Unbounded_Wide_Wide_String);
428 procedure Finalize (Object : in out Unbounded_Wide_Wide_String);
429 procedure Realloc_For_Chunk
430 (Source : in out Unbounded_Wide_Wide_String;
431 Chunk_Size : Natural);
432 -- Adjust the size allocated for the string. Add at least Chunk_Size so it
433 -- is safe to add a string of this size at the end of the current content.
434 -- The real size allocated for the string is Chunk_Size + x of the current
435 -- string size. This buffered handling makes the Append unbounded string
436 -- routines very fast.
438 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String :=
441 Null_Wide_Wide_String'Access,
443 -- Note: this declaration is illegal since library level controlled
444 -- objects are not allowed in preelaborated units. See AI-161 for a
445 -- discussion of this issue and an attempt to address it. Meanwhile,
446 -- what happens in GNAT is that this check is omitted for internal
447 -- implementation units (see check in sem_cat.adb).
449 end Ada.Strings.Wide_Wide_Unbounded;