summaryrefslogtreecommitdiffstats
path: root/tools/source/string
diff options
context:
space:
mode:
Diffstat (limited to 'tools/source/string')
-rw-r--r--tools/source/string/strcvt.cxx55
-rw-r--r--tools/source/string/strimp.cxx376
-rw-r--r--tools/source/string/tstring.cxx60
-rw-r--r--tools/source/string/tustring.cxx346
4 files changed, 346 insertions, 491 deletions
diff --git a/tools/source/string/strcvt.cxx b/tools/source/string/strcvt.cxx
index 54169c3c0716..c7519bdc6df5 100644
--- a/tools/source/string/strcvt.cxx
+++ b/tools/source/string/strcvt.cxx
@@ -169,61 +169,6 @@ struct Impl1ByteConvertTabData
Impl1ByteConvertTabData* mpNext;
};
-// =======================================================================
-
-sal_Unicode* ImplGet1ByteUnicodeTab( rtl_TextEncoding eTextEncoding )
-{
-#ifndef BOOTSTRAP
- TOOLSINDATA* pToolsData = ImplGetToolsInData();
-#else
- TOOLSINDATA* pToolsData = 0x0;
-#endif
- Impl1ByteUnicodeTabData* pTab = pToolsData->mpFirstUniTabData;
-
- while ( pTab )
- {
- if ( pTab->meTextEncoding == eTextEncoding )
- return pTab->maUniTab;
- pTab = pTab->mpNext;
- }
-
- // get TextEncodingInfo
- rtl_TextEncodingInfo aTextEncInfo;
- aTextEncInfo.StructSize = sizeof( aTextEncInfo );
- rtl_getTextEncodingInfo( eTextEncoding, &aTextEncInfo );
-
- if ( aTextEncInfo.MaximumCharSize == 1 )
- {
- pTab = new Impl1ByteUnicodeTabData;
- pTab->meTextEncoding = eTextEncoding;
- pTab->mpNext = pToolsData->mpFirstUniTabData;
-
- rtl_TextToUnicodeConverter hConverter;
- sal_uInt32 nInfo;
- sal_Size nSrcBytes;
- sal_Size nDestChars;
- hConverter = rtl_createTextToUnicodeConverter( eTextEncoding );
- nDestChars = rtl_convertTextToUnicode( hConverter, 0,
- (const sal_Char*)aImplByteTab, 256,
- pTab->maUniTab, 256,
- RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_MAPTOPRIVATE |
- RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_DEFAULT |
- RTL_TEXTTOUNICODE_FLAGS_INVALID_DEFAULT,
- &nInfo, &nSrcBytes );
- rtl_destroyTextToUnicodeConverter( hConverter );
-
- if ( (nSrcBytes != 256) || (nDestChars != 256) )
- delete pTab;
- else
- {
- pToolsData->mpFirstUniTabData = pTab;
- return pTab->maUniTab;
- }
- }
-
- return NULL;
-}
-
// -----------------------------------------------------------------------
static sal_uChar* ImplGet1ByteConvertTab( rtl_TextEncoding eSrcTextEncoding,
diff --git a/tools/source/string/strimp.cxx b/tools/source/string/strimp.cxx
index 21065f999958..2f79410a9c19 100644
--- a/tools/source/string/strimp.cxx
+++ b/tools/source/string/strimp.cxx
@@ -691,52 +691,6 @@ STRING& STRING::Insert( const STRING& rStr, xub_StrLen nIndex )
// -----------------------------------------------------------------------
-STRING& STRING::Insert( const STRING& rStr, xub_StrLen nPos, xub_StrLen nLen,
- xub_StrLen nIndex )
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
- DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING );
-
- // Stringlaenge ermitteln
- if ( nPos > rStr.mpData->mnLen )
- nLen = 0;
- else
- {
- // Laenge korrigieren, wenn noetig
- sal_Int32 nMaxLen = rStr.mpData->mnLen-nPos;
- if ( nLen > nMaxLen )
- nLen = static_cast< xub_StrLen >(nMaxLen);
- }
-
- // Ueberlauf abfangen
- sal_Int32 nCopyLen = ImplGetCopyLen( mpData->mnLen, nLen );
-
- // 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, rStr.mpData->maStr+nPos, 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;
-}
-
-// -----------------------------------------------------------------------
-
STRING& STRING::Insert( const STRCODE* pCharStr, xub_StrLen nIndex )
{
DBG_CHKTHIS( STRING, DBGCHECKSTRING );
@@ -1061,30 +1015,6 @@ STRING& STRING::EraseAllChars( STRCODE c )
// -----------------------------------------------------------------------
-STRING& STRING::Reverse()
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
-
- if ( !mpData->mnLen )
- return *this;
-
- // Daten kopieren, wenn noetig
- ImplCopyData();
-
- // Reverse
- sal_Int32 nCount = mpData->mnLen / 2;
- for ( sal_Int32 i = 0; i < nCount; ++i )
- {
- STRCODE cTemp = mpData->maStr[i];
- mpData->maStr[i] = mpData->maStr[mpData->mnLen-i-1];
- mpData->maStr[mpData->mnLen-i-1] = cTemp;
- }
-
- return *this;
-}
-
-// -----------------------------------------------------------------------
-
STRING& STRING::ToLowerAscii()
{
DBG_CHKTHIS( STRING, DBGCHECKSTRING );
@@ -1279,36 +1209,6 @@ StringCompare STRING::CompareTo( const STRCODE* pCharStr, xub_StrLen nLen ) cons
// -----------------------------------------------------------------------
-StringCompare STRING::CompareIgnoreCaseToAscii( 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 = ImplStringICompareWithoutZero( 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;
-}
-
-// -----------------------------------------------------------------------
-
StringCompare STRING::CompareIgnoreCaseToAscii( const STRCODE* pCharStr,
xub_StrLen nLen ) const
{
@@ -1419,41 +1319,6 @@ sal_Bool STRING::Equals( const STRCODE* pCharStr, xub_StrLen nIndex, xub_StrLen
// -----------------------------------------------------------------------
-sal_Bool STRING::EqualsIgnoreCaseAscii( 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 (ImplStringICompareWithoutZero( mpData->maStr+nIndex, rStr.mpData->maStr, nLen ) == 0);
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool STRING::EqualsIgnoreCaseAscii( 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 (ImplStringICompare( mpData->maStr+nIndex, pCharStr, nLen ) == 0);
-}
-
-// -----------------------------------------------------------------------
-
xub_StrLen STRING::Match( const STRING& rStr ) const
{
DBG_CHKTHIS( STRING, DBGCHECKSTRING );
@@ -1482,32 +1347,6 @@ xub_StrLen STRING::Match( const STRING& rStr ) const
// -----------------------------------------------------------------------
-xub_StrLen STRING::Match( const STRCODE* pCharStr ) const
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
-
- // Ist dieser String leer
- if ( !mpData->mnLen )
- return STRING_MATCH;
-
- // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen
- const STRCODE* pStr = mpData->maStr;
- xub_StrLen i = 0;
- while ( i < mpData->mnLen )
- {
- // Stimmt das Zeichen nicht ueberein, dann abbrechen
- if ( *pStr != *pCharStr )
- return i;
- ++pStr,
- ++pCharStr,
- ++i;
- }
-
- return STRING_MATCH;
-}
-
-// -----------------------------------------------------------------------
-
xub_StrLen STRING::Search( STRCODE c, xub_StrLen nIndex ) const
{
DBG_CHKTHIS( STRING, DBGCHECKSTRING );
@@ -1642,86 +1481,6 @@ xub_StrLen STRING::SearchBackward( STRCODE c, xub_StrLen nIndex ) const
// -----------------------------------------------------------------------
-xub_StrLen STRING::SearchChar( const STRCODE* pChars, xub_StrLen nIndex ) const
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
-
- sal_Int32 nLen = mpData->mnLen;
- const STRCODE* pStr = mpData->maStr;
- pStr += nIndex;
- while ( nIndex < nLen )
- {
- STRCODE c = *pStr;
- const STRCODE* pCompStr = pChars;
- while ( *pCompStr )
- {
- if ( *pCompStr == c )
- return nIndex;
- ++pCompStr;
- }
- ++pStr,
- ++nIndex;
- }
-
- return STRING_NOTFOUND;
-}
-
-// -----------------------------------------------------------------------
-
-xub_StrLen STRING::SearchCharBackward( const STRCODE* pChars, 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--;
-
- STRCODE c =*pStr;
- const STRCODE* pCompStr = pChars;
- while ( *pCompStr )
- {
- if ( *pCompStr == c )
- return nIndex;
- ++pCompStr;
- }
- }
-
- return STRING_NOTFOUND;
-}
-
-// -----------------------------------------------------------------------
-
-xub_StrLen STRING::SearchAndReplace( STRCODE c, STRCODE cRep, xub_StrLen nIndex )
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
-
- sal_Int32 nLen = mpData->mnLen;
- const STRCODE* pStr = mpData->maStr;
- pStr += nIndex;
- while ( nIndex < nLen )
- {
- if ( *pStr == c )
- {
- ImplCopyData();
- mpData->maStr[nIndex] = cRep;
- return nIndex;
- }
- ++pStr,
- ++nIndex;
- }
-
- return STRING_NOTFOUND;
-}
-
-// -----------------------------------------------------------------------
-
xub_StrLen STRING::SearchAndReplace( const STRING& rStr, const STRING& rRepStr,
xub_StrLen nIndex )
{
@@ -1923,141 +1682,6 @@ STRING STRING::GetToken( xub_StrLen nToken, STRCODE cTok, xub_StrLen& rIndex ) c
// -----------------------------------------------------------------------
-xub_StrLen STRING::GetQuotedTokenCount( const STRING& rQuotedPairs, STRCODE cTok ) const
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
- DBG_CHKOBJ( &rQuotedPairs, STRING, DBGCHECKSTRING );
- DBG_ASSERT( !(rQuotedPairs.Len()%2), "String::GetQuotedTokenCount() - QuotedString%2 != 0" );
- DBG_ASSERT( rQuotedPairs.Search(cTok) == STRING_NOTFOUND, "String::GetQuotedTokenCount() - cTok in QuotedString" );
-
- // Leerer String: TokenCount per Definition 0
- if ( !mpData->mnLen )
- return 0;
-
- xub_StrLen nTokCount = 1;
- sal_Int32 nLen = mpData->mnLen;
- xub_StrLen nQuotedLen = rQuotedPairs.Len();
- STRCODE cQuotedEndChar = 0;
- const STRCODE* pQuotedStr = rQuotedPairs.mpData->maStr;
- const STRCODE* pStr = mpData->maStr;
- sal_Int32 nIndex = 0;
- while ( nIndex < nLen )
- {
- STRCODE c = *pStr;
- if ( cQuotedEndChar )
- {
- // Ende des Quotes erreicht ?
- if ( c == cQuotedEndChar )
- cQuotedEndChar = 0;
- }
- else
- {
- // Ist das Zeichen ein Quote-Anfang-Zeichen ?
- xub_StrLen nQuoteIndex = 0;
- while ( nQuoteIndex < nQuotedLen )
- {
- if ( pQuotedStr[nQuoteIndex] == c )
- {
- cQuotedEndChar = pQuotedStr[nQuoteIndex+1];
- break;
- }
- else
- nQuoteIndex += 2;
- }
-
- // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount
- if ( c == cTok )
- ++nTokCount;
- }
-
- ++pStr,
- ++nIndex;
- }
-
- return nTokCount;
-}
-
-// -----------------------------------------------------------------------
-
-STRING STRING::GetQuotedToken( xub_StrLen nToken, const STRING& rQuotedPairs,
- STRCODE cTok, xub_StrLen& rIndex ) const
-{
- DBG_CHKTHIS( STRING, DBGCHECKSTRING );
- DBG_CHKOBJ( &rQuotedPairs, STRING, DBGCHECKSTRING );
- DBG_ASSERT( !(rQuotedPairs.Len()%2), "String::GetQuotedToken() - QuotedString%2 != 0" );
- DBG_ASSERT( rQuotedPairs.Search(cTok) == STRING_NOTFOUND, "String::GetQuotedToken() - cTok in QuotedString" );
-
- const STRCODE* pStr = mpData->maStr;
- const STRCODE* pQuotedStr = rQuotedPairs.mpData->maStr;
- STRCODE cQuotedEndChar = 0;
- xub_StrLen nQuotedLen = rQuotedPairs.Len();
- 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 )
- {
- STRCODE c = *pStr;
- if ( cQuotedEndChar )
- {
- // Ende des Quotes erreicht ?
- if ( c == cQuotedEndChar )
- cQuotedEndChar = 0;
- }
- else
- {
- // Ist das Zeichen ein Quote-Anfang-Zeichen ?
- xub_StrLen nQuoteIndex = 0;
- while ( nQuoteIndex < nQuotedLen )
- {
- if ( pQuotedStr[nQuoteIndex] == c )
- {
- cQuotedEndChar = pQuotedStr[nQuoteIndex+1];
- break;
- }
- else
- nQuoteIndex += 2;
- }
-
- // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount
- if ( c == 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();
- }
-}
-
-// -----------------------------------------------------------------------
-
STRCODE* STRING::GetBufferAccess()
{
DBG_CHKTHIS( STRING, DBGCHECKSTRING );
diff --git a/tools/source/string/tstring.cxx b/tools/source/string/tstring.cxx
index c7a5f380fb72..b89a51ba7cdc 100644
--- a/tools/source/string/tstring.cxx
+++ b/tools/source/string/tstring.cxx
@@ -38,7 +38,6 @@
#include <rtl/alloc.h>
#include <rtl/memory.h>
#include <rtl/tencinfo.h>
-#include <rtl/instance.hxx>
#include <tools/string.hxx>
#include <impstrg.hxx>
@@ -104,45 +103,6 @@ ByteString ByteString::CreateFromInt32( sal_Int32 n, sal_Int16 nRadix )
// -----------------------------------------------------------------------
-ByteString ByteString::CreateFromInt64( sal_Int64 n, sal_Int16 nRadix )
-{
- sal_Char aBuf[RTL_STR_MAX_VALUEOFINT64];
- BOOST_STATIC_ASSERT(RTL_STR_MAX_VALUEOFINT64 <= STRING_MAXLEN);
- return ByteString(
- aBuf,
- static_cast< xub_StrLen >(rtl_str_valueOfInt64( aBuf, n, nRadix )) );
-}
-
-// -----------------------------------------------------------------------
-
-ByteString ByteString::CreateFromFloat( float f )
-{
- sal_Char aBuf[RTL_STR_MAX_VALUEOFFLOAT];
- BOOST_STATIC_ASSERT(RTL_STR_MAX_VALUEOFFLOAT <= STRING_MAXLEN);
- return ByteString(
- aBuf, static_cast< xub_StrLen >(rtl_str_valueOfFloat( aBuf, f )) );
-}
-
-// -----------------------------------------------------------------------
-
-ByteString ByteString::CreateFromDouble( double d )
-{
- sal_Char aBuf[RTL_STR_MAX_VALUEOFDOUBLE];
- BOOST_STATIC_ASSERT(RTL_STR_MAX_VALUEOFDOUBLE <= STRING_MAXLEN);
- return ByteString(
- aBuf, static_cast< xub_StrLen >(rtl_str_valueOfDouble( aBuf, d )) );
-}
-
-// -----------------------------------------------------------------------
-
-namespace { struct Empty : public rtl::Static< const ByteString, Empty> {}; }
-const ByteString& ByteString::EmptyString()
-{
- return Empty::get();
-}
-
-// -----------------------------------------------------------------------
-
sal_Int32 ByteString::ToInt32() const
{
DBG_CHKTHIS( ByteString, DbgCheckByteString );
@@ -161,26 +121,6 @@ sal_Int64 ByteString::ToInt64() const
// -----------------------------------------------------------------------
-float ByteString::ToFloat() const
-{
- DBG_CHKTHIS( ByteString, DbgCheckByteString );
-
- OSL_FAIL("ByteString::ToFloat unusable");
- return 0;
-}
-
-// -----------------------------------------------------------------------
-
-double ByteString::ToDouble() const
-{
- DBG_CHKTHIS( ByteString, DbgCheckByteString );
-
- OSL_FAIL("ByteString::ToDouble unusable");
- return 0;
-}
-
-// -----------------------------------------------------------------------
-
sal_Bool ByteString::IsLowerAscii() const
{
DBG_CHKTHIS( ByteString, DbgCheckByteString );
diff --git a/tools/source/string/tustring.cxx b/tools/source/string/tustring.cxx
index 5edd160b5d69..9ef026f6cce8 100644
--- a/tools/source/string/tustring.cxx
+++ b/tools/source/string/tustring.cxx
@@ -155,4 +155,350 @@ double UniString::ToDouble() const
return rtl_ustr_toDouble( mpData->maStr );
}
+// -----------------------------------------------------------------------
+
+xub_StrLen STRING::SearchChar( const STRCODE* pChars, xub_StrLen nIndex ) const
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+
+ sal_Int32 nLen = mpData->mnLen;
+ const STRCODE* pStr = mpData->maStr;
+ pStr += nIndex;
+ while ( nIndex < nLen )
+ {
+ STRCODE c = *pStr;
+ const STRCODE* pCompStr = pChars;
+ while ( *pCompStr )
+ {
+ if ( *pCompStr == c )
+ return nIndex;
+ ++pCompStr;
+ }
+ ++pStr,
+ ++nIndex;
+ }
+
+ return STRING_NOTFOUND;
+}
+
+// -----------------------------------------------------------------------
+
+xub_StrLen STRING::SearchAndReplace( STRCODE c, STRCODE cRep, xub_StrLen nIndex )
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+
+ sal_Int32 nLen = mpData->mnLen;
+ const STRCODE* pStr = mpData->maStr;
+ pStr += nIndex;
+ while ( nIndex < nLen )
+ {
+ if ( *pStr == c )
+ {
+ ImplCopyData();
+ mpData->maStr[nIndex] = cRep;
+ return nIndex;
+ }
+ ++pStr,
+ ++nIndex;
+ }
+
+ return STRING_NOTFOUND;
+}
+
+// -----------------------------------------------------------------------
+
+STRING& STRING::Reverse()
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+
+ if ( !mpData->mnLen )
+ return *this;
+
+ // Daten kopieren, wenn noetig
+ ImplCopyData();
+
+ // Reverse
+ sal_Int32 nCount = mpData->mnLen / 2;
+ for ( sal_Int32 i = 0; i < nCount; ++i )
+ {
+ STRCODE cTemp = mpData->maStr[i];
+ mpData->maStr[i] = mpData->maStr[mpData->mnLen-i-1];
+ mpData->maStr[mpData->mnLen-i-1] = cTemp;
+ }
+
+ return *this;
+}
+
+// -----------------------------------------------------------------------
+
+xub_StrLen STRING::Match( const STRCODE* pCharStr ) const
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+
+ // Ist dieser String leer
+ if ( !mpData->mnLen )
+ return STRING_MATCH;
+
+ // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen
+ const STRCODE* pStr = mpData->maStr;
+ xub_StrLen i = 0;
+ while ( i < mpData->mnLen )
+ {
+ // Stimmt das Zeichen nicht ueberein, dann abbrechen
+ if ( *pStr != *pCharStr )
+ return i;
+ ++pStr,
+ ++pCharStr,
+ ++i;
+ }
+
+ return STRING_MATCH;
+}
+
+// -----------------------------------------------------------------------
+
+STRING& STRING::Insert( const STRING& rStr, xub_StrLen nPos, xub_StrLen nLen,
+ xub_StrLen nIndex )
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+ DBG_CHKOBJ( &rStr, STRING, DBGCHECKSTRING );
+
+ // Stringlaenge ermitteln
+ if ( nPos > rStr.mpData->mnLen )
+ nLen = 0;
+ else
+ {
+ // Laenge korrigieren, wenn noetig
+ sal_Int32 nMaxLen = rStr.mpData->mnLen-nPos;
+ if ( nLen > nMaxLen )
+ nLen = static_cast< xub_StrLen >(nMaxLen);
+ }
+
+ // Ueberlauf abfangen
+ sal_Int32 nCopyLen = ImplGetCopyLen( mpData->mnLen, nLen );
+
+ // 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, rStr.mpData->maStr+nPos, 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;
+}
+
+// -----------------------------------------------------------------------
+
+xub_StrLen STRING::GetQuotedTokenCount( const STRING& rQuotedPairs, STRCODE cTok ) const
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+ DBG_CHKOBJ( &rQuotedPairs, STRING, DBGCHECKSTRING );
+ DBG_ASSERT( !(rQuotedPairs.Len()%2), "String::GetQuotedTokenCount() - QuotedString%2 != 0" );
+ DBG_ASSERT( rQuotedPairs.Search(cTok) == STRING_NOTFOUND, "String::GetQuotedTokenCount() - cTok in QuotedString" );
+
+ // Leerer String: TokenCount per Definition 0
+ if ( !mpData->mnLen )
+ return 0;
+
+ xub_StrLen nTokCount = 1;
+ sal_Int32 nLen = mpData->mnLen;
+ xub_StrLen nQuotedLen = rQuotedPairs.Len();
+ STRCODE cQuotedEndChar = 0;
+ const STRCODE* pQuotedStr = rQuotedPairs.mpData->maStr;
+ const STRCODE* pStr = mpData->maStr;
+ sal_Int32 nIndex = 0;
+ while ( nIndex < nLen )
+ {
+ STRCODE c = *pStr;
+ if ( cQuotedEndChar )
+ {
+ // Ende des Quotes erreicht ?
+ if ( c == cQuotedEndChar )
+ cQuotedEndChar = 0;
+ }
+ else
+ {
+ // Ist das Zeichen ein Quote-Anfang-Zeichen ?
+ xub_StrLen nQuoteIndex = 0;
+ while ( nQuoteIndex < nQuotedLen )
+ {
+ if ( pQuotedStr[nQuoteIndex] == c )
+ {
+ cQuotedEndChar = pQuotedStr[nQuoteIndex+1];
+ break;
+ }
+ else
+ nQuoteIndex += 2;
+ }
+
+ // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount
+ if ( c == cTok )
+ ++nTokCount;
+ }
+
+ ++pStr,
+ ++nIndex;
+ }
+
+ return nTokCount;
+}
+
+// -----------------------------------------------------------------------
+
+STRING STRING::GetQuotedToken( xub_StrLen nToken, const STRING& rQuotedPairs,
+ STRCODE cTok, xub_StrLen& rIndex ) const
+{
+ DBG_CHKTHIS( STRING, DBGCHECKSTRING );
+ DBG_CHKOBJ( &rQuotedPairs, STRING, DBGCHECKSTRING );
+ DBG_ASSERT( !(rQuotedPairs.Len()%2), "String::GetQuotedToken() - QuotedString%2 != 0" );
+ DBG_ASSERT( rQuotedPairs.Search(cTok) == STRING_NOTFOUND, "String::GetQuotedToken() - cTok in QuotedString" );
+
+ const STRCODE* pStr = mpData->maStr;
+ const STRCODE* pQuotedStr = rQuotedPairs.mpData->maStr;
+ STRCODE cQuotedEndChar = 0;
+ xub_StrLen nQuotedLen = rQuotedPairs.Len();
+ 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 )
+ {
+ STRCODE c = *pStr;
+ if ( cQuotedEndChar )
+ {
+ // Ende des Quotes erreicht ?
+ if ( c == cQuotedEndChar )
+ cQuotedEndChar = 0;
+ }
+ else
+ {
+ // Ist das Zeichen ein Quote-Anfang-Zeichen ?
+ xub_StrLen nQuoteIndex = 0;
+ while ( nQuoteIndex < nQuotedLen )
+ {
+ if ( pQuotedStr[nQuoteIndex] == c )
+ {
+ cQuotedEndChar = pQuotedStr[nQuoteIndex+1];
+ break;
+ }
+ else
+ nQuoteIndex += 2;
+ }
+
+ // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount
+ if ( c == 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();
+ }
+}
+
+// -----------------------------------------------------------------------
+
+sal_Bool STRING::EqualsIgnoreCaseAscii( 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 (ImplStringICompareWithoutZero( mpData->maStr+nIndex, rStr.mpData->maStr, nLen ) == 0);
+}
+
+// -----------------------------------------------------------------------
+
+sal_Bool STRING::EqualsIgnoreCaseAscii( 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 (ImplStringICompare( mpData->maStr+nIndex, pCharStr, nLen ) == 0);
+}
+
+// -----------------------------------------------------------------------
+
+StringCompare STRING::CompareIgnoreCaseToAscii( 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 = ImplStringICompareWithoutZero( 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;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */