Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #ifndef _STRING_HXX
21 : : #define _STRING_HXX
22 : :
23 : : #include <tools/solar.h>
24 : : #include <osl/thread.h>
25 : : #include <rtl/textenc.h>
26 : : #include <rtl/textcvt.h>
27 : : #include <rtl/ustrbuf.h>
28 : : #include <rtl/string.hxx>
29 : : #include <rtl/ustring.hxx>
30 : : #include "tools/toolsdllapi.h"
31 : : #include "tools/lineend.hxx"
32 : :
33 : : /*******************************************************************************
34 : : *
35 : : * THIS CODE IS DEPRECATED. DO NOT USE IT IN ANY NEW CODE.
36 : : *
37 : : * Use the string classes in rtl/ustring.hxx and rtl/ustrbuf.hxx (and
38 : : * rtl/string.hxx and rtl/strbuf.hxx for byte-sized strings) instead. If you
39 : : * feel functionality missing from those string classes, please request
40 : : * improvements on discuss@openoffice.org.
41 : : *
42 : : * There will not be any fixes to the code here.
43 : : ******************************************************************************/
44 : :
45 : : class ResId;
46 : : class String;
47 : : class UniString;
48 : :
49 : : #define BYTESTRING_TO_UNISTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\
50 : : RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\
51 : : RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT)
52 : :
53 : : // CharSet
54 : :
55 : : #ifndef ENUM_CHARSET_DECLARED
56 : : #define ENUM_CHARSET_DECLARED
57 : :
58 : : typedef rtl_TextEncoding CharSet;
59 : :
60 : : #endif
61 : :
62 : : // String-Types
63 : :
64 : : #ifdef STRING32
65 : : #define STRING_NOTFOUND ((xub_StrLen)0x7FFFFFFF)
66 : : #define STRING_MATCH ((xub_StrLen)0x7FFFFFFF)
67 : : #define STRING_LEN ((xub_StrLen)0x7FFFFFFF)
68 : : #define STRING_MAXLEN ((xub_StrLen)0x7FFFFFFF)
69 : : #else
70 : : #define STRING_NOTFOUND ((xub_StrLen)0xFFFF)
71 : : #define STRING_MATCH ((xub_StrLen)0xFFFF)
72 : : #define STRING_LEN ((xub_StrLen)0xFFFF)
73 : : #define STRING_MAXLEN ((xub_StrLen)0xFFFF)
74 : : #endif
75 : :
76 : : enum StringCompare { COMPARE_LESS = -1, COMPARE_EQUAL = 0, COMPARE_GREATER = 1 };
77 : :
78 : : //Internal String data
79 : :
80 : : // Data used for the management of this String
81 : : // use only for debugging purposes (never assign to String directly!)
82 : :
83 : : #ifdef SAL_W32
84 : : #pragma pack(push, 4)
85 : : #endif
86 : :
87 : : typedef struct _UniStringData
88 : : {
89 : : sal_Int32 mnRefCount; // reference counter
90 : : sal_Int32 mnLen; // Length of the String
91 : : sal_Unicode maStr[1]; // CharArray (String)
92 : : } UniStringData;
93 : :
94 : : #ifdef SAL_W32
95 : : #pragma pack(pop)
96 : : #endif
97 : :
98 : : // UniString
99 : :
100 : : class TOOLS_DLLPUBLIC UniString
101 : : {
102 : : private:
103 : : UniStringData* mpData;
104 : :
105 : : TOOLS_DLLPRIVATE inline void ImplCopyData();
106 : : TOOLS_DLLPRIVATE inline sal_Unicode * ImplCopyStringData(sal_Unicode *);
107 : :
108 : : UniString( const int* pDummy ); // not implemented: to prevent UniString( NULL )
109 : : UniString(int); // not implemented; to detect misuses of
110 : : // UniString(sal_Unicode)
111 : : void Assign(int); // not implemented; to detect misuses of
112 : : // Assign(sal_Unicode)
113 : : void operator =(int); // not implemented; to detect misuses
114 : : // of operator =(sal_Unicode)
115 : : void Append(int); // not implemented; to detect misuses of
116 : : // Append(sal_Unicode)
117 : : void operator +=(int); // not implemented; to detect misuses
118 : : // of operator +=(sal_Unicode)
119 : :
120 : : //detect and reject use of RTL_CONSTASCII_STRINGPARAM instead of RTL_CONSTASCII_USTRINGPARAM
121 : : TOOLS_DLLPRIVATE UniString( const sal_Char*, sal_Int32 );
122 : :
123 : : //detect and reject wrong way to attempt to create a UniString from a substring of
124 : : //a rtl::OString
125 : : TOOLS_DLLPRIVATE UniString(const rtl::OString& rByteStr, xub_StrLen nPos, xub_StrLen nLen,
126 : : sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS);
127 : :
128 : : //no longer implemented
129 : : TOOLS_DLLPRIVATE UniString( const rtl::OString& rByteStr,
130 : : rtl_TextEncoding eTextEncoding,
131 : : sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
132 : : TOOLS_DLLPRIVATE UniString( const sal_Unicode* pCharStr );
133 : : TOOLS_DLLPRIVATE UniString( const sal_Unicode* pCharStr, xub_StrLen nLen );
134 : :
135 : : public:
136 : : UniString();
137 : : UniString( const ResId& rResId );
138 : : UniString( const UniString& rStr );
139 : : UniString( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen );
140 : : UniString( const rtl::OUString& rStr );
141 : : UniString( sal_Unicode c );
142 : : UniString(char c); // ...but allow "UniString('a')"
143 : : UniString( const sal_Char* pByteStr,
144 : : rtl_TextEncoding eTextEncoding,
145 : : sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
146 : : UniString( const sal_Char* pByteStr, xub_StrLen nLen,
147 : : rtl_TextEncoding eTextEncoding,
148 : : sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS );
149 : : ~UniString();
150 : :
151 : 11847787 : operator rtl::OUString () const
152 : : {
153 : : return rtl::OUString( rtl_uStringBuffer_refReturn(
154 : 11847787 : reinterpret_cast<rtl_uString*>(mpData)), SAL_NO_ACQUIRE );
155 : : }
156 : :
157 : : static UniString CreateFromInt32( sal_Int32 n, sal_Int16 nRadix = 10 );
158 : : static const UniString& EmptyString();
159 : : sal_Int32 ToInt32() const;
160 : : sal_Int64 ToInt64() const;
161 : :
162 : : UniString& Assign( const UniString& rStr );
163 : : UniString& Assign( const rtl::OUString& rStr );
164 : : UniString& Assign( const sal_Unicode* pCharStr );
165 : : UniString& Assign( const sal_Unicode* pCharStr, xub_StrLen nLen );
166 : : UniString& Assign( sal_Unicode c );
167 : 28 : inline UniString & Assign(char c) // ...but allow "Assign('a')"
168 : 28 : { return Assign(static_cast< sal_Unicode >(c)); }
169 : : UniString& AssignAscii( const sal_Char* pAsciiStr );
170 : : UniString& AssignAscii( const sal_Char* pAsciiStr, xub_StrLen nLen );
171 : 13119656 : UniString& operator =( const UniString& rStr )
172 : 13119656 : { return Assign( rStr ); }
173 : 3656424 : UniString& operator =( const rtl::OUString& rStr )
174 : 3656424 : { return Assign( rStr ); }
175 : 142681 : UniString& operator =( const sal_Unicode* pCharStr )
176 : 142681 : { return Assign( pCharStr ); }
177 : 4857 : UniString& operator =( sal_Unicode c )
178 : 4857 : { return Assign( c ); }
179 : 4755 : inline UniString & operator =(char c) // ...but allow "= 'a'"
180 : 4755 : { return operator =(static_cast< sal_Unicode >(c)); }
181 : :
182 : : UniString& Append( const UniString& rStr );
183 : : UniString& Append( const sal_Unicode* pCharStr );
184 : : UniString& Append( const sal_Unicode* pCharStr, xub_StrLen nLen );
185 : : UniString& Append( sal_Unicode c );
186 : 2640 : inline UniString & Append(char c) // ...but allow "Append('a')"
187 : 2640 : { return Append(static_cast< sal_Unicode >(c)); }
188 : : UniString& AppendAscii( const sal_Char* pAsciiStr );
189 : : UniString& AppendAscii( const sal_Char* pAsciiStr, xub_StrLen nLen );
190 : 2454087 : UniString& operator +=( const UniString& rStr )
191 : 2454087 : { return Append( rStr ); }
192 : 86499 : UniString& operator +=( const rtl::OUString& rStr )
193 [ + - ]: 86499 : { return Append( UniString(rStr) ); }
194 : 0 : UniString& operator +=( const sal_Unicode* pCharStr )
195 : 0 : { return Append( pCharStr ); }
196 : 4330303 : UniString& operator +=( sal_Unicode c )
197 : 4330303 : { return Append( c ); }
198 : 66404 : inline UniString & operator +=(char c) // ...but allow "+= 'a'"
199 : 66404 : { return operator +=(static_cast< sal_Unicode >(c)); }
200 : :
201 : : void SetChar( xub_StrLen nIndex, sal_Unicode c );
202 : 36831672 : sal_Unicode GetChar( xub_StrLen nIndex ) const
203 : 36831672 : { return mpData->maStr[nIndex]; }
204 : :
205 : 37934997 : xub_StrLen Len() const { return (xub_StrLen)mpData->mnLen; }
206 : :
207 : : UniString& Insert( const UniString& rStr, xub_StrLen nIndex = STRING_LEN );
208 : : UniString& Insert( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen,
209 : : xub_StrLen nIndex = STRING_LEN );
210 : : UniString& Insert( sal_Unicode c, xub_StrLen nIndex = STRING_LEN );
211 : : UniString& InsertAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = STRING_LEN );
212 : : UniString& Replace( xub_StrLen nIndex, xub_StrLen nLen, const UniString& rStr );
213 : : UniString& ReplaceAscii( xub_StrLen nIndex, xub_StrLen nLen,
214 : : const sal_Char* pAsciiStr, xub_StrLen nStrLen = STRING_LEN );
215 : : UniString& Erase( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN );
216 : : UniString Copy( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ) const;
217 : :
218 : : UniString& Fill( xub_StrLen nCount, sal_Unicode cFillChar = ' ' );
219 : : UniString& Expand( xub_StrLen nCount, sal_Unicode cExpandChar = ' ' );
220 : :
221 : : UniString& ToLowerAscii();
222 : : UniString& ToUpperAscii();
223 : :
224 : : StringCompare CompareTo( const UniString& rStr,
225 : : xub_StrLen nLen = STRING_LEN ) const;
226 : : StringCompare CompareToAscii( const sal_Char* pAsciiStr,
227 : : xub_StrLen nLen = STRING_LEN ) const;
228 : : StringCompare CompareIgnoreCaseToAscii( const UniString& rStr,
229 : : xub_StrLen nLen = STRING_LEN ) const;
230 : : StringCompare CompareIgnoreCaseToAscii( const sal_Char* pAsciiStr,
231 : : xub_StrLen nLen = STRING_LEN ) const;
232 : : sal_Bool Equals( const UniString& rStr ) const;
233 : : sal_Bool EqualsAscii( const sal_Char* pAsciiStr ) const;
234 : : sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr ) const;
235 : : sal_Bool EqualsIgnoreCaseAscii( const sal_Unicode* pCharStr ) const;
236 : : sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr ) const;
237 : : sal_Bool Equals( const UniString& rStr,
238 : : xub_StrLen nIndex, xub_StrLen nLen ) const;
239 : : sal_Bool Equals( const sal_Unicode* pCharStr,
240 : : xub_StrLen nIndex, xub_StrLen nLen ) const;
241 : : sal_Bool EqualsAscii( const sal_Char* pAsciiStr,
242 : : xub_StrLen nIndex, xub_StrLen nLen ) const;
243 : : sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr,
244 : : xub_StrLen nIndex, xub_StrLen nLen ) const;
245 : : sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr,
246 : : xub_StrLen nIndex, xub_StrLen nLen ) const;
247 : :
248 : : xub_StrLen Match( const UniString& rStr ) const;
249 : :
250 : : xub_StrLen Search( sal_Unicode c, xub_StrLen nIndex = 0 ) const;
251 : : xub_StrLen Search( const UniString& rStr, xub_StrLen nIndex = 0 ) const;
252 : : xub_StrLen Search( const sal_Unicode* pCharStr, xub_StrLen nIndex = 0 ) const;
253 : : xub_StrLen SearchAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = 0 ) const;
254 : : xub_StrLen SearchBackward( sal_Unicode c, xub_StrLen nIndex = STRING_LEN ) const;
255 : : xub_StrLen SearchChar( const sal_Unicode* pChars, xub_StrLen nIndex = 0 ) const;
256 : :
257 : : xub_StrLen SearchAndReplace( sal_Unicode c, sal_Unicode cRep,
258 : : xub_StrLen nIndex = 0 );
259 : : xub_StrLen SearchAndReplace( const UniString& rStr, const UniString& rRepStr,
260 : : xub_StrLen nIndex = 0 );
261 : : xub_StrLen SearchAndReplaceAscii( const sal_Char* pAsciiStr, const UniString& rRepStr,
262 : : xub_StrLen nIndex = 0 );
263 : : void SearchAndReplaceAll( sal_Unicode c, sal_Unicode cRep );
264 : : void SearchAndReplaceAll( const UniString& rStr, const UniString& rRepStr );
265 : : void SearchAndReplaceAllAscii( const sal_Char* pAsciiStr, const UniString& rRepStr );
266 : :
267 : : void SetToken( xub_StrLen nToken, sal_Unicode cTok, const UniString& rStr,
268 : : xub_StrLen nIndex = 0 );
269 : : UniString GetToken( xub_StrLen nToken, sal_Unicode cTok, xub_StrLen& rIndex ) const;
270 : : UniString GetToken( xub_StrLen nToken, sal_Unicode cTok = ';' ) const;
271 : :
272 : 10207400 : const sal_Unicode* GetBuffer() const { return mpData->maStr; }
273 : : sal_Unicode* GetBufferAccess();
274 : : void ReleaseBufferAccess( xub_StrLen nLen = STRING_LEN );
275 : : sal_Unicode* AllocBuffer( xub_StrLen nLen );
276 : :
277 : 19648815 : friend sal_Bool operator == ( const UniString& rStr1, const UniString& rStr2 )
278 : 19648815 : { return rStr1.Equals( rStr2 ); }
279 : 4423057 : friend sal_Bool operator != ( const UniString& rStr1, const UniString& rStr2 )
280 : 4423057 : { return !(operator == ( rStr1, rStr2 )); }
281 : 41908 : friend sal_Bool operator < ( const UniString& rStr1, const UniString& rStr2 )
282 : 41908 : { return (rStr1.CompareTo( rStr2 ) == COMPARE_LESS); }
283 : 0 : friend sal_Bool operator > ( const UniString& rStr1, const UniString& rStr2 )
284 : 0 : { return (rStr1.CompareTo( rStr2 ) == COMPARE_GREATER); }
285 : : friend sal_Bool operator <= ( const UniString& rStr1, const UniString& rStr2 )
286 : : { return !(operator > ( rStr1, rStr2 )); }
287 : : friend sal_Bool operator >= ( const UniString& rStr1, const UniString& rStr2 )
288 : : { return !(operator < ( rStr1, rStr2 )); }
289 : : };
290 : :
291 : 782674 : inline UniString UniString::Copy( xub_StrLen nIndex, xub_StrLen nCount ) const
292 : : {
293 : 782674 : return UniString( *this, nIndex, nCount );
294 : : }
295 : :
296 : 55755 : inline UniString UniString::GetToken( xub_StrLen nToken, sal_Unicode cTok ) const
297 : : {
298 : 55755 : xub_StrLen nTempPos = 0;
299 [ + - ]: 55755 : return GetToken( nToken, cTok, nTempPos );
300 : : }
301 : :
302 : : template< typename charT, typename traits > std::basic_ostream<charT, traits> &
303 : : operator <<(
304 : : std::basic_ostream<charT, traits> & stream, UniString const & string)
305 : : {
306 : : return stream <<
307 : : rtl::OUStringToOString(string, RTL_TEXTENCODING_UTF8).getStr();
308 : : // best effort; potentially loses data due to conversion failures
309 : : // (stray surrogate halves) and embedded null characters
310 : : }
311 : :
312 : : #endif
313 : :
314 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|