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-2010, 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 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. --
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. --
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/>. --
31 -- GNAT was originally developed by the GNAT team at New York University. --
32 -- Extensive contributions were provided by Ada Core Technologies Inc. --
34 ------------------------------------------------------------------------------
36 with Ada
.Strings
.Wide_Wide_Maps
;
37 with Ada
.Finalization
;
39 package Ada
.Strings
.Wide_Wide_Unbounded
is
42 type Unbounded_Wide_Wide_String
is private;
43 pragma Preelaborable_Initialization
(Unbounded_Wide_Wide_String
);
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
;
274 First
: out Positive;
276 pragma Ada_2012
(Find_Token
);
279 (Source
: Unbounded_Wide_Wide_String
;
280 Set
: Wide_Wide_Maps
.Wide_Wide_Character_Set
;
282 First
: out Positive;
285 ------------------------------------
286 -- String Translation Subprograms --
287 ------------------------------------
290 (Source
: Unbounded_Wide_Wide_String
;
291 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
)
292 return Unbounded_Wide_Wide_String
;
295 (Source
: in out Unbounded_Wide_Wide_String
;
296 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping
);
299 (Source
: Unbounded_Wide_Wide_String
;
300 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
)
301 return Unbounded_Wide_Wide_String
;
304 (Source
: in out Unbounded_Wide_Wide_String
;
305 Mapping
: Wide_Wide_Maps
.Wide_Wide_Character_Mapping_Function
);
307 ---------------------------------------
308 -- String Transformation Subprograms --
309 ---------------------------------------
311 function Replace_Slice
312 (Source
: Unbounded_Wide_Wide_String
;
315 By
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
;
317 procedure Replace_Slice
318 (Source
: in out Unbounded_Wide_Wide_String
;
321 By
: Wide_Wide_String
);
324 (Source
: Unbounded_Wide_Wide_String
;
326 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
;
329 (Source
: in out Unbounded_Wide_Wide_String
;
331 New_Item
: Wide_Wide_String
);
334 (Source
: Unbounded_Wide_Wide_String
;
336 New_Item
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
;
339 (Source
: in out Unbounded_Wide_Wide_String
;
341 New_Item
: Wide_Wide_String
);
344 (Source
: Unbounded_Wide_Wide_String
;
346 Through
: Natural) return Unbounded_Wide_Wide_String
;
349 (Source
: in out Unbounded_Wide_Wide_String
;
354 (Source
: Unbounded_Wide_Wide_String
;
355 Side
: Trim_End
) return Unbounded_Wide_Wide_String
;
358 (Source
: in out Unbounded_Wide_Wide_String
;
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
;
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
);
373 (Source
: Unbounded_Wide_Wide_String
;
375 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
376 return Unbounded_Wide_Wide_String
;
379 (Source
: in out Unbounded_Wide_Wide_String
;
381 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
);
384 (Source
: Unbounded_Wide_Wide_String
;
386 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
)
387 return Unbounded_Wide_Wide_String
;
390 (Source
: in out Unbounded_Wide_Wide_String
;
392 Pad
: Wide_Wide_Character
:= Wide_Wide_Space
);
396 Right
: Wide_Wide_Character
) return Unbounded_Wide_Wide_String
;
400 Right
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
;
404 Right
: Unbounded_Wide_Wide_String
) return Unbounded_Wide_Wide_String
;
407 pragma Inline
(Length
);
409 package AF
renames Ada
.Finalization
;
411 Null_Wide_Wide_String
: aliased Wide_Wide_String
:= "";
413 function To_Unbounded_Wide
414 (S
: Wide_Wide_String
) return Unbounded_Wide_Wide_String
415 renames To_Unbounded_Wide_Wide_String
;
417 type Unbounded_Wide_Wide_String
is new AF
.Controlled
with record
418 Reference
: Wide_Wide_String_Access
:= Null_Wide_Wide_String
'Access;
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).
429 pragma Stream_Convert
430 (Unbounded_Wide_Wide_String
, To_Unbounded_Wide
, To_Wide_Wide_String
);
432 pragma Finalize_Storage_Only
(Unbounded_Wide_Wide_String
);
433 -- Finalization is required only for freeing storage
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.
447 Null_Unbounded_Wide_Wide_String
: constant Unbounded_Wide_Wide_String
:=
450 Null_Wide_Wide_String
'Access,
452 end Ada
.Strings
.Wide_Wide_Unbounded
;