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