LCOV - code coverage report
Current view: top level - sal/rtl - strtmpl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 660 746 88.5 %
Date: 2015-06-13 12:38:46 Functions: 106 130 81.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 <cstring>
      30             : #include <wchar.h>
      31             : #include <sal/log.hxx>
      32             : #include <rtl/character.hxx>
      33             : 
      34             : /*
      35             : inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
      36             :                               const IMPL_RTL_STRCODE* pSrc,
      37             :                               sal_Int32 nCount )
      38             : {
      39             :     while ( nCount > 0 )
      40             :     {
      41             :         *pDest = *pSrc;
      42             :         pDest++;
      43             :         pSrc++;
      44             :         nCount--;
      45             :     }
      46             : }
      47             : */
      48             : 
      49   523108637 : static inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* _pDest,
      50             :                                      const IMPL_RTL_STRCODE* _pSrc,
      51             :                                      sal_Int32 _nCount )
      52             : {
      53             :     // take advantage of builtin optimisations
      54   523108637 :     memcpy( _pDest, _pSrc, _nCount * sizeof(IMPL_RTL_STRCODE));
      55   523108637 : }
      56             : 
      57             : /* ======================================================================= */
      58             : /* C-String functions which could be used without the String-Class         */
      59             : /* ======================================================================= */
      60             : 
      61   186622156 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
      62             :     SAL_THROW_EXTERN_C()
      63             : {
      64             :     assert(pStr);
      65             : #if !IMPL_RTL_IS_USTRING
      66             :     // take advantage of builtin optimisations
      67   174335030 :     return strlen( pStr);
      68             : #else
      69             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
      70             :     {
      71             :         // take advantage of builtin optimisations
      72             :         return wcslen(reinterpret_cast<wchar_t const *>(pStr));
      73             :     }
      74             :     else
      75             :     {
      76    12287126 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
      77   493723263 :         while( *pTempStr )
      78   469149011 :             pTempStr++;
      79    12287126 :         return pTempStr-pStr;
      80             :     }
      81             : #endif
      82             : }
      83             : 
      84             : /* ----------------------------------------------------------------------- */
      85             : 
      86    61978852 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
      87             :                                                 const IMPL_RTL_STRCODE* pStr2 )
      88             :     SAL_THROW_EXTERN_C()
      89             : {
      90             :     assert(pStr1);
      91             :     assert(pStr2);
      92             : #if !IMPL_RTL_IS_USTRING
      93             :     // take advantage of builtin optimisations
      94      394453 :     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(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2));
     100             :     }
     101             :     else
     102             :     {
     103             :         sal_Int32 nRet;
     104  1989147313 :         while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
     105   963781457 :                          ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
     106             :                 *pStr2 )
     107             :         {
     108   902197058 :             pStr1++;
     109   902197058 :             pStr2++;
     110             :         }
     111             : 
     112    61584399 :         return nRet;
     113             :     }
     114             : #endif
     115             : }
     116             : 
     117             : /* ----------------------------------------------------------------------- */
     118             : 
     119  3483223385 : 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             :     assert(nStr1Len >= 0);
     126             :     assert(nStr2Len >= 0);
     127             : #if !IMPL_RTL_IS_USTRING
     128             :     // take advantage of builtin optimisations
     129    78560190 :     sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
     130    78560190 :     sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
     131    78560190 :     return nRet == 0 ? nStr1Len - nStr2Len : nRet;
     132             : #else
     133             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     134             :     {
     135             :         // take advantage of builtin optimisations
     136             :         sal_Int32 nMin = std::min(nStr1Len, nStr2Len);
     137             :         sal_Int32 nRet = wcsncmp(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2), nMin);
     138             :         return nRet == 0 ? nStr1Len - nStr2Len : nRet;
     139             :     }
     140             :     else
     141             :     {
     142  3404663195 :         sal_Int32 nRet = nStr1Len - nStr2Len;
     143  3404663195 :         int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
     144             : 
     145  3404663195 :         --pStr1;
     146  3404663195 :         --pStr2;
     147  3404663195 :         while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ) ;
     148             : 
     149  3404663195 :         if( nCount >= 0 )
     150             :             nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
     151  2538493118 :                  - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     152             : 
     153  3404663195 :         return nRet;
     154             :     }
     155             : #endif
     156             : }
     157             : 
     158             : /* ----------------------------------------------------------------------- */
     159             : 
     160    39879312 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     161             :                                                                     sal_Int32 nStr1Len,
     162             :                                                                     const IMPL_RTL_STRCODE* pStr2,
     163             :                                                                     sal_Int32 nStr2Len,
     164             :                                                                     sal_Int32 nShortenedLength )
     165             :     SAL_THROW_EXTERN_C()
     166             : {
     167             :     assert(nStr1Len >= 0);
     168             :     assert(nStr2Len >= 0);
     169             :     assert(nShortenedLength >= 0);
     170             : #if !IMPL_RTL_IS_USTRING
     171             :     // take advantage of builtin optimisations
     172     1289551 :     sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
     173     1289551 :     sal_Int32 nRet = strncmp(pStr1, pStr2, nMin);
     174     1289551 :     if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
     175      221991 :         return nStr1Len - nStr2Len;
     176     1067560 :     return nRet;
     177             : #else
     178             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     179             :     {
     180             :         // take advantage of builtin optimisations
     181             :         sal_Int32 nMin = std::min(std::min(nStr1Len, nStr2Len), nShortenedLength);
     182             :         sal_Int32 nRet = wcsncmp(reinterpret_cast<wchar_t const *>(pStr1), reinterpret_cast<wchar_t const *>(pStr2), nMin);
     183             :         if (nRet == 0 && nShortenedLength > std::min(nStr1Len, nStr2Len))
     184             :             return nStr1Len - nStr2Len;
     185             :         return nRet;
     186             :     }
     187             :     else
     188             :     {
     189    38589761 :         const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     190    38589761 :         const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     191             :         sal_Int32               nRet;
     192    86915979 :         while ( (nShortenedLength > 0) &&
     193    47486863 :                 (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     194             :         {
     195    47486863 :             nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
     196    47486863 :                    ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     197    47486863 :             if ( nRet )
     198    37750406 :                 return nRet;
     199             : 
     200     9736457 :             nShortenedLength--;
     201     9736457 :             pStr1++;
     202     9736457 :             pStr2++;
     203             :         }
     204             : 
     205      839355 :         if ( nShortenedLength <= 0 )
     206      804455 :             return 0;
     207       34900 :         return nStr1Len - nStr2Len;
     208             :     }
     209             : #endif
     210             : }
     211             : 
     212             : /* ----------------------------------------------------------------------- */
     213             : 
     214  3192937488 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     215             :                                                                   sal_Int32 nStr1Len,
     216             :                                                                   const IMPL_RTL_STRCODE* pStr2,
     217             :                                                                   sal_Int32 nStr2Len )
     218             :     SAL_THROW_EXTERN_C()
     219             : {
     220             :     assert(nStr1Len >= 0);
     221             :     assert(nStr2Len >= 0);
     222  3192937488 :     const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
     223  3192937488 :     const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
     224             :     sal_Int32               nRet;
     225 14295044505 :     while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
     226             :     {
     227  9443190926 :         pStr1Run--;
     228  9443190926 :         pStr2Run--;
     229  9443190926 :         nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
     230  9443190926 :                ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
     231  9443190926 :         if ( nRet )
     232  1534021397 :             return nRet;
     233             :     }
     234             : 
     235  1658916091 :     return nStr1Len - nStr2Len;
     236             : }
     237             : 
     238             : /* ----------------------------------------------------------------------- */
     239             : 
     240      203405 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
     241             :                                                                const IMPL_RTL_STRCODE* pStr2 )
     242             :     SAL_THROW_EXTERN_C()
     243             : {
     244             :     assert(pStr1);
     245             :     assert(pStr2);
     246             :     sal_uInt32 c1;
     247      167853 :     do
     248             :     {
     249      203405 :         c1 = IMPL_RTL_USTRCODE(*pStr1);
     250             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     251      203405 :             c1, IMPL_RTL_USTRCODE(*pStr2));
     252      203405 :         if ( nRet != 0 )
     253       35552 :             return nRet;
     254             : 
     255      167853 :         pStr1++;
     256      167853 :         pStr2++;
     257             :     }
     258             :     while (c1);
     259             : 
     260       14855 :     return 0;
     261             : }
     262             : 
     263             : /* ----------------------------------------------------------------------- */
     264             : 
     265  8564409362 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     266             :                                                                           sal_Int32 nStr1Len,
     267             :                                                                           const IMPL_RTL_STRCODE* pStr2,
     268             :                                                                           sal_Int32 nStr2Len )
     269             :     SAL_THROW_EXTERN_C()
     270             : {
     271             :     assert(nStr1Len >= 0);
     272             :     assert(nStr2Len >= 0);
     273  8564409362 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     274  8564409362 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     275 29592460223 :     while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     276             :     {
     277             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     278 19276856980 :             IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
     279 19276856980 :         if ( nRet != 0 )
     280  6813215481 :             return nRet;
     281             : 
     282 12463641499 :         pStr1++;
     283 12463641499 :         pStr2++;
     284             :     }
     285             : 
     286  1751193881 :     return nStr1Len - nStr2Len;
     287             : }
     288             : 
     289             : /* ----------------------------------------------------------------------- */
     290             : 
     291     1078946 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     292             :                                                                                    sal_Int32 nStr1Len,
     293             :                                                                                    const IMPL_RTL_STRCODE* pStr2,
     294             :                                                                                    sal_Int32 nStr2Len,
     295             :                                                                                    sal_Int32 nShortenedLength )
     296             :     SAL_THROW_EXTERN_C()
     297             : {
     298             :     assert(nStr1Len >= 0);
     299             :     assert(nStr2Len >= 0);
     300             :     assert(nShortenedLength >= 0);
     301     1078946 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     302     1078946 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     303     2385973 :     while ( (nShortenedLength > 0) &&
     304     1177820 :             (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     305             :     {
     306             :         sal_Int32 nRet = rtl::compareIgnoreAsciiCase(
     307     1177820 :             IMPL_RTL_USTRCODE(*pStr1), IMPL_RTL_USTRCODE(*pStr2));
     308     1177820 :         if ( nRet != 0 )
     309      949739 :             return nRet;
     310             : 
     311      228081 :         nShortenedLength--;
     312      228081 :         pStr1++;
     313      228081 :         pStr2++;
     314             :     }
     315             : 
     316      129207 :     if ( nShortenedLength <= 0 )
     317        1261 :         return 0;
     318      127946 :     return nStr1Len - nStr2Len;
     319             : }
     320             : 
     321             : /* ----------------------------------------------------------------------- */
     322             : 
     323     4408789 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
     324             :     SAL_THROW_EXTERN_C()
     325             : {
     326     4408789 :     return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     327             : }
     328             : 
     329             : /* ----------------------------------------------------------------------- */
     330             : 
     331   111899454 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
     332             :                                                             sal_Int32 nLen )
     333             :     SAL_THROW_EXTERN_C()
     334             : {
     335             :     assert(nLen >= 0);
     336   111899454 :     sal_uInt32 h = static_cast<sal_uInt32>(nLen);
     337  3408807793 :     while ( nLen > 0 )
     338             :     {
     339  3185008885 :         h = (h*37U) + IMPL_RTL_USTRCODE( *pStr );
     340  3185008885 :         pStr++;
     341  3185008885 :         nLen--;
     342             :     }
     343   111899454 :     return static_cast<sal_Int32>(h);
     344             : }
     345             : 
     346             : /* ----------------------------------------------------------------------- */
     347             : 
     348        5763 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
     349             :                                                     IMPL_RTL_STRCODE c )
     350             :     SAL_THROW_EXTERN_C()
     351             : {
     352             :     assert(pStr);
     353             : #if !IMPL_RTL_IS_USTRING
     354             :     // take advantage of builtin optimisations
     355           0 :     const IMPL_RTL_STRCODE* p = strchr(pStr, c);
     356           0 :     return p ? p - pStr : -1;
     357             : #else
     358             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     359             :     {
     360             :         // take advantage of builtin optimisations
     361             :         wchar_t const * p = wcschr(reinterpret_cast<wchar_t const *>(pStr), (wchar_t)c);
     362             :         return p ? p - reinterpret_cast<wchar_t const *>(pStr) : -1;
     363             :     }
     364             :     else
     365             :     {
     366        5763 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
     367       83370 :         while ( *pTempStr )
     368             :         {
     369       77607 :             if ( *pTempStr == c )
     370        5763 :                 return pTempStr-pStr;
     371             : 
     372       71844 :             pTempStr++;
     373             :         }
     374             : 
     375           0 :         return -1;
     376             :     }
     377             : #endif
     378             : }
     379             : 
     380             : /* ----------------------------------------------------------------------- */
     381             : 
     382   160413310 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     383             :                                                                sal_Int32 nLen,
     384             :                                                                IMPL_RTL_STRCODE c )
     385             :     SAL_THROW_EXTERN_C()
     386             : {
     387             : //    assert(nLen >= 0);
     388             : #if !IMPL_RTL_IS_USTRING
     389             :     // take advantage of builtin optimisations
     390   124239479 :     IMPL_RTL_STRCODE* p = static_cast<IMPL_RTL_STRCODE*>(std::memchr(const_cast<IMPL_RTL_STRCODE *>(pStr), c, nLen));
     391   124239479 :     return p ? p - pStr : -1;
     392             : #else
     393    36173831 :     const IMPL_RTL_STRCODE* pTempStr = pStr;
     394   386673168 :     while ( nLen > 0 )
     395             :     {
     396   330464770 :         if ( *pTempStr == c )
     397    16139264 :             return pTempStr-pStr;
     398             : 
     399   314325506 :         pTempStr++;
     400   314325506 :         nLen--;
     401             :     }
     402             : 
     403    20034567 :     return -1;
     404             : #endif
     405             : }
     406             : 
     407             : /* ----------------------------------------------------------------------- */
     408             : 
     409          69 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
     410             :                                                         IMPL_RTL_STRCODE c )
     411             :     SAL_THROW_EXTERN_C()
     412             : {
     413             :     assert(pStr);
     414             : #if !IMPL_RTL_IS_USTRING
     415             :     // take advantage of builtin optimisations
     416           0 :     const IMPL_RTL_STRCODE* p = strrchr(pStr, c);
     417           0 :     return p ? p - pStr : -1;
     418             : #else
     419             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     420             :     {
     421             :         // take advantage of builtin optimisations
     422             :         wchar_t const * p = wcsrchr(reinterpret_cast<wchar_t const *>(pStr), (wchar_t)c);
     423             :         return p ? p - reinterpret_cast<wchar_t const *>(pStr) : -1;
     424             :     }
     425             :     else
     426             :     {
     427          69 :         return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
     428             :     }
     429             : #endif
     430             : }
     431             : 
     432             : /* ----------------------------------------------------------------------- */
     433             : 
     434     1834899 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     435             :                                                                    sal_Int32 nLen,
     436             :                                                                    IMPL_RTL_STRCODE c )
     437             :     SAL_THROW_EXTERN_C()
     438             : {
     439             :     assert(nLen >= 0);
     440     1834899 :     pStr += nLen;
     441    34454452 :     while ( nLen > 0 )
     442             :     {
     443    32286773 :         nLen--;
     444    32286773 :         pStr--;
     445             : 
     446    32286773 :         if ( *pStr == c )
     447     1502119 :             return nLen;
     448             :     }
     449             : 
     450      332780 :     return -1;
     451             : }
     452             : 
     453             : /* ----------------------------------------------------------------------- */
     454             : 
     455         245 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
     456             :                                                    const IMPL_RTL_STRCODE* pSubStr )
     457             :     SAL_THROW_EXTERN_C()
     458             : {
     459             :     assert(pStr);
     460             :     assert(pSubStr);
     461             : #if !IMPL_RTL_IS_USTRING
     462             :     // take advantage of builtin optimisations
     463         245 :     const IMPL_RTL_STRCODE* p = strstr(pStr, pSubStr);
     464         245 :     return p ? p - pStr : -1;
     465             : #else
     466             :     if (sizeof(IMPL_RTL_STRCODE) == sizeof(wchar_t))
     467             :     {
     468             :         // take advantage of builtin optimisations
     469             :         wchar_t const * p = wcsstr(reinterpret_cast<wchar_t const *>(pStr), reinterpret_cast<wchar_t const *>(pSubStr));
     470             :         return p ? p - reinterpret_cast<wchar_t const *>(pStr) : -1;
     471             :     }
     472             :     else
     473             :     {
     474             :        return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     475           0 :                                                          pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     476             :     }
     477             : #endif
     478             : }
     479             : 
     480             : /* ----------------------------------------------------------------------- */
     481             : 
     482   192834800 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
     483             :                                                               sal_Int32 nStrLen,
     484             :                                                               const  IMPL_RTL_STRCODE* pSubStr,
     485             :                                                               sal_Int32 nSubLen )
     486             :     SAL_THROW_EXTERN_C()
     487             : {
     488             :     assert(nStrLen >= 0);
     489             :     assert(nSubLen >= 0);
     490             :     /* faster search for a single character */
     491   192834800 :     if ( nSubLen < 2 )
     492             :     {
     493             :         /* an empty SubString is always not findable */
     494   175597718 :         if ( nSubLen == 1 )
     495             :         {
     496   175597658 :             IMPL_RTL_STRCODE        c = *pSubStr;
     497   175597658 :             const IMPL_RTL_STRCODE* pTempStr = pStr;
     498  1870418514 :             while ( nStrLen > 0 )
     499             :             {
     500  1521233368 :                 if ( *pTempStr == c )
     501     2010170 :                     return pTempStr-pStr;
     502             : 
     503  1519223198 :                 pTempStr++;
     504  1519223198 :                 nStrLen--;
     505             :             }
     506             :         }
     507             :     }
     508             :     else
     509             :     {
     510    17237082 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
     511   443976471 :         while ( nStrLen > 0 )
     512             :         {
     513   414031370 :             if ( *pTempStr == *pSubStr )
     514             :             {
     515             :                 /* Compare SubString */
     516    13776740 :                 if ( nSubLen <= nStrLen )
     517             :                 {
     518    12933873 :                     const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
     519    12933873 :                     const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     520    12933873 :                     sal_Int32               nTempLen = nSubLen;
     521    50303219 :                     while ( nTempLen )
     522             :                     {
     523    33683150 :                         if ( *pTempStr1 != *pTempStr2 )
     524     9247677 :                             break;
     525             : 
     526    24435473 :                         pTempStr1++;
     527    24435473 :                         pTempStr2++;
     528    24435473 :                         nTempLen--;
     529             :                     }
     530             : 
     531    12933873 :                     if ( !nTempLen )
     532     3686196 :                         return pTempStr-pStr;
     533             :                 }
     534             :                 else
     535      842867 :                     break;
     536             :             }
     537             : 
     538   409502307 :             nStrLen--;
     539   409502307 :             pTempStr++;
     540             :         }
     541             :     }
     542             : 
     543   187138434 :     return -1;
     544             : }
     545             : 
     546             : /* ----------------------------------------------------------------------- */
     547             : 
     548           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
     549             :                                                        const IMPL_RTL_STRCODE* pSubStr )
     550             :     SAL_THROW_EXTERN_C()
     551             : {
     552             :     return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     553           0 :                                                           pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     554             : }
     555             : 
     556             : /* ----------------------------------------------------------------------- */
     557             : 
     558      135005 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
     559             :                                                                   sal_Int32 nStrLen,
     560             :                                                                   const IMPL_RTL_STRCODE* pSubStr,
     561             :                                                                   sal_Int32 nSubLen )
     562             :     SAL_THROW_EXTERN_C()
     563             : {
     564             : //    assert(nStrLen >= 0);
     565             :     assert(nSubLen >= 0);
     566             :     /* faster search for a single character */
     567      135005 :     if ( nSubLen < 2 )
     568             :     {
     569             :         /* an empty SubString is always not findable */
     570        4714 :         if ( nSubLen == 1 )
     571             :         {
     572        4713 :             IMPL_RTL_STRCODE c = *pSubStr;
     573        4713 :             pStr += nStrLen;
     574       53409 :             while ( nStrLen > 0 )
     575             :             {
     576       45757 :                 nStrLen--;
     577       45757 :                 pStr--;
     578             : 
     579       45757 :                 if ( *pStr == c )
     580        1774 :                     return nStrLen;
     581             :             }
     582             :         }
     583             :     }
     584             :     else
     585             :     {
     586      130291 :         pStr += nStrLen;
     587      130291 :         nStrLen -= nSubLen;
     588      130291 :         pStr -= nSubLen;
     589     4789849 :         while ( nStrLen >= 0 )
     590             :         {
     591     4585519 :             const IMPL_RTL_STRCODE* pTempStr1 = pStr;
     592     4585519 :             const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     593     4585519 :             sal_Int32               nTempLen = nSubLen;
     594     9412548 :             while ( nTempLen )
     595             :             {
     596     4770777 :                 if ( *pTempStr1 != *pTempStr2 )
     597     4529267 :                     break;
     598             : 
     599      241510 :                 pTempStr1++;
     600      241510 :                 pTempStr2++;
     601      241510 :                 nTempLen--;
     602             :             }
     603             : 
     604     4585519 :             if ( !nTempLen )
     605       56252 :                 return nStrLen;
     606             : 
     607     4529267 :             nStrLen--;
     608     4529267 :             pStr--;
     609             :         }
     610             :     }
     611             : 
     612       76979 :     return -1;
     613             : }
     614             : 
     615             : /* ----------------------------------------------------------------------- */
     616             : 
     617           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
     618             :                                                IMPL_RTL_STRCODE cOld,
     619             :                                                IMPL_RTL_STRCODE cNew )
     620             :     SAL_THROW_EXTERN_C()
     621             : {
     622             :     assert(pStr);
     623           0 :     while ( *pStr )
     624             :     {
     625           0 :         if ( *pStr == cOld )
     626           0 :             *pStr = cNew;
     627             : 
     628           0 :         pStr++;
     629             :     }
     630           0 : }
     631             : 
     632             : /* ----------------------------------------------------------------------- */
     633             : 
     634           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
     635             :                                                           sal_Int32 nLen,
     636             :                                                           IMPL_RTL_STRCODE cOld,
     637             :                                                           IMPL_RTL_STRCODE cNew )
     638             :     SAL_THROW_EXTERN_C()
     639             : {
     640             :     assert(nLen >= 0);
     641           0 :     while ( nLen > 0 )
     642             :     {
     643           0 :         if ( *pStr == cOld )
     644           0 :             *pStr = cNew;
     645             : 
     646           0 :         pStr++;
     647           0 :         nLen--;
     648             :     }
     649           0 : }
     650             : 
     651             : /* ----------------------------------------------------------------------- */
     652             : 
     653           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
     654             :     SAL_THROW_EXTERN_C()
     655             : {
     656             :     assert(pStr);
     657           0 :     while ( *pStr )
     658             :     {
     659           0 :         *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
     660             : 
     661           0 :         pStr++;
     662             :     }
     663           0 : }
     664             : 
     665             : /* ----------------------------------------------------------------------- */
     666             : 
     667     2074587 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     668             :                                                                sal_Int32 nLen )
     669             :     SAL_THROW_EXTERN_C()
     670             : {
     671             :     assert(nLen >= 0);
     672    21713172 :     while ( nLen > 0 )
     673             :     {
     674    17563998 :         *pStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pStr));
     675             : 
     676    17563998 :         pStr++;
     677    17563998 :         nLen--;
     678             :     }
     679     2074587 : }
     680             : 
     681             : /* ----------------------------------------------------------------------- */
     682             : 
     683           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
     684             :     SAL_THROW_EXTERN_C()
     685             : {
     686             :     assert(pStr);
     687           0 :     while ( *pStr )
     688             :     {
     689           0 :         *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
     690             : 
     691           0 :         pStr++;
     692             :     }
     693           0 : }
     694             : 
     695             : /* ----------------------------------------------------------------------- */
     696             : 
     697           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     698             :                                                                sal_Int32 nLen )
     699             :     SAL_THROW_EXTERN_C()
     700             : {
     701             :     assert(nLen >= 0);
     702           0 :     while ( nLen > 0 )
     703             :     {
     704           0 :         *pStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pStr));
     705             : 
     706           0 :         pStr++;
     707           0 :         nLen--;
     708             :     }
     709           0 : }
     710             : 
     711             : /* ----------------------------------------------------------------------- */
     712             : 
     713           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
     714             :     SAL_THROW_EXTERN_C()
     715             : {
     716           0 :     return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     717             : }
     718             : 
     719             : /* ----------------------------------------------------------------------- */
     720             : 
     721           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
     722             :     SAL_THROW_EXTERN_C()
     723             : {
     724             :     assert(nLen >= 0);
     725           0 :     sal_Int32 nPreSpaces    = 0;
     726           0 :     sal_Int32 nPostSpaces   = 0;
     727           0 :     sal_Int32 nIndex        = nLen-1;
     728             : 
     729           0 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
     730           0 :         nPreSpaces++;
     731             : 
     732           0 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
     733             :     {
     734           0 :         nPostSpaces++;
     735           0 :         nIndex--;
     736             :     }
     737             : 
     738           0 :     if ( nPostSpaces )
     739             :     {
     740           0 :         nLen -= nPostSpaces;
     741           0 :         *(pStr+nLen) = 0;
     742             :     }
     743             : 
     744           0 :     if ( nPreSpaces )
     745             :     {
     746           0 :         IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
     747             : 
     748           0 :         nLen -= nPreSpaces;
     749           0 :         nIndex = nLen;
     750             : 
     751           0 :         while ( nIndex )
     752             :         {
     753           0 :             *pStr = *pNewStr;
     754           0 :             pStr++;
     755           0 :             pNewStr++;
     756           0 :             nIndex--;
     757             :         }
     758           0 :         *pStr = 0;
     759             :     }
     760             : 
     761           0 :     return nLen;
     762             : }
     763             : 
     764             : /* ----------------------------------------------------------------------- */
     765             : 
     766         850 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
     767             :     SAL_THROW_EXTERN_C()
     768             : {
     769             :     assert(pStr);
     770         850 :     if ( b )
     771             :     {
     772         677 :         *pStr = 't';
     773         677 :         pStr++;
     774         677 :         *pStr = 'r';
     775         677 :         pStr++;
     776         677 :         *pStr = 'u';
     777         677 :         pStr++;
     778         677 :         *pStr = 'e';
     779         677 :         pStr++;
     780         677 :         *pStr = 0;
     781         677 :         return 4;
     782             :     }
     783             :     else
     784             :     {
     785         173 :         *pStr = 'f';
     786         173 :         pStr++;
     787         173 :         *pStr = 'a';
     788         173 :         pStr++;
     789         173 :         *pStr = 'l';
     790         173 :         pStr++;
     791         173 :         *pStr = 's';
     792         173 :         pStr++;
     793         173 :         *pStr = 'e';
     794         173 :         pStr++;
     795         173 :         *pStr = 0;
     796         173 :         return 5;
     797             :     }
     798             : }
     799             : 
     800             : /* ----------------------------------------------------------------------- */
     801             : 
     802           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
     803             :                                                     IMPL_RTL_STRCODE c )
     804             :     SAL_THROW_EXTERN_C()
     805             : {
     806             :     assert(pStr);
     807           0 :     *pStr++ = c;
     808           0 :     *pStr = 0;
     809           0 :     return 1;
     810             : }
     811             : 
     812             : /* ----------------------------------------------------------------------- */
     813             : 
     814     2863637 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
     815             :                                                      sal_Int32 n,
     816             :                                                      sal_Int16 nRadix )
     817             :     SAL_THROW_EXTERN_C()
     818             : {
     819             :     assert(pStr);
     820             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT32];
     821     2863637 :     sal_Char*   pBuf = aBuf;
     822     2863637 :     sal_Int32   nLen = 0;
     823             :     sal_uInt32  nValue;
     824             : 
     825             :     /* Radix must be valid */
     826     2863637 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     827           5 :         nRadix = 10;
     828             : 
     829             :     /* is value negativ */
     830     2863637 :     if ( n < 0 )
     831             :     {
     832        7517 :         *pStr = '-';
     833        7517 :         pStr++;
     834        7517 :         nLen++;
     835        7517 :         nValue = n == SAL_MIN_INT32 ? static_cast<sal_uInt32>(n) : -n;
     836             :     }
     837             :     else
     838     2856120 :         nValue = n;
     839             : 
     840             :     /* create a recursive buffer with all values, except the last one */
     841     5109477 :     do
     842             :     {
     843     5109477 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     844     5109477 :         nValue /= nRadix;
     845     5109477 :         if ( nDigit > 9 )
     846       88317 :             *pBuf = (nDigit-10) + 'a';
     847             :         else
     848     5021160 :             *pBuf = (nDigit + '0' );
     849     5109477 :         pBuf++;
     850             :     }
     851             :     while ( nValue > 0 );
     852             : 
     853             :     /* copy the values in the right direction into the destination buffer */
     854     5109477 :     do
     855             :     {
     856     5109477 :         pBuf--;
     857     5109477 :         *pStr = *pBuf;
     858     5109477 :         pStr++;
     859     5109477 :         nLen++;
     860             :     }
     861             :     while ( pBuf != aBuf );
     862     2863637 :     *pStr = 0;
     863             : 
     864     2863637 :     return nLen;
     865             : }
     866             : 
     867             : /* ----------------------------------------------------------------------- */
     868             : 
     869     9627750 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
     870             :                                                      sal_Int64 n,
     871             :                                                      sal_Int16 nRadix )
     872             :     SAL_THROW_EXTERN_C()
     873             : {
     874             :     assert(pStr);
     875             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT64];
     876     9627750 :     sal_Char*   pBuf = aBuf;
     877     9627750 :     sal_Int32   nLen = 0;
     878             :     sal_uInt64  nValue;
     879             : 
     880             :     /* Radix must be valid */
     881     9627750 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     882           5 :         nRadix = 10;
     883             : 
     884             :     /* is value negativ */
     885     9627750 :     if ( n < 0 )
     886             :     {
     887        1119 :         *pStr = '-';
     888        1119 :         pStr++;
     889        1119 :         nLen++;
     890        1119 :         nValue = n == SAL_MIN_INT64 ? static_cast<sal_uInt64>(n) : -n;
     891             :     }
     892             :     else
     893     9626631 :         nValue = n;
     894             : 
     895             :     /* create a recursive buffer with all values, except the last one */
     896    19728840 :     do
     897             :     {
     898    19728840 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     899    19728840 :         nValue /= nRadix;
     900    19728840 :         if ( nDigit > 9 )
     901     8260804 :             *pBuf = (nDigit-10) + 'a';
     902             :         else
     903    11468036 :             *pBuf = (nDigit + '0' );
     904    19728840 :         pBuf++;
     905             :     }
     906             :     while ( nValue > 0 );
     907             : 
     908             :     /* copy the values in the right direction into the destination buffer */
     909    19728840 :     do
     910             :     {
     911    19728840 :         pBuf--;
     912    19728840 :         *pStr = *pBuf;
     913    19728840 :         pStr++;
     914    19728840 :         nLen++;
     915             :     }
     916             :     while ( pBuf != aBuf );
     917     9627750 :     *pStr = 0;
     918             : 
     919     9627750 :     return nLen;
     920             : }
     921             : 
     922             : /* ----------------------------------------------------------------------- */
     923             : 
     924      154540 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfUInt64 )( IMPL_RTL_STRCODE* pStr,
     925             :                                                       sal_uInt64 n,
     926             :                                                       sal_Int16 nRadix )
     927             :     SAL_THROW_EXTERN_C()
     928             : {
     929             :     assert(pStr);
     930             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFUINT64];
     931      154540 :     sal_Char*   pBuf = aBuf;
     932      154540 :     sal_Int32   nLen = 0;
     933             :     sal_uInt64  nValue;
     934             : 
     935             :     /* Radix must be valid */
     936      154540 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     937           0 :         nRadix = 10;
     938             : 
     939      154540 :     nValue = n;
     940             : 
     941             :     /* create a recursive buffer with all values, except the last one */
     942      613938 :     do
     943             :     {
     944      613938 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     945      613938 :         nValue /= nRadix;
     946      613938 :         if ( nDigit > 9 )
     947      109655 :             *pBuf = (nDigit-10) + 'a';
     948             :         else
     949      504283 :             *pBuf = (nDigit + '0' );
     950      613938 :         pBuf++;
     951             :     }
     952             :     while ( nValue > 0 );
     953             : 
     954             :     /* copy the values in the right direction into the destination buffer */
     955      613938 :     do
     956             :     {
     957      613938 :         pBuf--;
     958      613938 :         *pStr = *pBuf;
     959      613938 :         pStr++;
     960      613938 :         nLen++;
     961             :     }
     962             :     while ( pBuf != aBuf );
     963      154540 :     *pStr = 0;
     964             : 
     965      154540 :     return nLen;
     966             : }
     967             : 
     968             : /* ----------------------------------------------------------------------- */
     969             : 
     970        6151 : sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
     971             :     SAL_THROW_EXTERN_C()
     972             : {
     973             :     assert(pStr);
     974        6151 :     if ( *pStr == '1' )
     975           2 :         return sal_True;
     976             : 
     977        6149 :     if ( (*pStr == 'T') || (*pStr == 't') )
     978             :     {
     979           4 :         pStr++;
     980           4 :         if ( (*pStr == 'R') || (*pStr == 'r') )
     981             :         {
     982           4 :             pStr++;
     983           4 :             if ( (*pStr == 'U') || (*pStr == 'u') )
     984             :             {
     985           4 :                 pStr++;
     986           4 :                 if ( (*pStr == 'E') || (*pStr == 'e') )
     987           4 :                     return sal_True;
     988             :             }
     989             :         }
     990             :     }
     991             : 
     992        6145 :     return sal_False;
     993             : }
     994             : 
     995             : /* ----------------------------------------------------------------------- */
     996             : namespace {
     997     2937516 :     template<typename T, typename U> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
     998             :                                                                      sal_Int16 nRadix )
     999             :     {
    1000             :         static_assert(std::numeric_limits<T>::is_signed, "is signed");
    1001             :         bool    bNeg;
    1002             :         sal_Int16   nDigit;
    1003     2937516 :         U           n = 0;
    1004             : 
    1005     2937516 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
    1006           0 :             nRadix = 10;
    1007             : 
    1008             :         /* Skip whitespaces */
    1009     5875509 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
    1010         477 :             pStr++;
    1011             : 
    1012     2937516 :         if ( *pStr == '-' )
    1013             :         {
    1014       41044 :             bNeg = true;
    1015       41044 :             pStr++;
    1016             :         }
    1017             :         else
    1018             :         {
    1019     2896472 :             if ( *pStr == '+' )
    1020          51 :                 pStr++;
    1021     2896472 :             bNeg = false;
    1022             :         }
    1023             : 
    1024             :         T nDiv;
    1025             :         sal_Int16 nMod;
    1026     2937516 :         if ( bNeg )
    1027             :         {
    1028       41044 :             nDiv = std::numeric_limits<T>::min() / nRadix;
    1029       41044 :             nMod = std::numeric_limits<T>::min() % nRadix;
    1030             :             // Cater for C++03 implementations that round the quotient down
    1031             :             // instead of truncating towards zero as mandated by C++11:
    1032       41044 :             if ( nMod > 0 )
    1033             :             {
    1034           0 :                 --nDiv;
    1035           0 :                 nMod -= nRadix;
    1036             :             }
    1037       41044 :             nDiv = -nDiv;
    1038       41044 :             nMod = -nMod;
    1039             :         }
    1040             :         else
    1041             :         {
    1042     2896472 :             nDiv = std::numeric_limits<T>::max() / nRadix;
    1043     2896472 :             nMod = std::numeric_limits<T>::max() % nRadix;
    1044             :         }
    1045             : 
    1046    12269383 :         while ( *pStr )
    1047             :         {
    1048     6761908 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
    1049     6761908 :             if ( nDigit < 0 )
    1050      366477 :                 break;
    1051             :             assert(nDiv > 0);
    1052     6395431 :             if( static_cast<U>( nMod < nDigit ? nDiv-1 : nDiv ) < n )
    1053        1080 :                 return 0;
    1054             : 
    1055     6394351 :             n *= nRadix;
    1056     6394351 :             n += nDigit;
    1057             : 
    1058     6394351 :             pStr++;
    1059             :         }
    1060             : 
    1061     2936436 :         if ( bNeg )
    1062       41040 :             return n == static_cast<U>(std::numeric_limits<T>::min())
    1063       41040 :                 ? std::numeric_limits<T>::min() : -static_cast<T>(n);
    1064             :         else
    1065     2895396 :             return static_cast<T>(n);
    1066             :     }
    1067             : }
    1068             : 
    1069     2798187 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
    1070             :                                                 sal_Int16 nRadix )
    1071             :     SAL_THROW_EXTERN_C()
    1072             : {
    1073             :     assert(pStr);
    1074     2798187 :     return IMPL_RTL_STRNAME( toInt )<sal_Int32, sal_uInt32>(pStr, nRadix);
    1075             : }
    1076             : 
    1077      139329 : sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
    1078             :                                                 sal_Int16 nRadix )
    1079             :     SAL_THROW_EXTERN_C()
    1080             : {
    1081             :     assert(pStr);
    1082      139329 :     return IMPL_RTL_STRNAME( toInt )<sal_Int64, sal_uInt64>(pStr, nRadix);
    1083             : }
    1084             : 
    1085             : /* ----------------------------------------------------------------------- */
    1086             : namespace {
    1087      463809 :     template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
    1088             :                                                                       sal_Int16 nRadix )
    1089             :     {
    1090             :         static_assert(!std::numeric_limits<T>::is_signed, "is not signed");
    1091             :         sal_Int16   nDigit;
    1092      463809 :         T           n = 0;
    1093             : 
    1094      463809 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
    1095           0 :             nRadix = 10;
    1096             : 
    1097             :         /* Skip whitespaces */
    1098      927618 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
    1099           0 :             ++pStr;
    1100             : 
    1101             :         // skip optional explicit sign
    1102      463809 :         if ( *pStr == '+' )
    1103           0 :             ++pStr;
    1104             : 
    1105      463809 :         T nDiv = std::numeric_limits<T>::max() / nRadix;
    1106      463809 :         sal_Int16 nMod = std::numeric_limits<T>::max() % nRadix;
    1107     3455922 :         while ( *pStr )
    1108             :         {
    1109     2552171 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
    1110     2552171 :             if ( nDigit < 0 )
    1111       18683 :                 break;
    1112     2533488 :             if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
    1113        5184 :                 return 0;
    1114             : 
    1115     2528304 :             n *= nRadix;
    1116     2528304 :             n += nDigit;
    1117             : 
    1118     2528304 :             ++pStr;
    1119             :         }
    1120             : 
    1121      458625 :         return n;
    1122             :     }
    1123             : }
    1124             : 
    1125      449776 : sal_uInt32 SAL_CALL IMPL_RTL_STRNAME( toUInt32 )( const IMPL_RTL_STRCODE* pStr,
    1126             :                                                   sal_Int16 nRadix )
    1127             :     SAL_THROW_EXTERN_C()
    1128             : {
    1129             :     assert(pStr);
    1130      449776 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt32>(pStr, nRadix);
    1131             : }
    1132             : 
    1133       14033 : sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr,
    1134             :                                                   sal_Int16 nRadix )
    1135             :     SAL_THROW_EXTERN_C()
    1136             : {
    1137             :     assert(pStr);
    1138       14033 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt64>(pStr, nRadix);
    1139             : }
    1140             : 
    1141             : /* ======================================================================= */
    1142             : /* Internal String-Class help functions                                    */
    1143             : /* ======================================================================= */
    1144             : 
    1145  3220589063 : static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
    1146             : {
    1147             :     IMPL_RTL_STRINGDATA * pData
    1148  3220589063 :         = (sal::static_int_cast< sal_uInt32 >(nLen)
    1149  3220588956 :            <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
    1150  3220588956 :                / sizeof (IMPL_RTL_STRCODE)))
    1151             :         ? static_cast<IMPL_RTL_STRINGDATA *>(rtl_allocateMemory(
    1152  3220588956 :             sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE)))
    1153  6441177912 :         : NULL;
    1154  3220589279 :     if (pData != NULL) {
    1155  3220589287 :         pData->refCount = 1;
    1156  3220589287 :         pData->length = nLen;
    1157  3220589287 :         pData->buffer[nLen] = 0;
    1158             :     }
    1159  3220589279 :     return pData;
    1160             : }
    1161             : 
    1162             : /* ----------------------------------------------------------------------- */
    1163             : 
    1164     3017878 : static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
    1165             :                                                              IMPL_RTL_STRINGDATA* pStr,
    1166             :                                                              sal_Int32 nCount )
    1167             : {
    1168             :     assert(nCount >= 0);
    1169             :     IMPL_RTL_STRCODE*       pDest;
    1170             :     const IMPL_RTL_STRCODE* pSrc;
    1171     3017878 :     IMPL_RTL_STRINGDATA*    pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1172             :     OSL_ASSERT(pData != NULL);
    1173             : 
    1174     3017878 :     pDest   = pData->buffer;
    1175     3017878 :     pSrc    = pStr->buffer;
    1176     9035676 :     while ( nCount > 0 )
    1177             :     {
    1178     2999920 :         *pDest = *pSrc;
    1179     2999920 :         pDest++;
    1180     2999920 :         pSrc++;
    1181     2999920 :         nCount--;
    1182             :     }
    1183             : 
    1184     3017878 :     *ppThis = pData;
    1185             : 
    1186             :     RTL_LOG_STRING_NEW( pData );
    1187     3017878 :     return pDest;
    1188             : }
    1189             : 
    1190             : /* ======================================================================= */
    1191             : /* String-Class functions                                                  */
    1192             : /* ======================================================================= */
    1193             : 
    1194             : namespace {
    1195             : 
    1196 31444719820 : void IMPL_RTL_ACQUIRE(IMPL_RTL_STRINGDATA * pThis)
    1197             : {
    1198 31444719820 :     if (!SAL_STRING_IS_STATIC (pThis))
    1199 23096449485 :         osl_atomic_increment( &((pThis)->refCount) );
    1200 31444719820 : }
    1201             : 
    1202             : }
    1203             : 
    1204             : /* ----------------------------------------------------------------------- */
    1205             : 
    1206 15582605813 : void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
    1207             :     SAL_THROW_EXTERN_C()
    1208             : {
    1209 15582605813 :     IMPL_RTL_ACQUIRE( pThis );
    1210 15582605430 : }
    1211             : 
    1212             : /* ----------------------------------------------------------------------- */
    1213             : 
    1214 44617223123 : void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
    1215             :     SAL_THROW_EXTERN_C()
    1216             : {
    1217 44617223123 :     if (SAL_STRING_IS_STATIC (pThis))
    1218 18693917097 :         return;
    1219             : 
    1220             : /* OString doesn't have an 'intern' */
    1221             : #if IMPL_RTL_IS_USTRING
    1222 26035744731 :     if (SAL_STRING_IS_INTERN (pThis))
    1223             :     {
    1224     7183761 :         internRelease (pThis);
    1225     7183761 :         return;
    1226             :     }
    1227             : #endif
    1228             : 
    1229 26308338158 :     if ( !osl_atomic_decrement( &(pThis->refCount) ) )
    1230             :     {
    1231             :         RTL_LOG_STRING_DELETE( pThis );
    1232  3218855788 :         rtl_freeMemory( pThis );
    1233             :     }
    1234             : }
    1235             : 
    1236             : /* ----------------------------------------------------------------------- */
    1237             : 
    1238  9955703417 : void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
    1239             :     SAL_THROW_EXTERN_C()
    1240             : {
    1241             :     assert(ppThis);
    1242  9955703417 :     if ( *ppThis)
    1243    26252832 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1244             : 
    1245  9955703408 :     *ppThis = const_cast<IMPL_RTL_STRINGDATA*>(&IMPL_RTL_EMPTYSTRING);
    1246  9955703408 : }
    1247             : 
    1248             : /* ----------------------------------------------------------------------- */
    1249             : 
    1250   948605785 : IMPL_RTL_STRINGDATA* SAL_CALL IMPL_RTL_STRINGNAME( alloc )( sal_Int32 nLen )
    1251             :     SAL_THROW_EXTERN_C()
    1252             : {
    1253   948605785 :     if ( nLen < 0 )
    1254           0 :         return NULL;
    1255             :     else
    1256   948605785 :         return IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1257             : }
    1258             : 
    1259             : /* ----------------------------------------------------------------------- */
    1260             : 
    1261   372596337 : void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
    1262             :     SAL_THROW_EXTERN_C()
    1263             : {
    1264             :     assert(ppThis);
    1265   372596337 :     if ( nLen <= 0 )
    1266      432075 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1267             :     else
    1268             :     {
    1269   372164262 :         if ( *ppThis)
    1270     3277974 :             IMPL_RTL_STRINGNAME( release )( *ppThis );
    1271             : 
    1272   372164262 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1273             :         OSL_ASSERT(*ppThis != NULL);
    1274   372164266 :         (*ppThis)->length   = 0;
    1275             : 
    1276   372164266 :         IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
    1277   372164266 :         memset(pTempStr, 0, nLen*sizeof(IMPL_RTL_STRCODE));
    1278             :     }
    1279   372596341 : }
    1280             : 
    1281             : /* ----------------------------------------------------------------------- */
    1282             : 
    1283       41670 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
    1284             :                                                     const IMPL_RTL_STRINGDATA* pStr )
    1285             :     SAL_THROW_EXTERN_C()
    1286             : {
    1287             :     assert(ppThis);
    1288             :     assert(pStr);
    1289             :     IMPL_RTL_STRINGDATA* pOrg;
    1290             : 
    1291       41670 :     if ( !pStr->length )
    1292             :     {
    1293           1 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1294       41671 :         return;
    1295             :     }
    1296             : 
    1297       41669 :     pOrg = *ppThis;
    1298       41669 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1299             :     OSL_ASSERT(*ppThis != NULL);
    1300       41669 :     rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
    1301             :     RTL_LOG_STRING_NEW( *ppThis );
    1302             : 
    1303             :     /* must be done last, if pStr == *ppThis */
    1304       41669 :     if ( pOrg )
    1305           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1306             : }
    1307             : 
    1308             : /* ----------------------------------------------------------------------- */
    1309             : 
    1310   514896251 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
    1311             :                                                  const IMPL_RTL_STRCODE* pCharStr )
    1312             :     SAL_THROW_EXTERN_C()
    1313             : {
    1314             :     assert(ppThis);
    1315             :     IMPL_RTL_STRCODE*       pBuffer;
    1316             :     IMPL_RTL_STRINGDATA*    pOrg;
    1317             :     sal_Int32               nLen;
    1318             : 
    1319   514896251 :     if ( pCharStr )
    1320             :     {
    1321   514894307 :         const IMPL_RTL_STRCODE* pTempStr = pCharStr;
    1322  4162378699 :         while( *pTempStr )
    1323  3132590085 :             pTempStr++;
    1324   514894307 :         nLen = pTempStr-pCharStr;
    1325             :     }
    1326             :     else
    1327        1944 :         nLen = 0;
    1328             : 
    1329   514896251 :     if ( !nLen )
    1330             :     {
    1331    87287701 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1332   602183952 :         return;
    1333             :     }
    1334             : 
    1335   427608550 :     pOrg = *ppThis;
    1336   427608550 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1337             :     OSL_ASSERT(*ppThis != NULL);
    1338   427608550 :     pBuffer = (*ppThis)->buffer;
    1339  3132590069 :     do
    1340             :     {
    1341  3132590069 :         *pBuffer = *pCharStr;
    1342  3132590069 :         pBuffer++;
    1343  3132590069 :         pCharStr++;
    1344             :     }
    1345             :     while ( *pCharStr );
    1346             : 
    1347             :     RTL_LOG_STRING_NEW( *ppThis );
    1348             : 
    1349             :     /* must be done last, if pCharStr == *ppThis */
    1350   427608550 :     if ( pOrg )
    1351       94943 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1352             : }
    1353             : 
    1354             : /* ----------------------------------------------------------------------- */
    1355             : 
    1356   504846120 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
    1357             :                                                             const IMPL_RTL_STRCODE* pCharStr,
    1358             :                                                             sal_Int32 nLen )
    1359             :     SAL_THROW_EXTERN_C()
    1360             : {
    1361             :     assert(ppThis);
    1362             :     IMPL_RTL_STRINGDATA* pOrg;
    1363             : 
    1364   504846120 :     if ( !pCharStr || (nLen <= 0) )
    1365             :     {
    1366      723031 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1367   505569156 :         return;
    1368             :     }
    1369             : 
    1370   504123089 :     pOrg = *ppThis;
    1371   504123089 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1372             :     OSL_ASSERT(*ppThis != NULL);
    1373   504123092 :     rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
    1374             : 
    1375             :     RTL_LOG_STRING_NEW( *ppThis );
    1376             : 
    1377             :     /* must be done last, if pCharStr == *ppThis */
    1378   504123092 :     if ( pOrg )
    1379     5611190 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1380             : }
    1381             : 
    1382             : /* ----------------------------------------------------------------------- */
    1383             : 
    1384   216918869 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromSubString )( IMPL_RTL_STRINGDATA** ppThis,
    1385             :                                                        const IMPL_RTL_STRINGDATA* pFrom,
    1386             :                                                        sal_Int32 beginIndex,
    1387             :                                                        sal_Int32 count )
    1388             :     SAL_THROW_EXTERN_C()
    1389             : {
    1390             :     assert(ppThis);
    1391   216918869 :     if ( beginIndex == 0 && count == pFrom->length )
    1392             :     {
    1393    27762287 :         IMPL_RTL_STRINGNAME( assign )( ppThis, const_cast< IMPL_RTL_STRINGDATA * >( pFrom ) );
    1394    27762289 :         return;
    1395             :     }
    1396   189156582 :     if ( count < 0 || beginIndex < 0 || beginIndex + count > pFrom->length )
    1397             :     {
    1398             :         assert(false); // fail fast at least in debug builds
    1399           0 :         IMPL_RTL_STRINGNAME( newFromLiteral )( ppThis, "!!br0ken!!", 10, 0 );
    1400           0 :         return;
    1401             :     }
    1402             : 
    1403   189156592 :     IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pFrom->buffer + beginIndex, count );
    1404             : }
    1405             : 
    1406             : /* ----------------------------------------------------------------------- */
    1407             : 
    1408             : // Used when creating from string literals.
    1409   732847137 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromLiteral )( IMPL_RTL_STRINGDATA** ppThis,
    1410             :                                                      const sal_Char* pCharStr,
    1411             :                                                      sal_Int32 nLen,
    1412             :                                                      sal_Int32 allocExtra )
    1413             :     SAL_THROW_EXTERN_C()
    1414             : {
    1415             :     assert(ppThis);
    1416             :     assert(nLen >= 0);
    1417             :     assert(allocExtra >= 0);
    1418   732847137 :     if ( nLen + allocExtra == 0 )
    1419             :     {
    1420           0 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1421   732847150 :         return;
    1422             :     }
    1423             : 
    1424   732847137 :     if ( *ppThis )
    1425    32458852 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1426             : 
    1427   732847137 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen + allocExtra );
    1428             :     assert( *ppThis != NULL );
    1429             : 
    1430   732847150 :     (*ppThis)->length = nLen; // fix after possible allocExtra != 0
    1431   732847150 :     (*ppThis)->buffer[nLen] = 0;
    1432   732847150 :     IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
    1433             :     sal_Int32 nCount;
    1434 18515952373 :     for( nCount = nLen; nCount > 0; --nCount )
    1435             :     {
    1436             : #if IMPL_RTL_IS_USTRING
    1437             :         assert(static_cast<unsigned char>(*pCharStr) < 0x80); // ASCII range
    1438             : #endif
    1439             :         SAL_WARN_IF( ((unsigned char)*pCharStr) == '\0', "rtl.string",
    1440             :                     "rtl_uString_newFromLiteral - Found embedded \\0 character" );
    1441             : 
    1442 17783105223 :         *pBuffer = *pCharStr;
    1443 17783105223 :         pBuffer++;
    1444 17783105223 :         pCharStr++;
    1445             :     }
    1446             : 
    1447             :     RTL_LOG_STRING_NEW( *ppThis );
    1448             : }
    1449             : 
    1450             : /* ----------------------------------------------------------------------- */
    1451             : 
    1452 15767115832 : void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
    1453             :                                              IMPL_RTL_STRINGDATA* pStr )
    1454             :     SAL_THROW_EXTERN_C()
    1455             : {
    1456             :     assert(ppThis);
    1457             :     /* must be done at first, if pStr == *ppThis */
    1458 15767115832 :     IMPL_RTL_ACQUIRE( pStr );
    1459             : 
    1460 15767115564 :     if ( *ppThis )
    1461 15566907925 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1462             : 
    1463 15767115021 :     *ppThis = pStr;
    1464 15767115021 : }
    1465             : 
    1466             : /* ----------------------------------------------------------------------- */
    1467             : 
    1468      187738 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
    1469             :     SAL_THROW_EXTERN_C()
    1470             : {
    1471             :     assert(pThis);
    1472      187738 :     return pThis->length;
    1473             : }
    1474             : 
    1475             : /* ----------------------------------------------------------------------- */
    1476             : 
    1477      362729 : IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
    1478             :     SAL_THROW_EXTERN_C()
    1479             : {
    1480             :     assert(pThis);
    1481      362729 :     return pThis->buffer;
    1482             : }
    1483             : 
    1484             : /* ----------------------------------------------------------------------- */
    1485             : 
    1486    14201617 : void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
    1487             :                                                 IMPL_RTL_STRINGDATA* pLeft,
    1488             :                                                 IMPL_RTL_STRINGDATA* pRight )
    1489             :     SAL_THROW_EXTERN_C()
    1490             : {
    1491             :     assert(ppThis);
    1492    14201617 :     IMPL_RTL_STRINGDATA* pOrg = *ppThis;
    1493             : 
    1494             :     /* Test for 0-Pointer - if not, change newReplaceStrAt! */
    1495    14201617 :     if ( !pRight || !pRight->length )
    1496             :     {
    1497      783070 :         *ppThis = pLeft;
    1498      783070 :         IMPL_RTL_ACQUIRE( pLeft );
    1499             :     }
    1500    13418547 :     else if ( !pLeft || !pLeft->length )
    1501             :     {
    1502     4270670 :         *ppThis = pRight;
    1503     4270670 :         IMPL_RTL_ACQUIRE( pRight );
    1504             :     }
    1505             :     else
    1506             :     {
    1507     9147877 :         IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
    1508             :         OSL_ASSERT(pTempStr != NULL);
    1509     9147877 :         rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
    1510     9147877 :         rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
    1511     9147877 :         *ppThis = pTempStr;
    1512             : 
    1513             :         RTL_LOG_STRING_NEW( *ppThis );
    1514             :     }
    1515             : 
    1516             :     /* must be done last, if left or right == *ppThis */
    1517    14201617 :     if ( pOrg )
    1518    12102647 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1519    14201617 : }
    1520             : 
    1521             : /* ----------------------------------------------------------------------- */
    1522             : 
    1523       83887 : void SAL_CALL IMPL_RTL_STRINGNAME( ensureCapacity )( IMPL_RTL_STRINGDATA** ppThis,
    1524             :                                                      sal_Int32 size )
    1525             :     SAL_THROW_EXTERN_C()
    1526             : {
    1527             :     assert(ppThis);
    1528       83887 :     IMPL_RTL_STRINGDATA* const pOrg = *ppThis;
    1529       83887 :     if ( pOrg->refCount == 1 && pOrg->length >= size )
    1530       83889 :         return;
    1531             :     assert( pOrg->length <= size ); // do not truncate
    1532       83885 :     IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( size );
    1533       83885 :     rtl_str_ImplCopy( pTempStr->buffer, pOrg->buffer, pOrg->length );
    1534             :     // right now the length is still the same as of the original
    1535       83885 :     pTempStr->length = pOrg->length;
    1536       83885 :     pTempStr->buffer[ pOrg->length ] = '\0';
    1537       83885 :     *ppThis = pTempStr;
    1538             :     RTL_LOG_STRING_NEW( *ppThis );
    1539             : 
    1540       83885 :     IMPL_RTL_STRINGNAME( release )( pOrg );
    1541             : }
    1542             : 
    1543             : /* ----------------------------------------------------------------------- */
    1544             : 
    1545     2392510 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
    1546             :                                                       IMPL_RTL_STRINGDATA* pStr,
    1547             :                                                       sal_Int32 nIndex,
    1548             :                                                       sal_Int32 nCount,
    1549             :                                                       IMPL_RTL_STRINGDATA* pNewSubStr )
    1550             :     SAL_THROW_EXTERN_C()
    1551             : {
    1552             :     assert(ppThis);
    1553             : //    assert(nCount >= 0);
    1554             :     /* Append? */
    1555     2392510 :     if ( nIndex >= pStr->length )
    1556             :     {
    1557             :         /* newConcat test, if pNewSubStr is 0 */
    1558     2097475 :         IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
    1559     2097475 :         return;
    1560             :     }
    1561             : 
    1562             :     /* negativ index? */
    1563      295035 :     if ( nIndex < 0 )
    1564             :     {
    1565           0 :         nCount -= nIndex;
    1566           0 :         nIndex = 0;
    1567             :     }
    1568             : 
    1569             :     /* not more than the String length could be deleted */
    1570      295035 :     if ( nCount >= pStr->length-nIndex )
    1571             :     {
    1572      181628 :         nCount = pStr->length-nIndex;
    1573             : 
    1574             :         /* Assign of NewSubStr? */
    1575      181628 :         if ( !nIndex && (nCount >= pStr->length) )
    1576             :         {
    1577       85253 :             if ( !pNewSubStr )
    1578           0 :                 IMPL_RTL_STRINGNAME( new )( ppThis );
    1579             :             else
    1580       85253 :                 IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
    1581       85253 :             return;
    1582             :         }
    1583             :     }
    1584             : 
    1585             :     /* Assign of Str? */
    1586      209782 :     if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
    1587             :     {
    1588         588 :         IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
    1589         588 :         return;
    1590             :     }
    1591             : 
    1592      209194 :     IMPL_RTL_STRINGDATA*    pOrg = *ppThis;
    1593             :     IMPL_RTL_STRCODE*       pBuffer;
    1594             :     sal_Int32               nNewLen;
    1595             : 
    1596             :     /* Calculate length of the new string */
    1597      209194 :     nNewLen = pStr->length-nCount;
    1598      209194 :     if ( pNewSubStr )
    1599      209194 :         nNewLen += pNewSubStr->length;
    1600             : 
    1601             :     /* Alloc New Buffer */
    1602      209194 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
    1603             :     OSL_ASSERT(*ppThis != NULL);
    1604      209194 :     pBuffer = (*ppThis)->buffer;
    1605      209194 :     if ( nIndex )
    1606             :     {
    1607      117518 :         rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
    1608      117518 :         pBuffer += nIndex;
    1609             :     }
    1610      209194 :     if ( pNewSubStr && pNewSubStr->length )
    1611             :     {
    1612      162855 :         rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
    1613      162855 :         pBuffer += pNewSubStr->length;
    1614             :     }
    1615      209194 :     rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
    1616             : 
    1617             :     RTL_LOG_STRING_NEW( *ppThis );
    1618             :     /* must be done last, if pStr or pNewSubStr == *ppThis */
    1619      209194 :     if ( pOrg )
    1620           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1621             : }
    1622             : 
    1623             : /* ----------------------------------------------------------------------- */
    1624             : 
    1625    85932719 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
    1626             :                                                  IMPL_RTL_STRINGDATA* pStr,
    1627             :                                                  IMPL_RTL_STRCODE cOld,
    1628             :                                                  IMPL_RTL_STRCODE cNew )
    1629             :     SAL_THROW_EXTERN_C()
    1630             : {
    1631             :     assert(ppThis);
    1632             :     assert(pStr);
    1633    85932719 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1634    85932719 :     int                     bChanged    = 0;
    1635    85932719 :     sal_Int32               nLen        = pStr->length;
    1636    85932719 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1637             : 
    1638   914271240 :     while ( nLen > 0 )
    1639             :     {
    1640   742668309 :         if ( *pCharStr == cOld )
    1641             :         {
    1642             :             /* Copy String */
    1643      262507 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1644             : 
    1645             :             /* replace/copy rest of the string */
    1646      262507 :             if ( pNewCharStr )
    1647             :             {
    1648      262507 :                 *pNewCharStr = cNew;
    1649      262507 :                 pNewCharStr++;
    1650      262507 :                 pCharStr++;
    1651      262507 :                 nLen--;
    1652             : 
    1653     4486039 :                 while ( nLen > 0 )
    1654             :                 {
    1655     3961025 :                     if ( *pCharStr == cOld )
    1656      295902 :                         *pNewCharStr = cNew;
    1657             :                     else
    1658     3665123 :                         *pNewCharStr = *pCharStr;
    1659             : 
    1660     3961025 :                     pNewCharStr++;
    1661     3961025 :                     pCharStr++;
    1662     3961025 :                     nLen--;
    1663             :                 }
    1664             :             }
    1665             : 
    1666      262507 :             bChanged = 1;
    1667      262507 :             break;
    1668             :         }
    1669             : 
    1670   742405802 :         pCharStr++;
    1671   742405802 :         nLen--;
    1672             :     }
    1673             : 
    1674    85932719 :     if ( !bChanged )
    1675             :     {
    1676    85670212 :         *ppThis = pStr;
    1677    85670212 :         IMPL_RTL_ACQUIRE( pStr );
    1678             :     }
    1679             : 
    1680             :     RTL_LOG_STRING_NEW( *ppThis );
    1681             :     /* must be done last, if pStr == *ppThis */
    1682    85932719 :     if ( pOrg )
    1683           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1684    85932719 : }
    1685             : 
    1686             : /* ----------------------------------------------------------------------- */
    1687             : 
    1688     5187353 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
    1689             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1690             :     SAL_THROW_EXTERN_C()
    1691             : {
    1692             :     assert(ppThis);
    1693             :     assert(pStr);
    1694     5187353 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1695     5187353 :     int                     bChanged    = 0;
    1696     5187353 :     sal_Int32               nLen        = pStr->length;
    1697     5187353 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1698             : 
    1699    21654746 :     while ( nLen > 0 )
    1700             :     {
    1701    13924762 :         if ( rtl::isAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr)) )
    1702             :         {
    1703             :             /* Copy String */
    1704     2644722 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1705             : 
    1706             :             /* replace/copy rest of the string */
    1707     2644722 :             if ( pNewCharStr )
    1708             :             {
    1709     2644722 :                 *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
    1710     2644722 :                 pNewCharStr++;
    1711     2644722 :                 pCharStr++;
    1712     2644722 :                 nLen--;
    1713             : 
    1714    34413827 :                 while ( nLen > 0 )
    1715             :                 {
    1716    29124383 :                     *pNewCharStr = rtl::toAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr));
    1717             : 
    1718    29124383 :                     pNewCharStr++;
    1719    29124383 :                     pCharStr++;
    1720    29124383 :                     nLen--;
    1721             :                 }
    1722             :             }
    1723             : 
    1724     2644722 :             bChanged = 1;
    1725     2644722 :             break;
    1726             :         }
    1727             : 
    1728    11280040 :         pCharStr++;
    1729    11280040 :         nLen--;
    1730             :     }
    1731             : 
    1732     5187353 :     if ( !bChanged )
    1733             :     {
    1734     2542631 :         *ppThis = pStr;
    1735     2542631 :         IMPL_RTL_ACQUIRE( pStr );
    1736             :     }
    1737             : 
    1738             :     RTL_LOG_STRING_NEW( *ppThis );
    1739             :     /* must be done last, if pStr == *ppThis */
    1740     5187353 :     if ( pOrg )
    1741           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1742     5187353 : }
    1743             : 
    1744             : /* ----------------------------------------------------------------------- */
    1745             : 
    1746     1646568 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
    1747             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1748             :     SAL_THROW_EXTERN_C()
    1749             : {
    1750             :     assert(ppThis);
    1751             :     assert(pStr);
    1752     1646568 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1753     1646568 :     int                     bChanged    = 0;
    1754     1646568 :     sal_Int32               nLen        = pStr->length;
    1755     1646568 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1756             : 
    1757     6910727 :     while ( nLen > 0 )
    1758             :     {
    1759     3728240 :         if ( rtl::isAsciiLowerCase(IMPL_RTL_USTRCODE(*pCharStr)) )
    1760             :         {
    1761             :             /* Copy String */
    1762      110649 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1763             : 
    1764             :             /* replace/copy rest of the string */
    1765      110649 :             if ( pNewCharStr )
    1766             :             {
    1767      110649 :                 *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
    1768      110649 :                 pNewCharStr++;
    1769      110649 :                 pCharStr++;
    1770      110649 :                 nLen--;
    1771             : 
    1772     1759209 :                 while ( nLen > 0 )
    1773             :                 {
    1774     1537911 :                     *pNewCharStr = rtl::toAsciiUpperCase(IMPL_RTL_USTRCODE(*pCharStr));
    1775             : 
    1776     1537911 :                     pNewCharStr++;
    1777     1537911 :                     pCharStr++;
    1778     1537911 :                     nLen--;
    1779             :                 }
    1780             :             }
    1781             : 
    1782      110649 :             bChanged = 1;
    1783      110649 :             break;
    1784             :         }
    1785             : 
    1786     3617591 :         pCharStr++;
    1787     3617591 :         nLen--;
    1788             :     }
    1789             : 
    1790     1646568 :     if ( !bChanged )
    1791             :     {
    1792     1535919 :         *ppThis = pStr;
    1793     1535919 :         IMPL_RTL_ACQUIRE( pStr );
    1794             :     }
    1795             : 
    1796             :     RTL_LOG_STRING_NEW( *ppThis );
    1797             :     /* must be done last, if pStr == *ppThis */
    1798     1646568 :     if ( pOrg )
    1799           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1800     1646568 : }
    1801             : 
    1802             : /* ----------------------------------------------------------------------- */
    1803             : 
    1804      278677 : void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
    1805             :                                               IMPL_RTL_STRINGDATA* pStr )
    1806             :     SAL_THROW_EXTERN_C()
    1807             : {
    1808             :     assert(ppThis);
    1809             :     assert(pStr);
    1810      278677 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1811      278677 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1812      278677 :     sal_Int32               nPreSpaces  = 0;
    1813      278677 :     sal_Int32               nPostSpaces = 0;
    1814      278677 :     sal_Int32               nLen        = pStr->length;
    1815      278677 :     sal_Int32               nIndex      = nLen-1;
    1816             : 
    1817     1160723 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
    1818      603369 :         nPreSpaces++;
    1819             : 
    1820      652051 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
    1821             :     {
    1822       94697 :         nPostSpaces++;
    1823       94697 :         nIndex--;
    1824             :     }
    1825             : 
    1826      278677 :     if ( !nPreSpaces && !nPostSpaces )
    1827             :     {
    1828      204100 :         *ppThis = pStr;
    1829      204100 :         IMPL_RTL_ACQUIRE( pStr );
    1830             :     }
    1831             :     else
    1832             :     {
    1833       74577 :         nLen -= nPostSpaces+nPreSpaces;
    1834       74577 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1835             :         assert(*ppThis);
    1836       74577 :         rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
    1837             :     }
    1838             : 
    1839             :     RTL_LOG_STRING_NEW( *ppThis );
    1840             :     /* must be done last, if pStr == *ppThis */
    1841      278677 :     if ( pOrg )
    1842           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1843      278677 : }
    1844             : 
    1845             : /* ----------------------------------------------------------------------- */
    1846             : 
    1847    15017465 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
    1848             :                                                     IMPL_RTL_STRINGDATA* pStr,
    1849             :                                                     sal_Int32 nToken,
    1850             :                                                     IMPL_RTL_STRCODE cTok,
    1851             :                                                     sal_Int32 nIndex )
    1852             :     SAL_THROW_EXTERN_C()
    1853             : {
    1854             :     assert(ppThis);
    1855             :     assert(pStr);
    1856    15017465 :     const IMPL_RTL_STRCODE* pCharStr        = pStr->buffer;
    1857             :     const IMPL_RTL_STRCODE* pCharStrStart;
    1858             :     const IMPL_RTL_STRCODE* pOrgCharStr;
    1859    15017465 :     sal_Int32               nLen            = pStr->length-nIndex;
    1860    15017465 :     sal_Int32               nTokCount       = 0;
    1861             : 
    1862             :     // Set ppThis to an empty string and return -1 if either nToken or nIndex is
    1863             :     // negative:
    1864    15017465 :     if (nIndex < 0)
    1865        1412 :         nToken = -1;
    1866             : 
    1867    15017465 :     pCharStr += nIndex;
    1868    15017465 :     pOrgCharStr = pCharStr;
    1869    15017465 :     pCharStrStart = pCharStr;
    1870    85077800 :     while ( nLen > 0 )
    1871             :     {
    1872    62396338 :         if ( *pCharStr == cTok )
    1873             :         {
    1874     7480276 :             nTokCount++;
    1875             : 
    1876     7480276 :             if ( nTokCount == nToken )
    1877       64255 :                 pCharStrStart = pCharStr+1;
    1878             :             else
    1879             :             {
    1880     7416021 :                 if ( nTokCount > nToken )
    1881     7353468 :                     break;
    1882             :             }
    1883             :         }
    1884             : 
    1885    55042870 :         pCharStr++;
    1886    55042870 :         nLen--;
    1887             :     }
    1888             : 
    1889    15017465 :     if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
    1890             :     {
    1891     7819823 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1892     7819844 :         if( (nToken < 0) || (nTokCount < nToken ) )
    1893        2569 :             return -1;
    1894     7817275 :         else if( nLen > 0 )
    1895     4847517 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1896     2969758 :         else return -1;
    1897             :     }
    1898             :     else
    1899             :     {
    1900     7197642 :         IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
    1901     7197642 :         if ( nLen )
    1902     2505590 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1903             :         else
    1904     4692052 :             return -1;
    1905             :     }
    1906             : }
    1907             : 
    1908             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11