From 48649cdfb8671fb49a28b33c1ba1cd71c0999a07 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Wed, 15 Feb 2012 10:05:30 +0000 Subject: lock in those ByteString gains so there's no back-sliding --- tools/inc/tools/string.hxx | 55 +---- tools/source/string/strimp.cxx | 513 --------------------------------------- tools/source/string/tstring.cxx | 50 ---- tools/source/string/tustring.cxx | 513 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 526 insertions(+), 605 deletions(-) (limited to 'tools') diff --git a/tools/inc/tools/string.hxx b/tools/inc/tools/string.hxx index b91170a5249b..c232c07ff43e 100644 --- a/tools/inc/tools/string.hxx +++ b/tools/inc/tools/string.hxx @@ -148,26 +148,36 @@ private: sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS ); //not implemented, to detect use of removed methods without compiler making something to fit ByteString( const sal_Unicode* pUniStr, xub_StrLen nLen, rtl_TextEncoding eTextEncoding, - sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS ); //not implemented, to detect use of removed methods without compiler making somethiing to fit + sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS ); //not implemented, to detect use of removed methods without compiler making something to fit ByteString( const UniString& rUniStr, rtl_TextEncoding eTextEncoding, - sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS ); //not implemented, to detect use of removed methods without compiler making somethiing to fit + sal_uInt32 nCvtFlags = UNISTRING_TO_BYTESTRING_CVTFLAGS ); //not implemented, to detect use of removed methods without compiler making something to fit + ByteString( const sal_Char* pCharStr, xub_StrLen nLen ); //not implemented, to detect use of removed methods without compiler making something to fit void Assign(int); // not implemented; to detect misuses of // Assign(sal_Char) + ByteString& Assign( const sal_Char* pCharStr, xub_StrLen nLen ); //not implemented, to detect use of removed methods without compiler making something to fit + ByteString& operator =(const sal_Char); //not implemented, to detect use of removed methods without compiler making something to fit + + ByteString& Assign(sal_Char); //not implemented, to detect use of removed methods without compiler making something to fit void operator =(int); // not implemented; to detect misuses // of operator =(sal_Char) void Append(int); // not implemented; to detect misuses of // Append(char) + ByteString& Append( const sal_Char* pCharStr, xub_StrLen nLen ); // not implemented, to detect use of removed methods without compiler making something to fit + ByteString& operator +=(sal_Char); //not implemented, to detect use of removed methods without compiler making something to fit + ByteString& Append( char c ); //not implemented, to detect use of removed methods without compiler making something to fit void operator +=(int); // not implemented; to detect misuses // of operator +=(sal_Char) + friend sal_Bool operator == ( const ByteString& rStr1, const ByteString& rStr2 ); //not implemented, to detect use of removed methods without compiler making something to fit + friend sal_Bool operator < ( const ByteString& rStr1, const ByteString& rStr2 ); //not implemented, to detect use of removed methods without compiler making something to fit + friend sal_Bool operator > ( const ByteString& rStr1, const ByteString& rStr2 ); //not implemented, to detect use of removed methods without compiler making something to fit public: ByteString(); ByteString( const ByteString& rStr ); ByteString( const ByteString& rStr, xub_StrLen nPos, xub_StrLen nLen ); ByteString( const rtl::OString& rStr ); ByteString( const sal_Char* pCharStr ); - ByteString( const sal_Char* pCharStr, xub_StrLen nLen ); ~ByteString(); operator rtl::OString () const @@ -178,27 +188,19 @@ public: ByteString& Assign( const ByteString& rStr ); ByteString& Assign( const rtl::OString& rStr ); ByteString& Assign( const sal_Char* pCharStr ); - ByteString& Assign( const sal_Char* pCharStr, xub_StrLen nLen ); - ByteString& Assign( sal_Char c ); ByteString& operator =( const ByteString& rStr ) { return Assign( rStr ); } ByteString& operator =( const rtl::OString& rStr ) { return Assign( rStr ); } ByteString& operator =( const sal_Char* pCharStr ) { return Assign( pCharStr ); } - ByteString& operator =( const sal_Char c ) - { return Assign( c ); } ByteString& Append( const ByteString& rStr ); ByteString& Append( const sal_Char* pCharStr ); - ByteString& Append( const sal_Char* pCharStr, xub_StrLen nLen ); - ByteString& Append( char c ); ByteString& operator +=( const ByteString& rStr ) { return Append( rStr ); } ByteString& operator +=( const sal_Char* pCharStr ) { return Append( pCharStr ); } - ByteString& operator +=( sal_Char c ) - { return Append( c ); } void SetChar( xub_StrLen nIndex, sal_Char c ); sal_Char GetChar( xub_StrLen nIndex ) const @@ -207,54 +209,33 @@ public: xub_StrLen Len() const { return (xub_StrLen)mpData->mnLen; } ByteString& Insert( const ByteString& rStr, xub_StrLen nIndex = STRING_LEN ); - ByteString& Insert( const sal_Char* pCharStr, xub_StrLen nIndex = STRING_LEN ); - ByteString& Insert( sal_Char c, xub_StrLen nIndex = STRING_LEN ); ByteString& Replace( xub_StrLen nIndex, xub_StrLen nCount, const ByteString& rStr ); ByteString& Erase( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ); ByteString Copy( xub_StrLen nIndex = 0, xub_StrLen nCount = STRING_LEN ) const; ByteString& ToLowerAscii(); - ByteString& ToUpperAscii(); - StringCompare CompareTo( const ByteString& rStr, - xub_StrLen nLen = STRING_LEN ) const; StringCompare CompareTo( const sal_Char* pCharStr, xub_StrLen nLen = STRING_LEN ) const; StringCompare CompareIgnoreCaseToAscii( const sal_Char* pCharStr, xub_StrLen nLen = STRING_LEN ) const; - sal_Bool Equals( const ByteString& rStr ) const; sal_Bool Equals( const sal_Char* pCharStr ) const; - sal_Bool EqualsIgnoreCaseAscii( const ByteString& rStr ) const; sal_Bool EqualsIgnoreCaseAscii( const sal_Char* pCharStr ) const; - sal_Bool Equals( const ByteString& rStr, - xub_StrLen nIndex, xub_StrLen nLen ) const; - sal_Bool Equals( const sal_Char* pCharStr, - xub_StrLen nIndex, xub_StrLen nLen ) const; - - xub_StrLen Match( const ByteString& rStr ) const; xub_StrLen Search( sal_Char c, xub_StrLen nIndex = 0 ) const; xub_StrLen Search( const ByteString& rStr, xub_StrLen nIndex = 0 ) const; xub_StrLen Search( const sal_Char* pCharStr, xub_StrLen nIndex = 0 ) const; - xub_StrLen SearchBackward( sal_Char c, xub_StrLen nIndex = STRING_LEN ) const; xub_StrLen SearchAndReplace( const ByteString& rStr, const ByteString& rRepStr, xub_StrLen nIndex = 0 ); xub_StrLen SearchAndReplace( const sal_Char* pCharStr, const ByteString& rRepStr, xub_StrLen nIndex = 0 ); void SearchAndReplaceAll( sal_Char c, sal_Char cRep ); - void SearchAndReplaceAll( const ByteString& rStr, const ByteString& rRepStr ); - void SearchAndReplaceAll( const sal_Char* pCharStr, const ByteString& rRepStr ); - void SetToken( xub_StrLen nToken, sal_Char cTok, const ByteString& rStr, - xub_StrLen nIndex = 0 ); - ByteString GetToken( xub_StrLen nToken, sal_Char cTok, xub_StrLen& rIndex ) const; ByteString GetToken( xub_StrLen nToken, sal_Char cTok = ';' ) const; const sal_Char* GetBuffer() const { return mpData->maStr; } - friend sal_Bool operator == ( const ByteString& rStr1, const ByteString& rStr2 ) - { return rStr1.Equals( rStr2 ); } friend sal_Bool operator == ( const ByteString& rStr, const sal_Char* pCharStr ) { return rStr.Equals( pCharStr ); } friend sal_Bool operator == ( const sal_Char* pCharStr, const ByteString& rStr ) @@ -265,14 +246,10 @@ public: { return !(operator == ( rStr, pCharStr )); } friend sal_Bool operator != ( const sal_Char* pCharStr, const ByteString& rStr ) { return !(operator == ( pCharStr, rStr )); } - friend sal_Bool operator < ( const ByteString& rStr1, const ByteString& rStr2 ) - { return (rStr1.CompareTo( rStr2 ) == COMPARE_LESS); } friend sal_Bool operator < ( const ByteString& rStr, const sal_Char* pCharStr ) { return (rStr.CompareTo( pCharStr ) == COMPARE_LESS); } friend sal_Bool operator < ( const sal_Char* pCharStr, const ByteString& rStr ) { return (rStr.CompareTo( pCharStr ) >= COMPARE_EQUAL); } - friend sal_Bool operator > ( const ByteString& rStr1, const ByteString& rStr2 ) - { return (rStr1.CompareTo( rStr2 ) == COMPARE_GREATER); } friend sal_Bool operator > ( const ByteString& rStr, const sal_Char* pCharStr ) { return (rStr.CompareTo( pCharStr ) == COMPARE_GREATER); } friend sal_Bool operator > ( const sal_Char* pCharStr, const ByteString& rStr ) @@ -296,12 +273,6 @@ inline ByteString ByteString::Copy( xub_StrLen nIndex, xub_StrLen nCount ) const return ByteString( *this, nIndex, nCount ); } -inline ByteString ByteString::GetToken( xub_StrLen nToken, sal_Char cTok ) const -{ - xub_StrLen nTempPos = 0; - return GetToken( nToken, cTok, nTempPos ); -} - // ----------------------------------------------------------------------- // ------------------------ diff --git a/tools/source/string/strimp.cxx b/tools/source/string/strimp.cxx index 97344b3eb194..1eef75d8b86d 100644 --- a/tools/source/string/strimp.cxx +++ b/tools/source/string/strimp.cxx @@ -88,37 +88,6 @@ static sal_Int32 ImplStringICompare( const STRCODE* pStr1, const STRCODE* pStr2 return nRet; } -// ----------------------------------------------------------------------- - -static sal_Int32 ImplStringICompareWithoutZero( const STRCODE* pStr1, const STRCODE* pStr2, - sal_Int32 nCount ) -{ - sal_Int32 nRet = 0; - STRCODE c1; - STRCODE c2; - do - { - if ( !nCount ) - break; - - // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln - c1 = *pStr1; - c2 = *pStr2; - if ( (c1 >= 65) && (c1 <= 90) ) - c1 += 32; - if ( (c2 >= 65) && (c2 <= 90) ) - c2 += 32; - nRet = ((sal_Int32)((STRCODEU)c1))-((sal_Int32)((STRCODEU)c2)); - - ++pStr1, - ++pStr2, - --nCount; - } - while ( nRet == 0 ); - - return nRet; -} - // ======================================================================= #ifdef DBG_UTIL @@ -288,43 +257,6 @@ STRING::STRING( const STRCODE* pCharStr ) // ----------------------------------------------------------------------- -STRING::STRING( const STRCODE* pCharStr, xub_StrLen nLen ) -: mpData(NULL) -{ - DBG_CTOR( STRING, DBGCHECKSTRING ); - DBG_ASSERT( pCharStr, "String::String() - pCharStr is NULL" ); - - if ( nLen == STRING_LEN ) - nLen = ImplStringLen( pCharStr ); - -#ifdef DBG_UTIL - if ( DbgIsAssert() ) - { - for ( xub_StrLen i = 0; i < nLen; i++ ) - { - if ( !pCharStr[i] ) - { - OSL_FAIL( "String::String() : nLen is wrong" ); - } - } - } -#endif - - // Ist es kein leerer String - if ( nLen ) - { - // Verwaltungsdaten anlegen und String kopieren - mpData = ImplAllocData( nLen ); - memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); - } - else - { - STRING_NEW((STRING_TYPE **)&mpData); - } -} - -// ----------------------------------------------------------------------- - STRING::~STRING() { DBG_DTOR( STRING, DBGCHECKSTRING ); @@ -381,66 +313,6 @@ STRING& STRING::Assign( const STRCODE* pCharStr ) // ----------------------------------------------------------------------- -STRING& STRING::Assign( const STRCODE* pCharStr, xub_StrLen nLen ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_ASSERT( pCharStr, "String::Assign() - pCharStr is NULL" ); - - if ( nLen == STRING_LEN ) - nLen = ImplStringLen( pCharStr ); - -#ifdef DBG_UTIL - if ( DbgIsAssert() ) - { - for ( xub_StrLen i = 0; i < nLen; i++ ) - { - if ( !pCharStr[i] ) - { - OSL_FAIL( "String::Assign() : nLen is wrong" ); - } - } - } -#endif - - if ( !nLen ) - { - STRING_NEW((STRING_TYPE **)&mpData); - } - else - { - // Wenn String genauso lang ist, wie der String, dann direkt kopieren - if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) ) - memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); - else - { - // Alte Daten loeschen - STRING_RELEASE((STRING_TYPE *)mpData); - - // Daten initialisieren und String kopieren - mpData = ImplAllocData( nLen ); - memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); - } - } - - return *this; -} - -// ----------------------------------------------------------------------- - -STRING& STRING::Assign( STRCODE c ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_ASSERT( c, "String::Assign() - c is 0" ); - - // Verwaltungsdaten anlegen und initialisieren - STRING_RELEASE((STRING_TYPE *)mpData); - mpData = ImplAllocData( 1 ); - mpData->maStr[0] = c; - return *this; -} - -// ----------------------------------------------------------------------- - STRING& STRING::Append( const STRING& rStr ) { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -512,76 +384,6 @@ STRING& STRING::Append( const STRCODE* pCharStr ) // ----------------------------------------------------------------------- -STRING& STRING::Append( const STRCODE* pCharStr, xub_StrLen nCharLen ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_ASSERT( pCharStr, "String::Append() - pCharStr is NULL" ); - - if ( nCharLen == STRING_LEN ) - nCharLen = ImplStringLen( pCharStr ); - -#ifdef DBG_UTIL - if ( DbgIsAssert() ) - { - for ( xub_StrLen i = 0; i < nCharLen; i++ ) - { - if ( !pCharStr[i] ) - { - OSL_FAIL( "String::Append() : nLen is wrong" ); - } - } - } -#endif - - // Ueberlauf abfangen - sal_Int32 nLen = mpData->mnLen; - sal_Int32 nCopyLen = ImplGetCopyLen( nLen, nCharLen ); - - // Ist es kein leerer String - if ( nCopyLen ) - { - // Neue Datenstruktur und neuen String erzeugen - STRINGDATA* pNewData = ImplAllocData( nLen+nCopyLen ); - - // String kopieren - memcpy( pNewData->maStr, mpData->maStr, nLen*sizeof( STRCODE ) ); - memcpy( pNewData->maStr+nLen, pCharStr, nCopyLen*sizeof( STRCODE ) ); - - // Alte Daten loeschen und Neue zuweisen - STRING_RELEASE((STRING_TYPE *)mpData); - mpData = pNewData; - } - - return *this; -} - -// ----------------------------------------------------------------------- - -STRING& STRING::Append( STRCODE c ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - // kein 0-Character und maximale Stringlaenge nicht ueberschreiten - sal_Int32 nLen = mpData->mnLen; - if ( c && (nLen < STRING_MAXLEN) ) - { - // Neue Datenstruktur und neuen String erzeugen - STRINGDATA* pNewData = ImplAllocData( nLen+1 ); - - // String kopieren - memcpy( pNewData->maStr, mpData->maStr, nLen*sizeof( STRCODE ) ); - pNewData->maStr[nLen] = c; - - // Alte Daten loeschen und Neue zuweisen - STRING_RELEASE((STRING_TYPE *)mpData); - mpData = pNewData; - } - - return *this; -} - -// ----------------------------------------------------------------------- - void STRING::SetChar( xub_StrLen nIndex, STRCODE c ) { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -628,36 +430,6 @@ STRING& STRING::Insert( const STRING& rStr, xub_StrLen nIndex ) // ----------------------------------------------------------------------- -STRING& STRING::Insert( STRCODE c, xub_StrLen nIndex ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - // Ist es kein 0-Character - if ( !c || (mpData->mnLen == STRING_MAXLEN) ) - return *this; - - // Index groesser als Laenge - if ( nIndex > mpData->mnLen ) - nIndex = static_cast< xub_StrLen >(mpData->mnLen); - - // Neue Laenge ermitteln und neuen String anlegen - STRINGDATA* pNewData = ImplAllocData( mpData->mnLen+1 ); - - // String kopieren - memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( STRCODE ) ); - pNewData->maStr[nIndex] = c; - memcpy( pNewData->maStr+nIndex+1, mpData->maStr+nIndex, - (mpData->mnLen-nIndex)*sizeof( STRCODE ) ); - - // Alte Daten loeschen und Neue zuweisen - STRING_RELEASE((STRING_TYPE *)mpData); - mpData = pNewData; - - return *this; -} - -// ----------------------------------------------------------------------- - STRING& STRING::Replace( xub_StrLen nIndex, xub_StrLen nCount, const STRING& rStr ) { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -782,99 +554,6 @@ STRING& STRING::ToLowerAscii() // ----------------------------------------------------------------------- -STRING& STRING::ToUpperAscii() -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - sal_Int32 nIndex = 0; - sal_Int32 nLen = mpData->mnLen; - STRCODE* pStr = mpData->maStr; - while ( nIndex < nLen ) - { - // Ist das Zeichen zwischen 'a' und 'z' dann umwandeln - if ( (*pStr >= 97) && (*pStr <= 122) ) - { - // Daten kopieren, wenn noetig - pStr = ImplCopyStringData( pStr ); - *pStr -= 32; - } - - ++pStr, - ++nIndex; - } - - return *this; -} - -// ----------------------------------------------------------------------- - -StringCompare STRING::CompareTo( const STRING& rStr, xub_StrLen nLen ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - // Auf Gleichheit der Pointer testen - if ( mpData == rStr.mpData ) - return COMPARE_EQUAL; - - // Maximale Laenge ermitteln - if ( mpData->mnLen < nLen ) - nLen = static_cast< xub_StrLen >(mpData->mnLen+1); - if ( rStr.mpData->mnLen < nLen ) - nLen = static_cast< xub_StrLen >(rStr.mpData->mnLen+1); - - // String vergleichen - sal_Int32 nCompare = ImplStringCompareWithoutZero( mpData->maStr, rStr.mpData->maStr, nLen ); - - // Rueckgabewert anpassen - if ( nCompare == 0 ) - return COMPARE_EQUAL; - else if ( nCompare < 0 ) - return COMPARE_LESS; - else - return COMPARE_GREATER; -} - -// ----------------------------------------------------------------------- - -sal_Bool STRING::Equals( const STRING& rStr ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - // Sind die Daten gleich - if ( mpData == rStr.mpData ) - return sal_True; - - // Gleiche Laenge - if ( mpData->mnLen != rStr.mpData->mnLen ) - return sal_False; - - // String vergleichen - return (ImplStringCompareWithoutZero( mpData->maStr, rStr.mpData->maStr, mpData->mnLen ) == 0); -} - -// ----------------------------------------------------------------------- - -sal_Bool STRING::EqualsIgnoreCaseAscii( const STRING& rStr ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - // Sind die Daten gleich - if ( mpData == rStr.mpData ) - return sal_True; - - // Gleiche Laenge - if ( mpData->mnLen != rStr.mpData->mnLen ) - return sal_False; - - // String vergleichen - return (ImplStringICompareWithoutZero( mpData->maStr, rStr.mpData->maStr, mpData->mnLen ) == 0); -} - -// ----------------------------------------------------------------------- - sal_Bool STRING::EqualsIgnoreCaseAscii( const STRCODE* pCharStr ) const { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -884,69 +563,6 @@ sal_Bool STRING::EqualsIgnoreCaseAscii( const STRCODE* pCharStr ) const // ----------------------------------------------------------------------- -sal_Bool STRING::Equals( const STRING& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - // Are there enough codes for comparing? - if ( nIndex > mpData->mnLen ) - return (rStr.mpData->mnLen == 0); - sal_Int32 nMaxLen = mpData->mnLen-nIndex; - if ( nMaxLen < nLen ) - { - if ( rStr.mpData->mnLen != nMaxLen ) - return sal_False; - nLen = static_cast< xub_StrLen >(nMaxLen); - } - - // String vergleichen - return (ImplStringCompareWithoutZero( mpData->maStr+nIndex, rStr.mpData->maStr, nLen ) == 0); -} - -// ----------------------------------------------------------------------- - -sal_Bool STRING::Equals( const STRCODE* pCharStr, xub_StrLen nIndex, xub_StrLen nLen ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - // Are there enough codes for comparing? - if ( nIndex > mpData->mnLen ) - return (*pCharStr == 0); - - return (ImplStringCompare( mpData->maStr+nIndex, pCharStr, nLen ) == 0); -} - -// ----------------------------------------------------------------------- - -xub_StrLen STRING::Match( const STRING& rStr ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - // Ist dieser String leer - if ( !mpData->mnLen ) - return STRING_MATCH; - - // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen - const STRCODE* pStr1 = mpData->maStr; - const STRCODE* pStr2 = rStr.mpData->maStr; - xub_StrLen i = 0; - while ( i < mpData->mnLen ) - { - // Stimmt das Zeichen nicht ueberein, dann abbrechen - if ( *pStr1 != *pStr2 ) - return i; - ++pStr1, - ++pStr2, - ++i; - } - - return STRING_MATCH; -} - -// ----------------------------------------------------------------------- - xub_StrLen STRING::Search( STRCODE c, xub_StrLen nIndex ) const { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -1058,29 +674,6 @@ xub_StrLen STRING::Search( const STRCODE* pCharStr, xub_StrLen nIndex ) const // ----------------------------------------------------------------------- -xub_StrLen STRING::SearchBackward( STRCODE c, xub_StrLen nIndex ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - if ( nIndex > mpData->mnLen ) - nIndex = (xub_StrLen)mpData->mnLen; - - const STRCODE* pStr = mpData->maStr; - pStr += nIndex; - - while ( nIndex ) - { - nIndex--; - pStr--; - if ( *pStr == c ) - return nIndex; - } - - return STRING_NOTFOUND; -} - -// ----------------------------------------------------------------------- - xub_StrLen STRING::SearchAndReplace( const STRING& rStr, const STRING& rRepStr, xub_StrLen nIndex ) { @@ -1116,110 +709,4 @@ void STRING::SearchAndReplaceAll( STRCODE c, STRCODE cRep ) } } -// ----------------------------------------------------------------------- - -void STRING::SearchAndReplaceAll( const STRING& rStr, const STRING& rRepStr ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rRepStr, STRING, DBGCHECKSTRING ); - - xub_StrLen nSPos = Search( rStr, 0 ); - while ( nSPos != STRING_NOTFOUND ) - { - Replace( nSPos, rStr.Len(), rRepStr ); - nSPos = nSPos + rRepStr.Len(); - nSPos = Search( rStr, nSPos ); - } -} - -// ----------------------------------------------------------------------- - -void STRING::SetToken( xub_StrLen nToken, STRCODE cTok, const STRING& rStr, - xub_StrLen nIndex ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); - - const STRCODE* pStr = mpData->maStr; - xub_StrLen nLen = (xub_StrLen)mpData->mnLen; - xub_StrLen nTok = 0; - xub_StrLen nFirstChar = nIndex; - xub_StrLen i = nFirstChar; - - // Bestimme die Token-Position und Laenge - pStr += i; - while ( i < nLen ) - { - // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount - if ( *pStr == cTok ) - { - ++nTok; - - if ( nTok == nToken ) - nFirstChar = i+1; - else - { - if ( nTok > nToken ) - break; - } - } - - ++pStr, - ++i; - } - - if ( nTok >= nToken ) - Replace( nFirstChar, i-nFirstChar, rStr ); -} - -// ----------------------------------------------------------------------- - -STRING STRING::GetToken( xub_StrLen nToken, STRCODE cTok, xub_StrLen& rIndex ) const -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - - const STRCODE* pStr = mpData->maStr; - xub_StrLen nLen = (xub_StrLen)mpData->mnLen; - xub_StrLen nTok = 0; - xub_StrLen nFirstChar = rIndex; - xub_StrLen i = nFirstChar; - - // Bestimme die Token-Position und Laenge - pStr += i; - while ( i < nLen ) - { - // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount - if ( *pStr == cTok ) - { - ++nTok; - - if ( nTok == nToken ) - nFirstChar = i+1; - else - { - if ( nTok > nToken ) - break; - } - } - - ++pStr, - ++i; - } - - if ( nTok >= nToken ) - { - if ( i < nLen ) - rIndex = i+1; - else - rIndex = STRING_NOTFOUND; - return Copy( nFirstChar, i-nFirstChar ); - } - else - { - rIndex = STRING_NOTFOUND; - return STRING(); - } -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tools/source/string/tstring.cxx b/tools/source/string/tstring.cxx index b180ff07237b..e87316be2ca3 100644 --- a/tools/source/string/tstring.cxx +++ b/tools/source/string/tstring.cxx @@ -83,21 +83,6 @@ xub_StrLen ImplStringLen( const sal_Unicode* pStr ) #include #include -void STRING::SearchAndReplaceAll( const STRCODE* pCharStr, const STRING& rRepStr ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_CHKOBJ( &rRepStr, STRING, DBGCHECKSTRING ); - - xub_StrLen nCharLen = ImplStringLen( pCharStr ); - xub_StrLen nSPos = Search( pCharStr, 0 ); - while ( nSPos != STRING_NOTFOUND ) - { - Replace( nSPos, nCharLen, rRepStr ); - nSPos = nSPos + rRepStr.Len(); - nSPos = Search( pCharStr, nSPos ); - } -} - xub_StrLen STRING::SearchAndReplace( const STRCODE* pCharStr, const STRING& rRepStr, xub_StrLen nIndex ) { @@ -197,39 +182,4 @@ sal_Bool STRING::Equals( const STRCODE* pCharStr ) const return (ImplStringCompare( mpData->maStr, pCharStr ) == 0); } -STRING& STRING::Insert( const STRCODE* pCharStr, xub_StrLen nIndex ) -{ - DBG_CHKTHIS( STRING, DBGCHECKSTRING ); - DBG_ASSERT( pCharStr, "String::Insert() - pCharStr is NULL" ); - - // Stringlaenge ermitteln - sal_Int32 nCopyLen = ImplStringLen( pCharStr ); - - // Ueberlauf abfangen - nCopyLen = ImplGetCopyLen( mpData->mnLen, nCopyLen ); - - // Ist der einzufuegende String ein Leerstring - if ( !nCopyLen ) - return *this; - - // Index groesser als Laenge - if ( nIndex > mpData->mnLen ) - nIndex = static_cast< xub_StrLen >(mpData->mnLen); - - // Neue Laenge ermitteln und neuen String anlegen - STRINGDATA* pNewData = ImplAllocData( mpData->mnLen+nCopyLen ); - - // String kopieren - memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( STRCODE ) ); - memcpy( pNewData->maStr+nIndex, pCharStr, nCopyLen*sizeof( STRCODE ) ); - memcpy( pNewData->maStr+nIndex+nCopyLen, mpData->maStr+nIndex, - (mpData->mnLen-nIndex)*sizeof( STRCODE ) ); - - // Alte Daten loeschen und Neue zuweisen - STRING_RELEASE((STRING_TYPE *)mpData); - mpData = pNewData; - - return *this; -} - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/tools/source/string/tustring.cxx b/tools/source/string/tustring.cxx index f4c98ab76657..26a4ccf1bde4 100644 --- a/tools/source/string/tustring.cxx +++ b/tools/source/string/tustring.cxx @@ -390,6 +390,37 @@ STRING STRING::GetQuotedToken( xub_StrLen nToken, const STRING& rQuotedPairs, // ----------------------------------------------------------------------- +static sal_Int32 ImplStringICompareWithoutZero( const STRCODE* pStr1, const STRCODE* pStr2, + sal_Int32 nCount ) +{ + sal_Int32 nRet = 0; + STRCODE c1; + STRCODE c2; + do + { + if ( !nCount ) + break; + + // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln + c1 = *pStr1; + c2 = *pStr2; + if ( (c1 >= 65) && (c1 <= 90) ) + c1 += 32; + if ( (c2 >= 65) && (c2 <= 90) ) + c2 += 32; + nRet = ((sal_Int32)((STRCODEU)c1))-((sal_Int32)((STRCODEU)c2)); + + ++pStr1, + ++pStr2, + --nCount; + } + while ( nRet == 0 ); + + return nRet; +} + +// ----------------------------------------------------------------------- + sal_Bool STRING::EqualsIgnoreCaseAscii( const STRING& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const { DBG_CHKTHIS( STRING, DBGCHECKSTRING ); @@ -606,4 +637,486 @@ STRING& STRING::EraseTrailingChars( STRCODE c ) return *this; } +// ----------------------------------------------------------------------- + +STRING& STRING::Insert( STRCODE c, xub_StrLen nIndex ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + // Ist es kein 0-Character + if ( !c || (mpData->mnLen == STRING_MAXLEN) ) + return *this; + + // Index groesser als Laenge + if ( nIndex > mpData->mnLen ) + nIndex = static_cast< xub_StrLen >(mpData->mnLen); + + // Neue Laenge ermitteln und neuen String anlegen + STRINGDATA* pNewData = ImplAllocData( mpData->mnLen+1 ); + + // String kopieren + memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( STRCODE ) ); + pNewData->maStr[nIndex] = c; + memcpy( pNewData->maStr+nIndex+1, mpData->maStr+nIndex, + (mpData->mnLen-nIndex)*sizeof( STRCODE ) ); + + // Alte Daten loeschen und Neue zuweisen + STRING_RELEASE((STRING_TYPE *)mpData); + mpData = pNewData; + + return *this; +} + +// ----------------------------------------------------------------------- + +STRING& STRING::ToUpperAscii() +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + sal_Int32 nIndex = 0; + sal_Int32 nLen = mpData->mnLen; + STRCODE* pStr = mpData->maStr; + while ( nIndex < nLen ) + { + // Ist das Zeichen zwischen 'a' und 'z' dann umwandeln + if ( (*pStr >= 97) && (*pStr <= 122) ) + { + // Daten kopieren, wenn noetig + pStr = ImplCopyStringData( pStr ); + *pStr -= 32; + } + + ++pStr, + ++nIndex; + } + + return *this; +} + +// ----------------------------------------------------------------------- + +StringCompare STRING::CompareTo( const STRING& rStr, xub_StrLen nLen ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + // Auf Gleichheit der Pointer testen + if ( mpData == rStr.mpData ) + return COMPARE_EQUAL; + + // Maximale Laenge ermitteln + if ( mpData->mnLen < nLen ) + nLen = static_cast< xub_StrLen >(mpData->mnLen+1); + if ( rStr.mpData->mnLen < nLen ) + nLen = static_cast< xub_StrLen >(rStr.mpData->mnLen+1); + + // String vergleichen + sal_Int32 nCompare = ImplStringCompareWithoutZero( mpData->maStr, rStr.mpData->maStr, nLen ); + + // Rueckgabewert anpassen + if ( nCompare == 0 ) + return COMPARE_EQUAL; + else if ( nCompare < 0 ) + return COMPARE_LESS; + else + return COMPARE_GREATER; +} + +// ----------------------------------------------------------------------- + +sal_Bool STRING::Equals( const STRING& rStr ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + // Sind die Daten gleich + if ( mpData == rStr.mpData ) + return sal_True; + + // Gleiche Laenge + if ( mpData->mnLen != rStr.mpData->mnLen ) + return sal_False; + + // String vergleichen + return (ImplStringCompareWithoutZero( mpData->maStr, rStr.mpData->maStr, mpData->mnLen ) == 0); +} + +// ----------------------------------------------------------------------- + +sal_Bool STRING::EqualsIgnoreCaseAscii( const STRING& rStr ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + // Sind die Daten gleich + if ( mpData == rStr.mpData ) + return sal_True; + + // Gleiche Laenge + if ( mpData->mnLen != rStr.mpData->mnLen ) + return sal_False; + + // String vergleichen + return (ImplStringICompareWithoutZero( mpData->maStr, rStr.mpData->maStr, mpData->mnLen ) == 0); +} + +// ----------------------------------------------------------------------- + +sal_Bool STRING::Equals( const STRING& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + // Are there enough codes for comparing? + if ( nIndex > mpData->mnLen ) + return (rStr.mpData->mnLen == 0); + sal_Int32 nMaxLen = mpData->mnLen-nIndex; + if ( nMaxLen < nLen ) + { + if ( rStr.mpData->mnLen != nMaxLen ) + return sal_False; + nLen = static_cast< xub_StrLen >(nMaxLen); + } + + // String vergleichen + return (ImplStringCompareWithoutZero( mpData->maStr+nIndex, rStr.mpData->maStr, nLen ) == 0); +} + +// ----------------------------------------------------------------------- + +sal_Bool STRING::Equals( const STRCODE* pCharStr, xub_StrLen nIndex, xub_StrLen nLen ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + // Are there enough codes for comparing? + if ( nIndex > mpData->mnLen ) + return (*pCharStr == 0); + + return (ImplStringCompare( mpData->maStr+nIndex, pCharStr, nLen ) == 0); +} + +// ----------------------------------------------------------------------- + +xub_StrLen STRING::Match( const STRING& rStr ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + // Ist dieser String leer + if ( !mpData->mnLen ) + return STRING_MATCH; + + // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen + const STRCODE* pStr1 = mpData->maStr; + const STRCODE* pStr2 = rStr.mpData->maStr; + xub_StrLen i = 0; + while ( i < mpData->mnLen ) + { + // Stimmt das Zeichen nicht ueberein, dann abbrechen + if ( *pStr1 != *pStr2 ) + return i; + ++pStr1, + ++pStr2, + ++i; + } + + return STRING_MATCH; +} + +// ----------------------------------------------------------------------- + +xub_StrLen STRING::SearchBackward( STRCODE c, xub_StrLen nIndex ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + if ( nIndex > mpData->mnLen ) + nIndex = (xub_StrLen)mpData->mnLen; + + const STRCODE* pStr = mpData->maStr; + pStr += nIndex; + + while ( nIndex ) + { + nIndex--; + pStr--; + if ( *pStr == c ) + return nIndex; + } + + return STRING_NOTFOUND; +} + +// ----------------------------------------------------------------------- + +void STRING::SearchAndReplaceAll( const STRING& rStr, const STRING& rRepStr ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rRepStr, STRING, DBGCHECKSTRING ); + + xub_StrLen nSPos = Search( rStr, 0 ); + while ( nSPos != STRING_NOTFOUND ) + { + Replace( nSPos, rStr.Len(), rRepStr ); + nSPos = nSPos + rRepStr.Len(); + nSPos = Search( rStr, nSPos ); + } +} + +// ----------------------------------------------------------------------- + +void STRING::SetToken( xub_StrLen nToken, STRCODE cTok, const STRING& rStr, + xub_StrLen nIndex ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING ); + + const STRCODE* pStr = mpData->maStr; + xub_StrLen nLen = (xub_StrLen)mpData->mnLen; + xub_StrLen nTok = 0; + xub_StrLen nFirstChar = nIndex; + xub_StrLen i = nFirstChar; + + // Bestimme die Token-Position und Laenge + pStr += i; + while ( i < nLen ) + { + // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount + if ( *pStr == cTok ) + { + ++nTok; + + if ( nTok == nToken ) + nFirstChar = i+1; + else + { + if ( nTok > nToken ) + break; + } + } + + ++pStr, + ++i; + } + + if ( nTok >= nToken ) + Replace( nFirstChar, i-nFirstChar, rStr ); +} + +// ----------------------------------------------------------------------- + +STRING STRING::GetToken( xub_StrLen nToken, STRCODE cTok, xub_StrLen& rIndex ) const +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + const STRCODE* pStr = mpData->maStr; + xub_StrLen nLen = (xub_StrLen)mpData->mnLen; + xub_StrLen nTok = 0; + xub_StrLen nFirstChar = rIndex; + xub_StrLen i = nFirstChar; + + // Bestimme die Token-Position und Laenge + pStr += i; + while ( i < nLen ) + { + // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount + if ( *pStr == cTok ) + { + ++nTok; + + if ( nTok == nToken ) + nFirstChar = i+1; + else + { + if ( nTok > nToken ) + break; + } + } + + ++pStr, + ++i; + } + + if ( nTok >= nToken ) + { + if ( i < nLen ) + rIndex = i+1; + else + rIndex = STRING_NOTFOUND; + return Copy( nFirstChar, i-nFirstChar ); + } + else + { + rIndex = STRING_NOTFOUND; + return STRING(); + } +} + +// ----------------------------------------------------------------------- + +STRING::STRING( const STRCODE* pCharStr, xub_StrLen nLen ) +: mpData(NULL) +{ + DBG_CTOR( STRING, DBGCHECKSTRING ); + DBG_ASSERT( pCharStr, "String::String() - pCharStr is NULL" ); + + if ( nLen == STRING_LEN ) + nLen = ImplStringLen( pCharStr ); + +#ifdef DBG_UTIL + if ( DbgIsAssert() ) + { + for ( xub_StrLen i = 0; i < nLen; i++ ) + { + if ( !pCharStr[i] ) + { + OSL_FAIL( "String::String() : nLen is wrong" ); + } + } + } +#endif + + // Ist es kein leerer String + if ( nLen ) + { + // Verwaltungsdaten anlegen und String kopieren + mpData = ImplAllocData( nLen ); + memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); + } + else + { + STRING_NEW((STRING_TYPE **)&mpData); + } +} + +// ----------------------------------------------------------------------- + +STRING& STRING::Append( const STRCODE* pCharStr, xub_StrLen nCharLen ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_ASSERT( pCharStr, "String::Append() - pCharStr is NULL" ); + + if ( nCharLen == STRING_LEN ) + nCharLen = ImplStringLen( pCharStr ); + +#ifdef DBG_UTIL + if ( DbgIsAssert() ) + { + for ( xub_StrLen i = 0; i < nCharLen; i++ ) + { + if ( !pCharStr[i] ) + { + OSL_FAIL( "String::Append() : nLen is wrong" ); + } + } + } +#endif + + // Ueberlauf abfangen + sal_Int32 nLen = mpData->mnLen; + sal_Int32 nCopyLen = ImplGetCopyLen( nLen, nCharLen ); + + // Ist es kein leerer String + if ( nCopyLen ) + { + // Neue Datenstruktur und neuen String erzeugen + STRINGDATA* pNewData = ImplAllocData( nLen+nCopyLen ); + + // String kopieren + memcpy( pNewData->maStr, mpData->maStr, nLen*sizeof( STRCODE ) ); + memcpy( pNewData->maStr+nLen, pCharStr, nCopyLen*sizeof( STRCODE ) ); + + // Alte Daten loeschen und Neue zuweisen + STRING_RELEASE((STRING_TYPE *)mpData); + mpData = pNewData; + } + + return *this; +} + +// ----------------------------------------------------------------------- + +STRING& STRING::Append( STRCODE c ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + + // kein 0-Character und maximale Stringlaenge nicht ueberschreiten + sal_Int32 nLen = mpData->mnLen; + if ( c && (nLen < STRING_MAXLEN) ) + { + // Neue Datenstruktur und neuen String erzeugen + STRINGDATA* pNewData = ImplAllocData( nLen+1 ); + + // String kopieren + memcpy( pNewData->maStr, mpData->maStr, nLen*sizeof( STRCODE ) ); + pNewData->maStr[nLen] = c; + + // Alte Daten loeschen und Neue zuweisen + STRING_RELEASE((STRING_TYPE *)mpData); + mpData = pNewData; + } + + return *this; +} + +// ----------------------------------------------------------------------- + +STRING& STRING::Assign( const STRCODE* pCharStr, xub_StrLen nLen ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_ASSERT( pCharStr, "String::Assign() - pCharStr is NULL" ); + + if ( nLen == STRING_LEN ) + nLen = ImplStringLen( pCharStr ); + +#ifdef DBG_UTIL + if ( DbgIsAssert() ) + { + for ( xub_StrLen i = 0; i < nLen; i++ ) + { + if ( !pCharStr[i] ) + { + OSL_FAIL( "String::Assign() : nLen is wrong" ); + } + } + } +#endif + + if ( !nLen ) + { + STRING_NEW((STRING_TYPE **)&mpData); + } + else + { + // Wenn String genauso lang ist, wie der String, dann direkt kopieren + if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) ) + memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); + else + { + // Alte Daten loeschen + STRING_RELEASE((STRING_TYPE *)mpData); + + // Daten initialisieren und String kopieren + mpData = ImplAllocData( nLen ); + memcpy( mpData->maStr, pCharStr, nLen*sizeof( STRCODE ) ); + } + } + + return *this; +} + +// ----------------------------------------------------------------------- + +STRING& STRING::Assign( STRCODE c ) +{ + DBG_CHKTHIS( STRING, DBGCHECKSTRING ); + DBG_ASSERT( c, "String::Assign() - c is 0" ); + + // Verwaltungsdaten anlegen und initialisieren + STRING_RELEASE((STRING_TYPE *)mpData); + mpData = ImplAllocData( 1 ); + mpData->maStr[0] = c; + return *this; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit