LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sal/rtl - strtmpl.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 674 769 87.6 %
Date: 2013-07-09 Functions: 100 126 79.4 %
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 <string.h>
      26             : #include <sal/log.hxx>
      27             : #include <limits>
      28             : #include <boost/static_assert.hpp>
      29             : 
      30             : /*
      31             : inline void rtl_str_ImplCopy( IMPL_RTL_STRCODE* pDest,
      32             :                               const IMPL_RTL_STRCODE* pSrc,
      33             :                               sal_Int32 nCount )
      34             : {
      35             :     while ( nCount > 0 )
      36             :     {
      37             :         *pDest = *pSrc;
      38             :         pDest++;
      39             :         pSrc++;
      40             :         nCount--;
      41             :     }
      42             : }
      43             : */
      44             : 
      45             : #define rtl_str_ImplCopy( _pDest, _pSrc, _nCount )                  \
      46             : {                                                                   \
      47             :     IMPL_RTL_STRCODE*       __mm_pDest      = _pDest;               \
      48             :     const IMPL_RTL_STRCODE* __mm_pSrc       = _pSrc;                \
      49             :     sal_Int32               __mm_nCount     = _nCount;              \
      50             :     while ( __mm_nCount > 0 )                                       \
      51             :     {                                                               \
      52             :         *__mm_pDest = *__mm_pSrc;                                   \
      53             :         __mm_pDest++;                                               \
      54             :         __mm_pSrc++;                                                \
      55             :         __mm_nCount--;                                              \
      56             :     }                                                               \
      57             : }
      58             : 
      59             : /* ======================================================================= */
      60             : /* C-String functions which could be used without the String-Class         */
      61             : /* ======================================================================= */
      62             : 
      63    13299135 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( getLength )( const IMPL_RTL_STRCODE* pStr )
      64             :     SAL_THROW_EXTERN_C()
      65             : {
      66    13299135 :     const IMPL_RTL_STRCODE* pTempStr = pStr;
      67   501438760 :     while( *pTempStr )
      68   474840490 :         pTempStr++;
      69    13299135 :     return pTempStr-pStr;
      70             : }
      71             : 
      72             : /* ----------------------------------------------------------------------- */
      73             : 
      74     3527882 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare )( const IMPL_RTL_STRCODE* pStr1,
      75             :                                                 const IMPL_RTL_STRCODE* pStr2 )
      76             :     SAL_THROW_EXTERN_C()
      77             : {
      78             :     sal_Int32 nRet;
      79   209898492 :     while ( ((nRet = ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr1)))-
      80   103185305 :                      ((sal_Int32)(IMPL_RTL_USTRCODE(*pStr2)))) == 0) &&
      81             :             *pStr2 )
      82             :     {
      83    99657423 :         pStr1++;
      84    99657423 :         pStr2++;
      85             :     }
      86             : 
      87     3527882 :     return nRet;
      88             : }
      89             : 
      90             : /* ----------------------------------------------------------------------- */
      91             : 
      92   210227534 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
      93             :                                                            sal_Int32 nStr1Len,
      94             :                                                            const IMPL_RTL_STRCODE* pStr2,
      95             :                                                            sal_Int32 nStr2Len )
      96             :     SAL_THROW_EXTERN_C()
      97             : {
      98   210227534 :     sal_Int32 nRet = nStr1Len - nStr2Len;
      99   210227534 :     int nCount = (nRet <= 0) ? nStr1Len : nStr2Len;
     100             : 
     101   210227534 :     --pStr1;
     102   210227534 :     --pStr2;
     103   210227534 :     while( (--nCount >= 0) && (*++pStr1 == *++pStr2) ) ;
     104             : 
     105   210227534 :     if( nCount >= 0 )
     106             :         nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))
     107   135763287 :              - ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     108             : 
     109   210227534 :     return nRet;
     110             : }
     111             : 
     112             : /* ----------------------------------------------------------------------- */
     113             : 
     114     4531515 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     115             :                                                                     sal_Int32 nStr1Len,
     116             :                                                                     const IMPL_RTL_STRCODE* pStr2,
     117             :                                                                     sal_Int32 nStr2Len,
     118             :                                                                     sal_Int32 nShortenedLength )
     119             :     SAL_THROW_EXTERN_C()
     120             : {
     121     4531515 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     122     4531515 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     123             :     sal_Int32               nRet;
     124    13506568 :     while ( (nShortenedLength > 0) &&
     125     8737683 :             (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     126             :     {
     127     8737683 :         nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1 )))-
     128     8737683 :                ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2 )));
     129     8737683 :         if ( nRet )
     130     4294145 :             return nRet;
     131             : 
     132     4443538 :         nShortenedLength--;
     133     4443538 :         pStr1++;
     134     4443538 :         pStr2++;
     135             :     }
     136             : 
     137      237370 :     if ( nShortenedLength <= 0 )
     138      221754 :         return 0;
     139       15616 :     return nStr1Len - nStr2Len;
     140             : }
     141             : 
     142             : /* ----------------------------------------------------------------------- */
     143             : 
     144    21871167 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( reverseCompare_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     145             :                                                                   sal_Int32 nStr1Len,
     146             :                                                                   const IMPL_RTL_STRCODE* pStr2,
     147             :                                                                   sal_Int32 nStr2Len )
     148             :     SAL_THROW_EXTERN_C()
     149             : {
     150    21871167 :     const IMPL_RTL_STRCODE* pStr1Run = pStr1+nStr1Len;
     151    21871167 :     const IMPL_RTL_STRCODE* pStr2Run = pStr2+nStr2Len;
     152             :     sal_Int32               nRet;
     153   178780799 :     while ( (pStr1 < pStr1Run) && (pStr2 < pStr2Run) )
     154             :     {
     155   144779370 :         pStr1Run--;
     156   144779370 :         pStr2Run--;
     157   144779370 :         nRet = ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr1Run )))-
     158   144779370 :                ((sal_Int32)(IMPL_RTL_USTRCODE( *pStr2Run )));
     159   144779370 :         if ( nRet )
     160     9740905 :             return nRet;
     161             :     }
     162             : 
     163    12130262 :     return nStr1Len - nStr2Len;
     164             : }
     165             : 
     166             : /* ----------------------------------------------------------------------- */
     167             : 
     168       23552 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase )( const IMPL_RTL_STRCODE* pStr1,
     169             :                                                                const IMPL_RTL_STRCODE* pStr2 )
     170             :     SAL_THROW_EXTERN_C()
     171             : {
     172             :     sal_Int32   nRet;
     173             :     sal_Int32   c1;
     174             :     sal_Int32   c2;
     175       12356 :     do
     176             :     {
     177             :         /* If character between 'A' and 'Z', than convert it to lowercase */
     178       23552 :         c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
     179       23552 :         c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
     180       23552 :         if ( (c1 >= 65) && (c1 <= 90) )
     181       16481 :             c1 += 32;
     182       23552 :         if ( (c2 >= 65) && (c2 <= 90) )
     183       16479 :             c2 += 32;
     184       23552 :         nRet = c1-c2;
     185       23552 :         if ( nRet != 0 )
     186       11196 :             return nRet;
     187             : 
     188       12356 :         pStr1++;
     189       12356 :         pStr2++;
     190             :     }
     191             :     while ( c2 );
     192             : 
     193        2021 :     return 0;
     194             : }
     195             : 
     196             : /* ----------------------------------------------------------------------- */
     197             : 
     198      345196 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( compareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     199             :                                                                           sal_Int32 nStr1Len,
     200             :                                                                           const IMPL_RTL_STRCODE* pStr2,
     201             :                                                                           sal_Int32 nStr2Len )
     202             :     SAL_THROW_EXTERN_C()
     203             : {
     204      345196 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     205      345196 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     206             :     sal_Int32   nRet;
     207             :     sal_Int32   c1;
     208             :     sal_Int32   c2;
     209     1902920 :     while ( (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     210             :     {
     211             :         /* If character between 'A' and 'Z', than convert it to lowercase */
     212     1382604 :         c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
     213     1382604 :         c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
     214     1382604 :         if ( (c1 >= 65) && (c1 <= 90) )
     215      647553 :             c1 += 32;
     216     1382604 :         if ( (c2 >= 65) && (c2 <= 90) )
     217      713836 :             c2 += 32;
     218     1382604 :         nRet = c1-c2;
     219     1382604 :         if ( nRet != 0 )
     220      170076 :             return nRet;
     221             : 
     222     1212528 :         pStr1++;
     223     1212528 :         pStr2++;
     224             :     }
     225             : 
     226      175120 :     return nStr1Len - nStr2Len;
     227             : }
     228             : 
     229             : /* ----------------------------------------------------------------------- */
     230             : 
     231      605024 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( shortenedCompareIgnoreAsciiCase_WithLength )( const IMPL_RTL_STRCODE* pStr1,
     232             :                                                                                    sal_Int32 nStr1Len,
     233             :                                                                                    const IMPL_RTL_STRCODE* pStr2,
     234             :                                                                                    sal_Int32 nStr2Len,
     235             :                                                                                    sal_Int32 nShortenedLength )
     236             :     SAL_THROW_EXTERN_C()
     237             : {
     238      605024 :     const IMPL_RTL_STRCODE* pStr1End = pStr1 + nStr1Len;
     239      605024 :     const IMPL_RTL_STRCODE* pStr2End = pStr2 + nStr2Len;
     240             :     sal_Int32               nRet;
     241             :     sal_Int32               c1;
     242             :     sal_Int32               c2;
     243     1310104 :     while ( (nShortenedLength > 0) &&
     244      636735 :             (pStr1 < pStr1End) && (pStr2 < pStr2End) )
     245             :     {
     246             :         /* If character between 'A' and 'Z', than convert it to lowercase */
     247      636735 :         c1 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr1 );
     248      636735 :         c2 = (sal_Int32)IMPL_RTL_USTRCODE( *pStr2 );
     249      636735 :         if ( (c1 >= 65) && (c1 <= 90) )
     250       41102 :             c1 += 32;
     251      636735 :         if ( (c2 >= 65) && (c2 <= 90) )
     252       28996 :             c2 += 32;
     253      636735 :         nRet = c1-c2;
     254      636735 :         if ( nRet != 0 )
     255      536679 :             return nRet;
     256             : 
     257      100056 :         nShortenedLength--;
     258      100056 :         pStr1++;
     259      100056 :         pStr2++;
     260             :     }
     261             : 
     262       68345 :     if ( nShortenedLength <= 0 )
     263         454 :         return 0;
     264       67891 :     return nStr1Len - nStr2Len;
     265             : }
     266             : 
     267             : /* ----------------------------------------------------------------------- */
     268             : 
     269     2642006 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode )( const IMPL_RTL_STRCODE* pStr )
     270             :     SAL_THROW_EXTERN_C()
     271             : {
     272     2642006 :     return IMPL_RTL_STRNAME( hashCode_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     273             : }
     274             : 
     275             : /* ----------------------------------------------------------------------- */
     276             : 
     277    19808072 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( hashCode_WithLength )( const IMPL_RTL_STRCODE* pStr,
     278             :                                                             sal_Int32 nLen )
     279             :     SAL_THROW_EXTERN_C()
     280             : {
     281    19808072 :     sal_Int32 h = nLen;
     282             : 
     283    19808072 :     if ( nLen < 256 )
     284             :     {
     285   444881512 :         while ( nLen > 0 )
     286             :         {
     287   405267742 :             h = (h*37) + IMPL_RTL_USTRCODE( *pStr );
     288   405267742 :             pStr++;
     289   405267742 :             nLen--;
     290             :         }
     291             :     }
     292             :     else
     293             :     {
     294             :         sal_Int32               nSkip;
     295        1187 :         const IMPL_RTL_STRCODE* pEndStr = pStr+nLen-5;
     296             : 
     297             :         /* only sample some characters */
     298             :         /* the first 3, some characters between, and the last 5 */
     299        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
     300        1187 :         pStr++;
     301        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
     302        1187 :         pStr++;
     303        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
     304        1187 :         pStr++;
     305             : 
     306        1187 :         nSkip = nLen / 8;
     307        1187 :         nLen -= 8;
     308       11870 :         while ( nLen > 0 )
     309             :         {
     310        9496 :             h = (h*39) + IMPL_RTL_USTRCODE( *pStr );
     311        9496 :             pStr += nSkip;
     312        9496 :             nLen -= nSkip;
     313             :         }
     314             : 
     315        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
     316        1187 :         pEndStr++;
     317        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
     318        1187 :         pEndStr++;
     319        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
     320        1187 :         pEndStr++;
     321        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
     322        1187 :         pEndStr++;
     323        1187 :         h = (h*39) + IMPL_RTL_USTRCODE( *pEndStr );
     324             :     }
     325             : 
     326    19808072 :     return h;
     327             : }
     328             : 
     329             : /* ----------------------------------------------------------------------- */
     330             : 
     331        3738 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar )( const IMPL_RTL_STRCODE* pStr,
     332             :                                                     IMPL_RTL_STRCODE c )
     333             :     SAL_THROW_EXTERN_C()
     334             : {
     335        3738 :     const IMPL_RTL_STRCODE* pTempStr = pStr;
     336       45234 :     while ( *pTempStr )
     337             :     {
     338       41496 :         if ( *pTempStr == c )
     339        3738 :             return pTempStr-pStr;
     340             : 
     341       37758 :         pTempStr++;
     342             :     }
     343             : 
     344           0 :     return -1;
     345             : }
     346             : 
     347             : /* ----------------------------------------------------------------------- */
     348             : 
     349    41572332 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     350             :                                                                sal_Int32 nLen,
     351             :                                                                IMPL_RTL_STRCODE c )
     352             :     SAL_THROW_EXTERN_C()
     353             : {
     354    41572332 :     const IMPL_RTL_STRCODE* pTempStr = pStr;
     355   423249031 :     while ( nLen > 0 )
     356             :     {
     357   372752264 :         if ( *pTempStr == c )
     358    32647897 :             return pTempStr-pStr;
     359             : 
     360   340104367 :         pTempStr++;
     361   340104367 :         nLen--;
     362             :     }
     363             : 
     364     8924435 :     return -1;
     365             : }
     366             : 
     367             : /* ----------------------------------------------------------------------- */
     368             : 
     369          67 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar )( const IMPL_RTL_STRCODE* pStr,
     370             :                                                         IMPL_RTL_STRCODE c )
     371             :     SAL_THROW_EXTERN_C()
     372             : {
     373          67 :     return IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ), c );
     374             : }
     375             : 
     376             : /* ----------------------------------------------------------------------- */
     377             : 
     378     1159586 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfChar_WithLength )( const IMPL_RTL_STRCODE* pStr,
     379             :                                                                    sal_Int32 nLen,
     380             :                                                                    IMPL_RTL_STRCODE c )
     381             :     SAL_THROW_EXTERN_C()
     382             : {
     383     1159586 :     pStr += nLen;
     384    19432430 :     while ( nLen > 0 )
     385             :     {
     386    17945509 :         nLen--;
     387    17945509 :         pStr--;
     388             : 
     389    17945509 :         if ( *pStr == c )
     390      832251 :             return nLen;
     391             :     }
     392             : 
     393      327335 :     return -1;
     394             : }
     395             : 
     396             : /* ----------------------------------------------------------------------- */
     397             : 
     398         150 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr )( const IMPL_RTL_STRCODE* pStr,
     399             :                                                    const IMPL_RTL_STRCODE* pSubStr )
     400             :     SAL_THROW_EXTERN_C()
     401             : {
     402             :     return IMPL_RTL_STRNAME( indexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     403         150 :                                                       pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     404             : }
     405             : 
     406             : /* ----------------------------------------------------------------------- */
     407             : 
     408    10706746 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( indexOfStr_WithLength )( const IMPL_RTL_STRCODE* pStr,
     409             :                                                               sal_Int32 nStrLen,
     410             :                                                               const  IMPL_RTL_STRCODE* pSubStr,
     411             :                                                               sal_Int32 nSubLen )
     412             :     SAL_THROW_EXTERN_C()
     413             : {
     414             :     /* faster search for a single character */
     415    10706746 :     if ( nSubLen < 2 )
     416             :     {
     417             :         /* an empty SubString is always not foundable */
     418     1687549 :         if ( nSubLen == 1 )
     419             :         {
     420     1687541 :             IMPL_RTL_STRCODE        c = *pSubStr;
     421     1687541 :             const IMPL_RTL_STRCODE* pTempStr = pStr;
     422    18766842 :             while ( nStrLen > 0 )
     423             :             {
     424    16146976 :                 if ( *pTempStr == c )
     425      755216 :                     return pTempStr-pStr;
     426             : 
     427    15391760 :                 pTempStr++;
     428    15391760 :                 nStrLen--;
     429             :             }
     430             :         }
     431             :     }
     432             :     else
     433             :     {
     434     9019197 :         const IMPL_RTL_STRCODE* pTempStr = pStr;
     435   566601086 :         while ( nStrLen > 0 )
     436             :         {
     437   551043401 :             if ( *pTempStr == *pSubStr )
     438             :             {
     439             :                 /* Compare SubString */
     440     9046989 :                 if ( nSubLen <= nStrLen )
     441             :                 {
     442     8671343 :                     const IMPL_RTL_STRCODE* pTempStr1 = pTempStr;
     443     8671343 :                     const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     444     8671343 :                     sal_Int32               nTempLen = nSubLen;
     445    34300853 :                     while ( nTempLen )
     446             :                     {
     447    23524448 :                         if ( *pTempStr1 != *pTempStr2 )
     448     6566281 :                             break;
     449             : 
     450    16958167 :                         pTempStr1++;
     451    16958167 :                         pTempStr2++;
     452    16958167 :                         nTempLen--;
     453             :                     }
     454             : 
     455     8671343 :                     if ( !nTempLen )
     456     2105063 :                         return pTempStr-pStr;
     457             :                 }
     458             :                 else
     459      375646 :                     break;
     460             :             }
     461             : 
     462   548562692 :             nStrLen--;
     463   548562692 :             pTempStr++;
     464             :         }
     465             :     }
     466             : 
     467     7846467 :     return -1;
     468             : }
     469             : 
     470             : /* ----------------------------------------------------------------------- */
     471             : 
     472           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr )( const IMPL_RTL_STRCODE* pStr,
     473             :                                                        const IMPL_RTL_STRCODE* pSubStr )
     474             :     SAL_THROW_EXTERN_C()
     475             : {
     476             :     return IMPL_RTL_STRNAME( lastIndexOfStr_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ),
     477           0 :                                                           pSubStr, IMPL_RTL_STRNAME( getLength )( pSubStr ) );
     478             : }
     479             : 
     480             : /* ----------------------------------------------------------------------- */
     481             : 
     482      106296 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( lastIndexOfStr_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             :     /* faster search for a single character */
     489      106296 :     if ( nSubLen < 2 )
     490             :     {
     491             :         /* an empty SubString is always not foundable */
     492        4192 :         if ( nSubLen == 1 )
     493             :         {
     494        4192 :             IMPL_RTL_STRCODE c = *pSubStr;
     495        4192 :             pStr += nStrLen;
     496       49580 :             while ( nStrLen > 0 )
     497             :             {
     498       42302 :                 nStrLen--;
     499       42302 :                 pStr--;
     500             : 
     501       42302 :                 if ( *pStr == c )
     502        1106 :                     return nStrLen;
     503             :             }
     504             :         }
     505             :     }
     506             :     else
     507             :     {
     508      102104 :         pStr += nStrLen;
     509      102104 :         nStrLen -= nSubLen;
     510      102104 :         pStr -= nSubLen;
     511     3092788 :         while ( nStrLen >= 0 )
     512             :         {
     513     2940775 :             const IMPL_RTL_STRCODE* pTempStr1 = pStr;
     514     2940775 :             const IMPL_RTL_STRCODE* pTempStr2 = pSubStr;
     515     2940775 :             sal_Int32               nTempLen = nSubLen;
     516     6093727 :             while ( nTempLen )
     517             :             {
     518     3100757 :                 if ( *pTempStr1 != *pTempStr2 )
     519     2888580 :                     break;
     520             : 
     521      212177 :                 pTempStr1++;
     522      212177 :                 pTempStr2++;
     523      212177 :                 nTempLen--;
     524             :             }
     525             : 
     526     2940775 :             if ( !nTempLen )
     527       52195 :                 return nStrLen;
     528             : 
     529     2888580 :             nStrLen--;
     530     2888580 :             pStr--;
     531             :         }
     532             :     }
     533             : 
     534       52995 :     return -1;
     535             : }
     536             : 
     537             : /* ----------------------------------------------------------------------- */
     538             : 
     539           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar )( IMPL_RTL_STRCODE* pStr,
     540             :                                                IMPL_RTL_STRCODE cOld,
     541             :                                                IMPL_RTL_STRCODE cNew )
     542             :     SAL_THROW_EXTERN_C()
     543             : {
     544           0 :     while ( *pStr )
     545             :     {
     546           0 :         if ( *pStr == cOld )
     547           0 :             *pStr = cNew;
     548             : 
     549           0 :         pStr++;
     550             :     }
     551           0 : }
     552             : 
     553             : /* ----------------------------------------------------------------------- */
     554             : 
     555           0 : void SAL_CALL IMPL_RTL_STRNAME( replaceChar_WithLength )( IMPL_RTL_STRCODE* pStr,
     556             :                                                           sal_Int32 nLen,
     557             :                                                           IMPL_RTL_STRCODE cOld,
     558             :                                                           IMPL_RTL_STRCODE cNew )
     559             :     SAL_THROW_EXTERN_C()
     560             : {
     561           0 :     while ( nLen > 0 )
     562             :     {
     563           0 :         if ( *pStr == cOld )
     564           0 :             *pStr = cNew;
     565             : 
     566           0 :         pStr++;
     567           0 :         nLen--;
     568             :     }
     569           0 : }
     570             : 
     571             : /* ----------------------------------------------------------------------- */
     572             : 
     573           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase )( IMPL_RTL_STRCODE* pStr )
     574             :     SAL_THROW_EXTERN_C()
     575             : {
     576           0 :     while ( *pStr )
     577             :     {
     578             :         /* Between A-Z (65-90), than to lowercase (+32) */
     579           0 :         if ( (*pStr >= 65) && (*pStr <= 90) )
     580           0 :             *pStr += 32;
     581             : 
     582           0 :         pStr++;
     583             :     }
     584           0 : }
     585             : 
     586             : /* ----------------------------------------------------------------------- */
     587             : 
     588     1627631 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiLowerCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     589             :                                                                sal_Int32 nLen )
     590             :     SAL_THROW_EXTERN_C()
     591             : {
     592    17058441 :     while ( nLen > 0 )
     593             :     {
     594             :         /* Between A-Z (65-90), than to lowercase (+32) */
     595    13803179 :         if ( (*pStr >= 65) && (*pStr <= 90) )
     596       15691 :             *pStr += 32;
     597             : 
     598    13803179 :         pStr++;
     599    13803179 :         nLen--;
     600             :     }
     601     1627631 : }
     602             : 
     603             : /* ----------------------------------------------------------------------- */
     604             : 
     605           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase )( IMPL_RTL_STRCODE* pStr )
     606             :     SAL_THROW_EXTERN_C()
     607             : {
     608           0 :     while ( *pStr )
     609             :     {
     610             :         /* Between a-z (97-122), than to uppercase (-32) */
     611           0 :         if ( (*pStr >= 97) && (*pStr <= 122) )
     612           0 :             *pStr -= 32;
     613             : 
     614           0 :         pStr++;
     615             :     }
     616           0 : }
     617             : 
     618             : /* ----------------------------------------------------------------------- */
     619             : 
     620           0 : void SAL_CALL IMPL_RTL_STRNAME( toAsciiUpperCase_WithLength )( IMPL_RTL_STRCODE* pStr,
     621             :                                                                sal_Int32 nLen )
     622             :     SAL_THROW_EXTERN_C()
     623             : {
     624           0 :     while ( nLen > 0 )
     625             :     {
     626             :         /* Between a-z (97-122), than to uppercase (-32) */
     627           0 :         if ( (*pStr >= 97) && (*pStr <= 122) )
     628           0 :             *pStr -= 32;
     629             : 
     630           0 :         pStr++;
     631           0 :         nLen--;
     632             :     }
     633           0 : }
     634             : 
     635             : /* ----------------------------------------------------------------------- */
     636             : 
     637           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim )( IMPL_RTL_STRCODE* pStr )
     638             :     SAL_THROW_EXTERN_C()
     639             : {
     640           0 :     return IMPL_RTL_STRNAME( trim_WithLength )( pStr, IMPL_RTL_STRNAME( getLength )( pStr ) );
     641             : }
     642             : 
     643             : /* ----------------------------------------------------------------------- */
     644             : 
     645           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( trim_WithLength )( IMPL_RTL_STRCODE* pStr, sal_Int32 nLen )
     646             :     SAL_THROW_EXTERN_C()
     647             : {
     648           0 :     sal_Int32 nPreSpaces    = 0;
     649           0 :     sal_Int32 nPostSpaces   = 0;
     650           0 :     sal_Int32 nIndex        = nLen-1;
     651             : 
     652           0 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nPreSpaces)) ) )
     653           0 :         nPreSpaces++;
     654             : 
     655           0 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pStr+nIndex)) ) )
     656             :     {
     657           0 :         nPostSpaces++;
     658           0 :         nIndex--;
     659             :     }
     660             : 
     661           0 :     if ( nPostSpaces )
     662             :     {
     663           0 :         nLen -= nPostSpaces;
     664           0 :         *(pStr+nLen) = 0;
     665             :     }
     666             : 
     667           0 :     if ( nPreSpaces )
     668             :     {
     669           0 :         IMPL_RTL_STRCODE* pNewStr = pStr+nPreSpaces;
     670             : 
     671           0 :         nLen -= nPreSpaces;
     672           0 :         nIndex = nLen;
     673             : 
     674           0 :         while ( nIndex )
     675             :         {
     676           0 :             *pStr = *pNewStr;
     677           0 :             pStr++;
     678           0 :             pNewStr++;
     679           0 :             nIndex--;
     680             :         }
     681           0 :         *pStr = 0;
     682             :     }
     683             : 
     684           0 :     return nLen;
     685             : }
     686             : 
     687             : /* ----------------------------------------------------------------------- */
     688             : 
     689          43 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfBoolean )( IMPL_RTL_STRCODE* pStr, sal_Bool b )
     690             :     SAL_THROW_EXTERN_C()
     691             : {
     692          43 :     if ( b )
     693             :     {
     694          31 :         *pStr = 't';
     695          31 :         pStr++;
     696          31 :         *pStr = 'r';
     697          31 :         pStr++;
     698          31 :         *pStr = 'u';
     699          31 :         pStr++;
     700          31 :         *pStr = 'e';
     701          31 :         pStr++;
     702          31 :         *pStr = 0;
     703          31 :         return 4;
     704             :     }
     705             :     else
     706             :     {
     707          12 :         *pStr = 'f';
     708          12 :         pStr++;
     709          12 :         *pStr = 'a';
     710          12 :         pStr++;
     711          12 :         *pStr = 'l';
     712          12 :         pStr++;
     713          12 :         *pStr = 's';
     714          12 :         pStr++;
     715          12 :         *pStr = 'e';
     716          12 :         pStr++;
     717          12 :         *pStr = 0;
     718          12 :         return 5;
     719             :     }
     720             : }
     721             : 
     722             : /* ----------------------------------------------------------------------- */
     723             : 
     724           0 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfChar )( IMPL_RTL_STRCODE* pStr,
     725             :                                                     IMPL_RTL_STRCODE c )
     726             :     SAL_THROW_EXTERN_C()
     727             : {
     728           0 :     *pStr++ = c;
     729           0 :     *pStr = 0;
     730           0 :     return 1;
     731             : }
     732             : 
     733             : /* ----------------------------------------------------------------------- */
     734             : 
     735     1389561 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt32 )( IMPL_RTL_STRCODE* pStr,
     736             :                                                      sal_Int32 n,
     737             :                                                      sal_Int16 nRadix )
     738             :     SAL_THROW_EXTERN_C()
     739             : {
     740             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT32];
     741     1389561 :     sal_Char*   pBuf = aBuf;
     742     1389561 :     sal_Int32   nLen = 0;
     743             :     sal_uInt32  nValue;
     744             : 
     745             :     /* Radix must be valid */
     746     1389561 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     747           5 :         nRadix = 10;
     748             : 
     749             :     /* is value negativ */
     750     1389561 :     if ( n < 0 )
     751             :     {
     752         653 :         *pStr = '-';
     753         653 :         pStr++;
     754         653 :         nLen++;
     755         653 :         nValue = -n; /* FIXME this code is not portable for n == -2147483648
     756             :                         (smallest negative value for sal_Int32) */
     757             :     }
     758             :     else
     759     1388908 :         nValue = n;
     760             : 
     761             :     /* create a recursive buffer with all values, except the last one */
     762     2866934 :     do
     763             :     {
     764     2866934 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     765     2866934 :         nValue /= nRadix;
     766     2866934 :         if ( nDigit > 9 )
     767      265687 :             *pBuf = (nDigit-10) + 'a';
     768             :         else
     769     2601247 :             *pBuf = (nDigit + '0' );
     770     2866934 :         pBuf++;
     771             :     }
     772             :     while ( nValue > 0 );
     773             : 
     774             :     /* copy the values in the right direction into the destination buffer */
     775     2866934 :     do
     776             :     {
     777     2866934 :         pBuf--;
     778     2866934 :         *pStr = *pBuf;
     779     2866934 :         pStr++;
     780     2866934 :         nLen++;
     781             :     }
     782             :     while ( pBuf != aBuf );
     783     1389561 :     *pStr = 0;
     784             : 
     785     1389561 :     return nLen;
     786             : }
     787             : 
     788             : /* ----------------------------------------------------------------------- */
     789             : 
     790     1059175 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfInt64 )( IMPL_RTL_STRCODE* pStr,
     791             :                                                      sal_Int64 n,
     792             :                                                      sal_Int16 nRadix )
     793             :     SAL_THROW_EXTERN_C()
     794             : {
     795             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFINT64];
     796     1059175 :     sal_Char*   pBuf = aBuf;
     797     1059175 :     sal_Int32   nLen = 0;
     798             :     sal_uInt64  nValue;
     799             : 
     800             :     /* Radix must be valid */
     801     1059175 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     802           5 :         nRadix = 10;
     803             : 
     804             :     /* is value negativ */
     805     1059175 :     if ( n < 0 )
     806             :     {
     807        8606 :         *pStr = '-';
     808        8606 :         pStr++;
     809        8606 :         nLen++;
     810        8606 :         nValue = -n; /* FIXME this code is not portable for
     811             :                         n == -9223372036854775808 (smallest negative value for
     812             :                         sal_Int64) */
     813             :     }
     814             :     else
     815     1050569 :         nValue = n;
     816             : 
     817             :     /* create a recursive buffer with all values, except the last one */
     818     2437927 :     do
     819             :     {
     820     2437927 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     821     2437927 :         nValue /= nRadix;
     822     2437927 :         if ( nDigit > 9 )
     823      327049 :             *pBuf = (nDigit-10) + 'a';
     824             :         else
     825     2110878 :             *pBuf = (nDigit + '0' );
     826     2437927 :         pBuf++;
     827             :     }
     828             :     while ( nValue > 0 );
     829             : 
     830             :     /* copy the values in the right direction into the destination buffer */
     831     2437927 :     do
     832             :     {
     833     2437927 :         pBuf--;
     834     2437927 :         *pStr = *pBuf;
     835     2437927 :         pStr++;
     836     2437927 :         nLen++;
     837             :     }
     838             :     while ( pBuf != aBuf );
     839     1059175 :     *pStr = 0;
     840             : 
     841     1059175 :     return nLen;
     842             : }
     843             : 
     844             : /* ----------------------------------------------------------------------- */
     845             : 
     846       15863 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( valueOfUInt64 )( IMPL_RTL_STRCODE* pStr,
     847             :                                                       sal_uInt64 n,
     848             :                                                       sal_Int16 nRadix )
     849             :     SAL_THROW_EXTERN_C()
     850             : {
     851             :     sal_Char    aBuf[RTL_STR_MAX_VALUEOFUINT64];
     852       15863 :     sal_Char*   pBuf = aBuf;
     853       15863 :     sal_Int32   nLen = 0;
     854             :     sal_uInt64  nValue;
     855             : 
     856             :     /* Radix must be valid */
     857       15863 :     if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     858           0 :         nRadix = 10;
     859             : 
     860       15863 :     nValue = n;
     861             : 
     862             :     /* create a recursive buffer with all values, except the last one */
     863       54797 :     do
     864             :     {
     865       54797 :         sal_Char nDigit = (sal_Char)(nValue % nRadix);
     866       54797 :         nValue /= nRadix;
     867       54797 :         if ( nDigit > 9 )
     868           0 :             *pBuf = (nDigit-10) + 'a';
     869             :         else
     870       54797 :             *pBuf = (nDigit + '0' );
     871       54797 :         pBuf++;
     872             :     }
     873             :     while ( nValue > 0 );
     874             : 
     875             :     /* copy the values in the right direction into the destination buffer */
     876       54797 :     do
     877             :     {
     878       54797 :         pBuf--;
     879       54797 :         *pStr = *pBuf;
     880       54797 :         pStr++;
     881       54797 :         nLen++;
     882             :     }
     883             :     while ( pBuf != aBuf );
     884       15863 :     *pStr = 0;
     885             : 
     886       15863 :     return nLen;
     887             : }
     888             : 
     889             : /* ----------------------------------------------------------------------- */
     890             : 
     891         384 : sal_Bool SAL_CALL IMPL_RTL_STRNAME( toBoolean )( const IMPL_RTL_STRCODE* pStr )
     892             :     SAL_THROW_EXTERN_C()
     893             : {
     894         384 :     if ( *pStr == '1' )
     895           0 :         return sal_True;
     896             : 
     897         384 :     if ( (*pStr == 'T') || (*pStr == 't') )
     898             :     {
     899           0 :         pStr++;
     900           0 :         if ( (*pStr == 'R') || (*pStr == 'r') )
     901             :         {
     902           0 :             pStr++;
     903           0 :             if ( (*pStr == 'U') || (*pStr == 'u') )
     904             :             {
     905           0 :                 pStr++;
     906           0 :                 if ( (*pStr == 'E') || (*pStr == 'e') )
     907           0 :                     return sal_True;
     908             :             }
     909             :         }
     910             :     }
     911             : 
     912         384 :     return sal_False;
     913             : }
     914             : 
     915             : /* ----------------------------------------------------------------------- */
     916             : namespace {
     917     1400934 :     template <typename T> static inline T IMPL_RTL_STRNAME( toInt )( const IMPL_RTL_STRCODE* pStr,
     918             :                                                                      sal_Int16 nRadix )
     919             :     {
     920             :         BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_signed);
     921             :         sal_Bool    bNeg;
     922             :         sal_Int16   nDigit;
     923     1400934 :         T           n = 0;
     924             : 
     925     1400934 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
     926           0 :             nRadix = 10;
     927             : 
     928             :         /* Skip whitespaces */
     929     2801964 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
     930          96 :             pStr++;
     931             : 
     932     1400934 :         if ( *pStr == '-' )
     933             :         {
     934       24220 :             bNeg = sal_True;
     935       24220 :             pStr++;
     936             :         }
     937             :         else
     938             :         {
     939     1376714 :             if ( *pStr == '+' )
     940           0 :                 pStr++;
     941     1376714 :             bNeg = sal_False;
     942             :         }
     943             : 
     944             :         T nDiv;
     945             :         sal_Int16 nMod;
     946     1400934 :         if ( bNeg )
     947             :         {
     948       24220 :             nDiv = std::numeric_limits<T>::min() / nRadix;
     949       24220 :             nMod = std::numeric_limits<T>::min() % nRadix;
     950             :             // Cater for C++03 implementations that round the quotient down
     951             :             // instead of truncating towards zero as mandated by C++11:
     952       24220 :             if ( nMod > 0 )
     953             :             {
     954           0 :                 --nDiv;
     955           0 :                 nMod -= nRadix;
     956             :             }
     957       24220 :             nDiv = -nDiv;
     958       24220 :             nMod = -nMod;
     959             :         }
     960             :         else
     961             :         {
     962     1376714 :             nDiv = std::numeric_limits<T>::max() / nRadix;
     963     1376714 :             nMod = std::numeric_limits<T>::max() % nRadix;
     964             :         }
     965             : 
     966     6031101 :         while ( *pStr )
     967             :         {
     968     3245281 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
     969     3245281 :             if ( nDigit < 0 )
     970       16037 :                 break;
     971     3229244 :             if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
     972          11 :                 return 0;
     973             : 
     974     3229233 :             n *= nRadix;
     975     3229233 :             n += nDigit;
     976             : 
     977     3229233 :             pStr++;
     978             :         }
     979             : 
     980     1400923 :         if ( bNeg )
     981       24216 :             return -n;
     982             :         else
     983     1376707 :             return n;
     984             :     }
     985             : }
     986             : 
     987     1346449 : sal_Int32 SAL_CALL IMPL_RTL_STRNAME( toInt32 )( const IMPL_RTL_STRCODE* pStr,
     988             :                                                 sal_Int16 nRadix )
     989             :     SAL_THROW_EXTERN_C()
     990             : {
     991     1346449 :     return IMPL_RTL_STRNAME( toInt )<sal_Int32>(pStr, nRadix);
     992             : }
     993             : 
     994       54485 : sal_Int64 SAL_CALL IMPL_RTL_STRNAME( toInt64 )( const IMPL_RTL_STRCODE* pStr,
     995             :                                                 sal_Int16 nRadix )
     996             :     SAL_THROW_EXTERN_C()
     997             : {
     998       54485 :     return IMPL_RTL_STRNAME( toInt )<sal_Int64>(pStr, nRadix);
     999             : }
    1000             : 
    1001             : /* ----------------------------------------------------------------------- */
    1002             : namespace {
    1003       26146 :     template <typename T> static inline T IMPL_RTL_STRNAME( toUInt )( const IMPL_RTL_STRCODE* pStr,
    1004             :                                                                       sal_Int16 nRadix )
    1005             :     {
    1006             :         BOOST_STATIC_ASSERT(!std::numeric_limits<T>::is_signed);
    1007             :         sal_Int16   nDigit;
    1008       26146 :         T           n = 0;
    1009             : 
    1010       26146 :         if ( (nRadix < RTL_STR_MIN_RADIX) || (nRadix > RTL_STR_MAX_RADIX) )
    1011           0 :             nRadix = 10;
    1012             : 
    1013             :         /* Skip whitespaces */
    1014       52292 :         while ( *pStr && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE( *pStr ) ) )
    1015           0 :             ++pStr;
    1016             : 
    1017             :         // skip optional explicit sign
    1018       26146 :         if ( *pStr == '+' )
    1019           0 :             ++pStr;
    1020             : 
    1021       26146 :         T nDiv = std::numeric_limits<T>::max() / nRadix;
    1022       26146 :         sal_Int16 nMod = std::numeric_limits<T>::max() % nRadix;
    1023      221488 :         while ( *pStr )
    1024             :         {
    1025      171772 :             nDigit = rtl_ImplGetDigit( IMPL_RTL_USTRCODE( *pStr ), nRadix );
    1026      171772 :             if ( nDigit < 0 )
    1027        1752 :                 break;
    1028      170020 :             if( ( nMod < nDigit ? nDiv-1 : nDiv ) < n )
    1029         824 :                 return 0;
    1030             : 
    1031      169196 :             n *= nRadix;
    1032      169196 :             n += nDigit;
    1033             : 
    1034      169196 :             ++pStr;
    1035             :         }
    1036             : 
    1037       25322 :         return n;
    1038             :     }
    1039             : }
    1040             : 
    1041       26140 : sal_uInt32 SAL_CALL IMPL_RTL_STRNAME( toUInt32 )( const IMPL_RTL_STRCODE* pStr,
    1042             :                                                   sal_Int16 nRadix )
    1043             :     SAL_THROW_EXTERN_C()
    1044             : {
    1045       26140 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt32>(pStr, nRadix);
    1046             : }
    1047             : 
    1048           6 : sal_uInt64 SAL_CALL IMPL_RTL_STRNAME( toUInt64 )( const IMPL_RTL_STRCODE* pStr,
    1049             :                                                   sal_Int16 nRadix )
    1050             :     SAL_THROW_EXTERN_C()
    1051             : {
    1052           6 :     return IMPL_RTL_STRNAME( toUInt )<sal_uInt64>(pStr, nRadix);
    1053             : }
    1054             : 
    1055             : /* ======================================================================= */
    1056             : /* Internal String-Class help functions                                    */
    1057             : /* ======================================================================= */
    1058             : 
    1059   125795367 : static IMPL_RTL_STRINGDATA* IMPL_RTL_STRINGNAME( ImplAlloc )( sal_Int32 nLen )
    1060             : {
    1061             :     IMPL_RTL_STRINGDATA * pData
    1062   125795367 :         = (sal::static_int_cast< sal_uInt32 >(nLen)
    1063             :            <= ((SAL_MAX_UINT32 - sizeof (IMPL_RTL_STRINGDATA))
    1064             :                / sizeof (IMPL_RTL_STRCODE)))
    1065             :         ? (IMPL_RTL_STRINGDATA *) rtl_allocateMemory(
    1066   125795487 :             sizeof (IMPL_RTL_STRINGDATA) + nLen * sizeof (IMPL_RTL_STRCODE))
    1067   251590974 :         : NULL;
    1068   125795496 :     if (pData != NULL) {
    1069   125795496 :         pData->refCount = 1;
    1070   125795496 :         pData->length = nLen;
    1071   125795496 :         pData->buffer[nLen] = 0;
    1072             :     }
    1073   125795496 :     return pData;
    1074             : }
    1075             : 
    1076             : /* ----------------------------------------------------------------------- */
    1077             : 
    1078     1475720 : static IMPL_RTL_STRCODE* IMPL_RTL_STRINGNAME( ImplNewCopy )( IMPL_RTL_STRINGDATA** ppThis,
    1079             :                                                              IMPL_RTL_STRINGDATA* pStr,
    1080             :                                                              sal_Int32 nCount )
    1081             : {
    1082             :     IMPL_RTL_STRCODE*       pDest;
    1083             :     const IMPL_RTL_STRCODE* pSrc;
    1084     1475720 :     IMPL_RTL_STRINGDATA*    pData = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1085             :     OSL_ASSERT(pData != NULL);
    1086             : 
    1087     1475720 :     pDest   = pData->buffer;
    1088     1475720 :     pSrc    = pStr->buffer;
    1089     5486083 :     while ( nCount > 0 )
    1090             :     {
    1091     2534643 :         *pDest = *pSrc;
    1092     2534643 :         pDest++;
    1093     2534643 :         pSrc++;
    1094     2534643 :         nCount--;
    1095             :     }
    1096             : 
    1097     1475720 :     *ppThis = pData;
    1098             : 
    1099             :     RTL_LOG_STRING_NEW( pData );
    1100     1475720 :     return pDest;
    1101             : }
    1102             : 
    1103             : /* ======================================================================= */
    1104             : /* String-Class functions                                                  */
    1105             : /* ======================================================================= */
    1106             : 
    1107             : #define IMPL_RTL_AQUIRE( pThis )                                \
    1108             : {                                                               \
    1109             :     if (!SAL_STRING_IS_STATIC (pThis))                          \
    1110             :         osl_atomic_increment( &((pThis)->refCount) );  \
    1111             : }
    1112             : 
    1113             : /* ----------------------------------------------------------------------- */
    1114             : 
    1115   239729773 : void SAL_CALL IMPL_RTL_STRINGNAME( acquire )( IMPL_RTL_STRINGDATA* pThis )
    1116             :     SAL_THROW_EXTERN_C()
    1117             : {
    1118   239729773 :     IMPL_RTL_AQUIRE( pThis );
    1119   239729773 : }
    1120             : 
    1121             : /* ----------------------------------------------------------------------- */
    1122             : 
    1123   634982811 : void SAL_CALL IMPL_RTL_STRINGNAME( release )( IMPL_RTL_STRINGDATA* pThis )
    1124             :     SAL_THROW_EXTERN_C()
    1125             : {
    1126   634982811 :     if (SAL_STRING_IS_STATIC (pThis))
    1127   307560913 :         return;
    1128             : 
    1129             : /* OString doesn't have an 'intern' */
    1130             : #ifdef IMPL_RTL_INTERN
    1131   354719482 :     if (SAL_STRING_IS_INTERN (pThis))
    1132             :     {
    1133     3282559 :         internRelease (pThis);
    1134     3282559 :         return;
    1135             :     }
    1136             : #endif
    1137             : 
    1138   407276159 :     if ( !osl_atomic_decrement( &(pThis->refCount) ) )
    1139             :     {
    1140             :         RTL_LOG_STRING_DELETE( pThis );
    1141   124612298 :         rtl_freeMemory( pThis );
    1142             :     }
    1143             : }
    1144             : 
    1145             : /* ----------------------------------------------------------------------- */
    1146             : 
    1147   159692138 : void SAL_CALL IMPL_RTL_STRINGNAME( new )( IMPL_RTL_STRINGDATA** ppThis )
    1148             :     SAL_THROW_EXTERN_C()
    1149             : {
    1150   159692138 :     if ( *ppThis)
    1151     4790286 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1152             : 
    1153   159692138 :     *ppThis = (IMPL_RTL_STRINGDATA*) (&IMPL_RTL_EMPTYSTRING);
    1154   159692138 : }
    1155             : 
    1156             : /* ----------------------------------------------------------------------- */
    1157             : 
    1158     2792329 : IMPL_RTL_STRINGDATA* SAL_CALL IMPL_RTL_STRINGNAME( alloc )( sal_Int32 nLen )
    1159             :     SAL_THROW_EXTERN_C()
    1160             : {
    1161     2792329 :     if ( nLen < 0 )
    1162           0 :         return NULL;
    1163             :     else
    1164     2792329 :         return IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1165             : }
    1166             : 
    1167             : /* ----------------------------------------------------------------------- */
    1168             : 
    1169    18636965 : void SAL_CALL IMPL_RTL_STRINGNAME( new_WithLength )( IMPL_RTL_STRINGDATA** ppThis, sal_Int32 nLen )
    1170             :     SAL_THROW_EXTERN_C()
    1171             : {
    1172    18636965 :     if ( nLen <= 0 )
    1173       25322 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1174             :     else
    1175             :     {
    1176    18611643 :         if ( *ppThis)
    1177     1287584 :             IMPL_RTL_STRINGNAME( release )( *ppThis );
    1178             : 
    1179    18611643 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1180             :         OSL_ASSERT(*ppThis != NULL);
    1181    18611643 :         (*ppThis)->length   = 0;
    1182             : 
    1183    18611643 :         IMPL_RTL_STRCODE* pTempStr = (*ppThis)->buffer;
    1184    18611643 :         memset(pTempStr, 0, nLen*sizeof(IMPL_RTL_STRCODE));
    1185             :     }
    1186    18636965 : }
    1187             : 
    1188             : /* ----------------------------------------------------------------------- */
    1189             : 
    1190       29439 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromString )( IMPL_RTL_STRINGDATA** ppThis,
    1191             :                                                     const IMPL_RTL_STRINGDATA* pStr )
    1192             :     SAL_THROW_EXTERN_C()
    1193             : {
    1194             :     IMPL_RTL_STRINGDATA* pOrg;
    1195             : 
    1196       29439 :     if ( !pStr->length )
    1197             :     {
    1198           0 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1199       29439 :         return;
    1200             :     }
    1201             : 
    1202       29439 :     pOrg = *ppThis;
    1203       29439 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( pStr->length );
    1204             :     OSL_ASSERT(*ppThis != NULL);
    1205       29439 :     rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer, pStr->length );
    1206             :     RTL_LOG_STRING_NEW( *ppThis );
    1207             : 
    1208             :     /* must be done last, if pStr == *ppThis */
    1209       29439 :     if ( pOrg )
    1210           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1211             : }
    1212             : 
    1213             : /* ----------------------------------------------------------------------- */
    1214             : 
    1215    19411987 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr )( IMPL_RTL_STRINGDATA** ppThis,
    1216             :                                                  const IMPL_RTL_STRCODE* pCharStr )
    1217             :     SAL_THROW_EXTERN_C()
    1218             : {
    1219             :     IMPL_RTL_STRCODE*       pBuffer;
    1220             :     IMPL_RTL_STRINGDATA*    pOrg;
    1221             :     sal_Int32               nLen;
    1222             : 
    1223    19411987 :     if ( pCharStr )
    1224             :     {
    1225    19411352 :         const IMPL_RTL_STRCODE* pTempStr = pCharStr;
    1226   349733646 :         while( *pTempStr )
    1227   310910942 :             pTempStr++;
    1228    19411352 :         nLen = pTempStr-pCharStr;
    1229             :     }
    1230             :     else
    1231         635 :         nLen = 0;
    1232             : 
    1233    19411987 :     if ( !nLen )
    1234             :     {
    1235     1099818 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1236    20511805 :         return;
    1237             :     }
    1238             : 
    1239    18312169 :     pOrg = *ppThis;
    1240    18312169 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1241             :     OSL_ASSERT(*ppThis != NULL);
    1242    18312169 :     pBuffer = (*ppThis)->buffer;
    1243   310910962 :     do
    1244             :     {
    1245   310910962 :         *pBuffer = *pCharStr;
    1246   310910962 :         pBuffer++;
    1247   310910962 :         pCharStr++;
    1248             :     }
    1249             :     while ( *pCharStr );
    1250             : 
    1251             :     RTL_LOG_STRING_NEW( *ppThis );
    1252             : 
    1253             :     /* must be done last, if pCharStr == *ppThis */
    1254    18312169 :     if ( pOrg )
    1255       71871 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1256             : }
    1257             : 
    1258             : /* ----------------------------------------------------------------------- */
    1259             : 
    1260    26768670 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromStr_WithLength )( IMPL_RTL_STRINGDATA** ppThis,
    1261             :                                                             const IMPL_RTL_STRCODE* pCharStr,
    1262             :                                                             sal_Int32 nLen )
    1263             :     SAL_THROW_EXTERN_C()
    1264             : {
    1265             :     IMPL_RTL_STRINGDATA* pOrg;
    1266             : 
    1267    26768670 :     if ( !pCharStr || (nLen <= 0) )
    1268             :     {
    1269      306422 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1270    27075094 :         return;
    1271             :     }
    1272             : 
    1273    26462248 :     pOrg = *ppThis;
    1274    26462248 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1275             :     OSL_ASSERT(*ppThis != NULL);
    1276    26462248 :     rtl_str_ImplCopy( (*ppThis)->buffer, pCharStr, nLen );
    1277             : 
    1278             :     RTL_LOG_STRING_NEW( *ppThis );
    1279             : 
    1280             :     /* must be done last, if pCharStr == *ppThis */
    1281    26462248 :     if ( pOrg )
    1282      867528 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1283             : }
    1284             : 
    1285             : /* ----------------------------------------------------------------------- */
    1286             : 
    1287     9304143 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromSubString )( IMPL_RTL_STRINGDATA** ppThis,
    1288             :                                                        const IMPL_RTL_STRINGDATA* pFrom,
    1289             :                                                        sal_Int32 beginIndex,
    1290             :                                                        sal_Int32 count )
    1291             :     SAL_THROW_EXTERN_C()
    1292             : {
    1293     9304143 :     if ( beginIndex == 0 && count == pFrom->length )
    1294             :     {
    1295     1015385 :         IMPL_RTL_STRINGNAME( assign )( ppThis, const_cast< IMPL_RTL_STRINGDATA * >( pFrom ) );
    1296     1015386 :         return;
    1297             :     }
    1298     8288758 :     if ( count < 0 || beginIndex < 0 || beginIndex + count > pFrom->length )
    1299             :     {
    1300             :         OSL_FAIL( "Out of bounds substring access" );
    1301          90 :         IMPL_RTL_STRINGNAME( newFromLiteral )( ppThis, "!!br0ken!!", 10, 0 );
    1302          89 :         return;
    1303             :     }
    1304             : 
    1305     8288668 :     IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pFrom->buffer + beginIndex, count );
    1306             : }
    1307             : 
    1308             : /* ----------------------------------------------------------------------- */
    1309             : 
    1310             : // Used when creating from string literals.
    1311    14689565 : void SAL_CALL IMPL_RTL_STRINGNAME( newFromLiteral )( IMPL_RTL_STRINGDATA** ppThis,
    1312             :                                                      const sal_Char* pCharStr,
    1313             :                                                      sal_Int32 nLen,
    1314             :                                                      sal_Int32 allocExtra )
    1315             :     SAL_THROW_EXTERN_C()
    1316             : {
    1317    14689565 :     if ( nLen + allocExtra == 0 )
    1318             :     {
    1319           0 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1320    14689570 :         return;
    1321             :     }
    1322             : 
    1323    14689565 :     if ( *ppThis )
    1324      598881 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1325             : 
    1326    14689565 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen + allocExtra );
    1327             :     assert( *ppThis != NULL );
    1328    14689570 :     if ( (*ppThis) )
    1329             :     {
    1330    14689573 :         (*ppThis)->length = nLen; // fix after possible allocExtra != 0
    1331    14689573 :         (*ppThis)->buffer[nLen] = 0;
    1332    14689573 :         IMPL_RTL_STRCODE* pBuffer = (*ppThis)->buffer;
    1333             :         sal_Int32 nCount;
    1334   213178553 :         for( nCount = nLen; nCount > 0; --nCount )
    1335             :         {
    1336             :             /* Check ASCII range */
    1337             :             SAL_WARN_IF( ((unsigned char)*pCharStr) > 127, "rtl.string",
    1338             :                         "rtl_uString_newFromLiteral - Found char > 127" );
    1339             :             SAL_WARN_IF( ((unsigned char)*pCharStr) == '\0', "rtl.string",
    1340             :                         "rtl_uString_newFromLiteral - Found embedded \\0 character" );
    1341             : 
    1342   198488980 :             *pBuffer = *pCharStr;
    1343   198488980 :             pBuffer++;
    1344   198488980 :             pCharStr++;
    1345             :         }
    1346             :     }
    1347             : 
    1348             :     RTL_LOG_STRING_NEW( *ppThis );
    1349             : }
    1350             : 
    1351             : /* ----------------------------------------------------------------------- */
    1352             : 
    1353   110302466 : void SAL_CALL IMPL_RTL_STRINGNAME( assign )( IMPL_RTL_STRINGDATA** ppThis,
    1354             :                                              IMPL_RTL_STRINGDATA* pStr )
    1355             :     SAL_THROW_EXTERN_C()
    1356             : {
    1357             :     /* must be done at first, if pStr == *ppThis */
    1358   110302466 :     IMPL_RTL_AQUIRE( pStr );
    1359             : 
    1360   110302466 :     if ( *ppThis )
    1361   108626234 :         IMPL_RTL_STRINGNAME( release )( *ppThis );
    1362             : 
    1363   110302432 :     *ppThis = pStr;
    1364   110302432 : }
    1365             : 
    1366             : /* ----------------------------------------------------------------------- */
    1367             : 
    1368      410125 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getLength )( const IMPL_RTL_STRINGDATA* pThis )
    1369             :     SAL_THROW_EXTERN_C()
    1370             : {
    1371      410125 :     return pThis->length;
    1372             : }
    1373             : 
    1374             : /* ----------------------------------------------------------------------- */
    1375             : 
    1376      788412 : IMPL_RTL_STRCODE* SAL_CALL IMPL_RTL_STRINGNAME( getStr )( IMPL_RTL_STRINGDATA * pThis )
    1377             :     SAL_THROW_EXTERN_C()
    1378             : {
    1379      788412 :     return pThis->buffer;
    1380             : }
    1381             : 
    1382             : /* ----------------------------------------------------------------------- */
    1383             : 
    1384    12234616 : void SAL_CALL IMPL_RTL_STRINGNAME( newConcat )( IMPL_RTL_STRINGDATA** ppThis,
    1385             :                                                 IMPL_RTL_STRINGDATA* pLeft,
    1386             :                                                 IMPL_RTL_STRINGDATA* pRight )
    1387             :     SAL_THROW_EXTERN_C()
    1388             : {
    1389    12234616 :     IMPL_RTL_STRINGDATA* pOrg = *ppThis;
    1390             : 
    1391             :     /* Test for 0-Pointer - if not, change newReplaceStrAt! */
    1392    12234616 :     if ( !pRight || !pRight->length )
    1393             :     {
    1394      166587 :         *ppThis = pLeft;
    1395      166587 :         IMPL_RTL_AQUIRE( pLeft );
    1396             :     }
    1397    12068029 :     else if ( !pLeft || !pLeft->length )
    1398             :     {
    1399     1944512 :         *ppThis = pRight;
    1400     1944512 :         IMPL_RTL_AQUIRE( pRight );
    1401             :     }
    1402             :     else
    1403             :     {
    1404    10123517 :         IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( pLeft->length + pRight->length );
    1405             :         OSL_ASSERT(pTempStr != NULL);
    1406    10123517 :         rtl_str_ImplCopy( pTempStr->buffer, pLeft->buffer, pLeft->length );
    1407    10123517 :         rtl_str_ImplCopy( pTempStr->buffer+pLeft->length, pRight->buffer, pRight->length );
    1408    10123517 :         *ppThis = pTempStr;
    1409             : 
    1410             :         RTL_LOG_STRING_NEW( *ppThis );
    1411             :     }
    1412             : 
    1413             :     /* must be done last, if left or right == *ppThis */
    1414    12234616 :     if ( pOrg )
    1415    11633204 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1416    12234615 : }
    1417             : 
    1418             : /* ----------------------------------------------------------------------- */
    1419             : 
    1420        3218 : void SAL_CALL IMPL_RTL_STRINGNAME( ensureCapacity )( IMPL_RTL_STRINGDATA** ppThis,
    1421             :                                                      sal_Int32 size )
    1422             :     SAL_THROW_EXTERN_C()
    1423             : {
    1424        3218 :     IMPL_RTL_STRINGDATA* const pOrg = *ppThis;
    1425        3218 :     if ( pOrg->refCount == 1 && pOrg->length >= size )
    1426        3220 :         return;
    1427             :     assert( pOrg->length <= size ); // do not truncate
    1428        3216 :     IMPL_RTL_STRINGDATA* pTempStr = IMPL_RTL_STRINGNAME( ImplAlloc )( size );
    1429        3216 :     rtl_str_ImplCopy( pTempStr->buffer, pOrg->buffer, pOrg->length );
    1430             :     // right now the length is still the same as of the original
    1431        3216 :     pTempStr->length = pOrg->length;
    1432        3216 :     pTempStr->buffer[ pOrg->length ] = '\0';
    1433        3216 :     *ppThis = pTempStr;
    1434             :     RTL_LOG_STRING_NEW( *ppThis );
    1435             : 
    1436             :     /* must be done last, if pStr == *ppThis */
    1437        3216 :     if ( pOrg )
    1438        3216 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1439             : }
    1440             : 
    1441             : /* ----------------------------------------------------------------------- */
    1442             : 
    1443      764005 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplaceStrAt )( IMPL_RTL_STRINGDATA** ppThis,
    1444             :                                                       IMPL_RTL_STRINGDATA* pStr,
    1445             :                                                       sal_Int32 nIndex,
    1446             :                                                       sal_Int32 nCount,
    1447             :                                                       IMPL_RTL_STRINGDATA* pNewSubStr )
    1448             :     SAL_THROW_EXTERN_C()
    1449             : {
    1450             :     /* Append? */
    1451      764005 :     if ( nIndex >= pStr->length )
    1452             :     {
    1453             :         /* newConcat test, if pNewSubStr is 0 */
    1454      599322 :         IMPL_RTL_STRINGNAME( newConcat )( ppThis, pStr, pNewSubStr );
    1455      599322 :         return;
    1456             :     }
    1457             : 
    1458             :     /* negativ index? */
    1459      164683 :     if ( nIndex < 0 )
    1460             :     {
    1461           0 :         nCount -= nIndex;
    1462           0 :         nIndex = 0;
    1463             :     }
    1464             : 
    1465             :     /* not more than the String length could be deleted */
    1466      164683 :     if ( nCount >= pStr->length-nIndex )
    1467             :     {
    1468       67045 :         nCount = pStr->length-nIndex;
    1469             : 
    1470             :         /* Assign of NewSubStr? */
    1471       67045 :         if ( !nIndex && (nCount >= pStr->length) )
    1472             :         {
    1473       19070 :             if ( !pNewSubStr )
    1474           0 :                 IMPL_RTL_STRINGNAME( new )( ppThis );
    1475             :             else
    1476       19070 :                 IMPL_RTL_STRINGNAME( assign )( ppThis, pNewSubStr );
    1477       19070 :             return;
    1478             :         }
    1479             :     }
    1480             : 
    1481             :     /* Assign of Str? */
    1482      145613 :     if ( !nCount && (!pNewSubStr || !pNewSubStr->length) )
    1483             :     {
    1484           0 :         IMPL_RTL_STRINGNAME( assign )( ppThis, pStr );
    1485           0 :         return;
    1486             :     }
    1487             : 
    1488      145613 :     IMPL_RTL_STRINGDATA*    pOrg = *ppThis;
    1489             :     IMPL_RTL_STRCODE*       pBuffer;
    1490             :     sal_Int32               nNewLen;
    1491             : 
    1492             :     /* Calculate length of the new string */
    1493      145613 :     nNewLen = pStr->length-nCount;
    1494      145613 :     if ( pNewSubStr )
    1495      145613 :         nNewLen += pNewSubStr->length;
    1496             : 
    1497             :     /* Alloc New Buffer */
    1498      145613 :     *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nNewLen );
    1499             :     OSL_ASSERT(*ppThis != NULL);
    1500      145613 :     pBuffer = (*ppThis)->buffer;
    1501      145613 :     if ( nIndex )
    1502             :     {
    1503       61176 :         rtl_str_ImplCopy( pBuffer, pStr->buffer, nIndex );
    1504       61176 :         pBuffer += nIndex;
    1505             :     }
    1506      145613 :     if ( pNewSubStr && pNewSubStr->length )
    1507             :     {
    1508      143795 :         rtl_str_ImplCopy( pBuffer, pNewSubStr->buffer, pNewSubStr->length );
    1509      143795 :         pBuffer += pNewSubStr->length;
    1510             :     }
    1511      145613 :     rtl_str_ImplCopy( pBuffer, pStr->buffer+nIndex+nCount, pStr->length-nIndex-nCount );
    1512             : 
    1513             :     RTL_LOG_STRING_NEW( *ppThis );
    1514             :     /* must be done last, if pStr or pNewSubStr == *ppThis */
    1515      145613 :     if ( pOrg )
    1516           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1517             : }
    1518             : 
    1519             : /* ----------------------------------------------------------------------- */
    1520             : 
    1521      211228 : void SAL_CALL IMPL_RTL_STRINGNAME( newReplace )( IMPL_RTL_STRINGDATA** ppThis,
    1522             :                                                  IMPL_RTL_STRINGDATA* pStr,
    1523             :                                                  IMPL_RTL_STRCODE cOld,
    1524             :                                                  IMPL_RTL_STRCODE cNew )
    1525             :     SAL_THROW_EXTERN_C()
    1526             : {
    1527      211228 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1528      211228 :     int                     bChanged    = 0;
    1529      211228 :     sal_Int32               nLen        = pStr->length;
    1530      211228 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1531             : 
    1532     4052521 :     while ( nLen > 0 )
    1533             :     {
    1534     3737235 :         if ( *pCharStr == cOld )
    1535             :         {
    1536             :             /* Copy String */
    1537      107170 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1538             : 
    1539             :             /* replace/copy rest of the string */
    1540      107170 :             if ( pNewCharStr )
    1541             :             {
    1542      107170 :                 *pNewCharStr = cNew;
    1543      107170 :                 pNewCharStr++;
    1544      107170 :                 pCharStr++;
    1545      107170 :                 nLen--;
    1546             : 
    1547     3467684 :                 while ( nLen > 0 )
    1548             :                 {
    1549     3253344 :                     if ( *pCharStr == cOld )
    1550      322682 :                         *pNewCharStr = cNew;
    1551             :                     else
    1552     2930662 :                         *pNewCharStr = *pCharStr;
    1553             : 
    1554     3253344 :                     pNewCharStr++;
    1555     3253344 :                     pCharStr++;
    1556     3253344 :                     nLen--;
    1557             :                 }
    1558             :             }
    1559             : 
    1560      107170 :             bChanged = 1;
    1561      107170 :             break;
    1562             :         }
    1563             : 
    1564     3630065 :         pCharStr++;
    1565     3630065 :         nLen--;
    1566             :     }
    1567             : 
    1568      211228 :     if ( !bChanged )
    1569             :     {
    1570      104058 :         *ppThis = pStr;
    1571      104058 :         IMPL_RTL_AQUIRE( pStr );
    1572             :     }
    1573             : 
    1574             :     RTL_LOG_STRING_NEW( *ppThis );
    1575             :     /* must be done last, if pStr == *ppThis */
    1576      211228 :     if ( pOrg )
    1577           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1578      211228 : }
    1579             : 
    1580             : /* ----------------------------------------------------------------------- */
    1581             : 
    1582     2348680 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiLowerCase )( IMPL_RTL_STRINGDATA** ppThis,
    1583             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1584             :     SAL_THROW_EXTERN_C()
    1585             : {
    1586     2348680 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1587     2348680 :     int                     bChanged    = 0;
    1588     2348680 :     sal_Int32               nLen        = pStr->length;
    1589     2348680 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1590             : 
    1591     9821342 :     while ( nLen > 0 )
    1592             :     {
    1593             :         /* Between A-Z (65-90), than to lowercase (+32) */
    1594     6430908 :         if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
    1595             :         {
    1596             :             /* Copy String */
    1597     1306926 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1598             : 
    1599             :             /* replace/copy rest of the string */
    1600     1306926 :             if ( pNewCharStr )
    1601             :             {
    1602             :                 /* to lowercase (+32) */
    1603     1306926 :                 *pNewCharStr = *pCharStr+32;
    1604     1306926 :                 pNewCharStr++;
    1605     1306926 :                 pCharStr++;
    1606     1306926 :                 nLen--;
    1607             : 
    1608    10042191 :                 while ( nLen > 0 )
    1609             :                 {
    1610             :                     /* Between A-Z (65-90), than to lowercase (+32) */
    1611     7428339 :                     if ( (*pCharStr >= 65) && (*pCharStr <= 90) )
    1612     3051894 :                         *pNewCharStr = *pCharStr+32;
    1613             :                     else
    1614     4376445 :                         *pNewCharStr = *pCharStr;
    1615             : 
    1616     7428339 :                     pNewCharStr++;
    1617     7428339 :                     pCharStr++;
    1618     7428339 :                     nLen--;
    1619             :                 }
    1620             :             }
    1621             : 
    1622     1306926 :             bChanged = 1;
    1623     1306926 :             break;
    1624             :         }
    1625             : 
    1626     5123982 :         pCharStr++;
    1627     5123982 :         nLen--;
    1628             :     }
    1629             : 
    1630     2348680 :     if ( !bChanged )
    1631             :     {
    1632     1041754 :         *ppThis = pStr;
    1633     1041754 :         IMPL_RTL_AQUIRE( pStr );
    1634             :     }
    1635             : 
    1636             :     RTL_LOG_STRING_NEW( *ppThis );
    1637             :     /* must be done last, if pStr == *ppThis */
    1638     2348680 :     if ( pOrg )
    1639           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1640     2348680 : }
    1641             : 
    1642             : /* ----------------------------------------------------------------------- */
    1643             : 
    1644      739138 : void SAL_CALL IMPL_RTL_STRINGNAME( newToAsciiUpperCase )( IMPL_RTL_STRINGDATA** ppThis,
    1645             :                                                           IMPL_RTL_STRINGDATA* pStr )
    1646             :     SAL_THROW_EXTERN_C()
    1647             : {
    1648      739138 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1649      739138 :     int                     bChanged    = 0;
    1650      739138 :     sal_Int32               nLen        = pStr->length;
    1651      739138 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1652             : 
    1653     2675711 :     while ( nLen > 0 )
    1654             :     {
    1655             :         /* Between a-z (97-122), than to uppercase (-32) */
    1656     1259059 :         if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
    1657             :         {
    1658             :             /* Copy String */
    1659       61624 :             IMPL_RTL_STRCODE* pNewCharStr = IMPL_RTL_STRINGNAME( ImplNewCopy )( ppThis, pStr, pCharStr-pStr->buffer );
    1660             : 
    1661             :             /* replace/copy rest of the string */
    1662       61624 :             if ( pNewCharStr )
    1663             :             {
    1664             :                 /* to uppercase (-32) */
    1665       61624 :                 *pNewCharStr = *pCharStr-32;
    1666       61624 :                 pNewCharStr++;
    1667       61624 :                 pCharStr++;
    1668       61624 :                 nLen--;
    1669             : 
    1670     1043089 :                 while ( nLen > 0 )
    1671             :                 {
    1672             :                     /* Between a-z (97-122), than to uppercase (-32) */
    1673      919841 :                     if ( (*pCharStr >= 97) && (*pCharStr <= 122) )
    1674      743424 :                         *pNewCharStr = *pCharStr-32;
    1675             :                     else
    1676      176417 :                         *pNewCharStr = *pCharStr;
    1677             : 
    1678      919841 :                     pNewCharStr++;
    1679      919841 :                     pCharStr++;
    1680      919841 :                     nLen--;
    1681             :                 }
    1682             :             }
    1683             : 
    1684       61624 :             bChanged = 1;
    1685       61624 :             break;
    1686             :         }
    1687             : 
    1688     1197435 :         pCharStr++;
    1689     1197435 :         nLen--;
    1690             :     }
    1691             : 
    1692      739138 :     if ( !bChanged )
    1693             :     {
    1694      677514 :         *ppThis = pStr;
    1695      677514 :         IMPL_RTL_AQUIRE( pStr );
    1696             :     }
    1697             : 
    1698             :     RTL_LOG_STRING_NEW( *ppThis );
    1699             :     /* must be done last, if pStr == *ppThis */
    1700      739138 :     if ( pOrg )
    1701           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1702      739138 : }
    1703             : 
    1704             : /* ----------------------------------------------------------------------- */
    1705             : 
    1706      678878 : void SAL_CALL IMPL_RTL_STRINGNAME( newTrim )( IMPL_RTL_STRINGDATA** ppThis,
    1707             :                                               IMPL_RTL_STRINGDATA* pStr )
    1708             :     SAL_THROW_EXTERN_C()
    1709             : {
    1710      678878 :     IMPL_RTL_STRINGDATA*    pOrg        = *ppThis;
    1711      678878 :     const IMPL_RTL_STRCODE* pCharStr    = pStr->buffer;
    1712      678878 :     sal_Int32               nPreSpaces  = 0;
    1713      678878 :     sal_Int32               nPostSpaces = 0;
    1714      678878 :     sal_Int32               nLen        = pStr->length;
    1715      678878 :     sal_Int32               nIndex      = nLen-1;
    1716             : 
    1717     1985646 :     while ( (nPreSpaces < nLen) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nPreSpaces)) ) )
    1718      627890 :         nPreSpaces++;
    1719             : 
    1720     1645384 :     while ( (nIndex > nPreSpaces) && rtl_ImplIsWhitespace( IMPL_RTL_USTRCODE(*(pCharStr+nIndex)) ) )
    1721             :     {
    1722      287628 :         nPostSpaces++;
    1723      287628 :         nIndex--;
    1724             :     }
    1725             : 
    1726      678878 :     if ( !nPreSpaces && !nPostSpaces )
    1727             :     {
    1728      139116 :         *ppThis = pStr;
    1729      139116 :         IMPL_RTL_AQUIRE( pStr );
    1730             :     }
    1731             :     else
    1732             :     {
    1733      539762 :         nLen -= nPostSpaces+nPreSpaces;
    1734      539762 :         *ppThis = IMPL_RTL_STRINGNAME( ImplAlloc )( nLen );
    1735             :         OSL_ASSERT(*ppThis != NULL);
    1736      539762 :         if ( *ppThis )
    1737      539762 :             rtl_str_ImplCopy( (*ppThis)->buffer, pStr->buffer+nPreSpaces, nLen );
    1738             :     }
    1739             : 
    1740             :     RTL_LOG_STRING_NEW( *ppThis );
    1741             :     /* must be done last, if pStr == *ppThis */
    1742      678878 :     if ( pOrg )
    1743           0 :         IMPL_RTL_STRINGNAME( release )( pOrg );
    1744      678878 : }
    1745             : 
    1746             : /* ----------------------------------------------------------------------- */
    1747             : 
    1748    13202660 : sal_Int32 SAL_CALL IMPL_RTL_STRINGNAME( getToken )( IMPL_RTL_STRINGDATA** ppThis,
    1749             :                                                     IMPL_RTL_STRINGDATA* pStr,
    1750             :                                                     sal_Int32 nToken,
    1751             :                                                     IMPL_RTL_STRCODE cTok,
    1752             :                                                     sal_Int32 nIndex )
    1753             :     SAL_THROW_EXTERN_C()
    1754             : {
    1755    13202660 :     const IMPL_RTL_STRCODE* pCharStr        = pStr->buffer;
    1756             :     const IMPL_RTL_STRCODE* pCharStrStart;
    1757             :     const IMPL_RTL_STRCODE* pOrgCharStr;
    1758    13202660 :     sal_Int32               nLen            = pStr->length-nIndex;
    1759    13202660 :     sal_Int32               nTokCount       = 0;
    1760             : 
    1761             :     // Set ppThis to an empty string and return -1 if either nToken or nIndex is
    1762             :     // negative:
    1763    13202660 :     if (nIndex < 0)
    1764         316 :         nToken = -1;
    1765             : 
    1766    13202660 :     pCharStr += nIndex;
    1767    13202660 :     pOrgCharStr = pCharStr;
    1768    13202660 :     pCharStrStart = pCharStr;
    1769   193803252 :     while ( nLen > 0 )
    1770             :     {
    1771   177544409 :         if ( *pCharStr == cTok )
    1772             :         {
    1773    11002087 :             nTokCount++;
    1774             : 
    1775    11002087 :             if ( nTokCount == nToken )
    1776      684561 :                 pCharStrStart = pCharStr+1;
    1777             :             else
    1778             :             {
    1779    10317526 :                 if ( nTokCount > nToken )
    1780    10146477 :                     break;
    1781             :             }
    1782             :         }
    1783             : 
    1784   167397932 :         pCharStr++;
    1785   167397932 :         nLen--;
    1786             :     }
    1787             : 
    1788    13202660 :     if ( (nToken < 0) || (nTokCount < nToken) || (pCharStr == pCharStrStart) )
    1789             :     {
    1790     4218370 :         IMPL_RTL_STRINGNAME( new )( ppThis );
    1791     4218374 :         if( (nToken < 0) || (nTokCount < nToken ) )
    1792        1860 :             return -1;
    1793     4216514 :         else if( nLen > 0 )
    1794     3087525 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1795     1128989 :         else return -1;
    1796             :     }
    1797             :     else
    1798             :     {
    1799     8984290 :         IMPL_RTL_STRINGNAME( newFromStr_WithLength )( ppThis, pCharStrStart, pCharStr-pCharStrStart );
    1800     8984290 :         if ( nLen )
    1801     7058714 :             return nIndex+(pCharStr-pOrgCharStr)+1;
    1802             :         else
    1803     1925576 :             return -1;
    1804             :     }
    1805             : }
    1806             : 
    1807             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10