LCOV - code coverage report
Current view: top level - sal/rtl - strtmpl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 656 742 88.4 %
Date: 2014-11-03 Functions: 103 128 80.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : /* ======================================================================= */
      21             : /* Internal C-String help functions which could be used without the        */
      22             : /* String-Class                                                            */
      23             : /* ======================================================================= */
      24             : 
      25             : #include <algorithm>
      26             : #include <cassert>
      27             : #include <limits>
      28             : 
      29             : #include <string.h>
      30             : #include <wchar.h>
      31             : #include <sal/log.hxx>
      32             : #include <rtl/character.hxx>
      33             : #include <boost/static_assert.hpp>
      34             : 
      35             : /*
      36             : inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
      37             :                               const IMPL_RTL_STRCODE* pSrc,
      38             :                               sal_Int32 nCount )
      39             : {
      40             :     while ( nCount > 0 )
      41             :     {
      42             :         *pDest = *pSrc;
      43             :         pDest++;
      44             :         pSrc++;
      45             :         nCount--;
      46             :     }
      47             : }
      48             : */
      49             : 
      50    89628118 : static inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* _pDest,
      51             :                                      const IMPL_RTL_STRCODE* _pSrc,
      52             :                                      sal_Int32 _nCount )
      53             : {
      54             :     // take advantage of builtin optimisations
      55    89628118 :     memcpy( _pDest, _pSrc, _nCount * sizeof(IMPL_RTL_STRCODE));
      56    89628118 : }
      57             : 
      58             : /* ======================================================================= */
      59             : /* C-String functions which could be used without the String-Class         */
      60             : /* ======================================================================= */
      61             : 
      62    22740027 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
      63             :     SAL_THROW_EXTERN_C()
      64             : {
      65             : // same as "if sal_Char mode"
      66             : #ifndef IMPL_RTL_INTERN
      67             :     // take advantage of builtin optimisations
      68     5038389 :     return strlen( pStr);
      69             : #else
      70             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
      71             :     {
      72             :         // take advantage of builtin optimisations
      73             :         return wcslen((wchar_t*)pStr);
      74             :     }
      75             :     else
      76             :     {
      77    17701638 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
      78   665933185 :         while( *pTempStr )
      79   630529909 :             pTempStr++;
      80    17701638 :         return pTempStr-pStr;
      81             :     }
      82             : #endif
      83             : }
      84             : 
      85             : /* ----------------------------------------------------------------------- */
      86             : 
      87    12391365 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
      88             :                                                 const IMPL_RTL_STRCODE* pStr2 )
      89             :     SAL_THROW_EXTERN_C()
      90             : {
      91             : // same as "if sal_Char mode"
      92             : #ifndef IMPL_RTL_INTERN
      93             :     // take advantage of builtin optimisations
      94      323843 :     return strcmp( pStr1, pStr2);
      95             : #else
      96             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
      97             :     {
      98             :         // take advantage of builtin optimisations
      99             :         return wcscmp((wchar_t*)pStr1, (wchar_t*)pStr2);
     100             :     }
     101             :     else
     102             :     {
     103             :         sal_Int32 nRet;
     104   641095330 :         while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
     105   314513904 :                          ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
     106             :                 *pStr2 )
     107             :         {
     108   302446382 :             pStr1++;
     109   302446382 :             pStr2++;
     110             :         }
     111             : 
     112    12067522 :         return nRet;
     113             :     }
     114             : #endif
     115             : }
     116             : 
     117             : /* ----------------------------------------------------------------------- */
     118             : 
     119   179189953 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     120             :                                                            sal_Int32 nStr1Len,
     121             :                                                            const IMPL_RTL_STRCODE* pStr2,
     122             :                                                            sal_Int32 nStr2Len )
     123             :     SAL_THROW_EXTERN_C()
     124             : {
     125             : // same as "if sal_Char mode"
     126             : #ifndef IMPL_RTL_INTERN
     127             :     // take advantage of builtin optimisations
     128   115993052 :     sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
     129   115993052 :     sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
     130   115993052 :     return nRet == 0 ? nStr1Len - nStr2Len : nRet;
     131             : #else
     132             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     133             :     {
     134             :         // take advantage of builtin optimisations
     135             :         sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
     136             :         sal_Int32 nRet = wcsncmp((wchar_t*)pStr1, (wchar_t*)pStr2, nMin);
     137             :         return nRet == 0 ? nStr1Len - nStr2Len : nRet;
     138             :     }
     139             :     else
     140             :     {
     141    63196901 :         sal_Int32 nRet = nStr1Len - nStr2Len;
     142    63196901 :         int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
     143             : 
     144    63196901 :         --pStr1;
     145    63196901 :         --pStr2;
     146    63196901 :         while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ) ;
     147             : 
     148    63196901 :         if( nCount >= 0 )
     149             :             nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
     150   233404266 :                  - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     151             : 
     152    63196901 :         return nRet;
     153             :     }
     154             : #endif
     155             : }
     156             : 
     157             : /* ----------------------------------------------------------------------- */
     158             : 
     159    73638151 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     160             :                                                                     sal_Int32 nStr1Len,
     161             :                                                                     const IMPL_RTL_STRCODE* pStr2,
     162             :                                                                     sal_Int32 nStr2Len,
     163             :                                                                     sal_Int32 nShortenedLength )
     164             :     SAL_THROW_EXTERN_C()
     165             : {
     166             : // same as "if sal_Char mode"
     167             : #ifndef IMPL_RTL_INTERN
     168             :     // take advantage of builtin optimisations
     169     1689961 :     sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
     170     1689961 :     sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
     171     1689961 :     if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
     172      280191 :         return nStr1Len - nStr2Len;
     173     1409770 :     return nRet;
     174             : #else
     175             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     176             :     {
     177             :         // take advantage of builtin optimisations
     178             :         sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
     179             :         sal_Int32 nRet = wcsncmp((wchar_t*)pStr1, (wchar_t*)pStr2, nMin);
     180             :         if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
     181             :             return nStr1Len - nStr2Len;
     182             :         return nRet;
     183             :     }
     184             :     else
     185             :     {
     186    71948190 :         const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     187    71948190 :         const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     188             :         sal_Int32               nRet;
     189   163293012 :         while ( (nShortenedLength > 0) &&
     190    89934493 :                 (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     191             :         {
     192    89934493 :             nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
     193    89934493 :                    ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     194    89934493 :             if ( nRet )
     195    70537861 :                 return nRet;
     196             : 
     197    19396632 :             nShortenedLength--;
     198    19396632 :             pStr1++;
     199    19396632 :             pStr2++;
     200             :         }
     201             : 
     202     1410329 :         if ( nShortenedLength <= 0 )
     203     1377307 :             return 0;
     204       33022 :         return nStr1Len - nStr2Len;
     205             :     }
     206             : #endif
     207             : }
     208             : 
     209             : /* ----------------------------------------------------------------------- */
     210             : 
     211   183751438 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     212             :                                                                   sal_Int32 nStr1Len,
     213             :                                                                   const IMPL_RTL_STRCODE* pStr2,
     214             :                                                                   sal_Int32 nStr2Len )
     215             :     SAL_THROW_EXTERN_C()
     216             : {
     217   183751438 :     const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
     218   183751438 :     const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
     219             :     sal_Int32               nRet;
     220  1256289774 :     while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
     221             :     {
     222  1007904163 :         pStr1Run--;
     223  1007904163 :         pStr2Run--;
     224  1007904163 :         nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
     225  1007904163 :                ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
     226  1007904163 :         if ( nRet )
     227   119117265 :             return nRet;
     228             :     }
     229             : 
     230    64634173 :     return nStr1Len - nStr2Len;
     231             : }
     232             : 
     233             : /* ----------------------------------------------------------------------- */
     234             : 
     235       80000 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
     236             :                                                                const IMPL_RTL_STRCODE* pStr2 )
     237             :     SAL_THROW_EXTERN_C()
     238             : {
     239             :     sal_uInt32 c1;
     240       53290 :     do
     241             :     {
     242       80000 :         c1 = IMPL_RTL_USTRCODE(*pStr1);
     243             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     244       80000 :             c1, IMPL_RTL_USTRCODE(*pStr2));
     245       80000 :         if ( nRet != 0 )
     246       26710 :             return nRet;
     247             : 
     248       53290 :         pStr1++;
     249       53290 :         pStr2++;
     250             :     }
     251             :     while (c1);
     252             : 
     253        7019 :     return 0;
     254             : }
     255             : 
     256             : /* ----------------------------------------------------------------------- */
     257             : 
     258     9855874 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     259             :                                                                           sal_Int32 nStr1Len,
     260             :                                                                           const IMPL_RTL_STRCODE* pStr2,
     261             :                                                                           sal_Int32 nStr2Len )
     262             :     SAL_THROW_EXTERN_C()
     263             : {
     264     9855874 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     265     9855874 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     266    37329142 :     while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     267             :     {
     268             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     269    25815374 :             IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
     270    25815374 :         if ( nRet != 0 )
     271     8197980 :             return nRet;
     272             : 
     273    17617394 :         pStr1++;
     274    17617394 :         pStr2++;
     275             :     }
     276             : 
     277     1657894 :     return nStr1Len - nStr2Len;
     278             : }
     279             : 
     280             : /* ----------------------------------------------------------------------- */
     281             : 
     282     1631097 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     283             :                                                                                    sal_Int32 nStr1Len,
     284             :                                                                                    const IMPL_RTL_STRCODE* pStr2,
     285             :                                                                                    sal_Int32 nStr2Len,
     286             :                                                                                    sal_Int32 nShortenedLength )
     287             :     SAL_THROW_EXTERN_C()
     288             : {
     289     1631097 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     290     1631097 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     291     3592781 :     while ( (nShortenedLength > 0) &&
     292     1767648 :             (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     293             :     {
     294             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     295     1767648 :             IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
     296     1767648 :         if ( nRet != 0 )
     297     1437061 :             return nRet;
     298             : 
     299      330587 :         nShortenedLength--;
     300      330587 :         pStr1++;
     301      330587 :         pStr2++;
     302             :     }
     303             : 
     304      194036 :     if ( nShortenedLength <= 0 )
     305        1668 :         return 0;
     306      192368 :     return nStr1Len - nStr2Len;
     307             : }
     308             : 
     309             : /* ----------------------------------------------------------------------- */
     310             : 
     311     6349508 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
     312             :     SAL_THROW_EXTERN_C()
     313             : {
     314     6349508 :     return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     315             : }
     316             : 
     317             : /* ----------------------------------------------------------------------- */
     318             : 
     319   107138634 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
     320             :                                                             sal_Int32 nLen )
     321             :     SAL_THROW_EXTERN_C()
     322             : {
     323   107138634 :     sal_uInt32 h = static_cast<sal_uInt32>(nLen);
     324  2439184041 :     while ( nLen > 0 )
     325             :     {
     326  2224906773 :         h = (h*37U) + IMPL_RTL_USTRCODE( *pStr );
     327  2224906773 :         pStr++;
     328  2224906773 :         nLen--;
     329             :     }
     330   107138634 :     return static_cast<sal_Int32>(h);
     331             : }
     332             : 
     333             : /* ----------------------------------------------------------------------- */
     334             : 
     335        8929 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
     336             :                                                     IMPL_RTL_STRCODE c )
     337             :     SAL_THROW_EXTERN_C()
     338             : {
     339             : // same as "if sal_Char mode"
     340             : #ifndef IMPL_RTL_INTERN
     341             :     // take advantage of builtin optimisations
     342           0 :     const IMPL_RTL_STRCODE* p = strchr(pStr, c);
     343           0 :     return p ? p - pStr : -1;
     344             : #else
     345             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     346             :     {
     347             :         // take advantage of builtin optimisations
     348             :         wchar_t* p = wcschr((wchar_t*)pStr, (wchar_t)c);
     349             :         return p ? p - (wchar_t*)pStr : -1;
     350             :     }
     351             :     else
     352             :     {
     353        8929 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
     354      129547 :         while ( *pTempStr )
     355             :         {
     356      120618 :             if ( *pTempStr == c )
     357        8929 :                 return pTempStr-pStr;
     358             : 
     359      111689 :             pTempStr++;
     360             :         }
     361             : 
     362           0 :         return -1;
     363             :     }
     364             : #endif
     365             : }
     366             : 
     367             : /* ----------------------------------------------------------------------- */
     368             : 
     369    85843780 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     370             :                                                                sal_Int32 nLen,
     371             :                                                                IMPL_RTL_STRCODE c )
     372             :     SAL_THROW_EXTERN_C()
     373             : {
     374             : // same as "if sal_Char mode"
     375             : #ifndef IMPL_RTL_INTERN
     376             :     // take advantage of builtin optimisations
     377    58213144 :     IMPL_RTL_STRCODE* p = (IMPL_RTL_STRCODE*) memchr(pStr, c, nLen);
     378    58213144 :     return p ? p - pStr : -1;
     379             : #else
     380    27630636 :     const IMPL_RTL_STRCODE* pTempStr = pStr;
     381   310306736 :     while ( nLen > 0 )
     382             :     {
     383   271692779 :         if ( *pTempStr == c )
     384    16647315 :             return pTempStr-pStr;
     385             : 
     386   255045464 :         pTempStr++;
     387   255045464 :         nLen--;
     388             :     }
     389             : 
     390    10983321 :     return -1;
     391             : #endif
     392             : }
     393             : 
     394             : /* ----------------------------------------------------------------------- */
     395             : 
     396          94 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
     397             :                                                         IMPL_RTL_STRCODE c )
     398             :     SAL_THROW_EXTERN_C()
     399             : {
     400             : // same as "if sal_Char mode"
     401             : #ifndef IMPL_RTL_INTERN
     402             :     // take advantage of builtin optimisations
     403           0 :     const IMPL_RTL_STRCODE* p = strrchr(pStr, c);
     404           0 :     return p ? p - pStr : -1;
     405             : #else
     406             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     407             :     {
     408             :         // take advantage of builtin optimisations
     409             :         wchar_t* p = wcsrchr((wchar_t*)pStr, (wchar_t)c);
     410             :         return p ? p - (wchar_t*)pStr : -1;
     411             :     }
     412             :     else
     413             :     {
     414          94 :         return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
     415             :     }
     416             : #endif
     417             : }
     418             : 
     419             : /* ----------------------------------------------------------------------- */
     420             : 
     421     2670959 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     422             :                                                                    sal_Int32 nLen,
     423             :                                                                    IMPL_RTL_STRCODE c )
     424             :     SAL_THROW_EXTERN_C()
     425             : {
     426     2670959 :     pStr += nLen;
     427    49209641 :     while ( nLen > 0 )
     428             :     {
     429    46111426 :         nLen--;
     430    46111426 :         pStr--;
     431             : 
     432    46111426 :         if ( *pStr == c )
     433     2243703 :             return nLen;
     434             :     }
     435             : 
     436      427256 :     return -1;
     437             : }
     438             : 
     439             : /* ----------------------------------------------------------------------- */
     440             : 
     441         373 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
     442             :                                                    const IMPL_RTL_STRCODE* pSubStr )
     443             :     SAL_THROW_EXTERN_C()
     444             : {
     445             : // same as "if sal_Char mode"
     446             : #ifndef IMPL_RTL_INTERN
     447             :     // take advantage of builtin optimisations
     448         373 :     const IMPL_RTL_STRCODE* p = strstr(pStr, pSubStr);
     449         373 :     return p ? p - pStr : -1;
     450             : #else
     451             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     452             :     {
     453             :         // take advantage of builtin optimisations
     454             :         wchar_t* p = wcsstr((wchar_t*)pStr, (wchar_t*)pSubStr);
     455             :         return p ? p - (wchar_t*)pStr : -1;
     456             :     }
     457             :     else
     458             :     {
     459             :        return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     460           0 :                                                          pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     461             :     }
     462             : #endif
     463             : }
     464             : 
     465             : /* ----------------------------------------------------------------------- */
     466             : 
     467    34127610 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
     468             :                                                               sal_Int32 nStrLen,
     469             :                                                               const  IMPL_RTL_STRCODE* pSubStr,
     470             :                                                               sal_Int32 nSubLen )
     471             :     SAL_THROW_EXTERN_C()
     472             : {
     473             :     /* faster search for a single character */
     474    34127610 :     if ( nSubLen < 2 )
     475             :     {
     476             :         /* an empty SubString is always not findable */
     477     7338608 :         if ( nSubLen == 1 )
     478             :         {
     479     7338452 :             IMPL_RTL_STRCODE        c = *pSubStr;
     480     7338452 :             const IMPL_RTL_STRCODE* pTempStr = pStr;
     481    86315824 :             while ( nStrLen > 0 )
     482             :             {
     483    74840783 :                 if ( *pTempStr == c )
     484     3201863 :                     return pTempStr-pStr;
     485             : 
     486    71638920 :                 pTempStr++;
     487    71638920 :                 nStrLen--;
     488             :             }
     489             :         }
     490             :     }
     491             :     else
     492             :     {
     493    26789002 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
     494   571636522 :         while ( nStrLen > 0 )
     495             :         {
     496   525076493 :             if ( *pTempStr == *pSubStr )
     497             :             {
     498             :                 /* Compare SubString */
     499    20540883 :                 if ( nSubLen <= nStrLen )
     500             :                 {
     501    19180641 :                     const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
     502    19180641 :                     const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     503    19180641 :                     sal_Int32               nTempLen = nSubLen;
     504    75458927 :                     while ( nTempLen )
     505             :                     {
     506    50620553 :                         if ( *pTempStr1 != *pTempStr2 )
     507    13522908 :                             break;
     508             : 
     509    37097645 :                         pTempStr1++;
     510    37097645 :                         pTempStr2++;
     511    37097645 :                         nTempLen--;
     512             :                     }
     513             : 
     514    19180641 :                     if ( !nTempLen )
     515     5657733 :                         return pTempStr-pStr;
     516             :                 }
     517             :                 else
     518     1360242 :                     break;
     519             :             }
     520             : 
     521   518058518 :             nStrLen--;
     522   518058518 :             pTempStr++;
     523             :         }
     524             :     }
     525             : 
     526    25268014 :     return -1;
     527             : }
     528             : 
     529             : /* ----------------------------------------------------------------------- */
     530             : 
     531           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
     532             :                                                        const IMPL_RTL_STRCODE* pSubStr )
     533             :     SAL_THROW_EXTERN_C()
     534             : {
     535             :     return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     536           0 :                                                           pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     537             : }
     538             : 
     539             : /* ----------------------------------------------------------------------- */
     540             : 
     541      217596 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
     542             :                                                                   sal_Int32 nStrLen,
     543             :                                                                   const IMPL_RTL_STRCODE* pSubStr,
     544             :                                                                   sal_Int32 nSubLen )
     545             :     SAL_THROW_EXTERN_C()
     546             : {
     547             :     /* faster search for a single character */
     548      217596 :     if ( nSubLen < 2 )
     549             :     {
     550             :         /* an empty SubString is always not findable */
     551       10092 :         if ( nSubLen == 1 )
     552             :         {
     553       10090 :             IMPL_RTL_STRCODE c = *pSubStr;
     554       10090 :             pStr += nStrLen;
     555      118882 :             while ( nStrLen > 0 )
     556             :             {
     557      101478 :                 nStrLen--;
     558      101478 :                 pStr--;
     559             : 
     560      101478 :                 if ( *pStr == c )
     561        2776 :                     return nStrLen;
     562             :             }
     563             :         }
     564             :     }
     565             :     else
     566             :     {
     567      207504 :         pStr += nStrLen;
     568      207504 :         nStrLen -= nSubLen;
     569      207504 :         pStr -= nSubLen;
     570     7314887 :         while ( nStrLen >= 0 )
     571             :         {
     572     6993903 :             const IMPL_RTL_STRCODE* pTempStr1 = pStr;
     573     6993903 :             const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     574     6993903 :             sal_Int32               nTempLen = nSubLen;
     575    14385985 :             while ( nTempLen )
     576             :             {
     577     7298058 :                 if ( *pTempStr1 != *pTempStr2 )
     578     6899879 :                     break;
     579             : 
     580      398179 :                 pTempStr1++;
     581      398179 :                 pTempStr2++;
     582      398179 :                 nTempLen--;
     583             :             }
     584             : 
     585     6993903 :             if ( !nTempLen )
     586       94024 :                 return nStrLen;
     587             : 
     588     6899879 :             nStrLen--;
     589     6899879 :             pStr--;
     590             :         }
     591             :     }
     592             : 
     593      120796 :     return -1;
     594             : }
     595             : 
     596             : /* ----------------------------------------------------------------------- */
     597             : 
     598           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
     599             :                                                IMPL_RTL_STRCODE cOld,
     600             :                                                IMPL_RTL_STRCODE cNew )
     601             :     SAL_THROW_EXTERN_C()
     602             : {
     603           0 :     while ( *pStr )
     604             :     {
     605           0 :         if ( *pStr == cOld )
     606           0 :             *pStr = cNew;
     607             : 
     608           0 :         pStr++;
     609             :     }
     610           0 : }
     611             : 
     612             : /* ----------------------------------------------------------------------- */
     613             : 
     614           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
     615             :                                                           sal_Int32 nLen,
     616             :                                                           IMPL_RTL_STRCODE cOld,
     617             :                                                           IMPL_RTL_STRCODE cNew )
     618             :     SAL_THROW_EXTERN_C()
     619             : {
     620           0 :     while ( nLen > 0 )
     621             :     {
     622           0 :         if ( *pStr == cOld )
     623           0 :             *pStr = cNew;
     624             : 
     625           0 :         pStr++;
     626           0 :         nLen--;
     627             :     }
     628           0 : }
     629             : 
     630             : /* ----------------------------------------------------------------------- */
     631             : 
     632           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
     633             :     SAL_THROW_EXTERN_C()
     634             : {
     635           0 :     while ( *pStr )
     636             :     {
     637           0 :         *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
     638             : 
     639           0 :         pStr++;
     640             :     }
     641           0 : }
     642             : 
     643             : /* ----------------------------------------------------------------------- */
     644             : 
     645     2969184 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     646             :                                                                sal_Int32 nLen )
     647             :     SAL_THROW_EXTERN_C()
     648             : {
     649    31072266 :     while ( nLen > 0 )
     650             :     {
     651    25133898 :         *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
     652             : 
     653    25133898 :         pStr++;
     654    25133898 :         nLen--;
     655             :     }
     656     2969184 : }
     657             : 
     658             : /* ----------------------------------------------------------------------- */
     659             : 
     660           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
     661             :     SAL_THROW_EXTERN_C()
     662             : {
     663           0 :     while ( *pStr )
     664             :     {
     665           0 :         *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
     666             : 
     667           0 :         pStr++;
     668             :     }
     669           0 : }
     670             : 
     671             : /* ----------------------------------------------------------------------- */
     672             : 
     673           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     674             :                                                                sal_Int32 nLen )
     675             :     SAL_THROW_EXTERN_C()
     676             : {
     677           0 :     while ( nLen > 0 )
     678             :     {
     679           0 :         *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
     680             : 
     681           0 :         pStr++;
     682           0 :         nLen--;
     683             :     }
     684           0 : }
     685             : 
     686             : /* ----------------------------------------------------------------------- */
     687             : 
     688           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
     689             :     SAL_THROW_EXTERN_C()
     690             : {
     691           0 :     return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     692             : }
     693             : 
     694             : /* ----------------------------------------------------------------------- */
     695             : 
     696           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
     697             :     SAL_THROW_EXTERN_C()
     698             : {
     699           0 :     sal_Int32 nPreSpaces    = 0;
     700           0 :     sal_Int32 nPostSpaces   = 0;
     701           0 :     sal_Int32 nIndex        = nLen-1;
     702             : 
     703           0 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
     704           0 :         nPreSpaces++;
     705             : 
     706           0 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
     707             :     {
     708           0 :         nPostSpaces++;
     709           0 :         nIndex--;
     710             :     }
     711             : 
     712           0 :     if ( nPostSpaces )
     713             :     {
     714           0 :         nLen -= nPostSpaces;
     715           0 :         *(pStr+nLen) = 0;
     716             :     }
     717             : 
     718           0 :     if ( nPreSpaces )
     719             :     {
     720           0 :         IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
     721             : 
     722           0 :         nLen -= nPreSpaces;
     723           0 :         nIndex = nLen;
     724             : 
     725           0 :         while ( nIndex )
     726             :         {
     727           0 :             *pStr = *pNewStr;
     728           0 :             pStr++;
     729           0 :             pNewStr++;
     730           0 :             nIndex--;
     731             :         }
     732           0 :         *pStr = 0;
     733             :     }
     734             : 
     735           0 :     return nLen;
     736             : }
     737             : 
     738             : /* ----------------------------------------------------------------------- */
     739             : 
     740        2100 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
     741             :     SAL_THROW_EXTERN_C()
     742             : {
     743        2100 :     if ( b )
     744             :     {
     745        1984 :         *pStr = 't';
     746        1984 :         pStr++;
     747        1984 :         *pStr = 'r';
     748        1984 :         pStr++;
     749        1984 :         *pStr = 'u';
     750        1984 :         pStr++;
     751        1984 :         *pStr = 'e';
     752        1984 :         pStr++;
     753        1984 :         *pStr = 0;
     754        1984 :         return 4;
     755             :     }
     756             :     else
     757             :     {
     758         116 :         *pStr = 'f';
     759         116 :         pStr++;
     760         116 :         *pStr = 'a';
     761         116 :         pStr++;
     762         116 :         *pStr = 'l';
     763         116 :         pStr++;
     764         116 :         *pStr = 's';
     765         116 :         pStr++;
     766         116 :         *pStr = 'e';
     767         116 :         pStr++;
     768         116 :         *pStr = 0;
     769         116 :         return 5;
     770             :     }
     771             : }
     772             : 
     773             : /* ----------------------------------------------------------------------- */
     774             : 
     775           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
     776             :                                                     IMPL_RTL_STRCODE c )
     777             :     SAL_THROW_EXTERN_C()
     778             : {
     779           0 :     *pStr++ = c;
     780           0 :     *pStr = 0;
     781           0 :     return 1;
     782             : }
     783             : 
     784             : /* ----------------------------------------------------------------------- */
     785             : 
     786     4261589 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
     787             :                                                      sal_Int32 n,
     788             :                                                      sal_Int16 nRadix )
     789             :     SAL_THROW_EXTERN_C()
     790             : {
     791             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT32];
     792     4261589 :     sal_Char*   pBuf = aBuf;
     793     4261589 :     sal_Int32   nLen = 0;
     794             :     sal_uInt32  nValue;
     795             : 
     796             :     /* Radix must be valid */
     797     4261589 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     798          10 :         nRadix = 10;
     799             : 
     800             :     /* is value negativ */
     801     4261589 :     if ( n < 0 )
     802             :     {
     803        6523 :         *pStr = '-';
     804        6523 :         pStr++;
     805        6523 :         nLen++;
     806        6523 :         nValue = n == SAL_MIN_INT32 ? static_cast<sal_uInt32>(n) : -n;
     807             :     }
     808             :     else
     809     4255066 :         nValue = n;
     810             : 
     811             :     /* create a recursive buffer with all values, except the last one */
     812     7805074 :     do
     813             :     {
     814     7805074 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     815     7805074 :         nValue /= nRadix;
     816     7805074 :         if ( nDigit > 9 )
     817      169692 :             *pBuf = (nDigit-10) + 'a';
     818             :         else
     819     7635382 :             *pBuf = (nDigit + '0' );
     820     7805074 :         pBuf++;
     821             :     }
     822             :     while ( nValue > 0 );
     823             : 
     824             :     /* copy the values in the right direction into the destination buffer */
     825     7805074 :     do
     826             :     {
     827     7805074 :         pBuf--;
     828     7805074 :         *pStr = *pBuf;
     829     7805074 :         pStr++;
     830     7805074 :         nLen++;
     831             :     }
     832             :     while ( pBuf != aBuf );
     833     4261589 :     *pStr = 0;
     834             : 
     835     4261589 :     return nLen;
     836             : }
     837             : 
     838             : /* ----------------------------------------------------------------------- */
     839             : 
     840    12010635 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
     841             :                                                      sal_Int64 n,
     842             :                                                      sal_Int16 nRadix )
     843             :     SAL_THROW_EXTERN_C()
     844             : {
     845             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT64];
     846    12010635 :     sal_Char*   pBuf = aBuf;
     847    12010635 :     sal_Int32   nLen = 0;
     848             :     sal_uInt64  nValue;
     849             : 
     850             :     /* Radix must be valid */
     851    12010635 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     852          10 :         nRadix = 10;
     853             : 
     854             :     /* is value negativ */
     855    12010635 :     if ( n < 0 )
     856             :     {
     857        1033 :         *pStr = '-';
     858        1033 :         pStr++;
     859        1033 :         nLen++;
     860        1033 :         nValue = n == SAL_MIN_INT64 ? static_cast<sal_uInt64>(n) : -n;
     861             :     }
     862             :     else
     863    12009602 :         nValue = n;
     864             : 
     865             :     /* create a recursive buffer with all values, except the last one */
     866    25952645 :     do
     867             :     {
     868    25952645 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     869    25952645 :         nValue /= nRadix;
     870    25952645 :         if ( nDigit > 9 )
     871    13707116 :             *pBuf = (nDigit-10) + 'a';
     872             :         else
     873    12245529 :             *pBuf = (nDigit + '0' );
     874    25952645 :         pBuf++;
     875             :     }
     876             :     while ( nValue > 0 );
     877             : 
     878             :     /* copy the values in the right direction into the destination buffer */
     879    25952645 :     do
     880             :     {
     881    25952645 :         pBuf--;
     882    25952645 :         *pStr = *pBuf;
     883    25952645 :         pStr++;
     884    25952645 :         nLen++;
     885             :     }
     886             :     while ( pBuf != aBuf );
     887    12010635 :     *pStr = 0;
     888             : 
     889    12010635 :     return nLen;
     890             : }
     891             : 
     892             : /* ----------------------------------------------------------------------- */
     893             : 
     894      128701 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfUInt64 )( IMPL_RTL_STRCODE* pStr,
     895             :                                                       sal_uInt64 n,
     896             :                                                       sal_Int16 nRadix )
     897             :     SAL_THROW_EXTERN_C()
     898             : {
     899             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFUINT64];
     900      128701 :     sal_Char*   pBuf = aBuf;
     901      128701 :     sal_Int32   nLen = 0;
     902             :     sal_uInt64  nValue;
     903             : 
     904             :     /* Radix must be valid */
     905      128701 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     906           0 :         nRadix = 10;
     907             : 
     908      128701 :     nValue = n;
     909             : 
     910             :     /* create a recursive buffer with all values, except the last one */
     911      416003 :     do
     912             :     {
     913      416003 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     914      416003 :         nValue /= nRadix;
     915      416003 :         if ( nDigit > 9 )
     916      135516 :             *pBuf = (nDigit-10) + 'a';
     917             :         else
     918      280487 :             *pBuf = (nDigit + '0' );
     919      416003 :         pBuf++;
     920             :     }
     921             :     while ( nValue > 0 );
     922             : 
     923             :     /* copy the values in the right direction into the destination buffer */
     924      416003 :     do
     925             :     {
     926      416003 :         pBuf--;
     927      416003 :         *pStr = *pBuf;
     928      416003 :         pStr++;
     929      416003 :         nLen++;
     930             :     }
     931             :     while ( pBuf != aBuf );
     932      128701 :     *pStr = 0;
     933             : 
     934      128701 :     return nLen;
     935             : }
     936             : 
     937             : /* ----------------------------------------------------------------------- */
     938             : 
     939       10834 : sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
     940             :     SAL_THROW_EXTERN_C()
     941             : {
     942       10834 :     if ( *pStr == '1' )
     943           4 :         return sal_True;
     944             : 
     945       10830 :     if ( (*pStr == 'T') || (*pStr == 't') )
     946             :     {
     947           8 :         pStr++;
     948           8 :         if ( (*pStr == 'R') || (*pStr == 'r') )
     949             :         {
     950           8 :             pStr++;
     951           8 :             if ( (*pStr == 'U') || (*pStr == 'u') )
     952             :             {
     953           8 :                 pStr++;
     954           8 :                 if ( (*pStr == 'E') || (*pStr == 'e') )
     955           8 :                     return sal_True;
     956             :             }
     957             :         }
     958             :     }
     959             : 
     960       10822 :     return sal_False;
     961             : }
     962             : 
     963             : /* ----------------------------------------------------------------------- */
     964             : namespace {
     965     4688868 :     template<typename T, typename U> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
     966             :                                                                      sal_Int16 nRadix )
     967             :     {
     968             :         BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed);
     969             :         bool    bNeg;
     970             :         sal_Int16   nDigit;
     971     4688868 :         U           n = 0;
     972             : 
     973     4688868 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     974           0 :             nRadix = 10;
     975             : 
     976             :         /* Skip whitespaces */
     977     9377902 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
     978         166 :             pStr++;
     979             : 
     980     4688868 :         if ( *pStr == '-' )
     981             :         {
     982       64841 :             bNeg = true;
     983       64841 :             pStr++;
     984             :         }
     985             :         else
     986             :         {
     987     4624027 :             if ( *pStr == '+' )
     988           4 :                 pStr++;
     989     4624027 :             bNeg = false;
     990             :         }
     991             : 
     992             :         T nDiv;
     993             :         sal_Int16 nMod;
     994     4688868 :         if ( bNeg )
     995             :         {
     996       64841 :             nDiv = std::numeric_limits<T>::min() / nRadix;
     997       64841 :             nMod = std::numeric_limits<T>::min() % nRadix;
     998             :             // Cater for C++03 implementations that round the quotient down
     999             :             // instead of truncating towards zero as mandated by C++11:
    1000       64841 :             if ( nMod > 0 )
    1001             :             {
    1002           0 :                 --nDiv;
    1003           0 :                 nMod -= nRadix;
    1004             :             }
    1005       64841 :             nDiv = -nDiv;
    1006       64841 :             nMod = -nMod;
    1007             :         }
    1008             :         else
    1009             :         {
    1010     4624027 :             nDiv = std::numeric_limits<T>::max() / nRadix;
    1011     4624027 :             nMod = std::numeric_limits<T>::max() % nRadix;
    1012             :         }
    1013             : 
    1014    19940515 :         while ( *pStr )
    1015             :         {
    1016    11149251 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
    1017    11149251 :             if ( nDigit < 0 )
    1018      585594 :                 break;
    1019             :             assert(nDiv > 0);
    1020    10563657 :             if( static_cast<U>( nMod < nDigit ? nDiv-1 : nDiv ) < n )
    1021         878 :                 return 0;
    1022             : 
    1023    10562779 :             n *= nRadix;
    1024    10562779 :             n += nDigit;
    1025             : 
    1026    10562779 :             pStr++;
    1027             :         }
    1028             : 
    1029     4687990 :         if ( bNeg )
    1030       64833 :             return n == static_cast<U>(std::numeric_limits<T>::min())
    1031       64833 :                 ? std::numeric_limits<T>::min() : -static_cast<T>(n);
    1032             :         else
    1033     4623157 :             return static_cast<T>(n);
    1034             :     }
    1035             : }
    1036             : 
    1037     4465336 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
    1038             :                                                 sal_Int16 nRadix )
    1039             :     SAL_THROW_EXTERN_C()
    1040             : {
    1041     4465336 :     return IMPL_RTL_STRNAME( toInt )<sal_Int32, sal_uInt32>(pStr, nRadix);
    1042             : }
    1043             : 
    1044      223532 : sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
    1045             :                                                 sal_Int16 nRadix )
    1046             :     SAL_THROW_EXTERN_C()
    1047             : {
    1048      223532 :     return IMPL_RTL_STRNAME( toInt )<sal_Int64, sal_uInt64>(pStr, nRadix);
    1049             : }
    1050             : 
    1051             : /* ----------------------------------------------------------------------- */
    1052             : namespace {
    1053      864694 :     template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
    1054             :                                                                       sal_Int16 nRadix )
    1055             :     {
    1056             :         BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
    1057             :         sal_Int16   nDigit;
    1058      864694 :         T           n = 0;
    1059             : 
    1060      864694 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
    1061           0 :             nRadix = 10;
    1062             : 
    1063             :         /* Skip whitespaces */
    1064     1729388 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
    1065           0 :             ++pStr;
    1066             : 
    1067             :         // skip optional explicit sign
    1068      864694 :         if ( *pStr == '+' )
    1069           0 :             ++pStr;
    1070             : 
    1071      864694 :         T nDiv = std::numeric_limits<T>::max() / nRadix;
    1072      864694 :         sal_Int16 nMod = std::numeric_limits<T>::max() % nRadix;
    1073     6511431 :         while ( *pStr )
    1074             :         {
    1075     4827813 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
    1076     4827813 :             if ( nDigit < 0 )
    1077       35864 :                 break;
    1078     4791949 :             if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
    1079        9906 :                 return 0;
    1080             : 
    1081     4782043 :             n *= nRadix;
    1082     4782043 :             n += nDigit;
    1083             : 
    1084     4782043 :             ++pStr;
    1085             :         }
    1086             : 
    1087      854788 :         return n;
    1088             :     }
    1089             : }
    1090             : 
    1091      850642 : sal_uInt32 SAL_CALL IMPL_RTL_STRNAME( toUInt32 )( const IMPL_RTL_STRCODE* pStr,
    1092             :                                                   sal_Int16 nRadix )
    1093             :     SAL_THROW_EXTERN_C()
    1094             : {
    1095      850642 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt32>(pStr, nRadix);
    1096             : }
    1097             : 
    1098       14052 : sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr,
    1099             :                                                   sal_Int16 nRadix )
    1100             :     SAL_THROW_EXTERN_C()
    1101             : {
    1102       14052 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt64>(pStr, nRadix);
    1103             : }
    1104             : 
    1105             : /* ======================================================================= */
    1106             : /* Internal String-Class help functions                                    */
    1107             : /* ======================================================================= */
    1108             : 
    1109   219059226 : static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
    1110             : {
    1111             :     IMPL_RTL_STRINGDATA * pData
    1112   219059226 :         = (sal::static_int_cast< sal_uInt32 >(nLen)
    1113   219059251 :            <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
    1114   219059251 :                / sizeof (IMPL_RTL_STRCODE)))
    1115             :         ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory(
    1116   219059251 :             sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE))
    1117   438118502 :         : NULL;
    1118   314993151 :     if (pData != NULL) {
    1119   219059718 :         pData->refCount = 1;
    1120   219059718 :         pData->length = nLen;
    1121   219059718 :         pData->buffer[nLen] = 0;
    1122             :     }
    1123   314993151 :     return pData;
    1124             : }
    1125             : 
    1126             : /* ----------------------------------------------------------------------- */
    1127             : 
    1128     3168075 : static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
    1129             :                                                              IMPL_RTL_STRINGDATA* pStr,
    1130             :                                                              sal_Int32 nCount )
    1131             : {
    1132             :     IMPL_RTL_STRCODE*       pDest;
    1133             :     const IMPL_RTL_STRCODE* pSrc;
    1134     3168075 :     IMPL_RTL_STRINGDATA*    pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1135             :     OSL_ASSERT(pData != NULL);
    1136             : 
    1137     3168075 :     pDest   = pData->buffer;
    1138     3168075 :     pSrc    = pStr->buffer;
    1139    10548221 :     while ( nCount > 0 )
    1140             :     {
    1141     4212071 :         *pDest = *pSrc;
    1142     4212071 :         pDest++;
    1143     4212071 :         pSrc++;
    1144     4212071 :         nCount--;
    1145             :     }
    1146             : 
    1147     3168075 :     *ppThis = pData;
    1148             : 
    1149             :     RTL_LOG_STRING_NEW( pData );
    1150     3168075 :     return pDest;
    1151             : }
    1152             : 
    1153             : /* ======================================================================= */
    1154             : /* String-Class functions                                                  */
    1155             : /* ======================================================================= */
    1156             : 
    1157             : #define IMPL_RTL_AQUIRE( pThis )                                \
    1158             : {                                                               \
    1159             :     if (!SAL_STRING_IS_STATIC (pThis))                          \
    1160             :         osl_atomic_increment( &((pThis)->refCount) );  \
    1161             : }
    1162             : 
    1163             : /* ----------------------------------------------------------------------- */
    1164             : 
    1165  1178702569 : void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
    1166             :     SAL_THROW_EXTERN_C()
    1167             : {
    1168  1178702569 :     IMPL_RTL_AQUIRE( pThis );
    1169  1178702569 : }
    1170             : 
    1171             : /* ----------------------------------------------------------------------- */
    1172             : 
    1173  2509368495 : void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
    1174             :     SAL_THROW_EXTERN_C()
    1175             : {
    1176  2509368495 :     if (SAL_STRING_IS_STATIC (pThis))
    1177  1049469059 :         return;
    1178             : 
    1179             : /* OString doesn't have an 'intern' */
    1180             : #ifdef IMPL_RTL_INTERN
    1181  1507224095 :     if (SAL_STRING_IS_INTERN (pThis))
    1182             :     {
    1183    11795269 :         internRelease (pThis);
    1184    11795269 :         return;
    1185             :     }
    1186             : #endif
    1187             : 
    1188  1568743638 :     if ( !osl_atomic_decrement( &(pThis->refCount) ) )
    1189             :     {
    1190             :         RTL_LOG_STRING_DELETE( pThis );
    1191   312857601 :         rtl_freeMemory( pThis );
    1192             :     }
    1193             : }
    1194             : 
    1195             : /* ----------------------------------------------------------------------- */
    1196             : 
    1197   576601597 : void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
    1198             :     SAL_THROW_EXTERN_C()
    1199             : {
    1200   576601597 :     if ( *ppThis)
    1201    18452687 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1202             : 
    1203   576601599 :     *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING);
    1204   576601599 : }
    1205             : 
    1206             : /* ----------------------------------------------------------------------- */
    1207             : 
    1208     9389139 : IMPL_RTL_STRINGDATA* SAL_CALL IMPL_RTL_STRINGNAME( alloc )( sal_Int32 nLen )
    1209             :     SAL_THROW_EXTERN_C()
    1210             : {
    1211     9389139 :     if ( nLen < 0 )
    1212           0 :         return NULL;
    1213             :     else
    1214     9389139 :         return IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1215             : }
    1216             : 
    1217             : /* ----------------------------------------------------------------------- */
    1218             : 
    1219    48695455 : void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
    1220             :     SAL_THROW_EXTERN_C()
    1221             : {
    1222    48695455 :     if ( nLen <= 0 )
    1223      710960 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1224             :     else
    1225             :     {
    1226    47984495 :         if ( *ppThis)
    1227     7885972 :             IMPL_RTL_STRINGNAME( release )( *ppThis );
    1228             : 
    1229    47984495 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1230             :         OSL_ASSERT(*ppThis != NULL);
    1231    47984502 :         (*ppThis)->length   = 0;
    1232             : 
    1233    47984502 :         IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
    1234    47984502 :         memset(pTempStr, 0, nLen*sizeof(IMPL_RTL_STRCODE));
    1235             :     }
    1236    48695462 : }
    1237             : 
    1238             : /* ----------------------------------------------------------------------- */
    1239             : 
    1240       66288 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
    1241             :                                                     const IMPL_RTL_STRINGDATA* pStr )
    1242             :     SAL_THROW_EXTERN_C()
    1243             : {
    1244             :     IMPL_RTL_STRINGDATA* pOrg;
    1245             : 
    1246       66288 :     if ( !pStr->length )
    1247             :     {
    1248           2 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1249       66290 :         return;
    1250             :     }
    1251             : 
    1252       66286 :     pOrg = *ppThis;
    1253       66286 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1254             :     OSL_ASSERT(*ppThis != NULL);
    1255       66286 :     rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
    1256             :     RTL_LOG_STRING_NEW( *ppThis );
    1257             : 
    1258             :     /* must be done last, if pStr == *ppThis */
    1259       66286 :     if ( pOrg )
    1260           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1261             : }
    1262             : 
    1263             : /* ----------------------------------------------------------------------- */
    1264             : 
    1265    25319715 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
    1266             :                                                  const IMPL_RTL_STRCODE* pCharStr )
    1267             :     SAL_THROW_EXTERN_C()
    1268             : {
    1269             :     IMPL_RTL_STRCODE*       pBuffer;
    1270             :     IMPL_RTL_STRINGDATA*    pOrg;
    1271             :     sal_Int32               nLen;
    1272             : 
    1273    25319715 :     if ( pCharStr )
    1274             :     {
    1275    25317690 :         const IMPL_RTL_STRCODE* pTempStr = pCharStr;
    1276   289164043 :         while( *pTempStr )
    1277   238528663 :             pTempStr++;
    1278    25317690 :         nLen = pTempStr-pCharStr;
    1279             :     }
    1280             :     else
    1281        2025 :         nLen = 0;
    1282             : 
    1283    25319715 :     if ( !nLen )
    1284             :     {
    1285     3321009 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1286    28640724 :         return;
    1287             :     }
    1288             : 
    1289    21998706 :     pOrg = *ppThis;
    1290    21998706 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1291             :     OSL_ASSERT(*ppThis != NULL);
    1292    21998706 :     pBuffer = (*ppThis)->buffer;
    1293   238528681 :     do
    1294             :     {
    1295   238528681 :         *pBuffer = *pCharStr;
    1296   238528681 :         pBuffer++;
    1297   238528681 :         pCharStr++;
    1298             :     }
    1299             :     while ( *pCharStr );
    1300             : 
    1301             :     RTL_LOG_STRING_NEW( *ppThis );
    1302             : 
    1303             :     /* must be done last, if pCharStr == *ppThis */
    1304    21998706 :     if ( pOrg )
    1305      136175 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1306             : }
    1307             : 
    1308             : /* ----------------------------------------------------------------------- */
    1309             : 
    1310    66461433 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
    1311             :                                                             const IMPL_RTL_STRCODE* pCharStr,
    1312             :                                                             sal_Int32 nLen )
    1313             :     SAL_THROW_EXTERN_C()
    1314             : {
    1315             :     IMPL_RTL_STRINGDATA* pOrg;
    1316             : 
    1317    66461433 :     if ( !pCharStr || (nLen <= 0) )
    1318             :     {
    1319      893152 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1320    67354609 :         return;
    1321             :     }
    1322             : 
    1323    65568281 :     pOrg = *ppThis;
    1324    65568281 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1325             :     OSL_ASSERT(*ppThis != NULL);
    1326    65568307 :     rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
    1327             : 
    1328             :     RTL_LOG_STRING_NEW( *ppThis );
    1329             : 
    1330             :     /* must be done last, if pCharStr == *ppThis */
    1331    65568307 :     if ( pOrg )
    1332     1669595 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1333             : }
    1334             : 
    1335             : /* ----------------------------------------------------------------------- */
    1336             : 
    1337    22674926 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromSubString )( IMPL_RTL_STRINGDATA** ppThis,
    1338             :                                                        const IMPL_RTL_STRINGDATA* pFrom,
    1339             :                                                        sal_Int32 beginIndex,
    1340             :                                                        sal_Int32 count )
    1341             :     SAL_THROW_EXTERN_C()
    1342             : {
    1343    22674926 :     if ( beginIndex == 0 && count == pFrom->length )
    1344             :     {
    1345     2538634 :         IMPL_RTL_STRINGNAME( assign )( ppThis, const_cast< IMPL_RTL_STRINGDATA * >( pFrom ) );
    1346     2538635 :         return;
    1347             :     }
    1348    20136292 :     if ( count < 0 || beginIndex < 0 || beginIndex + count > pFrom->length )
    1349             :     {
    1350             :         assert(false); // fail fast at least in debug builds
    1351           0 :         IMPL_RTL_STRINGNAME( newFromLiteral )( ppThis, "!!br0ken!!", 10, 0 );
    1352           0 :         return;
    1353             :     }
    1354             : 
    1355    20136307 :     IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pFrom->buffer + beginIndex, count );
    1356             : }
    1357             : 
    1358             : /* ----------------------------------------------------------------------- */
    1359             : 
    1360             : // Used when creating from string literals.
    1361    55184905 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromLiteral )( IMPL_RTL_STRINGDATA** ppThis,
    1362             :                                                      const sal_Char* pCharStr,
    1363             :                                                      sal_Int32 nLen,
    1364             :                                                      sal_Int32 allocExtra )
    1365             :     SAL_THROW_EXTERN_C()
    1366             : {
    1367    55184905 :     if ( nLen + allocExtra == 0 )
    1368             :     {
    1369           0 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1370    55184955 :         return;
    1371             :     }
    1372             : 
    1373    55184905 :     if ( *ppThis )
    1374     9133498 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1375             : 
    1376    55184905 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen + allocExtra );
    1377             :     assert( *ppThis != NULL );
    1378             : 
    1379    55184955 :     (*ppThis)->length = nLen; // fix after possible allocExtra != 0
    1380    55184955 :     (*ppThis)->buffer[nLen] = 0;
    1381    55184955 :     IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
    1382             :     sal_Int32 nCount;
    1383   941599780 :     for( nCount = nLen; nCount > 0; --nCount )
    1384             :     {
    1385             :         /* Check ASCII range */
    1386             :         SAL_WARN_IF( ((unsigned char)*pCharStr) > 127, "rtl.string",
    1387             :                     "rtl_uString_newFromLiteral - Found char > 127" );
    1388             :         SAL_WARN_IF( ((unsigned char)*pCharStr) == '\0', "rtl.string",
    1389             :                     "rtl_uString_newFromLiteral - Found embedded \\0 character" );
    1390             : 
    1391   886414825 :         *pBuffer = *pCharStr;
    1392   886414825 :         pBuffer++;
    1393   886414825 :         pCharStr++;
    1394             :     }
    1395             : 
    1396             :     RTL_LOG_STRING_NEW( *ppThis );
    1397             : }
    1398             : 
    1399             : /* ----------------------------------------------------------------------- */
    1400             : 
    1401   431409158 : void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
    1402             :                                              IMPL_RTL_STRINGDATA* pStr )
    1403             :     SAL_THROW_EXTERN_C()
    1404             : {
    1405             :     /* must be done at first, if pStr == *ppThis */
    1406   431409158 :     IMPL_RTL_AQUIRE( pStr );
    1407             : 
    1408   431409158 :     if ( *ppThis )
    1409   426760577 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1410             : 
    1411   431408818 :     *ppThis = pStr;
    1412   431408818 : }
    1413             : 
    1414             : /* ----------------------------------------------------------------------- */
    1415             : 
    1416      735999 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
    1417             :     SAL_THROW_EXTERN_C()
    1418             : {
    1419      735999 :     return pThis->length;
    1420             : }
    1421             : 
    1422             : /* ----------------------------------------------------------------------- */
    1423             : 
    1424     1496477 : IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
    1425             :     SAL_THROW_EXTERN_C()
    1426             : {
    1427     1496477 :     return pThis->buffer;
    1428             : }
    1429             : 
    1430             : /* ----------------------------------------------------------------------- */
    1431             : 
    1432    18918650 : void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
    1433             :                                                 IMPL_RTL_STRINGDATA* pLeft,
    1434             :                                                 IMPL_RTL_STRINGDATA* pRight )
    1435             :     SAL_THROW_EXTERN_C()
    1436             : {
    1437    18918650 :     IMPL_RTL_STRINGDATA* pOrg = *ppThis;
    1438             : 
    1439             :     /* Test for 0-Pointer - if not, change newReplaceStrAt! */
    1440    18918650 :     if ( !pRight || !pRight->length )
    1441             :     {
    1442     1182490 :         *ppThis = pLeft;
    1443     1182490 :         IMPL_RTL_AQUIRE( pLeft );
    1444             :     }
    1445    17736160 :     else if ( !pLeft || !pLeft->length )
    1446             :     {
    1447     6206348 :         *ppThis = pRight;
    1448     6206348 :         IMPL_RTL_AQUIRE( pRight );
    1449             :     }
    1450             :     else
    1451             :     {
    1452    11529812 :         IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
    1453             :         OSL_ASSERT(pTempStr != NULL);
    1454    11529812 :         rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
    1455    11529812 :         rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
    1456    11529812 :         *ppThis = pTempStr;
    1457             : 
    1458             :         RTL_LOG_STRING_NEW( *ppThis );
    1459             :     }
    1460             : 
    1461             :     /* must be done last, if left or right == *ppThis */
    1462    18918650 :     if ( pOrg )
    1463    15760055 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1464    18918650 : }
    1465             : 
    1466             : /* ----------------------------------------------------------------------- */
    1467             : 
    1468       88744 : void SAL_CALL IMPL_RTL_STRINGNAME( ensureCapacity )( IMPL_RTL_STRINGDATA** ppThis,
    1469             :                                                      sal_Int32 size )
    1470             :     SAL_THROW_EXTERN_C()
    1471             : {
    1472       88744 :     IMPL_RTL_STRINGDATA* const pOrg = *ppThis;
    1473       88744 :     if ( pOrg->refCount == 1 && pOrg->length >= size )
    1474       88748 :         return;
    1475             :     assert( pOrg->length <= size ); // do not truncate
    1476       88740 :     IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( size );
    1477       88740 :     rtl_str_ImplCopy( pTempStr->buffer, pOrg->buffer, pOrg->length );
    1478             :     // right now the length is still the same as of the original
    1479       88740 :     pTempStr->length = pOrg->length;
    1480       88740 :     pTempStr->buffer[ pOrg->length ] = '\0';
    1481       88740 :     *ppThis = pTempStr;
    1482             :     RTL_LOG_STRING_NEW( *ppThis );
    1483             : 
    1484       88740 :     IMPL_RTL_STRINGNAME( release )( pOrg );
    1485             : }
    1486             : 
    1487             : /* ----------------------------------------------------------------------- */
    1488             : 
    1489     3588846 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
    1490             :                                                       IMPL_RTL_STRINGDATA* pStr,
    1491             :                                                       sal_Int32 nIndex,
    1492             :                                                       sal_Int32 nCount,
    1493             :                                                       IMPL_RTL_STRINGDATA* pNewSubStr )
    1494             :     SAL_THROW_EXTERN_C()
    1495             : {
    1496             :     /* Append? */
    1497     3588846 :     if ( nIndex >= pStr->length )
    1498             :     {
    1499             :         /* newConcat test, if pNewSubStr is 0 */
    1500     3156854 :         IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
    1501     3156854 :         return;
    1502             :     }
    1503             : 
    1504             :     /* negativ index? */
    1505      431992 :     if ( nIndex < 0 )
    1506             :     {
    1507           0 :         nCount -= nIndex;
    1508           0 :         nIndex = 0;
    1509             :     }
    1510             : 
    1511             :     /* not more than the String length could be deleted */
    1512      431992 :     if ( nCount >= pStr->length-nIndex )
    1513             :     {
    1514      266962 :         nCount = pStr->length-nIndex;
    1515             : 
    1516             :         /* Assign of NewSubStr? */
    1517      266962 :         if ( !nIndex && (nCount >= pStr->length) )
    1518             :         {
    1519      116826 :             if ( !pNewSubStr )
    1520           0 :                 IMPL_RTL_STRINGNAME( new )( ppThis );
    1521             :             else
    1522      116826 :                 IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
    1523      116826 :             return;
    1524             :         }
    1525             :     }
    1526             : 
    1527             :     /* Assign of Str? */
    1528      315166 :     if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
    1529             :     {
    1530        1156 :         IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
    1531        1156 :         return;
    1532             :     }
    1533             : 
    1534      314010 :     IMPL_RTL_STRINGDATA*    pOrg = *ppThis;
    1535             :     IMPL_RTL_STRCODE*       pBuffer;
    1536             :     sal_Int32               nNewLen;
    1537             : 
    1538             :     /* Calculate length of the new string */
    1539      314010 :     nNewLen = pStr->length-nCount;
    1540      314010 :     if ( pNewSubStr )
    1541      314010 :         nNewLen += pNewSubStr->length;
    1542             : 
    1543             :     /* Alloc New Buffer */
    1544      314010 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
    1545             :     OSL_ASSERT(*ppThis != NULL);
    1546      314010 :     pBuffer = (*ppThis)->buffer;
    1547      314010 :     if ( nIndex )
    1548             :     {
    1549      182927 :         rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
    1550      182927 :         pBuffer += nIndex;
    1551             :     }
    1552      314010 :     if ( pNewSubStr && pNewSubStr->length )
    1553             :     {
    1554      238278 :         rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
    1555      238278 :         pBuffer += pNewSubStr->length;
    1556             :     }
    1557      314010 :     rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
    1558             : 
    1559             :     RTL_LOG_STRING_NEW( *ppThis );
    1560             :     /* must be done last, if pStr or pNewSubStr == *ppThis */
    1561      314010 :     if ( pOrg )
    1562           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1563             : }
    1564             : 
    1565             : /* ----------------------------------------------------------------------- */
    1566             : 
    1567      834987 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
    1568             :                                                  IMPL_RTL_STRINGDATA* pStr,
    1569             :                                                  IMPL_RTL_STRCODE cOld,
    1570             :                                                  IMPL_RTL_STRCODE cNew )
    1571             :     SAL_THROW_EXTERN_C()
    1572             : {
    1573      834987 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1574      834987 :     int                     bChanged    = 0;
    1575      834987 :     sal_Int32               nLen        = pStr->length;
    1576      834987 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1577             : 
    1578    10046761 :     while ( nLen > 0 )
    1579             :     {
    1580     8738285 :         if ( *pCharStr == cOld )
    1581             :         {
    1582             :             /* Copy String */
    1583      361498 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1584             : 
    1585             :             /* replace/copy rest of the string */
    1586      361498 :             if ( pNewCharStr )
    1587             :             {
    1588      361498 :                 *pNewCharStr = cNew;
    1589      361498 :                 pNewCharStr++;
    1590      361498 :                 pCharStr++;
    1591      361498 :                 nLen--;
    1592             : 
    1593     5279487 :                 while ( nLen > 0 )
    1594             :                 {
    1595     4556491 :                     if ( *pCharStr == cOld )
    1596      300408 :                         *pNewCharStr = cNew;
    1597             :                     else
    1598     4256083 :                         *pNewCharStr = *pCharStr;
    1599             : 
    1600     4556491 :                     pNewCharStr++;
    1601     4556491 :                     pCharStr++;
    1602     4556491 :                     nLen--;
    1603             :                 }
    1604             :             }
    1605             : 
    1606      361498 :             bChanged = 1;
    1607      361498 :             break;
    1608             :         }
    1609             : 
    1610     8376787 :         pCharStr++;
    1611     8376787 :         nLen--;
    1612             :     }
    1613             : 
    1614      834987 :     if ( !bChanged )
    1615             :     {
    1616      473489 :         *ppThis = pStr;
    1617      473489 :         IMPL_RTL_AQUIRE( pStr );
    1618             :     }
    1619             : 
    1620             :     RTL_LOG_STRING_NEW( *ppThis );
    1621             :     /* must be done last, if pStr == *ppThis */
    1622      834987 :     if ( pOrg )
    1623           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1624      834987 : }
    1625             : 
    1626             : /* ----------------------------------------------------------------------- */
    1627             : 
    1628     5499314 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
    1629             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1630             :     SAL_THROW_EXTERN_C()
    1631             : {
    1632     5499314 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1633     5499314 :     int                     bChanged    = 0;
    1634     5499314 :     sal_Int32               nLen        = pStr->length;
    1635     5499314 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1636             : 
    1637    25791732 :     while ( nLen > 0 )
    1638             :     {
    1639    17526179 :         if ( rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr)) )
    1640             :         {
    1641             :             /* Copy String */
    1642     2733075 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1643             : 
    1644             :             /* replace/copy rest of the string */
    1645     2733075 :             if ( pNewCharStr )
    1646             :             {
    1647     2733075 :                 *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
    1648     2733075 :                 pNewCharStr++;
    1649     2733075 :                 pCharStr++;
    1650     2733075 :                 nLen--;
    1651             : 
    1652    35120204 :                 while ( nLen > 0 )
    1653             :                 {
    1654    29654054 :                     *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
    1655             : 
    1656    29654054 :                     pNewCharStr++;
    1657    29654054 :                     pCharStr++;
    1658    29654054 :                     nLen--;
    1659             :                 }
    1660             :             }
    1661             : 
    1662     2733075 :             bChanged = 1;
    1663     2733075 :             break;
    1664             :         }
    1665             : 
    1666    14793104 :         pCharStr++;
    1667    14793104 :         nLen--;
    1668             :     }
    1669             : 
    1670     5499314 :     if ( !bChanged )
    1671             :     {
    1672     2766239 :         *ppThis = pStr;
    1673     2766239 :         IMPL_RTL_AQUIRE( pStr );
    1674             :     }
    1675             : 
    1676             :     RTL_LOG_STRING_NEW( *ppThis );
    1677             :     /* must be done last, if pStr == *ppThis */
    1678     5499314 :     if ( pOrg )
    1679           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1680     5499314 : }
    1681             : 
    1682             : /* ----------------------------------------------------------------------- */
    1683             : 
    1684     1079875 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
    1685             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1686             :     SAL_THROW_EXTERN_C()
    1687             : {
    1688     1079875 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1689     1079875 :     int                     bChanged    = 0;
    1690     1079875 :     sal_Int32               nLen        = pStr->length;
    1691     1079875 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1692             : 
    1693     4362597 :     while ( nLen > 0 )
    1694             :     {
    1695     2276349 :         if ( rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr)) )
    1696             :         {
    1697             :             /* Copy String */
    1698       73502 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1699             : 
    1700             :             /* replace/copy rest of the string */
    1701       73502 :             if ( pNewCharStr )
    1702             :             {
    1703       73502 :                 *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
    1704       73502 :                 pNewCharStr++;
    1705       73502 :                 pCharStr++;
    1706       73502 :                 nLen--;
    1707             : 
    1708     1134579 :                 while ( nLen > 0 )
    1709             :                 {
    1710      987575 :                     *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
    1711             : 
    1712      987575 :                     pNewCharStr++;
    1713      987575 :                     pCharStr++;
    1714      987575 :                     nLen--;
    1715             :                 }
    1716             :             }
    1717             : 
    1718       73502 :             bChanged = 1;
    1719       73502 :             break;
    1720             :         }
    1721             : 
    1722     2202847 :         pCharStr++;
    1723     2202847 :         nLen--;
    1724             :     }
    1725             : 
    1726     1079875 :     if ( !bChanged )
    1727             :     {
    1728     1006373 :         *ppThis = pStr;
    1729     1006373 :         IMPL_RTL_AQUIRE( pStr );
    1730             :     }
    1731             : 
    1732             :     RTL_LOG_STRING_NEW( *ppThis );
    1733             :     /* must be done last, if pStr == *ppThis */
    1734     1079875 :     if ( pOrg )
    1735           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1736     1079875 : }
    1737             : 
    1738             : /* ----------------------------------------------------------------------- */
    1739             : 
    1740      429981 : void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
    1741             :                                               IMPL_RTL_STRINGDATA* pStr )
    1742             :     SAL_THROW_EXTERN_C()
    1743             : {
    1744      429981 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1745      429981 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1746      429981 :     sal_Int32               nPreSpaces  = 0;
    1747      429981 :     sal_Int32               nPostSpaces = 0;
    1748      429981 :     sal_Int32               nLen        = pStr->length;
    1749      429981 :     sal_Int32               nIndex      = nLen-1;
    1750             : 
    1751     1553633 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
    1752      693671 :         nPreSpaces++;
    1753             : 
    1754      966316 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
    1755             :     {
    1756      106354 :         nPostSpaces++;
    1757      106354 :         nIndex--;
    1758             :     }
    1759             : 
    1760      429981 :     if ( !nPreSpaces && !nPostSpaces )
    1761             :     {
    1762      320098 :         *ppThis = pStr;
    1763      320098 :         IMPL_RTL_AQUIRE( pStr );
    1764             :     }
    1765             :     else
    1766             :     {
    1767      109883 :         nLen -= nPostSpaces+nPreSpaces;
    1768      109883 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1769             :         assert(*ppThis);
    1770      109883 :         rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
    1771             :     }
    1772             : 
    1773             :     RTL_LOG_STRING_NEW( *ppThis );
    1774             :     /* must be done last, if pStr == *ppThis */
    1775      429981 :     if ( pOrg )
    1776           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1777      429981 : }
    1778             : 
    1779             : /* ----------------------------------------------------------------------- */
    1780             : 
    1781     8084688 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
    1782             :                                                     IMPL_RTL_STRINGDATA* pStr,
    1783             :                                                     sal_Int32 nToken,
    1784             :                                                     IMPL_RTL_STRCODE cTok,
    1785             :                                                     sal_Int32 nIndex )
    1786             :     SAL_THROW_EXTERN_C()
    1787             : {
    1788     8084688 :     const IMPL_RTL_STRCODE* pCharStr        = pStr->buffer;
    1789             :     const IMPL_RTL_STRCODE* pCharStrStart;
    1790             :     const IMPL_RTL_STRCODE* pOrgCharStr;
    1791     8084688 :     sal_Int32               nLen            = pStr->length-nIndex;
    1792     8084688 :     sal_Int32               nTokCount       = 0;
    1793             : 
    1794             :     // Set ppThis to an empty string and return -1 if either nToken or nIndex is
    1795             :     // negative:
    1796     8084688 :     if (nIndex < 0)
    1797        2640 :         nToken = -1;
    1798             : 
    1799     8084688 :     pCharStr += nIndex;
    1800     8084688 :     pOrgCharStr = pCharStr;
    1801     8084688 :     pCharStrStart = pCharStr;
    1802    63076056 :     while ( nLen > 0 )
    1803             :     {
    1804    51103517 :         if ( *pCharStr == cTok )
    1805             :         {
    1806     4418366 :             nTokCount++;
    1807             : 
    1808     4418366 :             if ( nTokCount == nToken )
    1809      112914 :                 pCharStrStart = pCharStr+1;
    1810             :             else
    1811             :             {
    1812     4305452 :                 if ( nTokCount > nToken )
    1813     4196837 :                     break;
    1814             :             }
    1815             :         }
    1816             : 
    1817    46906680 :         pCharStr++;
    1818    46906680 :         nLen--;
    1819             :     }
    1820             : 
    1821     8084688 :     if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
    1822             :     {
    1823     2970909 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1824     2970913 :         if( (nToken < 0) || (nTokCount < nToken ) )
    1825        4776 :             return -1;
    1826     2966137 :         else if( nLen > 0 )
    1827      643363 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1828     2322774 :         else return -1;
    1829             :     }
    1830             :     else
    1831             :     {
    1832     5113779 :         IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
    1833     5113779 :         if ( nLen )
    1834     3552914 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1835             :         else
    1836     1560865 :             return -1;
    1837             :     }
    1838             : }
    1839             : 
    1840             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10