1------------------------------------------------------------------------------ 2-- -- 3-- GNAT RUN-TIME COMPONENTS -- 4-- -- 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 -- 6-- -- 7-- S p e c -- 8-- -- 9-- Copyright (C) 1992-2010, Free Software Foundation, Inc. -- 10-- -- 11-- This specification is derived from the Ada Reference Manual for use with -- 12-- GNAT. The copyright notice above, and the license provisions that follow -- 13-- apply solely to the contents of the part following the private keyword. -- 14-- -- 15-- GNAT is free software; you can redistribute it and/or modify it under -- 16-- terms of the GNU General Public License as published by the Free Soft- -- 17-- ware Foundation; either version 3, or (at your option) any later ver- -- 18-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- 19-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- 20-- or FITNESS FOR A PARTICULAR PURPOSE. -- 21-- -- 22-- As a special exception under Section 7 of GPL version 3, you are granted -- 23-- additional permissions described in the GCC Runtime Library Exception, -- 24-- version 3.1, as published by the Free Software Foundation. -- 25-- -- 26-- You should have received a copy of the GNU General Public License and -- 27-- a copy of the GCC Runtime Library Exception along with this program; -- 28-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -- 29-- <http://www.gnu.org/licenses/>. -- 30-- -- 31-- GNAT was originally developed by the GNAT team at New York University. -- 32-- Extensive contributions were provided by Ada Core Technologies Inc. -- 33-- -- 34------------------------------------------------------------------------------ 35 36with Ada.Strings.Wide_Wide_Maps; 37with Ada.Finalization; 38 39package Ada.Strings.Wide_Wide_Unbounded is 40 pragma Preelaborate; 41 42 type Unbounded_Wide_Wide_String is private; 43 pragma Preelaborable_Initialization (Unbounded_Wide_Wide_String); 44 45 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String; 46 47 function Length (Source : Unbounded_Wide_Wide_String) return Natural; 48 49 type Wide_Wide_String_Access is access all Wide_Wide_String; 50 51 procedure Free (X : in out Wide_Wide_String_Access); 52 53 -------------------------------------------------------- 54 -- Conversion, Concatenation, and Selection Functions -- 55 -------------------------------------------------------- 56 57 function To_Unbounded_Wide_Wide_String 58 (Source : Wide_Wide_String) return Unbounded_Wide_Wide_String; 59 60 function To_Unbounded_Wide_Wide_String 61 (Length : Natural) return Unbounded_Wide_Wide_String; 62 63 function To_Wide_Wide_String 64 (Source : Unbounded_Wide_Wide_String) return Wide_Wide_String; 65 66 procedure Set_Unbounded_Wide_Wide_String 67 (Target : out Unbounded_Wide_Wide_String; 68 Source : Wide_Wide_String); 69 pragma Ada_05 (Set_Unbounded_Wide_Wide_String); 70 71 procedure Append 72 (Source : in out Unbounded_Wide_Wide_String; 73 New_Item : Unbounded_Wide_Wide_String); 74 75 procedure Append 76 (Source : in out Unbounded_Wide_Wide_String; 77 New_Item : Wide_Wide_String); 78 79 procedure Append 80 (Source : in out Unbounded_Wide_Wide_String; 81 New_Item : Wide_Wide_Character); 82 83 function "&" 84 (Left : Unbounded_Wide_Wide_String; 85 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String; 86 87 function "&" 88 (Left : Unbounded_Wide_Wide_String; 89 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String; 90 91 function "&" 92 (Left : Wide_Wide_String; 93 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String; 94 95 function "&" 96 (Left : Unbounded_Wide_Wide_String; 97 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String; 98 99 function "&" 100 (Left : Wide_Wide_Character; 101 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String; 102 103 function Element 104 (Source : Unbounded_Wide_Wide_String; 105 Index : Positive) return Wide_Wide_Character; 106 107 procedure Replace_Element 108 (Source : in out Unbounded_Wide_Wide_String; 109 Index : Positive; 110 By : Wide_Wide_Character); 111 112 function Slice 113 (Source : Unbounded_Wide_Wide_String; 114 Low : Positive; 115 High : Natural) return Wide_Wide_String; 116 117 function Unbounded_Slice 118 (Source : Unbounded_Wide_Wide_String; 119 Low : Positive; 120 High : Natural) return Unbounded_Wide_Wide_String; 121 pragma Ada_05 (Unbounded_Slice); 122 123 procedure Unbounded_Slice 124 (Source : Unbounded_Wide_Wide_String; 125 Target : out Unbounded_Wide_Wide_String; 126 Low : Positive; 127 High : Natural); 128 pragma Ada_05 (Unbounded_Slice); 129 130 function "=" 131 (Left : Unbounded_Wide_Wide_String; 132 Right : Unbounded_Wide_Wide_String) return Boolean; 133 134 function "=" 135 (Left : Unbounded_Wide_Wide_String; 136 Right : Wide_Wide_String) return Boolean; 137 138 function "=" 139 (Left : Wide_Wide_String; 140 Right : Unbounded_Wide_Wide_String) return Boolean; 141 142 function "<" 143 (Left : Unbounded_Wide_Wide_String; 144 Right : Unbounded_Wide_Wide_String) return Boolean; 145 146 function "<" 147 (Left : Unbounded_Wide_Wide_String; 148 Right : Wide_Wide_String) return Boolean; 149 150 function "<" 151 (Left : Wide_Wide_String; 152 Right : Unbounded_Wide_Wide_String) return Boolean; 153 154 function "<=" 155 (Left : Unbounded_Wide_Wide_String; 156 Right : Unbounded_Wide_Wide_String) return Boolean; 157 158 function "<=" 159 (Left : Unbounded_Wide_Wide_String; 160 Right : Wide_Wide_String) return Boolean; 161 162 function "<=" 163 (Left : Wide_Wide_String; 164 Right : Unbounded_Wide_Wide_String) return Boolean; 165 166 function ">" 167 (Left : Unbounded_Wide_Wide_String; 168 Right : Unbounded_Wide_Wide_String) return Boolean; 169 170 function ">" 171 (Left : Unbounded_Wide_Wide_String; 172 Right : Wide_Wide_String) return Boolean; 173 174 function ">" 175 (Left : Wide_Wide_String; 176 Right : Unbounded_Wide_Wide_String) return Boolean; 177 178 function ">=" 179 (Left : Unbounded_Wide_Wide_String; 180 Right : Unbounded_Wide_Wide_String) return Boolean; 181 182 function ">=" 183 (Left : Unbounded_Wide_Wide_String; 184 Right : Wide_Wide_String) return Boolean; 185 186 function ">=" 187 (Left : Wide_Wide_String; 188 Right : Unbounded_Wide_Wide_String) return Boolean; 189 190 ------------------------ 191 -- Search Subprograms -- 192 ------------------------ 193 194 function Index 195 (Source : Unbounded_Wide_Wide_String; 196 Pattern : Wide_Wide_String; 197 Going : Direction := Forward; 198 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping := 199 Wide_Wide_Maps.Identity) 200 return Natural; 201 202 function Index 203 (Source : Unbounded_Wide_Wide_String; 204 Pattern : Wide_Wide_String; 205 Going : Direction := Forward; 206 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function) 207 return Natural; 208 209 function Index 210 (Source : Unbounded_Wide_Wide_String; 211 Set : Wide_Wide_Maps.Wide_Wide_Character_Set; 212 Test : Membership := Inside; 213 Going : Direction := Forward) return Natural; 214 215 function Index 216 (Source : Unbounded_Wide_Wide_String; 217 Pattern : Wide_Wide_String; 218 From : Positive; 219 Going : Direction := Forward; 220 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping := 221 Wide_Wide_Maps.Identity) 222 return Natural; 223 pragma Ada_05 (Index); 224 225 function Index 226 (Source : Unbounded_Wide_Wide_String; 227 Pattern : Wide_Wide_String; 228 From : Positive; 229 Going : Direction := Forward; 230 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function) 231 return Natural; 232 pragma Ada_05 (Index); 233 234 function Index 235 (Source : Unbounded_Wide_Wide_String; 236 Set : Wide_Wide_Maps.Wide_Wide_Character_Set; 237 From : Positive; 238 Test : Membership := Inside; 239 Going : Direction := Forward) return Natural; 240 pragma Ada_05 (Index); 241 242 function Index_Non_Blank 243 (Source : Unbounded_Wide_Wide_String; 244 Going : Direction := Forward) return Natural; 245 246 function Index_Non_Blank 247 (Source : Unbounded_Wide_Wide_String; 248 From : Positive; 249 Going : Direction := Forward) return Natural; 250 pragma Ada_05 (Index_Non_Blank); 251 252 function Count 253 (Source : Unbounded_Wide_Wide_String; 254 Pattern : Wide_Wide_String; 255 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping := 256 Wide_Wide_Maps.Identity) 257 return Natural; 258 259 function Count 260 (Source : Unbounded_Wide_Wide_String; 261 Pattern : Wide_Wide_String; 262 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function) 263 return Natural; 264 265 function Count 266 (Source : Unbounded_Wide_Wide_String; 267 Set : Wide_Wide_Maps.Wide_Wide_Character_Set) return Natural; 268 269 procedure Find_Token 270 (Source : Unbounded_Wide_Wide_String; 271 Set : Wide_Wide_Maps.Wide_Wide_Character_Set; 272 From : Positive; 273 Test : Membership; 274 First : out Positive; 275 Last : out Natural); 276 pragma Ada_2012 (Find_Token); 277 278 procedure Find_Token 279 (Source : Unbounded_Wide_Wide_String; 280 Set : Wide_Wide_Maps.Wide_Wide_Character_Set; 281 Test : Membership; 282 First : out Positive; 283 Last : out Natural); 284 285 ------------------------------------ 286 -- String Translation Subprograms -- 287 ------------------------------------ 288 289 function Translate 290 (Source : Unbounded_Wide_Wide_String; 291 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping) 292 return Unbounded_Wide_Wide_String; 293 294 procedure Translate 295 (Source : in out Unbounded_Wide_Wide_String; 296 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping); 297 298 function Translate 299 (Source : Unbounded_Wide_Wide_String; 300 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function) 301 return Unbounded_Wide_Wide_String; 302 303 procedure Translate 304 (Source : in out Unbounded_Wide_Wide_String; 305 Mapping : Wide_Wide_Maps.Wide_Wide_Character_Mapping_Function); 306 307 --------------------------------------- 308 -- String Transformation Subprograms -- 309 --------------------------------------- 310 311 function Replace_Slice 312 (Source : Unbounded_Wide_Wide_String; 313 Low : Positive; 314 High : Natural; 315 By : Wide_Wide_String) return Unbounded_Wide_Wide_String; 316 317 procedure Replace_Slice 318 (Source : in out Unbounded_Wide_Wide_String; 319 Low : Positive; 320 High : Natural; 321 By : Wide_Wide_String); 322 323 function Insert 324 (Source : Unbounded_Wide_Wide_String; 325 Before : Positive; 326 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String; 327 328 procedure Insert 329 (Source : in out Unbounded_Wide_Wide_String; 330 Before : Positive; 331 New_Item : Wide_Wide_String); 332 333 function Overwrite 334 (Source : Unbounded_Wide_Wide_String; 335 Position : Positive; 336 New_Item : Wide_Wide_String) return Unbounded_Wide_Wide_String; 337 338 procedure Overwrite 339 (Source : in out Unbounded_Wide_Wide_String; 340 Position : Positive; 341 New_Item : Wide_Wide_String); 342 343 function Delete 344 (Source : Unbounded_Wide_Wide_String; 345 From : Positive; 346 Through : Natural) return Unbounded_Wide_Wide_String; 347 348 procedure Delete 349 (Source : in out Unbounded_Wide_Wide_String; 350 From : Positive; 351 Through : Natural); 352 353 function Trim 354 (Source : Unbounded_Wide_Wide_String; 355 Side : Trim_End) return Unbounded_Wide_Wide_String; 356 357 procedure Trim 358 (Source : in out Unbounded_Wide_Wide_String; 359 Side : Trim_End); 360 361 function Trim 362 (Source : Unbounded_Wide_Wide_String; 363 Left : Wide_Wide_Maps.Wide_Wide_Character_Set; 364 Right : Wide_Wide_Maps.Wide_Wide_Character_Set) 365 return Unbounded_Wide_Wide_String; 366 367 procedure Trim 368 (Source : in out Unbounded_Wide_Wide_String; 369 Left : Wide_Wide_Maps.Wide_Wide_Character_Set; 370 Right : Wide_Wide_Maps.Wide_Wide_Character_Set); 371 372 function Head 373 (Source : Unbounded_Wide_Wide_String; 374 Count : Natural; 375 Pad : Wide_Wide_Character := Wide_Wide_Space) 376 return Unbounded_Wide_Wide_String; 377 378 procedure Head 379 (Source : in out Unbounded_Wide_Wide_String; 380 Count : Natural; 381 Pad : Wide_Wide_Character := Wide_Wide_Space); 382 383 function Tail 384 (Source : Unbounded_Wide_Wide_String; 385 Count : Natural; 386 Pad : Wide_Wide_Character := Wide_Wide_Space) 387 return Unbounded_Wide_Wide_String; 388 389 procedure Tail 390 (Source : in out Unbounded_Wide_Wide_String; 391 Count : Natural; 392 Pad : Wide_Wide_Character := Wide_Wide_Space); 393 394 function "*" 395 (Left : Natural; 396 Right : Wide_Wide_Character) return Unbounded_Wide_Wide_String; 397 398 function "*" 399 (Left : Natural; 400 Right : Wide_Wide_String) return Unbounded_Wide_Wide_String; 401 402 function "*" 403 (Left : Natural; 404 Right : Unbounded_Wide_Wide_String) return Unbounded_Wide_Wide_String; 405 406private 407 pragma Inline (Length); 408 409 package AF renames Ada.Finalization; 410 411 Null_Wide_Wide_String : aliased Wide_Wide_String := ""; 412 413 function To_Unbounded_Wide 414 (S : Wide_Wide_String) return Unbounded_Wide_Wide_String 415 renames To_Unbounded_Wide_Wide_String; 416 417 type Unbounded_Wide_Wide_String is new AF.Controlled with record 418 Reference : Wide_Wide_String_Access := Null_Wide_Wide_String'Access; 419 Last : Natural := 0; 420 end record; 421 422 -- The Unbounded_Wide_Wide_String is using a buffered implementation to 423 -- increase speed of the Append/Delete/Insert procedures. The Reference 424 -- string pointer above contains the current string value and extra room 425 -- at the end to be used by the next Append routine. Last is the index of 426 -- the string ending character. So the current string value is really 427 -- Reference (1 .. Last). 428 429 pragma Stream_Convert 430 (Unbounded_Wide_Wide_String, To_Unbounded_Wide, To_Wide_Wide_String); 431 432 pragma Finalize_Storage_Only (Unbounded_Wide_Wide_String); 433 -- Finalization is required only for freeing storage 434 435 procedure Initialize (Object : in out Unbounded_Wide_Wide_String); 436 procedure Adjust (Object : in out Unbounded_Wide_Wide_String); 437 procedure Finalize (Object : in out Unbounded_Wide_Wide_String); 438 procedure Realloc_For_Chunk 439 (Source : in out Unbounded_Wide_Wide_String; 440 Chunk_Size : Natural); 441 -- Adjust the size allocated for the string. Add at least Chunk_Size so it 442 -- is safe to add a string of this size at the end of the current content. 443 -- The real size allocated for the string is Chunk_Size + x of the current 444 -- string size. This buffered handling makes the Append unbounded string 445 -- routines very fast. 446 447 Null_Unbounded_Wide_Wide_String : constant Unbounded_Wide_Wide_String := 448 (AF.Controlled with 449 Reference => 450 Null_Wide_Wide_String'Access, 451 Last => 0); 452end Ada.Strings.Wide_Wide_Unbounded; 453