annotate gcc/ada/libgnat/a-stzunb.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 _ 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_Wide_Fixed;
kono
parents:
diff changeset
33 with Ada.Strings.Wide_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_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_Wide_String;
kono
parents:
diff changeset
44 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_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_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_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_Wide_String;
kono
parents:
diff changeset
65 Right : Wide_Wide_String) return Unbounded_Wide_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_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_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_Wide_String;
kono
parents:
diff changeset
83 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_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_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_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_Wide_String;
kono
parents:
diff changeset
102 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
103 is
kono
parents:
diff changeset
104 Result : Unbounded_Wide_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_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_Wide_Character;
kono
parents:
diff changeset
120 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
121 is
kono
parents:
diff changeset
122 Result : Unbounded_Wide_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_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_Wide_Character) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
141 is
kono
parents:
diff changeset
142 Result : Unbounded_Wide_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_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_Wide_String) return Unbounded_Wide_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_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_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_Wide_String) return Unbounded_Wide_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_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_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_Wide_String;
kono
parents:
diff changeset
206 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
215 Right : Wide_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_Wide_String;
kono
parents:
diff changeset
223 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
235 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
244 Right : Wide_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_Wide_String;
kono
parents:
diff changeset
252 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
264 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
273 Right : Wide_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_Wide_String;
kono
parents:
diff changeset
281 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
293 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
302 Right : Wide_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_Wide_String;
kono
parents:
diff changeset
310 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
322 Right : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
331 Right : Wide_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_Wide_String;
kono
parents:
diff changeset
339 Right : Unbounded_Wide_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_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_Wide_String'Access then
kono
parents:
diff changeset
356 Object.Reference :=
kono
parents:
diff changeset
357 new Wide_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_Wide_String;
kono
parents:
diff changeset
367 New_Item : Unbounded_Wide_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_Wide_String;
kono
parents:
diff changeset
378 New_Item : Wide_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_Wide_String;
kono
parents:
diff changeset
389 New_Item : Wide_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_Wide_String;
kono
parents:
diff changeset
403 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
404 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
kono
parents:
diff changeset
405 Wide_Wide_Maps.Identity) 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_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_Wide_String;
kono
parents:
diff changeset
415 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
416 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
kono
parents:
diff changeset
417 return Natural
kono
parents:
diff changeset
418 is
kono
parents:
diff changeset
419 begin
kono
parents:
diff changeset
420 return
kono
parents:
diff changeset
421 Wide_Wide_Search.Count
kono
parents:
diff changeset
422 (Source.Reference (1 .. Source.Last), Pattern, Mapping);
kono
parents:
diff changeset
423 end Count;
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 function Count
kono
parents:
diff changeset
426 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
427 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural
kono
parents:
diff changeset
428 is
kono
parents:
diff changeset
429 begin
kono
parents:
diff changeset
430 return
kono
parents:
diff changeset
431 Wide_Wide_Search.Count
kono
parents:
diff changeset
432 (Source.Reference (1 .. Source.Last), Set);
kono
parents:
diff changeset
433 end Count;
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 ------------
kono
parents:
diff changeset
436 -- Delete --
kono
parents:
diff changeset
437 ------------
kono
parents:
diff changeset
438
kono
parents:
diff changeset
439 function Delete
kono
parents:
diff changeset
440 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
441 From : Positive;
kono
parents:
diff changeset
442 Through : Natural) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
443 is
kono
parents:
diff changeset
444 begin
kono
parents:
diff changeset
445 return
kono
parents:
diff changeset
446 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
447 (Wide_Wide_Fixed.Delete
kono
parents:
diff changeset
448 (Source.Reference (1 .. Source.Last), From, Through));
kono
parents:
diff changeset
449 end Delete;
kono
parents:
diff changeset
450
kono
parents:
diff changeset
451 procedure Delete
kono
parents:
diff changeset
452 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
453 From : Positive;
kono
parents:
diff changeset
454 Through : Natural)
kono
parents:
diff changeset
455 is
kono
parents:
diff changeset
456 begin
kono
parents:
diff changeset
457 if From > Through then
kono
parents:
diff changeset
458 null;
kono
parents:
diff changeset
459
kono
parents:
diff changeset
460 elsif From < Source.Reference'First or else Through > Source.Last then
kono
parents:
diff changeset
461 raise Index_Error;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 else
kono
parents:
diff changeset
464 declare
kono
parents:
diff changeset
465 Len : constant Natural := Through - From + 1;
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 begin
kono
parents:
diff changeset
468 Source.Reference (From .. Source.Last - Len) :=
kono
parents:
diff changeset
469 Source.Reference (Through + 1 .. Source.Last);
kono
parents:
diff changeset
470 Source.Last := Source.Last - Len;
kono
parents:
diff changeset
471 end;
kono
parents:
diff changeset
472 end if;
kono
parents:
diff changeset
473 end Delete;
kono
parents:
diff changeset
474
kono
parents:
diff changeset
475 -------------
kono
parents:
diff changeset
476 -- Element --
kono
parents:
diff changeset
477 -------------
kono
parents:
diff changeset
478
kono
parents:
diff changeset
479 function Element
kono
parents:
diff changeset
480 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
481 Index : Positive) return Wide_Wide_Character
kono
parents:
diff changeset
482 is
kono
parents:
diff changeset
483 begin
kono
parents:
diff changeset
484 if Index <= Source.Last then
kono
parents:
diff changeset
485 return Source.Reference (Index);
kono
parents:
diff changeset
486 else
kono
parents:
diff changeset
487 raise Strings.Index_Error;
kono
parents:
diff changeset
488 end if;
kono
parents:
diff changeset
489 end Element;
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 --------------
kono
parents:
diff changeset
492 -- Finalize --
kono
parents:
diff changeset
493 --------------
kono
parents:
diff changeset
494
kono
parents:
diff changeset
495 procedure Finalize (Object : in out Unbounded_Wide_Wide_String) is
kono
parents:
diff changeset
496 procedure Deallocate is
kono
parents:
diff changeset
497 new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
498 (Wide_Wide_String, Wide_Wide_String_Access);
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 begin
kono
parents:
diff changeset
501 -- Note: Don't try to free statically allocated null string
kono
parents:
diff changeset
502
kono
parents:
diff changeset
503 if Object.Reference /= Null_Wide_Wide_String'Access then
kono
parents:
diff changeset
504 Deallocate (Object.Reference);
kono
parents:
diff changeset
505 Object.Reference := Null_Unbounded_Wide_Wide_String.Reference;
kono
parents:
diff changeset
506 Object.Last := 0;
kono
parents:
diff changeset
507 end if;
kono
parents:
diff changeset
508 end Finalize;
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 ----------------
kono
parents:
diff changeset
511 -- Find_Token --
kono
parents:
diff changeset
512 ----------------
kono
parents:
diff changeset
513
kono
parents:
diff changeset
514 procedure Find_Token
kono
parents:
diff changeset
515 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
516 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
517 From : Positive;
kono
parents:
diff changeset
518 Test : Strings.Membership;
kono
parents:
diff changeset
519 First : out Positive;
kono
parents:
diff changeset
520 Last : out Natural)
kono
parents:
diff changeset
521 is
kono
parents:
diff changeset
522 begin
kono
parents:
diff changeset
523 Wide_Wide_Search.Find_Token
kono
parents:
diff changeset
524 (Source.Reference (From .. Source.Last), Set, Test, First, Last);
kono
parents:
diff changeset
525 end Find_Token;
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 procedure Find_Token
kono
parents:
diff changeset
528 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
529 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
530 Test : Strings.Membership;
kono
parents:
diff changeset
531 First : out Positive;
kono
parents:
diff changeset
532 Last : out Natural)
kono
parents:
diff changeset
533 is
kono
parents:
diff changeset
534 begin
kono
parents:
diff changeset
535 Wide_Wide_Search.Find_Token
kono
parents:
diff changeset
536 (Source.Reference (1 .. Source.Last), Set, Test, First, Last);
kono
parents:
diff changeset
537 end Find_Token;
kono
parents:
diff changeset
538
kono
parents:
diff changeset
539 ----------
kono
parents:
diff changeset
540 -- Free --
kono
parents:
diff changeset
541 ----------
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 procedure Free (X : in out Wide_Wide_String_Access) is
kono
parents:
diff changeset
544 procedure Deallocate is
kono
parents:
diff changeset
545 new Ada.Unchecked_Deallocation
kono
parents:
diff changeset
546 (Wide_Wide_String, Wide_Wide_String_Access);
kono
parents:
diff changeset
547
kono
parents:
diff changeset
548 begin
kono
parents:
diff changeset
549 -- Note: Do not try to free statically allocated null string
kono
parents:
diff changeset
550
kono
parents:
diff changeset
551 if X /= Null_Unbounded_Wide_Wide_String.Reference then
kono
parents:
diff changeset
552 Deallocate (X);
kono
parents:
diff changeset
553 end if;
kono
parents:
diff changeset
554 end Free;
kono
parents:
diff changeset
555
kono
parents:
diff changeset
556 ----------
kono
parents:
diff changeset
557 -- Head --
kono
parents:
diff changeset
558 ----------
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 function Head
kono
parents:
diff changeset
561 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
562 Count : Natural;
kono
parents:
diff changeset
563 Pad : Wide_Wide_Character := Wide_Wide_Space)
kono
parents:
diff changeset
564 return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
565 is
kono
parents:
diff changeset
566 begin
kono
parents:
diff changeset
567 return To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
568 (Wide_Wide_Fixed.Head
kono
parents:
diff changeset
569 (Source.Reference (1 .. Source.Last), Count, Pad));
kono
parents:
diff changeset
570 end Head;
kono
parents:
diff changeset
571
kono
parents:
diff changeset
572 procedure Head
kono
parents:
diff changeset
573 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
574 Count : Natural;
kono
parents:
diff changeset
575 Pad : Wide_Wide_Character := Wide_Wide_Space)
kono
parents:
diff changeset
576 is
kono
parents:
diff changeset
577 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
578 begin
kono
parents:
diff changeset
579 Source.Reference :=
kono
parents:
diff changeset
580 new Wide_Wide_String'
kono
parents:
diff changeset
581 (Wide_Wide_Fixed.Head
kono
parents:
diff changeset
582 (Source.Reference (1 .. Source.Last), Count, Pad));
kono
parents:
diff changeset
583 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
584 Free (Old);
kono
parents:
diff changeset
585 end Head;
kono
parents:
diff changeset
586
kono
parents:
diff changeset
587 -----------
kono
parents:
diff changeset
588 -- Index --
kono
parents:
diff changeset
589 -----------
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 function Index
kono
parents:
diff changeset
592 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
593 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
594 Going : Strings.Direction := Strings.Forward;
kono
parents:
diff changeset
595 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
kono
parents:
diff changeset
596 Wide_Wide_Maps.Identity) return Natural
kono
parents:
diff changeset
597 is
kono
parents:
diff changeset
598 begin
kono
parents:
diff changeset
599 return
kono
parents:
diff changeset
600 Wide_Wide_Search.Index
kono
parents:
diff changeset
601 (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
kono
parents:
diff changeset
602 end Index;
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 function Index
kono
parents:
diff changeset
605 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
606 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
607 Going : Direction := Forward;
kono
parents:
diff changeset
608 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
kono
parents:
diff changeset
609 return Natural
kono
parents:
diff changeset
610 is
kono
parents:
diff changeset
611 begin
kono
parents:
diff changeset
612 return
kono
parents:
diff changeset
613 Wide_Wide_Search.Index
kono
parents:
diff changeset
614 (Source.Reference (1 .. Source.Last), Pattern, Going, Mapping);
kono
parents:
diff changeset
615 end Index;
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 function Index
kono
parents:
diff changeset
618 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
619 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
620 Test : Strings.Membership := Strings.Inside;
kono
parents:
diff changeset
621 Going : Strings.Direction := Strings.Forward) return Natural
kono
parents:
diff changeset
622 is
kono
parents:
diff changeset
623 begin
kono
parents:
diff changeset
624 return Wide_Wide_Search.Index
kono
parents:
diff changeset
625 (Source.Reference (1 .. Source.Last), Set, Test, Going);
kono
parents:
diff changeset
626 end Index;
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 function Index
kono
parents:
diff changeset
629 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
630 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
631 From : Positive;
kono
parents:
diff changeset
632 Going : Direction := Forward;
kono
parents:
diff changeset
633 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping :=
kono
parents:
diff changeset
634 Wide_Wide_Maps.Identity) return Natural
kono
parents:
diff changeset
635 is
kono
parents:
diff changeset
636 begin
kono
parents:
diff changeset
637 return
kono
parents:
diff changeset
638 Wide_Wide_Search.Index
kono
parents:
diff changeset
639 (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
kono
parents:
diff changeset
640 end Index;
kono
parents:
diff changeset
641
kono
parents:
diff changeset
642 function Index
kono
parents:
diff changeset
643 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
644 Pattern : Wide_Wide_String;
kono
parents:
diff changeset
645 From : Positive;
kono
parents:
diff changeset
646 Going : Direction := Forward;
kono
parents:
diff changeset
647 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
kono
parents:
diff changeset
648 return Natural
kono
parents:
diff changeset
649 is
kono
parents:
diff changeset
650 begin
kono
parents:
diff changeset
651 return
kono
parents:
diff changeset
652 Wide_Wide_Search.Index
kono
parents:
diff changeset
653 (Source.Reference (1 .. Source.Last), Pattern, From, Going, Mapping);
kono
parents:
diff changeset
654 end Index;
kono
parents:
diff changeset
655
kono
parents:
diff changeset
656 function Index
kono
parents:
diff changeset
657 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
658 Set : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
659 From : Positive;
kono
parents:
diff changeset
660 Test : Membership := Inside;
kono
parents:
diff changeset
661 Going : Direction := Forward) return Natural
kono
parents:
diff changeset
662 is
kono
parents:
diff changeset
663 begin
kono
parents:
diff changeset
664 return
kono
parents:
diff changeset
665 Wide_Wide_Search.Index
kono
parents:
diff changeset
666 (Source.Reference (1 .. Source.Last), Set, From, Test, Going);
kono
parents:
diff changeset
667 end Index;
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 function Index_Non_Blank
kono
parents:
diff changeset
670 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
671 Going : Strings.Direction := Strings.Forward) return Natural
kono
parents:
diff changeset
672 is
kono
parents:
diff changeset
673 begin
kono
parents:
diff changeset
674 return
kono
parents:
diff changeset
675 Wide_Wide_Search.Index_Non_Blank
kono
parents:
diff changeset
676 (Source.Reference (1 .. Source.Last), Going);
kono
parents:
diff changeset
677 end Index_Non_Blank;
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 function Index_Non_Blank
kono
parents:
diff changeset
680 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
681 From : Positive;
kono
parents:
diff changeset
682 Going : Direction := Forward) return Natural
kono
parents:
diff changeset
683 is
kono
parents:
diff changeset
684 begin
kono
parents:
diff changeset
685 return
kono
parents:
diff changeset
686 Wide_Wide_Search.Index_Non_Blank
kono
parents:
diff changeset
687 (Source.Reference (1 .. Source.Last), From, Going);
kono
parents:
diff changeset
688 end Index_Non_Blank;
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 ----------------
kono
parents:
diff changeset
691 -- Initialize --
kono
parents:
diff changeset
692 ----------------
kono
parents:
diff changeset
693
kono
parents:
diff changeset
694 procedure Initialize (Object : in out Unbounded_Wide_Wide_String) is
kono
parents:
diff changeset
695 begin
kono
parents:
diff changeset
696 Object.Reference := Null_Unbounded_Wide_Wide_String.Reference;
kono
parents:
diff changeset
697 Object.Last := 0;
kono
parents:
diff changeset
698 end Initialize;
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 ------------
kono
parents:
diff changeset
701 -- Insert --
kono
parents:
diff changeset
702 ------------
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 function Insert
kono
parents:
diff changeset
705 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
706 Before : Positive;
kono
parents:
diff changeset
707 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
708 is
kono
parents:
diff changeset
709 begin
kono
parents:
diff changeset
710 return
kono
parents:
diff changeset
711 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
712 (Wide_Wide_Fixed.Insert
kono
parents:
diff changeset
713 (Source.Reference (1 .. Source.Last), Before, New_Item));
kono
parents:
diff changeset
714 end Insert;
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 procedure Insert
kono
parents:
diff changeset
717 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
718 Before : Positive;
kono
parents:
diff changeset
719 New_Item : Wide_Wide_String)
kono
parents:
diff changeset
720 is
kono
parents:
diff changeset
721 begin
kono
parents:
diff changeset
722 if Before not in Source.Reference'First .. Source.Last + 1 then
kono
parents:
diff changeset
723 raise Index_Error;
kono
parents:
diff changeset
724 end if;
kono
parents:
diff changeset
725
kono
parents:
diff changeset
726 Realloc_For_Chunk (Source, New_Item'Length);
kono
parents:
diff changeset
727
kono
parents:
diff changeset
728 Source.Reference
kono
parents:
diff changeset
729 (Before + New_Item'Length .. Source.Last + New_Item'Length) :=
kono
parents:
diff changeset
730 Source.Reference (Before .. Source.Last);
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 Source.Reference (Before .. Before + New_Item'Length - 1) := New_Item;
kono
parents:
diff changeset
733 Source.Last := Source.Last + New_Item'Length;
kono
parents:
diff changeset
734 end Insert;
kono
parents:
diff changeset
735
kono
parents:
diff changeset
736 ------------
kono
parents:
diff changeset
737 -- Length --
kono
parents:
diff changeset
738 ------------
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 function Length (Source : Unbounded_Wide_Wide_String) return Natural is
kono
parents:
diff changeset
741 begin
kono
parents:
diff changeset
742 return Source.Last;
kono
parents:
diff changeset
743 end Length;
kono
parents:
diff changeset
744
kono
parents:
diff changeset
745 ---------------
kono
parents:
diff changeset
746 -- Overwrite --
kono
parents:
diff changeset
747 ---------------
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 function Overwrite
kono
parents:
diff changeset
750 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
751 Position : Positive;
kono
parents:
diff changeset
752 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
753 is
kono
parents:
diff changeset
754 begin
kono
parents:
diff changeset
755 return
kono
parents:
diff changeset
756 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
757 (Wide_Wide_Fixed.Overwrite
kono
parents:
diff changeset
758 (Source.Reference (1 .. Source.Last), Position, New_Item));
kono
parents:
diff changeset
759 end Overwrite;
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 procedure Overwrite
kono
parents:
diff changeset
762 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
763 Position : Positive;
kono
parents:
diff changeset
764 New_Item : Wide_Wide_String)
kono
parents:
diff changeset
765 is
kono
parents:
diff changeset
766 NL : constant Natural := New_Item'Length;
kono
parents:
diff changeset
767 begin
kono
parents:
diff changeset
768 if Position <= Source.Last - NL + 1 then
kono
parents:
diff changeset
769 Source.Reference (Position .. Position + NL - 1) := New_Item;
kono
parents:
diff changeset
770 else
kono
parents:
diff changeset
771 declare
kono
parents:
diff changeset
772 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
773 begin
kono
parents:
diff changeset
774 Source.Reference := new Wide_Wide_String'
kono
parents:
diff changeset
775 (Wide_Wide_Fixed.Overwrite
kono
parents:
diff changeset
776 (Source.Reference (1 .. Source.Last), Position, New_Item));
kono
parents:
diff changeset
777 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
778 Free (Old);
kono
parents:
diff changeset
779 end;
kono
parents:
diff changeset
780 end if;
kono
parents:
diff changeset
781 end Overwrite;
kono
parents:
diff changeset
782
kono
parents:
diff changeset
783 -----------------------
kono
parents:
diff changeset
784 -- Realloc_For_Chunk --
kono
parents:
diff changeset
785 -----------------------
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 procedure Realloc_For_Chunk
kono
parents:
diff changeset
788 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
789 Chunk_Size : Natural)
kono
parents:
diff changeset
790 is
kono
parents:
diff changeset
791 Growth_Factor : constant := 32;
kono
parents:
diff changeset
792 -- The growth factor controls how much extra space is allocated when
kono
parents:
diff changeset
793 -- we have to increase the size of an allocated unbounded string. By
kono
parents:
diff changeset
794 -- allocating extra space, we avoid the need to reallocate on every
kono
parents:
diff changeset
795 -- append, particularly important when a string is built up by repeated
kono
parents:
diff changeset
796 -- append operations of small pieces. This is expressed as a factor so
kono
parents:
diff changeset
797 -- 32 means add 1/32 of the length of the string as growth space.
kono
parents:
diff changeset
798
kono
parents:
diff changeset
799 Min_Mul_Alloc : constant := Standard'Maximum_Alignment;
kono
parents:
diff changeset
800 -- Allocation will be done by a multiple of Min_Mul_Alloc This causes
kono
parents:
diff changeset
801 -- no memory loss as most (all?) malloc implementations are obliged to
kono
parents:
diff changeset
802 -- align the returned memory on the maximum alignment as malloc does not
kono
parents:
diff changeset
803 -- know the target alignment.
kono
parents:
diff changeset
804
kono
parents:
diff changeset
805 S_Length : constant Natural := Source.Reference'Length;
kono
parents:
diff changeset
806
kono
parents:
diff changeset
807 begin
kono
parents:
diff changeset
808 if Chunk_Size > S_Length - Source.Last then
kono
parents:
diff changeset
809 declare
kono
parents:
diff changeset
810 New_Size : constant Positive :=
kono
parents:
diff changeset
811 S_Length + Chunk_Size + (S_Length / Growth_Factor);
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 New_Rounded_Up_Size : constant Positive :=
kono
parents:
diff changeset
814 ((New_Size - 1) / Min_Mul_Alloc + 1) * Min_Mul_Alloc;
kono
parents:
diff changeset
815
kono
parents:
diff changeset
816 Tmp : constant Wide_Wide_String_Access :=
kono
parents:
diff changeset
817 new Wide_Wide_String (1 .. New_Rounded_Up_Size);
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 begin
kono
parents:
diff changeset
820 Tmp (1 .. Source.Last) := Source.Reference (1 .. Source.Last);
kono
parents:
diff changeset
821 Free (Source.Reference);
kono
parents:
diff changeset
822 Source.Reference := Tmp;
kono
parents:
diff changeset
823 end;
kono
parents:
diff changeset
824 end if;
kono
parents:
diff changeset
825 end Realloc_For_Chunk;
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 ---------------------
kono
parents:
diff changeset
828 -- Replace_Element --
kono
parents:
diff changeset
829 ---------------------
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 procedure Replace_Element
kono
parents:
diff changeset
832 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
833 Index : Positive;
kono
parents:
diff changeset
834 By : Wide_Wide_Character)
kono
parents:
diff changeset
835 is
kono
parents:
diff changeset
836 begin
kono
parents:
diff changeset
837 if Index <= Source.Last then
kono
parents:
diff changeset
838 Source.Reference (Index) := By;
kono
parents:
diff changeset
839 else
kono
parents:
diff changeset
840 raise Strings.Index_Error;
kono
parents:
diff changeset
841 end if;
kono
parents:
diff changeset
842 end Replace_Element;
kono
parents:
diff changeset
843
kono
parents:
diff changeset
844 -------------------
kono
parents:
diff changeset
845 -- Replace_Slice --
kono
parents:
diff changeset
846 -------------------
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 function Replace_Slice
kono
parents:
diff changeset
849 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
850 Low : Positive;
kono
parents:
diff changeset
851 High : Natural;
kono
parents:
diff changeset
852 By : Wide_Wide_String) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
853 is
kono
parents:
diff changeset
854 begin
kono
parents:
diff changeset
855 return To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
856 (Wide_Wide_Fixed.Replace_Slice
kono
parents:
diff changeset
857 (Source.Reference (1 .. Source.Last), Low, High, By));
kono
parents:
diff changeset
858 end Replace_Slice;
kono
parents:
diff changeset
859
kono
parents:
diff changeset
860 procedure Replace_Slice
kono
parents:
diff changeset
861 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
862 Low : Positive;
kono
parents:
diff changeset
863 High : Natural;
kono
parents:
diff changeset
864 By : Wide_Wide_String)
kono
parents:
diff changeset
865 is
kono
parents:
diff changeset
866 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
867 begin
kono
parents:
diff changeset
868 Source.Reference := new Wide_Wide_String'
kono
parents:
diff changeset
869 (Wide_Wide_Fixed.Replace_Slice
kono
parents:
diff changeset
870 (Source.Reference (1 .. Source.Last), Low, High, By));
kono
parents:
diff changeset
871 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
872 Free (Old);
kono
parents:
diff changeset
873 end Replace_Slice;
kono
parents:
diff changeset
874
kono
parents:
diff changeset
875 ------------------------------------
kono
parents:
diff changeset
876 -- Set_Unbounded_Wide_Wide_String --
kono
parents:
diff changeset
877 ------------------------------------
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 procedure Set_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
880 (Target : out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
881 Source : Wide_Wide_String)
kono
parents:
diff changeset
882 is
kono
parents:
diff changeset
883 begin
kono
parents:
diff changeset
884 Target.Last := Source'Length;
kono
parents:
diff changeset
885 Target.Reference := new Wide_Wide_String (1 .. Source'Length);
kono
parents:
diff changeset
886 Target.Reference.all := Source;
kono
parents:
diff changeset
887 end Set_Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 -----------
kono
parents:
diff changeset
890 -- Slice --
kono
parents:
diff changeset
891 -----------
kono
parents:
diff changeset
892
kono
parents:
diff changeset
893 function Slice
kono
parents:
diff changeset
894 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
895 Low : Positive;
kono
parents:
diff changeset
896 High : Natural) return Wide_Wide_String
kono
parents:
diff changeset
897 is
kono
parents:
diff changeset
898 begin
kono
parents:
diff changeset
899 -- Note: test of High > Length is in accordance with AI95-00128
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 if Low > Source.Last + 1 or else High > Source.Last then
kono
parents:
diff changeset
902 raise Index_Error;
kono
parents:
diff changeset
903 else
kono
parents:
diff changeset
904 return Source.Reference (Low .. High);
kono
parents:
diff changeset
905 end if;
kono
parents:
diff changeset
906 end Slice;
kono
parents:
diff changeset
907
kono
parents:
diff changeset
908 ----------
kono
parents:
diff changeset
909 -- Tail --
kono
parents:
diff changeset
910 ----------
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 function Tail
kono
parents:
diff changeset
913 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
914 Count : Natural;
kono
parents:
diff changeset
915 Pad : Wide_Wide_Character := Wide_Wide_Space)
kono
parents:
diff changeset
916 return Unbounded_Wide_Wide_String is
kono
parents:
diff changeset
917 begin
kono
parents:
diff changeset
918 return To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
919 (Wide_Wide_Fixed.Tail
kono
parents:
diff changeset
920 (Source.Reference (1 .. Source.Last), Count, Pad));
kono
parents:
diff changeset
921 end Tail;
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 procedure Tail
kono
parents:
diff changeset
924 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
925 Count : Natural;
kono
parents:
diff changeset
926 Pad : Wide_Wide_Character := Wide_Wide_Space)
kono
parents:
diff changeset
927 is
kono
parents:
diff changeset
928 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
929 begin
kono
parents:
diff changeset
930 Source.Reference := new Wide_Wide_String'
kono
parents:
diff changeset
931 (Wide_Wide_Fixed.Tail
kono
parents:
diff changeset
932 (Source.Reference (1 .. Source.Last), Count, Pad));
kono
parents:
diff changeset
933 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
934 Free (Old);
kono
parents:
diff changeset
935 end Tail;
kono
parents:
diff changeset
936
kono
parents:
diff changeset
937 -----------------------------------
kono
parents:
diff changeset
938 -- To_Unbounded_Wide_Wide_String --
kono
parents:
diff changeset
939 -----------------------------------
kono
parents:
diff changeset
940
kono
parents:
diff changeset
941 function To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
942 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
943 is
kono
parents:
diff changeset
944 Result : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
945 begin
kono
parents:
diff changeset
946 Result.Last := Source'Length;
kono
parents:
diff changeset
947 Result.Reference := new Wide_Wide_String (1 .. Source'Length);
kono
parents:
diff changeset
948 Result.Reference.all := Source;
kono
parents:
diff changeset
949 return Result;
kono
parents:
diff changeset
950 end To_Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
951
kono
parents:
diff changeset
952 function To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
953 (Length : Natural) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
954 is
kono
parents:
diff changeset
955 Result : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
956 begin
kono
parents:
diff changeset
957 Result.Last := Length;
kono
parents:
diff changeset
958 Result.Reference := new Wide_Wide_String (1 .. Length);
kono
parents:
diff changeset
959 return Result;
kono
parents:
diff changeset
960 end To_Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
961
kono
parents:
diff changeset
962 -------------------------
kono
parents:
diff changeset
963 -- To_Wide_Wide_String --
kono
parents:
diff changeset
964 -------------------------
kono
parents:
diff changeset
965
kono
parents:
diff changeset
966 function To_Wide_Wide_String
kono
parents:
diff changeset
967 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String
kono
parents:
diff changeset
968 is
kono
parents:
diff changeset
969 begin
kono
parents:
diff changeset
970 return Source.Reference (1 .. Source.Last);
kono
parents:
diff changeset
971 end To_Wide_Wide_String;
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 ---------------
kono
parents:
diff changeset
974 -- Translate --
kono
parents:
diff changeset
975 ---------------
kono
parents:
diff changeset
976
kono
parents:
diff changeset
977 function Translate
kono
parents:
diff changeset
978 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
979 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
kono
parents:
diff changeset
980 return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
981 is
kono
parents:
diff changeset
982 begin
kono
parents:
diff changeset
983 return
kono
parents:
diff changeset
984 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
985 (Wide_Wide_Fixed.Translate
kono
parents:
diff changeset
986 (Source.Reference (1 .. Source.Last), Mapping));
kono
parents:
diff changeset
987 end Translate;
kono
parents:
diff changeset
988
kono
parents:
diff changeset
989 procedure Translate
kono
parents:
diff changeset
990 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
991 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping)
kono
parents:
diff changeset
992 is
kono
parents:
diff changeset
993 begin
kono
parents:
diff changeset
994 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
kono
parents:
diff changeset
995 end Translate;
kono
parents:
diff changeset
996
kono
parents:
diff changeset
997 function Translate
kono
parents:
diff changeset
998 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
999 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
kono
parents:
diff changeset
1000 return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1001 is
kono
parents:
diff changeset
1002 begin
kono
parents:
diff changeset
1003 return
kono
parents:
diff changeset
1004 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1005 (Wide_Wide_Fixed.Translate
kono
parents:
diff changeset
1006 (Source.Reference (1 .. Source.Last), Mapping));
kono
parents:
diff changeset
1007 end Translate;
kono
parents:
diff changeset
1008
kono
parents:
diff changeset
1009 procedure Translate
kono
parents:
diff changeset
1010 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1011 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function)
kono
parents:
diff changeset
1012 is
kono
parents:
diff changeset
1013 begin
kono
parents:
diff changeset
1014 Wide_Wide_Fixed.Translate (Source.Reference (1 .. Source.Last), Mapping);
kono
parents:
diff changeset
1015 end Translate;
kono
parents:
diff changeset
1016
kono
parents:
diff changeset
1017 ----------
kono
parents:
diff changeset
1018 -- Trim --
kono
parents:
diff changeset
1019 ----------
kono
parents:
diff changeset
1020
kono
parents:
diff changeset
1021 function Trim
kono
parents:
diff changeset
1022 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1023 Side : Trim_End) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1024 is
kono
parents:
diff changeset
1025 begin
kono
parents:
diff changeset
1026 return
kono
parents:
diff changeset
1027 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1028 (Wide_Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
kono
parents:
diff changeset
1029 end Trim;
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 procedure Trim
kono
parents:
diff changeset
1032 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1033 Side : Trim_End)
kono
parents:
diff changeset
1034 is
kono
parents:
diff changeset
1035 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
1036 begin
kono
parents:
diff changeset
1037 Source.Reference :=
kono
parents:
diff changeset
1038 new Wide_Wide_String'
kono
parents:
diff changeset
1039 (Wide_Wide_Fixed.Trim (Source.Reference (1 .. Source.Last), Side));
kono
parents:
diff changeset
1040 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
1041 Free (Old);
kono
parents:
diff changeset
1042 end Trim;
kono
parents:
diff changeset
1043
kono
parents:
diff changeset
1044 function Trim
kono
parents:
diff changeset
1045 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1046 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
1047 Right : Wide_Wide_Maps.Wide_Wide_Character_Set)
kono
parents:
diff changeset
1048 return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1049 is
kono
parents:
diff changeset
1050 begin
kono
parents:
diff changeset
1051 return
kono
parents:
diff changeset
1052 To_Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1053 (Wide_Wide_Fixed.Trim
kono
parents:
diff changeset
1054 (Source.Reference (1 .. Source.Last), Left, Right));
kono
parents:
diff changeset
1055 end Trim;
kono
parents:
diff changeset
1056
kono
parents:
diff changeset
1057 procedure Trim
kono
parents:
diff changeset
1058 (Source : in out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1059 Left : Wide_Wide_Maps.Wide_Wide_Character_Set;
kono
parents:
diff changeset
1060 Right : Wide_Wide_Maps.Wide_Wide_Character_Set)
kono
parents:
diff changeset
1061 is
kono
parents:
diff changeset
1062 Old : Wide_Wide_String_Access := Source.Reference;
kono
parents:
diff changeset
1063 begin
kono
parents:
diff changeset
1064 Source.Reference :=
kono
parents:
diff changeset
1065 new Wide_Wide_String'
kono
parents:
diff changeset
1066 (Wide_Wide_Fixed.Trim
kono
parents:
diff changeset
1067 (Source.Reference (1 .. Source.Last), Left, Right));
kono
parents:
diff changeset
1068 Source.Last := Source.Reference'Length;
kono
parents:
diff changeset
1069 Free (Old);
kono
parents:
diff changeset
1070 end Trim;
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 ---------------------
kono
parents:
diff changeset
1073 -- Unbounded_Slice --
kono
parents:
diff changeset
1074 ---------------------
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 function Unbounded_Slice
kono
parents:
diff changeset
1077 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1078 Low : Positive;
kono
parents:
diff changeset
1079 High : Natural) return Unbounded_Wide_Wide_String
kono
parents:
diff changeset
1080 is
kono
parents:
diff changeset
1081 begin
kono
parents:
diff changeset
1082 if Low > Source.Last + 1 or else High > Source.Last then
kono
parents:
diff changeset
1083 raise Index_Error;
kono
parents:
diff changeset
1084 else
kono
parents:
diff changeset
1085 return
kono
parents:
diff changeset
1086 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
kono
parents:
diff changeset
1087 end if;
kono
parents:
diff changeset
1088 end Unbounded_Slice;
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 procedure Unbounded_Slice
kono
parents:
diff changeset
1091 (Source : Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1092 Target : out Unbounded_Wide_Wide_String;
kono
parents:
diff changeset
1093 Low : Positive;
kono
parents:
diff changeset
1094 High : Natural)
kono
parents:
diff changeset
1095 is
kono
parents:
diff changeset
1096 begin
kono
parents:
diff changeset
1097 if Low > Source.Last + 1 or else High > Source.Last then
kono
parents:
diff changeset
1098 raise Index_Error;
kono
parents:
diff changeset
1099 else
kono
parents:
diff changeset
1100 Target :=
kono
parents:
diff changeset
1101 To_Unbounded_Wide_Wide_String (Source.Reference.all (Low .. High));
kono
parents:
diff changeset
1102 end if;
kono
parents:
diff changeset
1103 end Unbounded_Slice;
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 end Ada.Strings.Wide_Wide_Unbounded;