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