1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
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"
33 /*******************************************************************************
35 * THIS CODE IS DEPRECATED. DO NOT USE IT IN ANY NEW CODE.
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.
42 * There will not be any fixes to the code here.
43 ******************************************************************************/
49 #define BYTESTRING_TO_UNISTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\
50 RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\
51 RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT)
55 #ifndef ENUM_CHARSET_DECLARED
56 #define ENUM_CHARSET_DECLARED
58 typedef rtl_TextEncoding CharSet
;
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)
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)
76 enum StringCompare
{ COMPARE_LESS
= -1, COMPARE_EQUAL
= 0, COMPARE_GREATER
= 1 };
78 //Internal String data
80 // Data used for the management of this String
81 // use only for debugging purposes (never assign to String directly!)
87 typedef struct _UniStringData
89 sal_Int32 mnRefCount
; // reference counter
90 sal_Int32 mnLen
; // Length of the String
91 sal_Unicode maStr
[1]; // CharArray (String)
100 class TOOLS_DLLPUBLIC SAL_WARN_UNUSED UniString
103 UniStringData
* mpData
;
105 TOOLS_DLLPRIVATE
inline void ImplCopyData();
106 TOOLS_DLLPRIVATE
inline sal_Unicode
* ImplCopyStringData(sal_Unicode
*);
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)
120 //detect and reject use of RTL_CONSTASCII_STRINGPARAM instead of RTL_CONSTASCII_USTRINGPARAM
121 TOOLS_DLLPRIVATE
UniString( const sal_Char
*, sal_Int32
);
123 //detect and reject wrong way to attempt to create a UniString from a substring of
125 TOOLS_DLLPRIVATE
UniString(const OString
& rByteStr
, xub_StrLen nPos
, xub_StrLen nLen
,
126 sal_uInt32 nCvtFlags
= BYTESTRING_TO_UNISTRING_CVTFLAGS
);
128 //no longer implemented
129 TOOLS_DLLPRIVATE
UniString( const 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 TOOLS_DLLPRIVATE
UniString( sal_Unicode c
);
135 TOOLS_DLLPRIVATE UniString
& Assign( const sal_Unicode
* pCharStr
, xub_StrLen nLen
);
136 TOOLS_DLLPRIVATE UniString
& Expand( xub_StrLen nCount
, sal_Unicode cExpandChar
);
139 UniString( const ResId
& rResId
);
140 UniString( const UniString
& rStr
);
141 UniString( const UniString
& rStr
, xub_StrLen nPos
, xub_StrLen nLen
);
142 UniString( const OUString
& rStr
);
143 UniString(char c
); // ...but allow "UniString('a')"
144 UniString( const sal_Char
* pByteStr
,
145 rtl_TextEncoding eTextEncoding
,
146 sal_uInt32 nCvtFlags
= BYTESTRING_TO_UNISTRING_CVTFLAGS
);
147 UniString( const sal_Char
* pByteStr
, xub_StrLen nLen
,
148 rtl_TextEncoding eTextEncoding
,
149 sal_uInt32 nCvtFlags
= BYTESTRING_TO_UNISTRING_CVTFLAGS
);
152 operator OUString () const
154 return OUString( rtl_uStringBuffer_refReturn(
155 reinterpret_cast<rtl_uString
*>(mpData
)), SAL_NO_ACQUIRE
);
158 #ifdef RTL_FAST_STRING
159 template< typename T1
, typename T2
>
160 UniString( const rtl::OUStringConcat
< T1
, T2
>& concat
)
161 : mpData(NULL
) { Assign( OUString( concat
)); }
162 template< typename T1
, typename T2
>
163 UniString
& operator =( const rtl::OUStringConcat
< T1
, T2
>& concat
)
164 { return Assign( OUString( concat
)); }
165 template< typename T1
, typename T2
>
166 UniString
& operator +=( const rtl::OUStringConcat
< T1
, T2
>& concat
)
167 { return Append( UniString( concat
) ); }
170 static const UniString
& EmptyString();
171 sal_Int32
ToInt32() const;
172 sal_Int64
ToInt64() const;
174 UniString
& Assign( const UniString
& rStr
);
175 UniString
& Assign( const OUString
& rStr
);
176 UniString
& Assign( const sal_Unicode
* pCharStr
);
177 UniString
& Assign( sal_Unicode c
);
178 inline UniString
& Assign(char c
) // ...but allow "Assign('a')"
179 { return Assign(static_cast< sal_Unicode
>(c
)); }
180 UniString
& AssignAscii( const sal_Char
* pAsciiStr
);
181 UniString
& AssignAscii( const sal_Char
* pAsciiStr
, xub_StrLen nLen
);
182 UniString
& operator =( const UniString
& rStr
)
183 { return Assign( rStr
); }
184 UniString
& operator =( const OUString
& rStr
)
185 { return Assign( rStr
); }
186 UniString
& operator =( const sal_Unicode
* pCharStr
)
187 { return Assign( pCharStr
); }
188 UniString
& operator =( sal_Unicode c
)
189 { return Assign( c
); }
190 inline UniString
& operator =(char c
) // ...but allow "= 'a'"
191 { return operator =(static_cast< sal_Unicode
>(c
)); }
193 UniString
& Append( const UniString
& rStr
);
194 UniString
& Append( const sal_Unicode
* pCharStr
);
195 UniString
& Append( const sal_Unicode
* pCharStr
, xub_StrLen nLen
);
196 UniString
& Append( sal_Unicode c
);
197 inline UniString
& Append(char c
) // ...but allow "Append('a')"
198 { return Append(static_cast< sal_Unicode
>(c
)); }
199 UniString
& AppendAscii( const sal_Char
* pAsciiStr
);
200 UniString
& AppendAscii( const sal_Char
* pAsciiStr
, xub_StrLen nLen
);
201 UniString
& operator +=( const UniString
& rStr
)
202 { return Append( rStr
); }
203 UniString
& operator +=( const OUString
& rStr
)
204 { return Append( UniString(rStr
) ); }
205 UniString
& operator +=( const sal_Unicode
* pCharStr
)
206 { return Append( pCharStr
); }
207 UniString
& operator +=( sal_Unicode c
)
208 { return Append( c
); }
209 inline UniString
& operator +=(char c
) // ...but allow "+= 'a'"
210 { return operator +=(static_cast< sal_Unicode
>(c
)); }
212 void SetChar( xub_StrLen nIndex
, sal_Unicode c
);
213 sal_Unicode
GetChar( xub_StrLen nIndex
) const
214 { return mpData
->maStr
[nIndex
]; }
216 xub_StrLen
Len() const { return (xub_StrLen
)mpData
->mnLen
; }
218 UniString
& Insert( const UniString
& rStr
, xub_StrLen nIndex
= STRING_LEN
);
219 UniString
& Insert( const UniString
& rStr
, xub_StrLen nPos
, xub_StrLen nLen
,
220 xub_StrLen nIndex
= STRING_LEN
);
221 UniString
& Insert( sal_Unicode c
, xub_StrLen nIndex
= STRING_LEN
);
222 UniString
& InsertAscii( const sal_Char
* pAsciiStr
, xub_StrLen nIndex
= STRING_LEN
);
223 UniString
& Replace( xub_StrLen nIndex
, xub_StrLen nLen
, const UniString
& rStr
);
224 UniString
& ReplaceAscii( xub_StrLen nIndex
, xub_StrLen nLen
,
225 const sal_Char
* pAsciiStr
, xub_StrLen nStrLen
= STRING_LEN
);
226 UniString
& Erase( xub_StrLen nIndex
= 0, xub_StrLen nCount
= STRING_LEN
);
227 UniString
Copy( xub_StrLen nIndex
= 0, xub_StrLen nCount
= STRING_LEN
) const;
229 UniString
& ToLowerAscii();
230 UniString
& ToUpperAscii();
232 StringCompare
CompareTo( const UniString
& rStr
,
233 xub_StrLen nLen
= STRING_LEN
) const;
234 StringCompare
CompareToAscii( const sal_Char
* pAsciiStr
,
235 xub_StrLen nLen
= STRING_LEN
) const;
236 StringCompare
CompareIgnoreCaseToAscii( const UniString
& rStr
,
237 xub_StrLen nLen
= STRING_LEN
) const;
238 StringCompare
CompareIgnoreCaseToAscii( const sal_Char
* pAsciiStr
,
239 xub_StrLen nLen
= STRING_LEN
) const;
240 sal_Bool
Equals( const UniString
& rStr
) const;
241 sal_Bool
EqualsAscii( const sal_Char
* pAsciiStr
) const;
242 sal_Bool
EqualsIgnoreCaseAscii( const UniString
& rStr
) const;
243 sal_Bool
EqualsIgnoreCaseAscii( const sal_Unicode
* pCharStr
) const;
244 sal_Bool
EqualsIgnoreCaseAscii( const sal_Char
* pAsciiStr
) const;
245 sal_Bool
Equals( const UniString
& rStr
,
246 xub_StrLen nIndex
, xub_StrLen nLen
) const;
247 sal_Bool
Equals( const sal_Unicode
* pCharStr
,
248 xub_StrLen nIndex
, xub_StrLen nLen
) const;
249 sal_Bool
EqualsAscii( const sal_Char
* pAsciiStr
,
250 xub_StrLen nIndex
, xub_StrLen nLen
) const;
251 sal_Bool
EqualsIgnoreCaseAscii( const UniString
& rStr
,
252 xub_StrLen nIndex
, xub_StrLen nLen
) const;
253 sal_Bool
EqualsIgnoreCaseAscii( const sal_Char
* pAsciiStr
,
254 xub_StrLen nIndex
, xub_StrLen nLen
) const;
256 xub_StrLen
Match( const UniString
& rStr
) const;
258 xub_StrLen
Search( sal_Unicode c
, xub_StrLen nIndex
= 0 ) const;
259 xub_StrLen
Search( const UniString
& rStr
, xub_StrLen nIndex
= 0 ) const;
260 xub_StrLen
Search( const sal_Unicode
* pCharStr
, xub_StrLen nIndex
= 0 ) const;
261 xub_StrLen
SearchAscii( const sal_Char
* pAsciiStr
, xub_StrLen nIndex
= 0 ) const;
262 xub_StrLen
SearchBackward( sal_Unicode c
, xub_StrLen nIndex
= STRING_LEN
) const;
263 xub_StrLen
SearchChar( const sal_Unicode
* pChars
, xub_StrLen nIndex
= 0 ) const;
265 xub_StrLen
SearchAndReplace( sal_Unicode c
, sal_Unicode cRep
,
266 xub_StrLen nIndex
= 0 );
267 xub_StrLen
SearchAndReplace( const UniString
& rStr
, const UniString
& rRepStr
,
268 xub_StrLen nIndex
= 0 );
269 xub_StrLen
SearchAndReplaceAscii( const sal_Char
* pAsciiStr
, const UniString
& rRepStr
,
270 xub_StrLen nIndex
= 0 );
271 void SearchAndReplaceAll( sal_Unicode c
, sal_Unicode cRep
);
272 void SearchAndReplaceAll( const UniString
& rStr
, const UniString
& rRepStr
);
273 void SearchAndReplaceAllAscii( const sal_Char
* pAsciiStr
, const UniString
& rRepStr
);
275 void SetToken( xub_StrLen nToken
, sal_Unicode cTok
, const UniString
& rStr
,
276 xub_StrLen nIndex
= 0 );
277 UniString
GetToken( xub_StrLen nToken
, sal_Unicode cTok
, sal_Int32
& rIndex
) const;
278 UniString
GetToken( xub_StrLen nToken
, sal_Unicode cTok
= ';' ) const;
280 const sal_Unicode
* GetBuffer() const { return mpData
->maStr
; }
281 sal_Unicode
* GetBufferAccess();
282 void ReleaseBufferAccess( xub_StrLen nLen
= STRING_LEN
);
283 sal_Unicode
* AllocBuffer( xub_StrLen nLen
);
285 friend sal_Bool
operator == ( const UniString
& rStr1
, const UniString
& rStr2
)
286 { return rStr1
.Equals( rStr2
); }
287 friend sal_Bool
operator != ( const UniString
& rStr1
, const UniString
& rStr2
)
288 { return !(operator == ( rStr1
, rStr2
)); }
289 friend sal_Bool
operator < ( const UniString
& rStr1
, const UniString
& rStr2
)
290 { return (rStr1
.CompareTo( rStr2
) == COMPARE_LESS
); }
291 friend sal_Bool
operator > ( const UniString
& rStr1
, const UniString
& rStr2
)
292 { return (rStr1
.CompareTo( rStr2
) == COMPARE_GREATER
); }
293 friend sal_Bool
operator <= ( const UniString
& rStr1
, const UniString
& rStr2
)
294 { return !(operator > ( rStr1
, rStr2
)); }
295 friend sal_Bool
operator >= ( const UniString
& rStr1
, const UniString
& rStr2
)
296 { return !(operator < ( rStr1
, rStr2
)); }
299 inline UniString
UniString::Copy( xub_StrLen nIndex
, xub_StrLen nCount
) const
301 return UniString( *this, nIndex
, nCount
);
304 inline UniString
UniString::GetToken( xub_StrLen nToken
, sal_Unicode cTok
) const
306 sal_Int32 nTempPos
= 0;
307 return GetToken( nToken
, cTok
, nTempPos
);
310 template< typename charT
, typename traits
> std::basic_ostream
<charT
, traits
> &
312 std::basic_ostream
<charT
, traits
> & stream
, UniString
const & string
)
315 OUStringToOString(string
, RTL_TEXTENCODING_UTF8
).getStr();
316 // best effort; potentially loses data due to conversion failures
317 // (stray surrogate halves) and embedded null characters
320 #ifdef RTL_FAST_STRING
324 struct ToStringHelper
< UniString
>
326 static int length( const UniString
& s
) { return s
.Len(); }
327 static sal_Unicode
* addData( sal_Unicode
* buffer
, const UniString
& s
) { return addDataHelper( buffer
, s
.GetBuffer(), s
.Len()); }
328 static const bool allowOStringConcat
= false;
329 static const bool allowOUStringConcat
= true;
335 // some compare operators, so that conversions from String to OUString don't
336 // have to insert conversions all over the place
337 inline bool operator==(UniString
const& rLeft
, OUString
const& rRight
)
339 return OUString(rLeft
) == rRight
;
342 inline bool operator==(OUString
const& rLeft
, UniString
const& rRight
)
344 return rLeft
== OUString(rRight
);
347 inline bool operator!=(UniString
const& rLeft
, OUString
const& rRight
)
349 return OUString(rLeft
) != rRight
;
352 inline bool operator!=(OUString
const& rLeft
, UniString
const& rRight
)
354 return rLeft
!= OUString(rRight
);
357 #ifdef RTL_FAST_STRING
358 // The above operators make comparisons involving fast string concatenation ambiguous, so provide explicit overloads.
359 template< typename T1
, typename T2
>
360 inline bool operator==( const rtl::OUStringConcat
< T1
, T2
>& concat
, const OUString
& str
)
362 return OUString( concat
) == str
;
365 template< typename T1
, typename T2
>
366 inline bool operator!=( const rtl::OUStringConcat
< T1
, T2
>& concat
, const OUString
& str
)
368 return OUString( concat
) == str
;
371 template< typename T1
, typename T2
>
372 inline bool operator==( const OUString
& str
, const rtl::OUStringConcat
< T1
, T2
>& concat
)
374 return str
== OUString( concat
);
377 template< typename T1
, typename T2
>
378 inline bool operator!=( const OUString
& str
, const rtl::OUStringConcat
< T1
, T2
>& concat
)
380 return str
!= OUString( concat
);
383 template< typename T1
, typename T2
>
384 inline bool operator==( const rtl::OUStringConcat
< T1
, T2
>& concat
, const UniString
& str
)
386 return UniString( concat
) == str
;
389 template< typename T1
, typename T2
>
390 inline bool operator!=( const rtl::OUStringConcat
< T1
, T2
>& concat
, const UniString
& str
)
392 return UniString( concat
) == str
;
395 template< typename T1
, typename T2
>
396 inline bool operator==( const UniString
& str
, const rtl::OUStringConcat
< T1
, T2
>& concat
)
398 return str
== UniString( concat
);
401 template< typename T1
, typename T2
>
402 inline bool operator!=( const UniString
& str
, const rtl::OUStringConcat
< T1
, T2
>& concat
)
404 return str
!= UniString( concat
);
411 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */