annotate gcc/ada/libgnat/a-stwiun.adb @ 131:84e7813d76e9

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