1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _RTL_STRING_HXX_ 25 #define _RTL_STRING_HXX_ 26 27 #ifdef __cplusplus 28 29 #ifndef _RTL_DIAGNOSE_H_ 30 #include <osl/diagnose.h> 31 #endif 32 #include <rtl/memory.h> 33 #include <rtl/textenc.h> 34 #include <rtl/string.h> 35 #ifdef DBG_UTIL 36 #include <tools/debug.hxx> 37 #endif /* DBG_UTIL */ 38 39 #if !defined EXCEPTIONS_OFF 40 #include <new> 41 #endif 42 43 namespace rtl 44 { 45 46 /* ======================================================================= */ 47 48 /** 49 This String class provide base functionality for C++ like 8-Bit 50 character array handling. The advantage of this class is, that it 51 handle all the memory managament for you - and it do it 52 more efficient. If you assign a string to another string, the 53 data of both strings are shared (without any copy operation or 54 memory allocation) as long as you do not change the string. This class 55 stores also the length of the string, so that many operations are 56 faster as the C-str-functions. 57 58 This class provide only readonly string handling. So you could create 59 a string and you could only query the content from this string. 60 It provide also functionality to change the string, but this results 61 in every case in a new string instance (in the most cases with an 62 memory allocation). You don't have functionality to change the 63 content of the string. If you want change the string content, than 64 you should us the OStringBuffer class, which provide these 65 functionality and avoid to much memory allocation. 66 67 The design of this class is similar to the string classes in Java 68 and so more people should have fewer understanding problems when they 69 use this class. 70 */ 71 72 class OString 73 { 74 public: 75 /** @internal */ 76 rtl_String * pData; 77 78 private: 79 /** @internal */ 80 class DO_NOT_ACQUIRE; 81 82 /** @internal */ 83 OString( rtl_String * value, DO_NOT_ACQUIRE * ) 84 { 85 pData = value; 86 } 87 88 public: 89 /** 90 New string containing no characters. 91 */ 92 OString() SAL_THROW(()) 93 { 94 pData = 0; 95 rtl_string_new( &pData ); 96 } 97 98 /** 99 New string from OString. 100 101 @param str a OString. 102 */ 103 OString( const OString & str ) SAL_THROW(()) 104 { 105 pData = str.pData; 106 rtl_string_acquire( pData ); 107 } 108 109 /** 110 New string from OString data. 111 112 @param str a OString data. 113 */ 114 OString( rtl_String * str ) SAL_THROW(()) 115 { 116 pData = str; 117 rtl_string_acquire( pData ); 118 } 119 120 /** 121 New string from a single character. 122 123 @param value a character. 124 */ 125 explicit OString( sal_Char value ) SAL_THROW(()) 126 : pData (0) 127 { 128 rtl_string_newFromStr_WithLength( &pData, &value, 1 ); 129 } 130 131 /** 132 New string from a character buffer array. 133 134 @param value a NULL-terminated character array. 135 */ 136 OString( const sal_Char * value ) SAL_THROW(()) 137 { 138 pData = 0; 139 rtl_string_newFromStr( &pData, value ); 140 } 141 142 /** 143 New string from a character buffer array. 144 145 @param value a character array. 146 @param length the number of character which should be copied. 147 The character array length must be greater or 148 equal than this value. 149 */ 150 OString( const sal_Char * value, sal_Int32 length ) SAL_THROW(()) 151 { 152 pData = 0; 153 rtl_string_newFromStr_WithLength( &pData, value, length ); 154 } 155 156 /** 157 New string from a Unicode character buffer array. 158 159 @param value a Unicode character array. 160 @param length the number of character which should be converted. 161 The Unicode character array length must be 162 greater or equal than this value. 163 @param encoding the text encoding in which the Unicode character 164 sequence should be converted. 165 @param convertFlags flags which controls the conversion. 166 see RTL_UNICODETOTEXT_FLAGS_... 167 168 @exception std::bad_alloc is thrown if an out-of-memory condition occurs 169 */ 170 OString( const sal_Unicode * value, sal_Int32 length, 171 rtl_TextEncoding encoding, 172 sal_uInt32 convertFlags = OUSTRING_TO_OSTRING_CVTFLAGS ) 173 { 174 pData = 0; 175 rtl_uString2String( &pData, value, length, encoding, convertFlags ); 176 #if defined EXCEPTIONS_OFF 177 OSL_ASSERT(pData != NULL); 178 #else 179 if (pData == 0) { 180 throw std::bad_alloc(); 181 } 182 #endif 183 } 184 185 /** 186 Release the string data. 187 */ 188 ~OString() SAL_THROW(()) 189 { 190 rtl_string_release( pData ); 191 } 192 193 /** 194 Assign a new string. 195 196 @param str a OString. 197 */ 198 OString & operator=( const OString & str ) SAL_THROW(()) 199 { 200 rtl_string_assign( &pData, str.pData ); 201 return *this; 202 } 203 204 /** 205 Append a string to this string. 206 207 @param str a OString. 208 */ 209 OString & operator+=( const OString & str ) SAL_THROW(()) 210 { 211 rtl_string_newConcat( &pData, pData, str.pData ); 212 return *this; 213 } 214 215 /** 216 Returns the length of this string. 217 218 The length is equal to the number of characters in this string. 219 220 @return the length of the sequence of characters represented by this 221 object. 222 */ 223 sal_Int32 getLength() const SAL_THROW(()) { return pData->length; } 224 225 private: 226 /** 227 Returns a pointer to the characters of this string. 228 229 NOTE: the implicit cast to a char pointer is obsolete 230 because it is too dangerous #i123068# 231 232 <p>The returned pointer is not guaranteed to point to a null-terminated 233 byte string. Note that this string object may contain embedded null 234 characters, which will thus also be embedded in the returned byte 235 string.</p> 236 237 @return a pointer to a (not necessarily null-terminated) byte string 238 representing the characters of this string object. 239 */ 240 241 public: 242 operator const sal_Char *() const SAL_THROW(()) { return pData->buffer; } 243 /** Returns a reference to a character of this string. */ 244 sal_Char& operator[]( int n ) { return pData->buffer[n]; } 245 /** Returns a const reference to a character of this string. */ 246 const sal_Char& operator[]( int n ) const { return pData->buffer[n]; } 247 /** Returns a bool indicating whether this string is empty. */ 248 bool isEmpty() const { return (pData->length == 0); } 249 250 /** 251 Returns a pointer to the characters of this string. 252 253 <p>The returned pointer is guaranteed to point to a null-terminated byte 254 string. But note that this string object may contain embedded null 255 characters, which will thus also be embedded in the returned 256 null-terminated byte string.</p> 257 258 @return a pointer to a null-terminated byte string representing the 259 characters of this string object. 260 */ 261 const sal_Char * getStr() const SAL_THROW(()) { return pData->buffer; } 262 263 /** 264 Compares two strings. 265 266 The comparison is based on the numeric value of each character in 267 the strings and return a value indicating their relationship. 268 This function can't be used for language specific sorting. 269 270 @param str the object to be compared. 271 @return 0 - if both strings are equal 272 < 0 - if this string is less than the string argument 273 > 0 - if this string is greater than the string argument 274 */ 275 sal_Int32 compareTo( const OString & str ) const SAL_THROW(()) 276 { 277 return rtl_str_compare_WithLength( pData->buffer, pData->length, 278 str.pData->buffer, str.pData->length ); 279 } 280 281 /** 282 Compares two strings with an maximum count of characters. 283 284 The comparison is based on the numeric value of each character in 285 the strings and return a value indicating their relationship. 286 This function can't be used for language specific sorting. 287 288 @param str the object to be compared. 289 @param maxLength the maximum count of characters to be compared. 290 @return 0 - if both strings are equal 291 < 0 - if this string is less than the string argument 292 > 0 - if this string is greater than the string argument 293 */ 294 sal_Int32 compareTo( const OString & rObj, sal_Int32 maxLength ) const SAL_THROW(()) 295 { 296 return rtl_str_shortenedCompare_WithLength( pData->buffer, pData->length, 297 rObj.pData->buffer, rObj.pData->length, maxLength ); 298 } 299 300 /** 301 Compares two strings in reverse order. 302 303 The comparison is based on the numeric value of each character in 304 the strings and return a value indicating their relationship. 305 This function can't be used for language specific sorting. 306 307 @param str the object to be compared. 308 @return 0 - if both strings are equal 309 < 0 - if this string is less than the string argument 310 > 0 - if this string is greater than the string argument 311 */ 312 sal_Int32 reverseCompareTo( const OString & str ) const SAL_THROW(()) 313 { 314 return rtl_str_reverseCompare_WithLength( pData->buffer, pData->length, 315 str.pData->buffer, str.pData->length ); 316 } 317 318 /** 319 Perform a comparison of two strings. 320 321 The result is true if and only if second string 322 represents the same sequence of characters as the first string. 323 This function can't be used for language specific comparison. 324 325 @param str the object to be compared. 326 @return sal_True if the strings are equal; 327 sal_False, otherwise. 328 */ 329 sal_Bool equals( const OString & str ) const SAL_THROW(()) 330 { 331 if ( pData->length != str.pData->length ) 332 return sal_False; 333 if ( pData == str.pData ) 334 return sal_True; 335 return rtl_str_reverseCompare_WithLength( pData->buffer, pData->length, 336 str.pData->buffer, str.pData->length ) == 0; 337 } 338 339 /** 340 Perform a ASCII lowercase comparison of two strings. 341 342 The result is true if and only if second string 343 represents the same sequence of characters as the first string, 344 ignoring the case. 345 Character values between 65 and 90 (ASCII A-Z) are interpreted as 346 values between 97 and 122 (ASCII a-z). 347 This function can't be used for language specific comparison. 348 349 @param str the object to be compared. 350 @return sal_True if the strings are equal; 351 sal_False, otherwise. 352 */ 353 sal_Bool equalsIgnoreAsciiCase( const OString & str ) const SAL_THROW(()) 354 { 355 if ( pData->length != str.pData->length ) 356 return sal_False; 357 if ( pData == str.pData ) 358 return sal_True; 359 return rtl_str_compareIgnoreAsciiCase_WithLength( pData->buffer, pData->length, 360 str.pData->buffer, str.pData->length ) == 0; 361 } 362 363 /** 364 Match against a substring appearing in this string. 365 366 The result is true if and only if the second string appears as a substring 367 of this string, at the given position. 368 This function can't be used for language specific comparison. 369 370 @param str the object (substring) to be compared. 371 @param fromIndex the index to start the comparion from. 372 The index must be greater or equal than 0 373 and less or equal as the string length. 374 @return sal_True if str match with the characters in the string 375 at the given position; 376 sal_False, otherwise. 377 */ 378 sal_Bool match( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(()) 379 { 380 return rtl_str_shortenedCompare_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, 381 str.pData->buffer, str.pData->length, str.pData->length ) == 0; 382 } 383 384 /** 385 Match against a substring appearing in this string, ignoring the case of 386 ASCII letters. 387 388 The result is true if and only if the second string appears as a substring 389 of this string, at the given position. 390 Character values between 65 and 90 (ASCII A-Z) are interpreted as 391 values between 97 and 122 (ASCII a-z). 392 This function can't be used for language specific comparison. 393 394 @param str the object (substring) to be compared. 395 @param fromIndex the index to start the comparion from. 396 The index must be greater or equal than 0 397 and less or equal as the string length. 398 @return sal_True if str match with the characters in the string 399 at the given position; 400 sal_False, otherwise. 401 */ 402 sal_Bool matchIgnoreAsciiCase( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(()) 403 { 404 return rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, 405 str.pData->buffer, str.pData->length, 406 str.pData->length ) == 0; 407 } 408 409 friend sal_Bool operator == ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 410 { return rStr1.getLength() == rStr2.getLength() && rStr1.compareTo( rStr2 ) == 0; } 411 friend sal_Bool operator == ( const OString& rStr1, const sal_Char * pStr2 ) SAL_THROW(()) 412 { return rStr1.compareTo( pStr2 ) == 0; } 413 friend sal_Bool operator == ( const sal_Char * pStr1, const OString& rStr2 ) SAL_THROW(()) 414 { return OString( pStr1 ).compareTo( rStr2 ) == 0; } 415 416 friend sal_Bool operator != ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 417 { return !(operator == ( rStr1, rStr2 )); } 418 friend sal_Bool operator != ( const OString& rStr1, const sal_Char * pStr2 ) SAL_THROW(()) 419 { return !(operator == ( rStr1, pStr2 )); } 420 friend sal_Bool operator != ( const sal_Char * pStr1, const OString& rStr2 ) SAL_THROW(()) 421 { return !(operator == ( pStr1, rStr2 )); } 422 423 friend sal_Bool operator < ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 424 { return rStr1.compareTo( rStr2 ) < 0; } 425 friend sal_Bool operator > ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 426 { return rStr1.compareTo( rStr2 ) > 0; } 427 friend sal_Bool operator <= ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 428 { return rStr1.compareTo( rStr2 ) <= 0; } 429 friend sal_Bool operator >= ( const OString& rStr1, const OString& rStr2 ) SAL_THROW(()) 430 { return rStr1.compareTo( rStr2 ) >= 0; } 431 432 /** 433 Returns a hashcode for this string. 434 435 @return a hash code value for this object. 436 437 @see rtl::OStringHash for convenient use of hash_map / unordered_map 438 */ 439 sal_Int32 hashCode() const SAL_THROW(()) 440 { 441 return rtl_str_hashCode_WithLength( pData->buffer, pData->length ); 442 } 443 444 /** 445 Returns the index within this string of the first occurrence of the 446 specified character, starting the search at the specified index. 447 448 @param ch character to be located. 449 @param fromIndex the index to start the search from. 450 The index must be greater or equal than 0 451 and less or equal as the string length. 452 @return the index of the first occurrence of the character in the 453 character sequence represented by this string that is 454 greater than or equal to fromIndex, or 455 -1 if the character does not occur. 456 */ 457 sal_Int32 indexOf( sal_Char ch, sal_Int32 fromIndex = 0 ) const SAL_THROW(()) 458 { 459 sal_Int32 ret = rtl_str_indexOfChar_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, ch ); 460 return (ret < 0 ? ret : ret+fromIndex); 461 } 462 463 /** 464 Returns the index within this string of the last occurrence of the 465 specified character, searching backward starting at the end. 466 467 @param ch character to be located. 468 @return the index of the last occurrence of the character in the 469 character sequence represented by this string, or 470 -1 if the character does not occur. 471 */ 472 sal_Int32 lastIndexOf( sal_Char ch ) const SAL_THROW(()) 473 { 474 return rtl_str_lastIndexOfChar_WithLength( pData->buffer, pData->length, ch ); 475 } 476 477 /** 478 Returns the index within this string of the last occurrence of the 479 specified character, searching backward starting before the specified 480 index. 481 482 @param ch character to be located. 483 @param fromIndex the index before which to start the search. 484 @return the index of the last occurrence of the character in the 485 character sequence represented by this string that 486 is less than fromIndex, or -1 487 if the character does not occur before that point. 488 */ 489 sal_Int32 lastIndexOf( sal_Char ch, sal_Int32 fromIndex ) const SAL_THROW(()) 490 { 491 return rtl_str_lastIndexOfChar_WithLength( pData->buffer, fromIndex, ch ); 492 } 493 494 /** 495 Returns the index within this string of the first occurrence of the 496 specified substring, starting at the specified index. 497 498 If str doesn't include any character, always -1 is 499 returned. This is also the case, if both strings are empty. 500 501 @param str the substring to search for. 502 @param fromIndex the index to start the search from. 503 @return If the string argument occurs one or more times as a substring 504 within this string at the starting index, then the index 505 of the first character of the first such substring is 506 returned. If it does not occur as a substring starting 507 at fromIndex or beyond, -1 is returned. 508 */ 509 sal_Int32 indexOf( const OString & str, sal_Int32 fromIndex = 0 ) const SAL_THROW(()) 510 { 511 sal_Int32 ret = rtl_str_indexOfStr_WithLength( pData->buffer+fromIndex, pData->length-fromIndex, 512 str.pData->buffer, str.pData->length ); 513 return (ret < 0 ? ret : ret+fromIndex); 514 } 515 516 /** 517 Returns the index within this string of the last occurrence of 518 the specified substring, searching backward starting at the end. 519 520 The returned index indicates the starting index of the substring 521 in this string. 522 If str doesn't include any character, always -1 is 523 returned. This is also the case, if both strings are empty. 524 525 @param str the substring to search for. 526 @return If the string argument occurs one or more times as a substring 527 within this string, then the index of the first character of 528 the last such substring is returned. If it does not occur as 529 a substring, -1 is returned. 530 */ 531 sal_Int32 lastIndexOf( const OString & str ) const SAL_THROW(()) 532 { 533 return rtl_str_lastIndexOfStr_WithLength( pData->buffer, pData->length, 534 str.pData->buffer, str.pData->length ); 535 } 536 537 /** 538 Returns the index within this string of the last occurrence of 539 the specified substring, searching backward starting before the specified 540 index. 541 542 The returned index indicates the starting index of the substring 543 in this string. 544 If str doesn't include any character, always -1 is 545 returned. This is also the case, if both strings are empty. 546 547 @param str the substring to search for. 548 @param fromIndex the index before which to start the search. 549 @return If the string argument occurs one or more times as a substring 550 within this string before the starting index, then the index 551 of the first character of the last such substring is 552 returned. Otherwise, -1 is returned. 553 */ 554 sal_Int32 lastIndexOf( const OString & str, sal_Int32 fromIndex ) const SAL_THROW(()) 555 { 556 return rtl_str_lastIndexOfStr_WithLength( pData->buffer, fromIndex, 557 str.pData->buffer, str.pData->length ); 558 } 559 560 /** 561 Returns a new string that is a substring of this string. 562 563 The substring begins at the specified beginIndex. It is an error for 564 beginIndex to be negative or to be greater than the length of this string. 565 566 @param beginIndex the beginning index, inclusive. 567 @return the specified substring. 568 */ 569 OString copy( sal_Int32 beginIndex ) const SAL_THROW(()) 570 { 571 OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength()); 572 if ( beginIndex == 0 ) 573 return *this; 574 else 575 { 576 rtl_String* pNew = 0; 577 rtl_string_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, getLength()-beginIndex ); 578 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 579 } 580 } 581 582 /** 583 Returns a new string that is a substring of this string. 584 585 The substring begins at the specified beginIndex and contains count 586 characters. It is an error for either beginIndex or count to be negative, 587 or for beginIndex + count to be greater than the length of this string. 588 589 @param beginIndex the beginning index, inclusive. 590 @param count the number of characters. 591 @return the specified substring. 592 */ 593 OString copy( sal_Int32 beginIndex, sal_Int32 count ) const SAL_THROW(()) 594 { 595 OSL_ASSERT(beginIndex >= 0 && beginIndex <= getLength() 596 && count >= 0 && count <= getLength() - beginIndex); 597 if ( (beginIndex == 0) && (count == getLength()) ) 598 return *this; 599 else 600 { 601 rtl_String* pNew = 0; 602 rtl_string_newFromStr_WithLength( &pNew, pData->buffer+beginIndex, count ); 603 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 604 } 605 } 606 607 /** 608 Concatenates the specified string to the end of this string. 609 610 @param str the string that is concatenated to the end 611 of this string. 612 @return a string that represents the concatenation of this string 613 followed by the string argument. 614 */ 615 OString concat( const OString & str ) const SAL_THROW(()) 616 { 617 rtl_String* pNew = 0; 618 rtl_string_newConcat( &pNew, pData, str.pData ); 619 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 620 } 621 622 friend OString operator+( const OString & str1, const OString & str2 ) SAL_THROW(()) 623 { 624 return str1.concat( str2 ); 625 } 626 627 /** 628 Returns a new string resulting from replacing n = count characters 629 from position index in this string with newStr. 630 631 @param index the replacing index in str. 632 The index must be greater or equal as 0 and 633 less or equal as the length of the string. 634 @param count the count of charcters that will replaced 635 The count must be greater or equal as 0 and 636 less or equal as the length of the string minus index. 637 @param newStr the new substring. 638 @return the new string. 639 */ 640 OString replaceAt( sal_Int32 index, sal_Int32 count, const OString& newStr ) const SAL_THROW(()) 641 { 642 rtl_String* pNew = 0; 643 rtl_string_newReplaceStrAt( &pNew, pData, index, count, newStr.pData ); 644 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 645 } 646 647 /** 648 Returns a new string resulting from replacing all occurrences of 649 oldChar in this string with newChar. 650 651 If the character oldChar does not occur in the character sequence 652 represented by this object, then the string is assigned with 653 str. 654 655 @param oldChar the old character. 656 @param newChar the new character. 657 @return a string derived from this string by replacing every 658 occurrence of oldChar with newChar. 659 */ 660 OString replace( sal_Char oldChar, sal_Char newChar ) const SAL_THROW(()) 661 { 662 rtl_String* pNew = 0; 663 rtl_string_newReplace( &pNew, pData, oldChar, newChar ); 664 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 665 } 666 667 /** 668 Converts from this string all ASCII uppercase characters (65-90) 669 to ASCII lowercase characters (97-122). 670 671 This function can't be used for language specific conversion. 672 If the string doesn't contain characters which must be converted, 673 then the new string is assigned with str. 674 675 @return the string, converted to ASCII lowercase. 676 */ 677 OString toAsciiLowerCase() const SAL_THROW(()) 678 { 679 rtl_String* pNew = 0; 680 rtl_string_newToAsciiLowerCase( &pNew, pData ); 681 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 682 } 683 684 /** 685 Converts from this string all ASCII lowercase characters (97-122) 686 to ASCII uppercase characters (65-90). 687 688 This function can't be used for language specific conversion. 689 If the string doesn't contain characters which must be converted, 690 then the new string is assigned with str. 691 692 @return the string, converted to ASCII uppercase. 693 */ 694 OString toAsciiUpperCase() const SAL_THROW(()) 695 { 696 rtl_String* pNew = 0; 697 rtl_string_newToAsciiUpperCase( &pNew, pData ); 698 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 699 } 700 701 /** 702 Returns a new string resulting from removing white space from both ends 703 of the string. 704 705 All characters that have codes less than or equal to 706 32 (the space character) are considered to be white space. 707 If the string doesn't contain white spaces at both ends, 708 then the new string is assigned with str. 709 710 @return the string, with white space removed from the front and end. 711 */ 712 OString trim() const SAL_THROW(()) 713 { 714 rtl_String* pNew = 0; 715 rtl_string_newTrim( &pNew, pData ); 716 return OString( pNew, (DO_NOT_ACQUIRE*)0 ); 717 } 718 719 /** 720 Returns a token in the string. 721 722 Example: 723 sal_Int32 nIndex = 0; 724 do 725 { 726 ... 727 OString aToken = aStr.getToken( 0, ';', nIndex ); 728 ... 729 } 730 while ( nIndex >= 0 ); 731 732 @param token the number of the token to return. 733 @param cTok the character which separate the tokens. 734 @param index the position at which the token is searched in the 735 string. 736 The index must not be greater thanthe length of the 737 string. 738 This param is set to the position of the 739 next token or to -1, if it is the last token. 740 @return the token; if either token or index is negative, an empty token 741 is returned (and index is set to -1) 742 */ 743 OString getToken( sal_Int32 token, sal_Char cTok, sal_Int32& index ) const SAL_THROW(()) 744 { 745 rtl_String * pNew = 0; 746 index = rtl_string_getToken( &pNew, pData, token, cTok, index ); 747 return OString( pNew, (DO_NOT_ACQUIRE *)0 ); 748 } 749 750 /** 751 Returns the Boolean value from this string. 752 753 This function can't be used for language specific conversion. 754 755 @return sal_True, if the string is 1 or "True" in any ASCII case. 756 sal_False in any other case. 757 */ 758 sal_Bool toBoolean() const SAL_THROW(()) 759 { 760 return rtl_str_toBoolean( pData->buffer ); 761 } 762 763 /** 764 Returns the first character from this string. 765 766 @return the first character from this string or 0, if this string 767 is emptry. 768 */ 769 sal_Char toChar() const SAL_THROW(()) 770 { 771 return pData->buffer[0]; 772 } 773 774 /** 775 Returns the int32 value from this string. 776 777 This function can't be used for language specific conversion. 778 779 @param radix the radix (between 2 and 36) 780 @return the int32 represented from this string. 781 0 if this string represents no number. 782 */ 783 sal_Int32 toInt32( sal_Int16 radix = 10 ) const SAL_THROW(()) 784 { 785 return rtl_str_toInt32( pData->buffer, radix ); 786 } 787 788 /** 789 Returns the int64 value from this string. 790 791 This function can't be used for language specific conversion. 792 793 @param radix the radix (between 2 and 36) 794 @return the int64 represented from this string. 795 0 if this string represents no number. 796 */ 797 sal_Int64 toInt64( sal_Int16 radix = 10 ) const SAL_THROW(()) 798 { 799 return rtl_str_toInt64( pData->buffer, radix ); 800 } 801 802 /** 803 Returns the float value from this string. 804 805 This function can't be used for language specific conversion. 806 807 @return the float represented from this string. 808 0.0 if this string represents no number. 809 */ 810 float toFloat() const SAL_THROW(()) 811 { 812 return rtl_str_toFloat( pData->buffer ); 813 } 814 815 /** 816 Returns the double value from this string. 817 818 This function can't be used for language specific conversion. 819 820 @return the double represented from this string. 821 0.0 if this string represents no number. 822 */ 823 double toDouble() const SAL_THROW(()) 824 { 825 return rtl_str_toDouble( pData->buffer ); 826 } 827 828 /** 829 Returns the string representation of the sal_Bool argument. 830 831 If the sal_Bool is true, the string "true" is returned. 832 If the sal_Bool is false, the string "false" is returned. 833 This function can't be used for language specific conversion. 834 835 @param b a sal_Bool. 836 @return a string with the string representation of the argument. 837 */ 838 static OString valueOf( sal_Bool b ) SAL_THROW(()) 839 { 840 sal_Char aBuf[RTL_STR_MAX_VALUEOFBOOLEAN]; 841 rtl_String* pNewData = 0; 842 rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfBoolean( aBuf, b ) ); 843 return OString( pNewData, (DO_NOT_ACQUIRE*)0 ); 844 } 845 846 /** 847 Returns the string representation of the char argument. 848 849 @param c a character. 850 @return a string with the string representation of the argument. 851 */ 852 static OString valueOf( sal_Char c ) SAL_THROW(()) 853 { 854 return OString( &c, 1 ); 855 } 856 857 /** 858 Returns the string representation of the int argument. 859 860 This function can't be used for language specific conversion. 861 862 @param i a int32. 863 @param radix the radix (between 2 and 36) 864 @return a string with the string representation of the argument. 865 */ 866 static OString valueOf( sal_Int32 i, sal_Int16 radix = 10 ) SAL_THROW(()) 867 { 868 sal_Char aBuf[RTL_STR_MAX_VALUEOFINT32]; 869 rtl_String* pNewData = 0; 870 rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfInt32( aBuf, i, radix ) ); 871 return OString( pNewData, (DO_NOT_ACQUIRE*)0 ); 872 } 873 874 /** 875 Returns the string representation of the long argument. 876 877 This function can't be used for language specific conversion. 878 879 @param ll a int64. 880 @param radix the radix (between 2 and 36) 881 @return a string with the string representation of the argument. 882 */ 883 static OString valueOf( sal_Int64 ll, sal_Int16 radix = 10 ) SAL_THROW(()) 884 { 885 sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64]; 886 rtl_String* pNewData = 0; 887 rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfInt64( aBuf, ll, radix ) ); 888 return OString( pNewData, (DO_NOT_ACQUIRE*)0 ); 889 } 890 891 /** 892 Returns the string representation of the float argument. 893 894 This function can't be used for language specific conversion. 895 896 @param f a float. 897 @return a string with the string representation of the argument. 898 */ 899 static OString valueOf( float f ) SAL_THROW(()) 900 { 901 sal_Char aBuf[RTL_STR_MAX_VALUEOFFLOAT]; 902 rtl_String* pNewData = 0; 903 rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfFloat( aBuf, f ) ); 904 return OString( pNewData, (DO_NOT_ACQUIRE*)0 ); 905 } 906 907 /** 908 Returns the string representation of the double argument. 909 910 This function can't be used for language specific conversion. 911 912 @param d a double. 913 @return a string with the string representation of the argument. 914 */ 915 static OString valueOf( double d ) SAL_THROW(()) 916 { 917 sal_Char aBuf[RTL_STR_MAX_VALUEOFDOUBLE]; 918 rtl_String* pNewData = 0; 919 rtl_string_newFromStr_WithLength( &pNewData, aBuf, rtl_str_valueOfDouble( aBuf, d ) ); 920 return OString( pNewData, (DO_NOT_ACQUIRE*)0 ); 921 } 922 }; 923 924 /* ======================================================================= */ 925 926 /** A helper to use OStrings with hash maps. 927 928 Instances of this class are unary function objects that can be used as 929 hash function arguments to unordered_map, hash_map and similar constructs. 930 */ 931 struct OStringHash 932 { 933 /** Compute a hash code for a string. 934 935 @param rString 936 a string. 937 938 @return 939 a hash code for the string. This hash code should not be stored 940 persistently, as its computation may change in later revisions. 941 */ 942 size_t operator()( const rtl::OString& rString ) const 943 { return (size_t)rString.hashCode(); } 944 }; 945 946 /* ======================================================================= */ 947 948 /** Equality functor for classic c-strings (i.e. null-terminated char* strings) */ 949 struct CStringEqual 950 { 951 bool operator()( const char* p1, const char* p2) const { 952 while( *p1 != '\0') 953 if( *(p1++) != *(p2++)) 954 return false; 955 return (*p2 == '\0'); 956 } 957 }; 958 959 /** Hashing functor for classic c-strings (i.e. null-terminated char* strings) */ 960 struct CStringHash 961 { 962 size_t operator()( const char* p) const { 963 size_t n = 0; 964 while( *p) 965 n += 4*n + *reinterpret_cast<const unsigned char*>(p++); 966 return n; 967 } 968 }; 969 970 } /* Namespace */ 971 972 /* Helper methods to support OString messages in OSL_ENSURE, DBG_ERROR, DBG_WARN, DBG_TRACE, etc. */ 973 inline sal_Bool SAL_CALL osl_assertFailedLine( const sal_Char* pszFileName, sal_Int32 nLine, const ::rtl::OString& rMessage) 974 { return osl_assertFailedLine( pszFileName, nLine, rMessage.getStr()); } 975 #ifdef DBG_UTIL 976 inline void DbgOut( const rtl::OString& rMessage, sal_uInt16 nOutType, const sal_Char* pFileName, sal_uInt16 nLineNum ) 977 { DbgOut( rMessage.getStr(), nOutType, pFileName, nLineNum); } 978 #endif /* DBG_UTIL */ 979 980 #endif /* __cplusplus */ 981 982 #endif /* _RTL_STRING_HXX_ */ 983 984