diff options
Diffstat (limited to 'include/tools/string.hxx')
-rw-r--r-- | include/tools/string.hxx | 411 |
1 files changed, 411 insertions, 0 deletions
diff --git a/include/tools/string.hxx b/include/tools/string.hxx new file mode 100644 index 000000000000..5efcd3e3d933 --- /dev/null +++ b/include/tools/string.hxx @@ -0,0 +1,411 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef _STRING_HXX +#define _STRING_HXX + +#include <tools/solar.h> +#include <osl/thread.h> +#include <rtl/textenc.h> +#include <rtl/textcvt.h> +#include <rtl/ustrbuf.h> +#include <rtl/string.hxx> +#include <rtl/ustring.hxx> +#include "tools/toolsdllapi.h" +#include "tools/lineend.hxx" + +/******************************************************************************* + * + * THIS CODE IS DEPRECATED. DO NOT USE IT IN ANY NEW CODE. + * + * Use the string classes in rtl/ustring.hxx and rtl/ustrbuf.hxx (and + * rtl/string.hxx and rtl/strbuf.hxx for byte-sized strings) instead. If you + * feel functionality missing from those string classes, please request + * improvements on discuss@openoffice.org. + * + * There will not be any fixes to the code here. + ******************************************************************************/ + +class ResId; +class String; +class UniString; + +#define BYTESTRING_TO_UNISTRING_CVTFLAGS (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |\ + RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |\ + RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT) + +// CharSet + +#ifndef ENUM_CHARSET_DECLARED +#define ENUM_CHARSET_DECLARED + +typedef rtl_TextEncoding CharSet; + +#endif + +// String-Types + +#ifdef STRING32 +#define STRING_NOTFOUND ((xub_StrLen)0x7FFFFFFF) +#define STRING_MATCH ((xub_StrLen)0x7FFFFFFF) +#define STRING_LEN ((xub_StrLen)0x7FFFFFFF) +#define STRING_MAXLEN ((xub_StrLen)0x7FFFFFFF) +#else +#define STRING_NOTFOUND ((xub_StrLen)0xFFFF) +#define STRING_MATCH ((xub_StrLen)0xFFFF) +#define STRING_LEN ((xub_StrLen)0xFFFF) +#define STRING_MAXLEN ((xub_StrLen)0xFFFF) +#endif + +enum StringCompare { COMPARE_LESS = -1, COMPARE_EQUAL = 0, COMPARE_GREATER = 1 }; + +//Internal String data + +// Data used for the management of this String +// use only for debugging purposes (never assign to String directly!) + +#ifdef SAL_W32 +#pragma pack(push, 4) +#endif + +typedef struct _UniStringData +{ + sal_Int32 mnRefCount; // reference counter + sal_Int32 mnLen; // Length of the String + sal_Unicode maStr[1]; // CharArray (String) +} UniStringData; + +#ifdef SAL_W32 +#pragma pack(pop) +#endif + +// UniString + +class TOOLS_DLLPUBLIC SAL_WARN_UNUSED UniString +{ +private: + UniStringData* mpData; + + TOOLS_DLLPRIVATE inline void ImplCopyData(); + TOOLS_DLLPRIVATE inline sal_Unicode * ImplCopyStringData(sal_Unicode *); + + UniString( const int* pDummy ); // not implemented: to prevent UniString( NULL ) + UniString(int); // not implemented; to detect misuses of + // UniString(sal_Unicode) + void Assign(int); // not implemented; to detect misuses of + // Assign(sal_Unicode) + void operator =(int); // not implemented; to detect misuses + // of operator =(sal_Unicode) + void Append(int); // not implemented; to detect misuses of + // Append(sal_Unicode) + void operator +=(int); // not implemented; to detect misuses + // of operator +=(sal_Unicode) + + //detect and reject use of RTL_CONSTASCII_STRINGPARAM instead of RTL_CONSTASCII_USTRINGPARAM + TOOLS_DLLPRIVATE UniString( const sal_Char*, sal_Int32 ); + + //detect and reject wrong way to attempt to create a UniString from a substring of + //a OString + TOOLS_DLLPRIVATE UniString(const OString& rByteStr, xub_StrLen nPos, xub_StrLen nLen, + sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS); + + //no longer implemented + TOOLS_DLLPRIVATE UniString( const OString& rByteStr, + rtl_TextEncoding eTextEncoding, + sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS ); + TOOLS_DLLPRIVATE UniString( const sal_Unicode* pCharStr ); + TOOLS_DLLPRIVATE UniString( const sal_Unicode* pCharStr, xub_StrLen nLen ); + TOOLS_DLLPRIVATE UniString( sal_Unicode c ); + TOOLS_DLLPRIVATE UniString& Assign( const sal_Unicode* pCharStr, xub_StrLen nLen ); + TOOLS_DLLPRIVATE UniString& Expand( xub_StrLen nCount, sal_Unicode cExpandChar ); +public: + UniString(); + UniString( const ResId& rResId ); + UniString( const UniString& rStr ); + UniString( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen ); + UniString( const OUString& rStr ); + UniString(char c); // ...but allow "UniString('a')" + UniString( const sal_Char* pByteStr, + rtl_TextEncoding eTextEncoding, + sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS ); + UniString( const sal_Char* pByteStr, xub_StrLen nLen, + rtl_TextEncoding eTextEncoding, + sal_uInt32 nCvtFlags = BYTESTRING_TO_UNISTRING_CVTFLAGS ); + ~UniString(); + + operator OUString () const + { + return OUString( rtl_uStringBuffer_refReturn( + reinterpret_cast<rtl_uString*>(mpData)), SAL_NO_ACQUIRE ); + } + +#ifdef RTL_FAST_STRING + template< typename T1, typename T2 > + UniString( const rtl::OUStringConcat< T1, T2 >& concat ) + : mpData(NULL) { Assign( OUString( concat )); } + template< typename T1, typename T2 > + UniString& operator =( const rtl::OUStringConcat< T1, T2 >& concat ) + { return Assign( OUString( concat )); } + template< typename T1, typename T2 > + UniString& operator +=( const rtl::OUStringConcat< T1, T2 >& concat ) + { return Append( UniString( concat ) ); } +#endif + + static const UniString& EmptyString(); + sal_Int32 ToInt32() const; + sal_Int64 ToInt64() const; + + UniString& Assign( const UniString& rStr ); + UniString& Assign( const OUString& rStr ); + UniString& Assign( const sal_Unicode* pCharStr ); + UniString& Assign( sal_Unicode c ); + inline UniString & Assign(char c) // ...but allow "Assign('a')" + { return Assign(static_cast< sal_Unicode >(c)); } + UniString& AssignAscii( const sal_Char* pAsciiStr ); + UniString& AssignAscii( const sal_Char* pAsciiStr, xub_StrLen nLen ); + UniString& operator =( const UniString& rStr ) + { return Assign( rStr ); } + UniString& operator =( const OUString& rStr ) + { return Assign( rStr ); } + UniString& operator =( const sal_Unicode* pCharStr ) + { return Assign( pCharStr ); } + UniString& operator =( sal_Unicode c ) + { return Assign( c ); } + inline UniString & operator =(char c) // ...but allow "= 'a'" + { return operator =(static_cast< sal_Unicode >(c)); } + + UniString& Append( const UniString& rStr ); + UniString& Append( const sal_Unicode* pCharStr ); + UniString& Append( const sal_Unicode* pCharStr, xub_StrLen nLen ); + UniString& Append( sal_Unicode c ); + inline UniString & Append(char c) // ...but allow "Append('a')" + { return Append(static_cast< sal_Unicode >(c)); } + UniString& AppendAscii( const sal_Char* pAsciiStr ); + UniString& AppendAscii( const sal_Char* pAsciiStr, xub_StrLen nLen ); + UniString& operator +=( const UniString& rStr ) + { return Append( rStr ); } + UniString& operator +=( const OUString& rStr ) + { return Append( UniString(rStr) ); } + UniString& operator +=( const sal_Unicode* pCharStr ) + { return Append( pCharStr ); } + UniString& operator +=( sal_Unicode c ) + { return Append( c ); } + inline UniString & operator +=(char c) // ...but allow "+= 'a'" + { return operator +=(static_cast< sal_Unicode >(c)); } + + void SetChar( xub_StrLen nIndex, sal_Unicode c ); + sal_Unicode GetChar( xub_StrLen nIndex ) const + { return mpData->maStr[nIndex]; } + + xub_StrLen Len() const { return (xub_StrLen)mpData->mnLen; } + + UniString& Insert( const UniString& rStr, xub_StrLen nIndex = STRING_LEN ); + UniString& Insert( const UniString& rStr, xub_StrLen nPos, xub_StrLen nLen, + xub_StrLen nIndex = STRING_LEN ); + UniString& Insert( sal_Unicode c, xub_StrLen nIndex = STRING_LEN ); + UniString& InsertAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = STRING_LEN ); + UniString& Replace( xub_StrLen nIndex, xub_StrLen nLen, const UniString& rStr ); + UniString& ReplaceAscii( xub_StrLen nIndex, xub_StrLen nLen, + const sal_Char* pAsciiStr, xub_StrLen nStrLen = STRING_LEN ); + UniString& Erase( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ); + UniString Copy( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ) const; + + UniString& ToLowerAscii(); + UniString& ToUpperAscii(); + + StringCompare CompareTo( const UniString& rStr, + xub_StrLen nLen = STRING_LEN ) const; + StringCompare CompareToAscii( const sal_Char* pAsciiStr, + xub_StrLen nLen = STRING_LEN ) const; + StringCompare CompareIgnoreCaseToAscii( const UniString& rStr, + xub_StrLen nLen = STRING_LEN ) const; + StringCompare CompareIgnoreCaseToAscii( const sal_Char* pAsciiStr, + xub_StrLen nLen = STRING_LEN ) const; + sal_Bool Equals( const UniString& rStr ) const; + sal_Bool EqualsAscii( const sal_Char* pAsciiStr ) const; + sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr ) const; + sal_Bool EqualsIgnoreCaseAscii( const sal_Unicode* pCharStr ) const; + sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr ) const; + sal_Bool Equals( const UniString& rStr, + xub_StrLen nIndex, xub_StrLen nLen ) const; + sal_Bool Equals( const sal_Unicode* pCharStr, + xub_StrLen nIndex, xub_StrLen nLen ) const; + sal_Bool EqualsAscii( const sal_Char* pAsciiStr, + xub_StrLen nIndex, xub_StrLen nLen ) const; + sal_Bool EqualsIgnoreCaseAscii( const UniString& rStr, + xub_StrLen nIndex, xub_StrLen nLen ) const; + sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr, + xub_StrLen nIndex, xub_StrLen nLen ) const; + + xub_StrLen Match( const UniString& rStr ) const; + + xub_StrLen Search( sal_Unicode c, xub_StrLen nIndex = 0 ) const; + xub_StrLen Search( const UniString& rStr, xub_StrLen nIndex = 0 ) const; + xub_StrLen Search( const sal_Unicode* pCharStr, xub_StrLen nIndex = 0 ) const; + xub_StrLen SearchAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex = 0 ) const; + xub_StrLen SearchBackward( sal_Unicode c, xub_StrLen nIndex = STRING_LEN ) const; + xub_StrLen SearchChar( const sal_Unicode* pChars, xub_StrLen nIndex = 0 ) const; + + xub_StrLen SearchAndReplace( sal_Unicode c, sal_Unicode cRep, + xub_StrLen nIndex = 0 ); + xub_StrLen SearchAndReplace( const UniString& rStr, const UniString& rRepStr, + xub_StrLen nIndex = 0 ); + xub_StrLen SearchAndReplaceAscii( const sal_Char* pAsciiStr, const UniString& rRepStr, + xub_StrLen nIndex = 0 ); + void SearchAndReplaceAll( sal_Unicode c, sal_Unicode cRep ); + void SearchAndReplaceAll( const UniString& rStr, const UniString& rRepStr ); + void SearchAndReplaceAllAscii( const sal_Char* pAsciiStr, const UniString& rRepStr ); + + void SetToken( xub_StrLen nToken, sal_Unicode cTok, const UniString& rStr, + xub_StrLen nIndex = 0 ); + UniString GetToken( xub_StrLen nToken, sal_Unicode cTok, sal_Int32& rIndex ) const; + UniString GetToken( xub_StrLen nToken, sal_Unicode cTok = ';' ) const; + + const sal_Unicode* GetBuffer() const { return mpData->maStr; } + sal_Unicode* GetBufferAccess(); + void ReleaseBufferAccess( xub_StrLen nLen = STRING_LEN ); + sal_Unicode* AllocBuffer( xub_StrLen nLen ); + + friend sal_Bool operator == ( const UniString& rStr1, const UniString& rStr2 ) + { return rStr1.Equals( rStr2 ); } + friend sal_Bool operator != ( const UniString& rStr1, const UniString& rStr2 ) + { return !(operator == ( rStr1, rStr2 )); } + friend sal_Bool operator < ( const UniString& rStr1, const UniString& rStr2 ) + { return (rStr1.CompareTo( rStr2 ) == COMPARE_LESS); } + friend sal_Bool operator > ( const UniString& rStr1, const UniString& rStr2 ) + { return (rStr1.CompareTo( rStr2 ) == COMPARE_GREATER); } + friend sal_Bool operator <= ( const UniString& rStr1, const UniString& rStr2 ) + { return !(operator > ( rStr1, rStr2 )); } + friend sal_Bool operator >= ( const UniString& rStr1, const UniString& rStr2 ) + { return !(operator < ( rStr1, rStr2 )); } +}; + +inline UniString UniString::Copy( xub_StrLen nIndex, xub_StrLen nCount ) const +{ + return UniString( *this, nIndex, nCount ); +} + +inline UniString UniString::GetToken( xub_StrLen nToken, sal_Unicode cTok ) const +{ + sal_Int32 nTempPos = 0; + return GetToken( nToken, cTok, nTempPos ); +} + +template< typename charT, typename traits > std::basic_ostream<charT, traits> & +operator <<( + std::basic_ostream<charT, traits> & stream, UniString const & string) +{ + return stream << + OUStringToOString(string, RTL_TEXTENCODING_UTF8).getStr(); + // best effort; potentially loses data due to conversion failures + // (stray surrogate halves) and embedded null characters +} + +#ifdef RTL_FAST_STRING +namespace rtl +{ +template<> +struct ToStringHelper< UniString > + { + static int length( const UniString& s ) { return s.Len(); } + static sal_Unicode* addData( sal_Unicode* buffer, const UniString& s ) { return addDataHelper( buffer, s.GetBuffer(), s.Len()); } + static const bool allowOStringConcat = false; + static const bool allowOUStringConcat = true; + }; +} + +#endif + +// some compare operators, so that conversions from String to OUString don't +// have to insert conversions all over the place +inline bool operator==(UniString const& rLeft, OUString const& rRight) +{ + return OUString(rLeft) == rRight; +} + +inline bool operator==(OUString const& rLeft, UniString const& rRight) +{ + return rLeft == OUString(rRight); +} + +inline bool operator!=(UniString const& rLeft, OUString const& rRight) +{ + return OUString(rLeft) != rRight; +} + +inline bool operator!=(OUString const& rLeft, UniString const& rRight) +{ + return rLeft != OUString(rRight); +} + +#ifdef RTL_FAST_STRING +// The above operators make comparisons involving fast string concatenation ambiguous, so provide explicit overloads. +template< typename T1, typename T2 > +inline bool operator==( const rtl::OUStringConcat< T1, T2 >& concat, const OUString& str ) +{ + return OUString( concat ) == str; +} + +template< typename T1, typename T2 > +inline bool operator!=( const rtl::OUStringConcat< T1, T2 >& concat, const OUString& str ) +{ + return OUString( concat ) == str; +} + +template< typename T1, typename T2 > +inline bool operator==( const OUString& str, const rtl::OUStringConcat< T1, T2 >& concat ) +{ + return str == OUString( concat ); +} + +template< typename T1, typename T2 > +inline bool operator!=( const OUString& str, const rtl::OUStringConcat< T1, T2 >& concat ) +{ + return str != OUString( concat ); +} + +template< typename T1, typename T2 > +inline bool operator==( const rtl::OUStringConcat< T1, T2 >& concat, const UniString& str ) +{ + return UniString( concat ) == str; +} + +template< typename T1, typename T2 > +inline bool operator!=( const rtl::OUStringConcat< T1, T2 >& concat, const UniString& str ) +{ + return UniString( concat ) == str; +} + +template< typename T1, typename T2 > +inline bool operator==( const UniString& str, const rtl::OUStringConcat< T1, T2 >& concat ) +{ + return str == UniString( concat ); +} + +template< typename T1, typename T2 > +inline bool operator!=( const UniString& str, const rtl::OUStringConcat< T1, T2 >& concat ) +{ + return str != UniString( concat ); +} + +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |