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 _STRING_HXX
25 #define _STRING_HXX
26
27 #include <tools/solar.h>
28 #include <osl/thread.h>
29 #include <rtl/textenc.h>
30 #include <rtl/textcvt.h>
31 #ifndef _RTL_STRING_HXX
32 #include <rtl/string.hxx>
33 #endif
34 #ifndef _RTL_USTRING_HXX
35 #include <rtl/ustring.hxx>
36 #endif
37 #include "tools/toolsdllapi.h"
38
39 /*******************************************************************************
40 *
41 * THIS CODE IS DEPRECATED. DO NOT USE IT IN ANY NEW CODE.
42 *
43 * Use the string classes in rtl/ustring.hxx and rtl/ustrbuf.hxx (and
44 * rtl/string.hxx and rtl/strbuf.hxx for byte-sized strings) instead. If you
45 * feel functionality missing from those string classes, please request
46 * improvements on discuss@openoffice.org.
47 *
48 * There will not be any fixes to the code here.
49 ******************************************************************************/
50
51 // -----------------------------------------------------------------------
52
53 class ResId;
54 class String;
55 class ByteString;
56 class UniString;
57
58 // -----------------------------------------------------------------------
59
60 #define BYTESTRING_TO_UNISTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\
61 RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\
62 RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT)
63 #define UNISTRING_TO_BYTESTRING_CVTFLAGS (RTL_UNICODETOTEXT_FLAGS_UNDEFINED_DEFAULT |\
64 RTL_UNICODETOTEXT_FLAGS_INVALID_DEFAULT |\
65 RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE |\
66 RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 |\
67 RTL_UNICODETOTEXT_FLAGS_NOCOMPOSITE)
68
69 // -----------------------------------------------------------------------
70
71 // -----------
72 // - CharSet -
73 // -----------
74
75 #ifndef ENUM_CHARSET_DECLARED
76 #define ENUM_CHARSET_DECLARED
77
78 typedef rtl_TextEncoding CharSet;
79
80 #endif // ENUM_CHARSET_DECLARED
81
gsl_getSystemTextEncoding()82 inline rtl_TextEncoding gsl_getSystemTextEncoding()
83 {
84 return osl_getThreadTextEncoding();
85 }
86
87 // -----------------------------------------------------------------------
88
89 // -----------
90 // - LineEnd -
91 // -----------
92
93 enum LineEnd { LINEEND_CR, LINEEND_LF, LINEEND_CRLF };
94
GetSystemLineEnd()95 inline LineEnd GetSystemLineEnd()
96 {
97 #if defined UNX
98 return LINEEND_LF;
99 #else
100 return LINEEND_CRLF;
101 #endif
102 }
103
104 // -----------------------------------------------------------------------
105
106 // ----------------
107 // - String-Types -
108 // ----------------
109
110 #ifdef STRING32
111 #define STRING_NOTFOUND ((xub_StrLen)0x7FFFFFFF)
112 #define STRING_MATCH ((xub_StrLen)0x7FFFFFFF)
113 #define STRING_LEN ((xub_StrLen)0x7FFFFFFF)
114 #define STRING_MAXLEN ((xub_StrLen)0x7FFFFFFF)
115 #else
116 #define STRING_NOTFOUND ((xub_StrLen)0xFFFF)
117 #define STRING_MATCH ((xub_StrLen)0xFFFF)
118 #define STRING_LEN ((xub_StrLen)0xFFFF)
119 #define STRING_MAXLEN ((xub_StrLen)0xFFFF)
120 #endif
121
122 enum StringCompare { COMPARE_LESS = -1, COMPARE_EQUAL = 0, COMPARE_GREATER = 1 };
123
124 // -----------------------------------------------------------------------
125
126 // ------------------------
127 // - Interne String-Daten -
128 // ------------------------
129
130 // Daten vom String, mit denen der String verwaltet wird
131 // Nur fuer Debug-Zwecke (darf nie direkt einem String zugewiesen werden)
132
133 #ifdef SAL_W32
134 #pragma pack(push, 8)
135 #elif defined(SAL_OS2)
136 #pragma pack(1)
137 #endif
138
139 typedef struct _ByteStringData
140 {
141 sal_Int32 mnRefCount; // Referenz counter
142 sal_Int32 mnLen; // Length of the String
143 sal_Char maStr[1]; // CharArray (String)
144 } ByteStringData;
145
146 #ifdef SAL_W32
147 #pragma pack(pop)
148 #elif defined(SAL_OS2)
149 #pragma pack()
150 #endif
151
152 // --------------
153 // - ByteString -
154 // --------------
155
156 class TOOLS_DLLPUBLIC ByteString
157 {
158 friend class UniString;
159
160 TOOLS_DLLPRIVATE void InitStringRes( const UniString& rStr );
161
162 private:
163 ByteStringData* mpData;
164
165 TOOLS_DLLPRIVATE inline void ImplCopyData();
166 TOOLS_DLLPRIVATE inline char * ImplCopyStringData(char *);
167 TOOLS_DLLPRIVATE void ImplUpdateStringFromUniString(
168 sal_Unicode const *, sal_Size, rtl_TextEncoding, sal_uInt32);
169 TOOLS_DLLPRIVATE void ImplStringConvert(
170 rtl_TextEncoding, rtl_TextEncoding, sal_Bool);
171
172 ByteString( const int* pDummy ); // not implemented: to prevent ByteString( NULL )
173 ByteString(int); // not implemented; to detect misuses
174 // of ByteString(sal_Char);
175 void Assign(int); // not implemented; to detect misuses of
176 // Assign(sal_Char)
177 void operator =(int); // not implemented; to detect misuses
178 // of operator =(sal_Char)
179 void Append(int); // not implemented; to detect misuses of
180 // Append(char)
181 void operator +=(int); // not implemented; to detect misuses
182 // of operator +=(sal_Char)
183
184 public:
185 ByteString();
186 ByteString( const ByteString& rStr );
187 ByteString( const ByteString& rStr, xub_StrLen nPos, xub_StrLen nLen );
188 ByteString( const rtl::OString& rStr );
189 ByteString( const sal_Char* pCharStr );
190 ByteString( const sal_Char* pCharStr, xub_StrLen nLen );
191 ByteString( sal_Char c );
192 ByteString( const UniString& rUniStr,
193 rtl_TextEncoding eTextEncoding,
194 sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS );
195 ByteString( const UniString& rUniStr, xub_StrLen nPos, xub_StrLen nLen,
196 rtl_TextEncoding eTextEncoding,
197 sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS );
198 ByteString( const sal_Unicode* pUniStr,
199 rtl_TextEncoding eTextEncoding,
200 sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS );
201 ByteString( const sal_Unicode* pUniStr, xub_StrLen nLen,
202 rtl_TextEncoding eTextEncoding,
203 sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS );
204 ~ByteString();
205
operator rtl::OString() const206 operator rtl::OString () const
207 {
208 return rtl::OString (reinterpret_cast<rtl_String*>(mpData));
209 }
210
211 static ByteString CreateFromInt32( sal_Int32 n, sal_Int16 nRadix = 10 );
212 static ByteString CreateFromInt64( sal_Int64 n, sal_Int16 nRadix = 10 );
213 static ByteString CreateFromFloat( float f );
214 static ByteString CreateFromDouble( double d );
215 static const ByteString& EmptyString();
216 sal_Int32 ToInt32() const;
217 sal_Int64 ToInt64() const;
218 float ToFloat() const;
219 double ToDouble() const;
220
221 ByteString& Assign( const ByteString& rStr );
222 ByteString& Assign( const rtl::OString& rStr );
223 ByteString& Assign( const sal_Char* pCharStr );
224 ByteString& Assign( const sal_Char* pCharStr, xub_StrLen nLen );
225 ByteString& Assign( sal_Char c );
operator =(const ByteString & rStr)226 ByteString& operator =( const ByteString& rStr )
227 { return Assign( rStr ); }
operator =(const rtl::OString & rStr)228 ByteString& operator =( const rtl::OString& rStr )
229 { return Assign( rStr ); }
operator =(const sal_Char * pCharStr)230 ByteString& operator =( const sal_Char* pCharStr )
231 { return Assign( pCharStr ); }
operator =(const sal_Char c)232 ByteString& operator =( const sal_Char c )
233 { return Assign( c ); }
234
235 ByteString& Append( const ByteString& rStr );
236 ByteString& Append( const sal_Char* pCharStr );
237 ByteString& Append( const sal_Char* pCharStr, xub_StrLen nLen );
238 ByteString& Append( char c );
operator +=(const ByteString & rStr)239 ByteString& operator +=( const ByteString& rStr )
240 { return Append( rStr ); }
operator +=(const sal_Char * pCharStr)241 ByteString& operator +=( const sal_Char* pCharStr )
242 { return Append( pCharStr ); }
operator +=(sal_Char c)243 ByteString& operator +=( sal_Char c )
244 { return Append( c ); }
245
246 void SetChar( xub_StrLen nIndex, sal_Char c );
GetChar(xub_StrLen nIndex) const247 sal_Char GetChar( xub_StrLen nIndex ) const
248 { return mpData->maStr[nIndex]; }
249
Len() const250 xub_StrLen Len() const { return (xub_StrLen)mpData->mnLen; }
251
252 ByteString& Insert( const ByteString& rStr, xub_StrLen nIndex = STRING_LEN );
253 ByteString& Insert( const ByteString& rStr, xub_StrLen nPos, xub_StrLen nLen,
254 xub_StrLen nIndex = STRING_LEN );
255 ByteString& Insert( const sal_Char* pCharStr, xub_StrLen nIndex = STRING_LEN );
256 ByteString& Insert( sal_Char c, xub_StrLen nIndex = STRING_LEN );
257 ByteString& Replace( xub_StrLen nIndex, xub_StrLen nCount, const ByteString& rStr );
258 ByteString& Erase( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN );
259 ByteString Copy( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ) const;
260
261 ByteString& Fill( xub_StrLen nCount, sal_Char cFillChar = ' ' );
262 ByteString& Expand( xub_StrLen nCount, sal_Char cExpandChar = ' ' );
263
264 ByteString& EraseLeadingChars( sal_Char c = ' ' );
265 ByteString& EraseTrailingChars( sal_Char c = ' ' );
266 ByteString& EraseLeadingAndTrailingChars( sal_Char c = ' ' );
267 ByteString& EraseAllChars( sal_Char c = ' ' );
268 ByteString& Reverse();
269
270 ByteString& Convert( rtl_TextEncoding eSource,
271 rtl_TextEncoding eTarget,
272 sal_Bool bReplace = sal_True );
273 static sal_Char Convert( sal_Char c, rtl_TextEncoding eSource,
274 rtl_TextEncoding eTarget,
275 sal_Bool bReplace = sal_True );
276 static sal_Unicode ConvertToUnicode( sal_Char c,
277 rtl_TextEncoding eTextEncoding );
278 static sal_Char ConvertFromUnicode( sal_Unicode c,
279 rtl_TextEncoding eTextEncoding,
280 sal_Bool bReplace = sal_True );
281 static sal_Unicode ConvertToUnicode( const sal_Char* pChar, sal_Size* pLen,
282 rtl_TextEncoding eTextEncoding );
283 static sal_Size ConvertFromUnicode( sal_Unicode c, sal_Char* pBuf, sal_Size nBufLen,
284 rtl_TextEncoding eTextEncoding,
285 sal_Bool bReplace = sal_True );
286 ByteString& ConvertLineEnd( LineEnd eLineEnd );
ConvertLineEnd()287 ByteString& ConvertLineEnd()
288 { return ConvertLineEnd( GetSystemLineEnd() ); }
289
290 sal_Bool IsLowerAscii() const;
291 sal_Bool IsUpperAscii() const;
292 sal_Bool IsAlphaAscii() const;
293 sal_Bool IsNumericAscii() const;
294 sal_Bool IsAlphaNumericAscii() const;
295
296 ByteString& ToLowerAscii();
297 ByteString& ToUpperAscii();
298
299 StringCompare CompareTo( const ByteString& rStr,
300 xub_StrLen nLen = STRING_LEN ) const;
301 StringCompare CompareTo( const sal_Char* pCharStr,
302 xub_StrLen nLen = STRING_LEN ) const;
303 StringCompare CompareIgnoreCaseToAscii( const ByteString& rStr,
304 xub_StrLen nLen = STRING_LEN ) const;
305 StringCompare CompareIgnoreCaseToAscii( const sal_Char* pCharStr,
306 xub_StrLen nLen = STRING_LEN ) const;
307 sal_Bool Equals( const ByteString& rStr ) const;
308 sal_Bool Equals( const sal_Char* pCharStr ) const;
309 sal_Bool EqualsIgnoreCaseAscii( const ByteString& rStr ) const;
310 sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pCharStr ) const;
311 sal_Bool Equals( const ByteString& rStr,
312 xub_StrLen nIndex, xub_StrLen nLen ) const;
313 sal_Bool Equals( const sal_Char* pCharStr,
314 xub_StrLen nIndex, xub_StrLen nLen ) const;
315 sal_Bool EqualsIgnoreCaseAscii( const ByteString& rStr,
316 xub_StrLen nIndex, xub_StrLen nLen ) const;
317 sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pCharStr,
318 xub_StrLen nIndex, xub_StrLen nLen ) const;
319
320 xub_StrLen Match( const ByteString& rStr ) const;
321 xub_StrLen Match( const sal_Char* pCharStr ) const;
322
323 xub_StrLen Search( sal_Char c, xub_StrLen nIndex = 0 ) const;
324 xub_StrLen Search( const ByteString& rStr, xub_StrLen nIndex = 0 ) const;
325 xub_StrLen Search( const sal_Char* pCharStr, xub_StrLen nIndex = 0 ) const;
326 xub_StrLen SearchBackward( sal_Char c, xub_StrLen nIndex = STRING_LEN ) const;
327 xub_StrLen SearchChar( const sal_Char* pChars, xub_StrLen nIndex = 0 ) const;
328 xub_StrLen SearchCharBackward( const sal_Char* pChars, xub_StrLen nIndex = STRING_LEN ) const;
329
330 xub_StrLen SearchAndReplace( sal_Char c, sal_Char cRep, xub_StrLen nIndex = 0 );
331 xub_StrLen SearchAndReplace( const ByteString& rStr, const ByteString& rRepStr,
332 xub_StrLen nIndex = 0 );
333 xub_StrLen SearchAndReplace( const sal_Char* pCharStr, const ByteString& rRepStr,
334 xub_StrLen nIndex = 0 );
335 void SearchAndReplaceAll( sal_Char c, sal_Char cRep );
336 void SearchAndReplaceAll( const ByteString& rStr, const ByteString& rRepStr );
337 void SearchAndReplaceAll( const sal_Char* pCharStr, const ByteString& rRepStr );
338
339 xub_StrLen GetTokenCount( sal_Char cTok = ';' ) const;
340 void SetToken( xub_StrLen nToken, sal_Char cTok, const ByteString& rStr,
341 xub_StrLen nIndex = 0 );
342 ByteString GetToken( xub_StrLen nToken, sal_Char cTok, xub_StrLen& rIndex ) const;
343 ByteString GetToken( xub_StrLen nToken, sal_Char cTok = ';' ) const;
344
345 xub_StrLen GetQuotedTokenCount( const ByteString& rQuotedPairs, sal_Char cTok = ';' ) const;
346 ByteString GetQuotedToken( xub_StrLen nToken, const ByteString& rQuotedPairs,
347 sal_Char cTok, xub_StrLen& rIndex ) const;
348 ByteString GetQuotedToken( xub_StrLen nToken, const ByteString& rQuotedPairs,
349 sal_Char cTok = ';' ) const;
350
GetBuffer() const351 const sal_Char* GetBuffer() const { return mpData->maStr; }
352 sal_Char* GetBufferAccess();
353 void ReleaseBufferAccess( xub_StrLen nLen = STRING_LEN );
354 sal_Char* AllocBuffer( xub_StrLen nLen );
355
operator ==(const ByteString & rStr1,const ByteString & rStr2)356 friend sal_Bool operator == ( const ByteString& rStr1, const ByteString& rStr2 )
357 { return rStr1.Equals( rStr2 ); }
operator ==(const ByteString & rStr,const sal_Char * pCharStr)358 friend sal_Bool operator == ( const ByteString& rStr, const sal_Char* pCharStr )
359 { return rStr.Equals( pCharStr ); }
operator ==(const sal_Char * pCharStr,const ByteString & rStr)360 friend sal_Bool operator == ( const sal_Char* pCharStr, const ByteString& rStr )
361 { return rStr.Equals( pCharStr ); }
operator !=(const ByteString & rStr1,const ByteString & rStr2)362 friend sal_Bool operator != ( const ByteString& rStr1, const ByteString& rStr2 )
363 { return !(operator == ( rStr1, rStr2 )); }
operator !=(const ByteString & rStr,const sal_Char * pCharStr)364 friend sal_Bool operator != ( const ByteString& rStr, const sal_Char* pCharStr )
365 { return !(operator == ( rStr, pCharStr )); }
operator !=(const sal_Char * pCharStr,const ByteString & rStr)366 friend sal_Bool operator != ( const sal_Char* pCharStr, const ByteString& rStr )
367 { return !(operator == ( pCharStr, rStr )); }
operator <(const ByteString & rStr1,const ByteString & rStr2)368 friend sal_Bool operator < ( const ByteString& rStr1, const ByteString& rStr2 )
369 { return (rStr1.CompareTo( rStr2 ) == COMPARE_LESS); }
operator <(const ByteString & rStr,const sal_Char * pCharStr)370 friend sal_Bool operator < ( const ByteString& rStr, const sal_Char* pCharStr )
371 { return (rStr.CompareTo( pCharStr ) == COMPARE_LESS); }
operator <(const sal_Char * pCharStr,const ByteString & rStr)372 friend sal_Bool operator < ( const sal_Char* pCharStr, const ByteString& rStr )
373 { return (rStr.CompareTo( pCharStr ) >= COMPARE_EQUAL); }
operator >(const ByteString & rStr1,const ByteString & rStr2)374 friend sal_Bool operator > ( const ByteString& rStr1, const ByteString& rStr2 )
375 { return (rStr1.CompareTo( rStr2 ) == COMPARE_GREATER); }
operator >(const ByteString & rStr,const sal_Char * pCharStr)376 friend sal_Bool operator > ( const ByteString& rStr, const sal_Char* pCharStr )
377 { return (rStr.CompareTo( pCharStr ) == COMPARE_GREATER); }
operator >(const sal_Char * pCharStr,const ByteString & rStr)378 friend sal_Bool operator > ( const sal_Char* pCharStr, const ByteString& rStr )
379 { return (rStr.CompareTo( pCharStr ) <= COMPARE_EQUAL); }
operator <=(const ByteString & rStr1,const ByteString & rStr2)380 friend sal_Bool operator <= ( const ByteString& rStr1, const ByteString& rStr2 )
381 { return !(operator > ( rStr1, rStr2 )); }
operator <=(const ByteString & rStr,const sal_Char * pCharStr)382 friend sal_Bool operator <= ( const ByteString& rStr, const sal_Char* pCharStr )
383 { return !(operator > ( rStr, pCharStr )); }
operator <=(const sal_Char * pCharStr,const ByteString & rStr)384 friend sal_Bool operator <= ( const sal_Char* pCharStr, const ByteString& rStr )
385 { return !(operator > ( pCharStr, rStr )); }
operator >=(const ByteString & rStr1,const ByteString & rStr2)386 friend sal_Bool operator >= ( const ByteString& rStr1, const ByteString& rStr2 )
387 { return !(operator < ( rStr1, rStr2 )); }
operator >=(const ByteString & rStr,const sal_Char * pCharStr)388 friend sal_Bool operator >= ( const ByteString& rStr, const sal_Char* pCharStr )
389 { return !(operator < ( rStr, pCharStr )); }
operator >=(const sal_Char * pCharStr,const ByteString & rStr)390 friend sal_Bool operator >= ( const sal_Char* pCharStr, const ByteString& rStr )
391 { return !(operator < ( pCharStr, rStr )); }
392 };
393
Copy(xub_StrLen nIndex,xub_StrLen nCount) const394 inline ByteString ByteString::Copy( xub_StrLen nIndex, xub_StrLen nCount ) const
395 {
396 return ByteString( *this, nIndex, nCount );
397 }
398
GetToken(xub_StrLen nToken,sal_Char cTok) const399 inline ByteString ByteString::GetToken( xub_StrLen nToken, sal_Char cTok ) const
400 {
401 xub_StrLen nTempPos = 0;
402 return GetToken( nToken, cTok, nTempPos );
403 }
404
GetQuotedToken(xub_StrLen nToken,const ByteString & rQuotedPairs,sal_Char cTok) const405 inline ByteString ByteString::GetQuotedToken( xub_StrLen nToken, const ByteString& rQuotedPairs,
406 sal_Char cTok ) const
407 {
408 xub_StrLen nTempPos = 0;
409 return GetQuotedToken( nToken, rQuotedPairs, cTok, nTempPos );
410 }
411
412 // -----------------------------------------------------------------------
413
414 // ------------------------
415 // - Interne String-Daten -
416 // ------------------------
417
418 // Daten vom String, mit denen der String verwaltet wird
419 // Nur fuer Debug-Zwecke (darf nie direkt einem String zugewiesen werden)
420
421 #ifdef SAL_W32
422 #pragma pack(push, 4)
423 #elif defined(SAL_OS2)
424 #pragma pack(1)
425 #endif
426
427 typedef struct _UniStringData
428 {
429 sal_Int32 mnRefCount; // Referenz counter
430 sal_Int32 mnLen; // Length of the String
431 sal_Unicode maStr[1]; // CharArray (String)
432 } UniStringData;
433
434 #ifdef SAL_W32
435 #pragma pack(pop)
436 #elif defined(SAL_OS2)
437 #pragma pack()
438 #endif
439
440 // -------------
441 // - UniString -
442 // -------------
443
444 class TOOLS_DLLPUBLIC UniString
445 {
446 friend class ByteString;
447
448 TOOLS_DLLPRIVATE void InitStringRes( const sal_Char* pUTF8Str, sal_Int32 nLen );
449
450 private:
451 UniStringData* mpData;
452
453 TOOLS_DLLPRIVATE inline void ImplCopyData();
454 TOOLS_DLLPRIVATE inline sal_Unicode * ImplCopyStringData(sal_Unicode *);
455
456 UniString( const int* pDummy ); // not implemented: to prevent UniString( NULL )
457 UniString(int); // not implemented; to detect misuses of
458 // UniString(sal_Unicode)
459 void Assign(int); // not implemented; to detect misuses of
460 // Assign(sal_Unicode)
461 void operator =(int); // not implemented; to detect misuses
462 // of operator =(sal_Unicode)
463 void Append(int); // not implemented; to detect misuses of
464 // Append(sal_Unicode)
465 void operator +=(int); // not implemented; to detect misuses
466 // of operator +=(sal_Unicode)
467
468 public:
469 UniString();
470 UniString( const ResId& rResId );
471 UniString( const UniString& rStr );
472 UniString( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen );
473 UniString( const rtl::OUString& rStr );
474 UniString( const sal_Unicode* pCharStr );
475 UniString( const sal_Unicode* pCharStr, xub_StrLen nLen );
476 UniString( sal_Unicode c );
477 UniString(char c); // ...but allow "UniString('a')"
478 UniString( const ByteString& rByteStr,
479 rtl_TextEncoding eTextEncoding,
480 sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
481 UniString( const ByteString& rByteStr, xub_StrLen nPos, xub_StrLen nLen,
482 rtl_TextEncoding eTextEncoding,
483 sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
484 UniString( const sal_Char* pByteStr,
485 rtl_TextEncoding eTextEncoding,
486 sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
487 UniString( const sal_Char* pByteStr, xub_StrLen nLen,
488 rtl_TextEncoding eTextEncoding,
489 sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
490 ~UniString();
491
operator rtl::OUString() const492 operator rtl::OUString () const
493 {
494 return rtl::OUString (reinterpret_cast<rtl_uString*>(mpData));
495 }
496
497 UniString intern() const;
498
499 static UniString CreateFromAscii( const sal_Char* pAsciiStr );
500 static UniString CreateFromAscii( const sal_Char* pAsciiStr, xub_StrLen nLen );
501
502 static UniString CreateFromInt32( sal_Int32 n, sal_Int16 nRadix = 10 );
503 static UniString CreateFromInt64( sal_Int64 n, sal_Int16 nRadix = 10 );
504 static UniString CreateFromFloat( float f );
505 static UniString CreateFromDouble( double d );
506 static const UniString& EmptyString();
507 sal_Int32 ToInt32() const;
508 sal_Int64 ToInt64() const;
509 float ToFloat() const;
510 double ToDouble() const;
511
512 UniString& Assign( const UniString& rStr );
513 UniString& Assign( const rtl::OUString& rStr );
514 UniString& Assign( const sal_Unicode* pCharStr );
515 UniString& Assign( const sal_Unicode* pCharStr, xub_StrLen nLen );
516 UniString& Assign( sal_Unicode c );
Assign(char c)517 inline UniString & Assign(char c) // ...but allow "Assign('a')"
518 { return Assign(static_cast< sal_Unicode >(c)); }
519 UniString& AssignAscii( const sal_Char* pAsciiStr );
520 UniString& AssignAscii( const sal_Char* pAsciiStr, xub_StrLen nLen );
operator =(const UniString & rStr)521 UniString& operator =( const UniString& rStr )
522 { return Assign( rStr ); }
operator =(const rtl::OUString & rStr)523 UniString& operator =( const rtl::OUString& rStr )
524 { return Assign( rStr ); }
operator =(const sal_Unicode * pCharStr)525 UniString& operator =( const sal_Unicode* pCharStr )
526 { return Assign( pCharStr ); }
operator =(sal_Unicode c)527 UniString& operator =( sal_Unicode c )
528 { return Assign( c ); }
operator =(char c)529 inline UniString & operator =(char c) // ...but allow "= 'a'"
530 { return operator =(static_cast< sal_Unicode >(c)); }
531
532 UniString& Append( const UniString& rStr );
533 UniString& Append( const sal_Unicode* pCharStr );
534 UniString& Append( const sal_Unicode* pCharStr, xub_StrLen nLen );
535 UniString& Append( sal_Unicode c );
Append(char c)536 inline UniString & Append(char c) // ...but allow "Append('a')"
537 { return Append(static_cast< sal_Unicode >(c)); }
538 UniString& AppendAscii( const sal_Char* pAsciiStr );
539 UniString& AppendAscii( const sal_Char* pAsciiStr, xub_StrLen nLen );
operator +=(const UniString & rStr)540 UniString& operator +=( const UniString& rStr )
541 { return Append( rStr ); }
operator +=(const sal_Unicode * pCharStr)542 UniString& operator +=( const sal_Unicode* pCharStr )
543 { return Append( pCharStr ); }
operator +=(sal_Unicode c)544 UniString& operator +=( sal_Unicode c )
545 { return Append( c ); }
operator +=(char c)546 inline UniString & operator +=(char c) // ...but allow "+= 'a'"
547 { return operator +=(static_cast< sal_Unicode >(c)); }
548
549 void SetChar( xub_StrLen nIndex, sal_Unicode c );
GetChar(xub_StrLen nIndex) const550 sal_Unicode GetChar( xub_StrLen nIndex ) const
551 { return mpData->maStr[nIndex]; }
552
Len() const553 xub_StrLen Len() const { return (xub_StrLen)mpData->mnLen; }
554
555 UniString& Insert( const UniString& rStr, xub_StrLen nIndex = STRING_LEN );
556 UniString& Insert( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen,
557 xub_StrLen nIndex = STRING_LEN );
558 UniString& Insert( const sal_Unicode* pCharStr, xub_StrLen nIndex = STRING_LEN );
559 UniString& Insert( sal_Unicode c, xub_StrLen nIndex = STRING_LEN );
560 UniString& InsertAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = STRING_LEN );
561 UniString& Replace( xub_StrLen nIndex, xub_StrLen nLen, const UniString& rStr );
562 UniString& ReplaceAscii( xub_StrLen nIndex, xub_StrLen nLen,
563 const sal_Char* pAsciiStr, xub_StrLen nStrLen = STRING_LEN );
564 UniString& Erase( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN );
565 UniString Copy( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ) const;
566
567 UniString& Fill( xub_StrLen nCount, sal_Unicode cFillChar = ' ' );
568 UniString& Expand( xub_StrLen nCount, sal_Unicode cExpandChar = ' ' );
569
570 UniString& EraseLeadingChars( sal_Unicode c = ' ' );
571 UniString& EraseTrailingChars( sal_Unicode c = ' ' );
572 UniString& EraseLeadingAndTrailingChars( sal_Unicode c = ' ' );
573 UniString& EraseAllChars( sal_Unicode c = ' ' );
574 UniString& Reverse();
575
576 UniString& ConvertLineEnd( LineEnd eLineEnd );
ConvertLineEnd()577 UniString& ConvertLineEnd()
578 { return ConvertLineEnd( GetSystemLineEnd() ); }
579
580 UniString& ToLowerAscii();
581 UniString& ToUpperAscii();
582
583 StringCompare CompareTo( const UniString& rStr,
584 xub_StrLen nLen = STRING_LEN ) const;
585 StringCompare CompareTo( const sal_Unicode* pCharStr,
586 xub_StrLen nLen = STRING_LEN ) const;
587 StringCompare CompareToAscii( const sal_Char* pAsciiStr,
588 xub_StrLen nLen = STRING_LEN ) const;
589 StringCompare CompareIgnoreCaseToAscii( const UniString& rStr,
590 xub_StrLen nLen = STRING_LEN ) const;
591 StringCompare CompareIgnoreCaseToAscii( const sal_Unicode* pCharStr,
592 xub_StrLen nLen = STRING_LEN ) const;
593 StringCompare CompareIgnoreCaseToAscii( const sal_Char* pAsciiStr,
594 xub_StrLen nLen = STRING_LEN ) const;
595 sal_Bool Equals( const UniString& rStr ) const;
596 sal_Bool Equals( const sal_Unicode* pCharStr ) const;
597 sal_Bool EqualsAscii( const sal_Char* pAsciiStr ) const;
598 sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr ) const;
599 sal_Bool EqualsIgnoreCaseAscii( const sal_Unicode* pCharStr ) const;
600 sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr ) const;
601 sal_Bool Equals( const UniString& rStr,
602 xub_StrLen nIndex, xub_StrLen nLen ) const;
603 sal_Bool Equals( const sal_Unicode* pCharStr,
604 xub_StrLen nIndex, xub_StrLen nLen ) const;
605 sal_Bool EqualsAscii( const sal_Char* pAsciiStr,
606 xub_StrLen nIndex, xub_StrLen nLen ) const;
607 sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr,
608 xub_StrLen nIndex, xub_StrLen nLen ) const;
609 sal_Bool EqualsIgnoreCaseAscii( const sal_Unicode* pCharStr,
610 xub_StrLen nIndex, xub_StrLen nLen ) const;
611 sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr,
612 xub_StrLen nIndex, xub_StrLen nLen ) const;
613
614 xub_StrLen Match( const UniString& rStr ) const;
615 xub_StrLen Match( const sal_Unicode* pCharStr ) const;
616
617 xub_StrLen Search( sal_Unicode c, xub_StrLen nIndex = 0 ) const;
618 xub_StrLen Search( const UniString& rStr, xub_StrLen nIndex = 0 ) const;
619 xub_StrLen Search( const sal_Unicode* pCharStr, xub_StrLen nIndex = 0 ) const;
620 xub_StrLen SearchAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = 0 ) const;
621 xub_StrLen SearchBackward( sal_Unicode c, xub_StrLen nIndex = STRING_LEN ) const;
622 xub_StrLen SearchChar( const sal_Unicode* pChars, xub_StrLen nIndex = 0 ) const;
623 xub_StrLen SearchCharBackward( const sal_Unicode* pChars, xub_StrLen nIndex = STRING_LEN ) const;
624
625 xub_StrLen SearchAndReplace( sal_Unicode c, sal_Unicode cRep,
626 xub_StrLen nIndex = 0 );
627 xub_StrLen SearchAndReplace( const UniString& rStr, const UniString& rRepStr,
628 xub_StrLen nIndex = 0 );
629 xub_StrLen SearchAndReplace( const sal_Unicode* pCharStr, const UniString& rRepStr,
630 xub_StrLen nIndex = 0 );
631 xub_StrLen SearchAndReplaceAscii( const sal_Char* pAsciiStr, const UniString& rRepStr,
632 xub_StrLen nIndex = 0 );
633 void SearchAndReplaceAll( sal_Unicode c, sal_Unicode cRep );
634 void SearchAndReplaceAll( const UniString& rStr, const UniString& rRepStr );
635 void SearchAndReplaceAll( const sal_Unicode* pCharStr, const UniString& rRepStr );
636 void SearchAndReplaceAllAscii( const sal_Char* pAsciiStr, const UniString& rRepStr );
637
638 xub_StrLen GetTokenCount( sal_Unicode cTok = ';' ) const;
639 void SetToken( xub_StrLen nToken, sal_Unicode cTok, const UniString& rStr,
640 xub_StrLen nIndex = 0 );
641 UniString GetToken( xub_StrLen nToken, sal_Unicode cTok, xub_StrLen& rIndex ) const;
642 UniString GetToken( xub_StrLen nToken, sal_Unicode cTok = ';' ) const;
643
644 xub_StrLen GetQuotedTokenCount( const UniString& rQuotedPairs, sal_Unicode cTok = ';' ) const;
645 UniString GetQuotedToken( xub_StrLen nToken, const UniString& rQuotedPairs,
646 sal_Unicode cTok, xub_StrLen& rIndex ) const;
647 UniString GetQuotedToken( xub_StrLen nToken, const UniString& rQuotedPairs,
648 sal_Unicode cTok = ';' ) const;
649
GetBuffer() const650 const sal_Unicode* GetBuffer() const { return mpData->maStr; }
651 sal_Unicode* GetBufferAccess();
652 void ReleaseBufferAccess( xub_StrLen nLen = STRING_LEN );
653 sal_Unicode* AllocBuffer( xub_StrLen nLen );
654
operator ==(const UniString & rStr1,const UniString & rStr2)655 friend sal_Bool operator == ( const UniString& rStr1, const UniString& rStr2 )
656 { return rStr1.Equals( rStr2 ); }
operator !=(const UniString & rStr1,const UniString & rStr2)657 friend sal_Bool operator != ( const UniString& rStr1, const UniString& rStr2 )
658 { return !(operator == ( rStr1, rStr2 )); }
operator <(const UniString & rStr1,const UniString & rStr2)659 friend sal_Bool operator < ( const UniString& rStr1, const UniString& rStr2 )
660 { return (rStr1.CompareTo( rStr2 ) == COMPARE_LESS); }
operator >(const UniString & rStr1,const UniString & rStr2)661 friend sal_Bool operator > ( const UniString& rStr1, const UniString& rStr2 )
662 { return (rStr1.CompareTo( rStr2 ) == COMPARE_GREATER); }
operator <=(const UniString & rStr1,const UniString & rStr2)663 friend sal_Bool operator <= ( const UniString& rStr1, const UniString& rStr2 )
664 { return !(operator > ( rStr1, rStr2 )); }
operator >=(const UniString & rStr1,const UniString & rStr2)665 friend sal_Bool operator >= ( const UniString& rStr1, const UniString& rStr2 )
666 { return !(operator < ( rStr1, rStr2 )); }
667 };
668
Copy(xub_StrLen nIndex,xub_StrLen nCount) const669 inline UniString UniString::Copy( xub_StrLen nIndex, xub_StrLen nCount ) const
670 {
671 return UniString( *this, nIndex, nCount );
672 }
673
GetToken(xub_StrLen nToken,sal_Unicode cTok) const674 inline UniString UniString::GetToken( xub_StrLen nToken, sal_Unicode cTok ) const
675 {
676 xub_StrLen nTempPos = 0;
677 return GetToken( nToken, cTok, nTempPos );
678 }
679
GetQuotedToken(xub_StrLen nToken,const UniString & rQuotedPairs,sal_Unicode cTok) const680 inline UniString UniString::GetQuotedToken( xub_StrLen nToken, const UniString& rQuotedPairs,
681 sal_Unicode cTok ) const
682 {
683 xub_StrLen nTempPos = 0;
684 return GetQuotedToken( nToken, rQuotedPairs, cTok, nTempPos );
685 }
686
687 #endif // _STRING_HXX
688