1*89b56da7SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*89b56da7SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*89b56da7SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*89b56da7SAndrew Rist * distributed with this work for additional information 6*89b56da7SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*89b56da7SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*89b56da7SAndrew Rist * "License"); you may not use this file except in compliance 9*89b56da7SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*89b56da7SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*89b56da7SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*89b56da7SAndrew Rist * software distributed under the License is distributed on an 15*89b56da7SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*89b56da7SAndrew Rist * KIND, either express or implied. See the License for the 17*89b56da7SAndrew Rist * specific language governing permissions and limitations 18*89b56da7SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*89b56da7SAndrew Rist *************************************************************/ 21*89b56da7SAndrew Rist 22*89b56da7SAndrew Rist # 23cdf0e10cSrcweir 24cdf0e10cSrcweir // no include "precompiled_tools.hxx" because this is included in other cxx files. 25cdf0e10cSrcweir 26cdf0e10cSrcweir // ======================================================================= 27cdf0e10cSrcweir 28cdf0e10cSrcweir #ifdef DBG_UTIL 29cdf0e10cSrcweir 30cdf0e10cSrcweir static sal_Bool ImplDbgCheckAsciiStr( const sal_Char* pAsciiStr, sal_Int32 nLen ) 31cdf0e10cSrcweir { 32cdf0e10cSrcweir while ( nLen && *pAsciiStr ) 33cdf0e10cSrcweir { 34cdf0e10cSrcweir if ( ((unsigned char)*pAsciiStr) > 127 ) 35cdf0e10cSrcweir return sal_False; 36cdf0e10cSrcweir ++pAsciiStr, 37cdf0e10cSrcweir --nLen; 38cdf0e10cSrcweir } 39cdf0e10cSrcweir 40cdf0e10cSrcweir return sal_True; 41cdf0e10cSrcweir } 42cdf0e10cSrcweir 43cdf0e10cSrcweir #endif 44cdf0e10cSrcweir 45cdf0e10cSrcweir // ======================================================================= 46cdf0e10cSrcweir 47cdf0e10cSrcweir static void ImplCopyAsciiStr( sal_Unicode* pDest, const sal_Char* pSrc, 48cdf0e10cSrcweir sal_Int32 nLen ) 49cdf0e10cSrcweir { 50cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pSrc, nLen ), 51cdf0e10cSrcweir "UniString::CopyAsciiStr() - pAsciiStr include characters > 127" ); 52cdf0e10cSrcweir 53cdf0e10cSrcweir while ( nLen ) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir *pDest = (unsigned char)*pSrc; 56cdf0e10cSrcweir ++pDest, 57cdf0e10cSrcweir ++pSrc, 58cdf0e10cSrcweir --nLen; 59cdf0e10cSrcweir } 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir // ======================================================================= 63cdf0e10cSrcweir 64cdf0e10cSrcweir static sal_Int32 ImplStringCompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2 ) 65cdf0e10cSrcweir { 66cdf0e10cSrcweir sal_Int32 nRet; 67cdf0e10cSrcweir while ( ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) && 68cdf0e10cSrcweir *pStr2 ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir ++pStr1, 71cdf0e10cSrcweir ++pStr2; 72cdf0e10cSrcweir } 73cdf0e10cSrcweir 74cdf0e10cSrcweir return nRet; 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir // ----------------------------------------------------------------------- 78cdf0e10cSrcweir 79cdf0e10cSrcweir static sal_Int32 ImplStringCompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2, 80cdf0e10cSrcweir xub_StrLen nCount ) 81cdf0e10cSrcweir { 82cdf0e10cSrcweir sal_Int32 nRet = 0; 83cdf0e10cSrcweir while ( nCount && 84cdf0e10cSrcweir ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) && 85cdf0e10cSrcweir *pStr2 ) 86cdf0e10cSrcweir { 87cdf0e10cSrcweir ++pStr1, 88cdf0e10cSrcweir ++pStr2, 89cdf0e10cSrcweir --nCount; 90cdf0e10cSrcweir } 91cdf0e10cSrcweir 92cdf0e10cSrcweir return nRet; 93cdf0e10cSrcweir } 94cdf0e10cSrcweir 95cdf0e10cSrcweir // ----------------------------------------------------------------------- 96cdf0e10cSrcweir 97cdf0e10cSrcweir static sal_Int32 ImplStringCompareWithoutZeroAscii( const sal_Unicode* pStr1, const sal_Char* pStr2, 98cdf0e10cSrcweir xub_StrLen nCount ) 99cdf0e10cSrcweir { 100cdf0e10cSrcweir sal_Int32 nRet = 0; 101cdf0e10cSrcweir while ( nCount && 102cdf0e10cSrcweir ((nRet = ((sal_Int32)*pStr1)-((sal_Int32)((unsigned char)*pStr2))) == 0) ) 103cdf0e10cSrcweir { 104cdf0e10cSrcweir ++pStr1, 105cdf0e10cSrcweir ++pStr2, 106cdf0e10cSrcweir --nCount; 107cdf0e10cSrcweir } 108cdf0e10cSrcweir 109cdf0e10cSrcweir return nRet; 110cdf0e10cSrcweir } 111cdf0e10cSrcweir 112cdf0e10cSrcweir // ----------------------------------------------------------------------- 113cdf0e10cSrcweir 114cdf0e10cSrcweir static sal_Int32 ImplStringICompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2 ) 115cdf0e10cSrcweir { 116cdf0e10cSrcweir sal_Int32 nRet; 117cdf0e10cSrcweir sal_Unicode c1; 118cdf0e10cSrcweir sal_Char c2; 119cdf0e10cSrcweir do 120cdf0e10cSrcweir { 121cdf0e10cSrcweir // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln 122cdf0e10cSrcweir c1 = *pStr1; 123cdf0e10cSrcweir c2 = *pStr2; 124cdf0e10cSrcweir if ( (c1 >= 65) && (c1 <= 90) ) 125cdf0e10cSrcweir c1 += 32; 126cdf0e10cSrcweir if ( (c2 >= 65) && (c2 <= 90) ) 127cdf0e10cSrcweir c2 += 32; 128cdf0e10cSrcweir nRet = ((sal_Int32)c1)-((sal_Int32)((unsigned char)c2)); 129cdf0e10cSrcweir if ( nRet != 0 ) 130cdf0e10cSrcweir break; 131cdf0e10cSrcweir 132cdf0e10cSrcweir ++pStr1, 133cdf0e10cSrcweir ++pStr2; 134cdf0e10cSrcweir } 135cdf0e10cSrcweir while ( c2 ); 136cdf0e10cSrcweir 137cdf0e10cSrcweir return nRet; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir // ----------------------------------------------------------------------- 141cdf0e10cSrcweir 142cdf0e10cSrcweir static sal_Int32 ImplStringICompareAscii( const sal_Unicode* pStr1, const sal_Char* pStr2, 143cdf0e10cSrcweir xub_StrLen nCount ) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir sal_Int32 nRet = 0; 146cdf0e10cSrcweir sal_Unicode c1; 147cdf0e10cSrcweir sal_Char c2; 148cdf0e10cSrcweir do 149cdf0e10cSrcweir { 150cdf0e10cSrcweir if ( !nCount ) 151cdf0e10cSrcweir break; 152cdf0e10cSrcweir 153cdf0e10cSrcweir // Ist das Zeichen zwischen 'A' und 'Z' dann umwandeln 154cdf0e10cSrcweir c1 = *pStr1; 155cdf0e10cSrcweir c2 = *pStr2; 156cdf0e10cSrcweir if ( (c1 >= 65) && (c1 <= 90) ) 157cdf0e10cSrcweir c1 += 32; 158cdf0e10cSrcweir if ( (c2 >= 65) && (c2 <= 90) ) 159cdf0e10cSrcweir c2 += 32; 160cdf0e10cSrcweir nRet = ((sal_Int32)c1)-((sal_Int32)((unsigned char)c2)); 161cdf0e10cSrcweir if ( nRet != 0 ) 162cdf0e10cSrcweir break; 163cdf0e10cSrcweir 164cdf0e10cSrcweir ++pStr1, 165cdf0e10cSrcweir ++pStr2, 166cdf0e10cSrcweir --nCount; 167cdf0e10cSrcweir } 168cdf0e10cSrcweir while ( c2 ); 169cdf0e10cSrcweir 170cdf0e10cSrcweir return nRet; 171cdf0e10cSrcweir } 172cdf0e10cSrcweir 173cdf0e10cSrcweir // ======================================================================= 174cdf0e10cSrcweir 175cdf0e10cSrcweir UniString UniString::CreateFromAscii( const sal_Char* pAsciiStr ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::CreateFromAscii() - pAsciiStr is NULL" ); 178cdf0e10cSrcweir 179cdf0e10cSrcweir // Stringlaenge ermitteln 180cdf0e10cSrcweir xub_StrLen nLen = ImplStringLen( pAsciiStr ); 181cdf0e10cSrcweir 182cdf0e10cSrcweir UniString aTempStr; 183cdf0e10cSrcweir if ( nLen ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir ImplCopyAsciiStr( aTempStr.AllocBuffer( nLen ), pAsciiStr, nLen ); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir return aTempStr; 188cdf0e10cSrcweir } 189cdf0e10cSrcweir 190cdf0e10cSrcweir // ----------------------------------------------------------------------- 191cdf0e10cSrcweir 192cdf0e10cSrcweir UniString UniString::CreateFromAscii( const sal_Char* pAsciiStr, xub_StrLen nLen ) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::CreateFromAscii() - pAsciiStr is NULL" ); 195cdf0e10cSrcweir 196cdf0e10cSrcweir // Stringlaenge ermitteln 197cdf0e10cSrcweir if ( nLen == STRING_LEN ) 198cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr ); 199cdf0e10cSrcweir 200cdf0e10cSrcweir UniString aTempStr; 201cdf0e10cSrcweir 202cdf0e10cSrcweir if ( nLen ) 203cdf0e10cSrcweir { 204cdf0e10cSrcweir ImplCopyAsciiStr( aTempStr.AllocBuffer( nLen ), pAsciiStr, nLen ); 205cdf0e10cSrcweir } 206cdf0e10cSrcweir return aTempStr; 207cdf0e10cSrcweir } 208cdf0e10cSrcweir 209cdf0e10cSrcweir // ----------------------------------------------------------------------- 210cdf0e10cSrcweir 211cdf0e10cSrcweir UniString& UniString::AssignAscii( const sal_Char* pAsciiStr ) 212cdf0e10cSrcweir { 213cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 214cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AssignAscii() - pAsciiStr is NULL" ); 215cdf0e10cSrcweir 216cdf0e10cSrcweir // Stringlaenge ermitteln 217cdf0e10cSrcweir xub_StrLen nLen = ImplStringLen( pAsciiStr ); 218cdf0e10cSrcweir 219cdf0e10cSrcweir if ( !nLen ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir STRING_NEW((STRING_TYPE **)&mpData); 222cdf0e10cSrcweir } 223cdf0e10cSrcweir else 224cdf0e10cSrcweir { 225cdf0e10cSrcweir // Wenn String genauso lang ist, wie der String, dann direkt kopieren 226cdf0e10cSrcweir if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) ) 227cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen ); 228cdf0e10cSrcweir else 229cdf0e10cSrcweir { 230cdf0e10cSrcweir // Alte Daten loeschen 231cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 232cdf0e10cSrcweir 233cdf0e10cSrcweir // Daten initialisieren und String kopieren 234cdf0e10cSrcweir mpData = ImplAllocData( nLen ); 235cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen ); 236cdf0e10cSrcweir } 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 239cdf0e10cSrcweir return *this; 240cdf0e10cSrcweir } 241cdf0e10cSrcweir 242cdf0e10cSrcweir // ----------------------------------------------------------------------- 243cdf0e10cSrcweir 244cdf0e10cSrcweir UniString& UniString::AssignAscii( const sal_Char* pAsciiStr, xub_StrLen nLen ) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 247cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AssignAscii() - pAsciiStr is NULL" ); 248cdf0e10cSrcweir 249cdf0e10cSrcweir if ( nLen == STRING_LEN ) 250cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr ); 251cdf0e10cSrcweir 252cdf0e10cSrcweir #ifdef DBG_UTIL 253cdf0e10cSrcweir if ( DbgIsAssert() ) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir for ( xub_StrLen i = 0; i < nLen; ++i ) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir if ( !pAsciiStr[i] ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir DBG_ERROR( "UniString::AssignAscii() : nLen is wrong" ); 260cdf0e10cSrcweir } 261cdf0e10cSrcweir } 262cdf0e10cSrcweir } 263cdf0e10cSrcweir #endif 264cdf0e10cSrcweir 265cdf0e10cSrcweir if ( !nLen ) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir STRING_NEW((STRING_TYPE **)&mpData); 268cdf0e10cSrcweir } 269cdf0e10cSrcweir else 270cdf0e10cSrcweir { 271cdf0e10cSrcweir // Wenn String genauso lang ist, wie der String, dann direkt kopieren 272cdf0e10cSrcweir if ( (nLen == mpData->mnLen) && (mpData->mnRefCount == 1) ) 273cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen ); 274cdf0e10cSrcweir else 275cdf0e10cSrcweir { 276cdf0e10cSrcweir // Alte Daten loeschen 277cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 278cdf0e10cSrcweir 279cdf0e10cSrcweir // Daten initialisieren und String kopieren 280cdf0e10cSrcweir mpData = ImplAllocData( nLen ); 281cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr, pAsciiStr, nLen ); 282cdf0e10cSrcweir } 283cdf0e10cSrcweir } 284cdf0e10cSrcweir 285cdf0e10cSrcweir return *this; 286cdf0e10cSrcweir } 287cdf0e10cSrcweir 288cdf0e10cSrcweir // ----------------------------------------------------------------------- 289cdf0e10cSrcweir 290cdf0e10cSrcweir UniString& UniString::AppendAscii( const sal_Char* pAsciiStr ) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 293cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AppendAscii() - pAsciiStr is NULL" ); 294cdf0e10cSrcweir 295cdf0e10cSrcweir // Stringlaenge ermitteln 296cdf0e10cSrcweir sal_Int32 nCopyLen = ImplStringLen( pAsciiStr ); 297cdf0e10cSrcweir 298cdf0e10cSrcweir // Ueberlauf abfangen 299cdf0e10cSrcweir nCopyLen = ImplGetCopyLen( mpData->mnLen, nCopyLen ); 300cdf0e10cSrcweir 301cdf0e10cSrcweir // Ist es kein leerer String 302cdf0e10cSrcweir if ( nCopyLen ) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir // Neue Datenstruktur und neuen String erzeugen 305cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen ); 306cdf0e10cSrcweir 307cdf0e10cSrcweir // String kopieren 308cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, mpData->mnLen*sizeof( sal_Unicode ) ); 309cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+mpData->mnLen, pAsciiStr, nCopyLen ); 310cdf0e10cSrcweir 311cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen 312cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 313cdf0e10cSrcweir mpData = pNewData; 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir return *this; 317cdf0e10cSrcweir } 318cdf0e10cSrcweir 319cdf0e10cSrcweir // ----------------------------------------------------------------------- 320cdf0e10cSrcweir 321cdf0e10cSrcweir UniString& UniString::AppendAscii( const sal_Char* pAsciiStr, xub_StrLen nLen ) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 324cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::AppendAscii() - pAsciiStr is NULL" ); 325cdf0e10cSrcweir 326cdf0e10cSrcweir if ( nLen == STRING_LEN ) 327cdf0e10cSrcweir nLen = ImplStringLen( pAsciiStr ); 328cdf0e10cSrcweir 329cdf0e10cSrcweir #ifdef DBG_UTIL 330cdf0e10cSrcweir if ( DbgIsAssert() ) 331cdf0e10cSrcweir { 332cdf0e10cSrcweir for ( xub_StrLen i = 0; i < nLen; ++i ) 333cdf0e10cSrcweir { 334cdf0e10cSrcweir if ( !pAsciiStr[i] ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir DBG_ERROR( "UniString::AppendAscii() : nLen is wrong" ); 337cdf0e10cSrcweir } 338cdf0e10cSrcweir } 339cdf0e10cSrcweir } 340cdf0e10cSrcweir #endif 341cdf0e10cSrcweir 342cdf0e10cSrcweir // Ueberlauf abfangen 343cdf0e10cSrcweir sal_Int32 nCopyLen = ImplGetCopyLen( mpData->mnLen, nLen ); 344cdf0e10cSrcweir 345cdf0e10cSrcweir // Ist es kein leerer String 346cdf0e10cSrcweir if ( nCopyLen ) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir // Neue Datenstruktur und neuen String erzeugen 349cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen ); 350cdf0e10cSrcweir 351cdf0e10cSrcweir // String kopieren 352cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, mpData->mnLen*sizeof( sal_Unicode ) ); 353cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+mpData->mnLen, pAsciiStr, nCopyLen ); 354cdf0e10cSrcweir 355cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen 356cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 357cdf0e10cSrcweir mpData = pNewData; 358cdf0e10cSrcweir } 359cdf0e10cSrcweir 360cdf0e10cSrcweir return *this; 361cdf0e10cSrcweir } 362cdf0e10cSrcweir 363cdf0e10cSrcweir // ----------------------------------------------------------------------- 364cdf0e10cSrcweir 365cdf0e10cSrcweir UniString& UniString::InsertAscii( const char* pAsciiStr, xub_StrLen nIndex ) 366cdf0e10cSrcweir { 367cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 368cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::InsertAscii() - pAsciiStr is NULL" ); 369cdf0e10cSrcweir 370cdf0e10cSrcweir // Stringlaenge ermitteln 371cdf0e10cSrcweir sal_Int32 nCopyLen = ImplStringLen( pAsciiStr ); 372cdf0e10cSrcweir 373cdf0e10cSrcweir // Ueberlauf abfangen 374cdf0e10cSrcweir nCopyLen = ImplGetCopyLen( mpData->mnLen, nCopyLen ); 375cdf0e10cSrcweir 376cdf0e10cSrcweir // Ist der einzufuegende String ein Leerstring 377cdf0e10cSrcweir if ( !nCopyLen ) 378cdf0e10cSrcweir return *this; 379cdf0e10cSrcweir 380cdf0e10cSrcweir // Index groesser als Laenge 381cdf0e10cSrcweir if ( nIndex > mpData->mnLen ) 382cdf0e10cSrcweir nIndex = static_cast< xub_StrLen >(mpData->mnLen); 383cdf0e10cSrcweir 384cdf0e10cSrcweir // Neue Laenge ermitteln und neuen String anlegen 385cdf0e10cSrcweir UniStringData* pNewData = ImplAllocData( mpData->mnLen+nCopyLen ); 386cdf0e10cSrcweir 387cdf0e10cSrcweir // String kopieren 388cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( sal_Unicode ) ); 389cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+nIndex, pAsciiStr, nCopyLen ); 390cdf0e10cSrcweir memcpy( pNewData->maStr+nIndex+nCopyLen, mpData->maStr+nIndex, 391cdf0e10cSrcweir (mpData->mnLen-nIndex)*sizeof( sal_Unicode ) ); 392cdf0e10cSrcweir 393cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen 394cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 395cdf0e10cSrcweir mpData = pNewData; 396cdf0e10cSrcweir 397cdf0e10cSrcweir return *this; 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir // ----------------------------------------------------------------------- 401cdf0e10cSrcweir 402cdf0e10cSrcweir UniString& UniString::ReplaceAscii( xub_StrLen nIndex, xub_StrLen nCount, 403cdf0e10cSrcweir const sal_Char* pAsciiStr, xub_StrLen nStrLen ) 404cdf0e10cSrcweir { 405cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 406cdf0e10cSrcweir DBG_ASSERT( pAsciiStr, "UniString::ReplaceAscii() - pAsciiStr is NULL" ); 407cdf0e10cSrcweir 408cdf0e10cSrcweir // Wenn Index groessergleich Laenge ist, dann ist es ein Append 409cdf0e10cSrcweir if ( nIndex >= mpData->mnLen ) 410cdf0e10cSrcweir { 411cdf0e10cSrcweir AppendAscii( pAsciiStr, nStrLen ); 412cdf0e10cSrcweir return *this; 413cdf0e10cSrcweir } 414cdf0e10cSrcweir 415cdf0e10cSrcweir // Ist es eine Zuweisung 416cdf0e10cSrcweir if ( (nIndex == 0) && (nCount >= mpData->mnLen) ) 417cdf0e10cSrcweir { 418cdf0e10cSrcweir AssignAscii( pAsciiStr, nStrLen ); 419cdf0e10cSrcweir return *this; 420cdf0e10cSrcweir } 421cdf0e10cSrcweir 422cdf0e10cSrcweir // Reicht ein Erase 423cdf0e10cSrcweir if ( nStrLen == STRING_LEN ) 424cdf0e10cSrcweir nStrLen = ImplStringLen( pAsciiStr ); 425cdf0e10cSrcweir if ( !nStrLen ) 426cdf0e10cSrcweir return Erase( nIndex, nCount ); 427cdf0e10cSrcweir 428cdf0e10cSrcweir // nCount darf nicht ueber das Stringende hinnausgehen 429cdf0e10cSrcweir if ( nCount > mpData->mnLen - nIndex ) 430cdf0e10cSrcweir nCount = static_cast< xub_StrLen >(mpData->mnLen-nIndex); 431cdf0e10cSrcweir 432cdf0e10cSrcweir // Reicht eine zeichenweise Zuweisung 433cdf0e10cSrcweir if ( nCount == nStrLen ) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir ImplCopyData(); 436cdf0e10cSrcweir ImplCopyAsciiStr( mpData->maStr+nIndex, pAsciiStr, nStrLen ); 437cdf0e10cSrcweir return *this; 438cdf0e10cSrcweir } 439cdf0e10cSrcweir 440cdf0e10cSrcweir // Ueberlauf abfangen 441cdf0e10cSrcweir sal_Int32 n = ImplGetCopyLen( mpData->mnLen-nCount, nStrLen ); 442cdf0e10cSrcweir 443cdf0e10cSrcweir // Neue Daten anlegen 444cdf0e10cSrcweir STRINGDATA* pNewData = ImplAllocData( mpData->mnLen-nCount+n ); 445cdf0e10cSrcweir 446cdf0e10cSrcweir // String kopieren 447cdf0e10cSrcweir memcpy( pNewData->maStr, mpData->maStr, nIndex*sizeof( STRCODE ) ); 448cdf0e10cSrcweir ImplCopyAsciiStr( pNewData->maStr+nIndex, pAsciiStr, n ); 449cdf0e10cSrcweir memcpy( pNewData->maStr+nIndex+n, mpData->maStr+nIndex+nCount, 450cdf0e10cSrcweir (mpData->mnLen-nIndex-nCount+1)*sizeof( STRCODE ) ); 451cdf0e10cSrcweir 452cdf0e10cSrcweir // Alte Daten loeschen und Neue zuweisen 453cdf0e10cSrcweir STRING_RELEASE((STRING_TYPE *)mpData); 454cdf0e10cSrcweir mpData = pNewData; 455cdf0e10cSrcweir 456cdf0e10cSrcweir return *this; 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir // ----------------------------------------------------------------------- 460cdf0e10cSrcweir 461cdf0e10cSrcweir StringCompare UniString::CompareToAscii( const sal_Char* pAsciiStr, 462cdf0e10cSrcweir xub_StrLen nLen ) const 463cdf0e10cSrcweir { 464cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 465cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ), 466cdf0e10cSrcweir "UniString::CompareToAscii() - pAsciiStr include characters > 127" ); 467cdf0e10cSrcweir 468cdf0e10cSrcweir // String vergleichen 469cdf0e10cSrcweir sal_Int32 nCompare = ImplStringCompareAscii( mpData->maStr, pAsciiStr, nLen ); 470cdf0e10cSrcweir 471cdf0e10cSrcweir // Rueckgabewert anpassen 472cdf0e10cSrcweir if ( nCompare == 0 ) 473cdf0e10cSrcweir return COMPARE_EQUAL; 474cdf0e10cSrcweir else if ( nCompare < 0 ) 475cdf0e10cSrcweir return COMPARE_LESS; 476cdf0e10cSrcweir else 477cdf0e10cSrcweir return COMPARE_GREATER; 478cdf0e10cSrcweir } 479cdf0e10cSrcweir 480cdf0e10cSrcweir // ----------------------------------------------------------------------- 481cdf0e10cSrcweir 482cdf0e10cSrcweir StringCompare UniString::CompareIgnoreCaseToAscii( const sal_Char* pAsciiStr, 483cdf0e10cSrcweir xub_StrLen nLen ) const 484cdf0e10cSrcweir { 485cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 486cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ), 487cdf0e10cSrcweir "UniString::CompareIgnoreCaseToAscii() - pAsciiStr include characters > 127" ); 488cdf0e10cSrcweir 489cdf0e10cSrcweir // String vergleichen 490cdf0e10cSrcweir sal_Int32 nCompare = ImplStringICompareAscii( mpData->maStr, pAsciiStr, nLen ); 491cdf0e10cSrcweir 492cdf0e10cSrcweir // Rueckgabewert anpassen 493cdf0e10cSrcweir if ( nCompare == 0 ) 494cdf0e10cSrcweir return COMPARE_EQUAL; 495cdf0e10cSrcweir else if ( nCompare < 0 ) 496cdf0e10cSrcweir return COMPARE_LESS; 497cdf0e10cSrcweir else 498cdf0e10cSrcweir return COMPARE_GREATER; 499cdf0e10cSrcweir } 500cdf0e10cSrcweir 501cdf0e10cSrcweir // ----------------------------------------------------------------------- 502cdf0e10cSrcweir 503cdf0e10cSrcweir sal_Bool UniString::EqualsAscii( const sal_Char* pAsciiStr ) const 504cdf0e10cSrcweir { 505cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 506cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ), 507cdf0e10cSrcweir "UniString::EqualsAscii() - pAsciiStr include characters > 127" ); 508cdf0e10cSrcweir 509cdf0e10cSrcweir return (ImplStringCompareAscii( mpData->maStr, pAsciiStr ) == 0); 510cdf0e10cSrcweir } 511cdf0e10cSrcweir 512cdf0e10cSrcweir // ----------------------------------------------------------------------- 513cdf0e10cSrcweir 514cdf0e10cSrcweir sal_Bool UniString::EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr ) const 515cdf0e10cSrcweir { 516cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 517cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ), 518cdf0e10cSrcweir "UniString::EqualsIgnoreCaseAscii() - pAsciiStr include characters > 127" ); 519cdf0e10cSrcweir 520cdf0e10cSrcweir return (ImplStringICompareAscii( mpData->maStr, pAsciiStr ) == 0); 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir // ----------------------------------------------------------------------- 524cdf0e10cSrcweir 525cdf0e10cSrcweir sal_Bool UniString::EqualsAscii( const sal_Char* pAsciiStr, 526cdf0e10cSrcweir xub_StrLen nIndex, xub_StrLen nLen ) const 527cdf0e10cSrcweir { 528cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 529cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ), 530cdf0e10cSrcweir "UniString::EqualsAscii() - pAsciiStr include characters > 127" ); 531cdf0e10cSrcweir 532cdf0e10cSrcweir // Are there enough codes for comparing? 533cdf0e10cSrcweir if ( nIndex > mpData->mnLen ) 534cdf0e10cSrcweir return (*pAsciiStr == 0); 535cdf0e10cSrcweir 536cdf0e10cSrcweir return (ImplStringCompareAscii( mpData->maStr+nIndex, pAsciiStr, nLen ) == 0); 537cdf0e10cSrcweir } 538cdf0e10cSrcweir 539cdf0e10cSrcweir // ----------------------------------------------------------------------- 540cdf0e10cSrcweir 541cdf0e10cSrcweir sal_Bool UniString::EqualsIgnoreCaseAscii( const sal_Char* pAsciiStr, 542cdf0e10cSrcweir xub_StrLen nIndex, xub_StrLen nLen ) const 543cdf0e10cSrcweir { 544cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 545cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, nLen ), 546cdf0e10cSrcweir "UniString::EqualsIgnoreCaseAscii() - pAsciiStr include characters > 127" ); 547cdf0e10cSrcweir 548cdf0e10cSrcweir // Are there enough codes for comparing? 549cdf0e10cSrcweir if ( nIndex > mpData->mnLen ) 550cdf0e10cSrcweir return (*pAsciiStr == 0); 551cdf0e10cSrcweir 552cdf0e10cSrcweir return (ImplStringICompareAscii( mpData->maStr+nIndex, pAsciiStr, nLen ) == 0); 553cdf0e10cSrcweir } 554cdf0e10cSrcweir 555cdf0e10cSrcweir // ----------------------------------------------------------------------- 556cdf0e10cSrcweir 557cdf0e10cSrcweir xub_StrLen UniString::SearchAscii( const sal_Char* pAsciiStr, xub_StrLen nIndex ) const 558cdf0e10cSrcweir { 559cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 560cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ), 561cdf0e10cSrcweir "UniString::SearchAscii() - pAsciiStr include characters > 127" ); 562cdf0e10cSrcweir 563cdf0e10cSrcweir sal_Int32 nLen = mpData->mnLen; 564cdf0e10cSrcweir xub_StrLen nStrLen = ImplStringLen( pAsciiStr ); 565cdf0e10cSrcweir 566cdf0e10cSrcweir // Falls die Laenge des uebergebenen Strings 0 ist oder der Index 567cdf0e10cSrcweir // hinter dem String liegt, dann wurde der String nicht gefunden 568cdf0e10cSrcweir if ( !nStrLen || (nIndex >= nLen) ) 569cdf0e10cSrcweir return STRING_NOTFOUND; 570cdf0e10cSrcweir 571cdf0e10cSrcweir const sal_Unicode* pStr = mpData->maStr; 572cdf0e10cSrcweir pStr += nIndex; 573cdf0e10cSrcweir 574cdf0e10cSrcweir if ( nStrLen == 1 ) 575cdf0e10cSrcweir { 576cdf0e10cSrcweir sal_Unicode cSearch = (unsigned char)*pAsciiStr; 577cdf0e10cSrcweir while ( nIndex < nLen ) 578cdf0e10cSrcweir { 579cdf0e10cSrcweir if ( *pStr == cSearch ) 580cdf0e10cSrcweir return nIndex; 581cdf0e10cSrcweir ++pStr, 582cdf0e10cSrcweir ++nIndex; 583cdf0e10cSrcweir } 584cdf0e10cSrcweir } 585cdf0e10cSrcweir else 586cdf0e10cSrcweir { 587cdf0e10cSrcweir // Nur innerhalb des Strings suchen 588cdf0e10cSrcweir while ( nLen - nIndex >= nStrLen ) 589cdf0e10cSrcweir { 590cdf0e10cSrcweir // Stimmt der String ueberein 591cdf0e10cSrcweir if ( ImplStringCompareWithoutZeroAscii( pStr, pAsciiStr, nStrLen ) == 0 ) 592cdf0e10cSrcweir return nIndex; 593cdf0e10cSrcweir ++pStr, 594cdf0e10cSrcweir ++nIndex; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir } 597cdf0e10cSrcweir 598cdf0e10cSrcweir return STRING_NOTFOUND; 599cdf0e10cSrcweir } 600cdf0e10cSrcweir 601cdf0e10cSrcweir // ----------------------------------------------------------------------- 602cdf0e10cSrcweir 603cdf0e10cSrcweir xub_StrLen UniString::SearchAndReplaceAscii( const sal_Char* pAsciiStr, const UniString& rRepStr, 604cdf0e10cSrcweir xub_StrLen nIndex ) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 607cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ), 608cdf0e10cSrcweir "UniString::SearchAndReplaceAscii() - pAsciiStr include characters > 127" ); 609cdf0e10cSrcweir 610cdf0e10cSrcweir xub_StrLen nSPos = SearchAscii( pAsciiStr, nIndex ); 611cdf0e10cSrcweir if ( nSPos != STRING_NOTFOUND ) 612cdf0e10cSrcweir Replace( nSPos, ImplStringLen( pAsciiStr ), rRepStr ); 613cdf0e10cSrcweir 614cdf0e10cSrcweir return nSPos; 615cdf0e10cSrcweir } 616cdf0e10cSrcweir 617cdf0e10cSrcweir // ----------------------------------------------------------------------- 618cdf0e10cSrcweir 619cdf0e10cSrcweir void UniString::SearchAndReplaceAllAscii( const sal_Char* pAsciiStr, const UniString& rRepStr ) 620cdf0e10cSrcweir { 621cdf0e10cSrcweir DBG_CHKTHIS( UniString, DbgCheckUniString ); 622cdf0e10cSrcweir DBG_ASSERT( ImplDbgCheckAsciiStr( pAsciiStr, STRING_LEN ), 623cdf0e10cSrcweir "UniString::SearchAndReplaceAllAscii() - pAsciiStr include characters > 127" ); 624cdf0e10cSrcweir 625cdf0e10cSrcweir xub_StrLen nCharLen = ImplStringLen( pAsciiStr ); 626cdf0e10cSrcweir xub_StrLen nSPos = SearchAscii( pAsciiStr, 0 ); 627cdf0e10cSrcweir while ( nSPos != STRING_NOTFOUND ) 628cdf0e10cSrcweir { 629cdf0e10cSrcweir Replace( nSPos, nCharLen, rRepStr ); 630cdf0e10cSrcweir nSPos = nSPos + rRepStr.Len(); 631cdf0e10cSrcweir nSPos = SearchAscii( pAsciiStr, nSPos ); 632cdf0e10cSrcweir } 633cdf0e10cSrcweir } 634