xref: /trunk/main/tools/inc/tools/string.hxx (revision 67e470da)
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