LCOV - code coverage report
Current view: top level - svl/source/numbers - zforscan.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1156 1461 79.1 %
Date: 2012-08-25 Functions: 32 32 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 1180 2234 52.8 %

           Branch data     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                 :            : #include <stdlib.h>
      22                 :            : #include <comphelper/string.hxx>
      23                 :            : #include <tools/debug.hxx>
      24                 :            : #include <i18npool/mslangid.hxx>
      25                 :            : #include <unotools/charclass.hxx>
      26                 :            : #include <unotools/localedatawrapper.hxx>
      27                 :            : #include <unotools/numberformatcodewrapper.hxx>
      28                 :            : #include <rtl/instance.hxx>
      29                 :            : 
      30                 :            : #include <svl/zforlist.hxx>
      31                 :            : #include <svl/zformat.hxx>
      32                 :            : #include <unotools/digitgroupingiterator.hxx>
      33                 :            : 
      34                 :            : #define _ZFORSCAN_CXX
      35                 :            : #include "zforscan.hxx"
      36                 :            : #undef _ZFORSCAN_CXX
      37                 :            : #include <svl/nfsymbol.hxx>
      38                 :            : using namespace svt;
      39                 :            : 
      40                 :            : const sal_Unicode cNonBreakingSpace = 0xA0;
      41                 :            : 
      42                 :            : namespace
      43                 :            : {
      44                 :            :     struct ImplEnglishColors
      45                 :            :     {
      46                 :          8 :         const String* operator()()
      47                 :            :         {
      48                 :            :             static const String aEnglishColors[NF_MAX_DEFAULT_COLORS] =
      49                 :            :             {
      50                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "BLACK" ) ),
      51                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "BLUE" ) ),
      52                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "GREEN" ) ),
      53                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "CYAN" ) ),
      54                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "RED" ) ),
      55                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "MAGENTA" ) ),
      56                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "BROWN" ) ),
      57                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "GREY" ) ),
      58                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "YELLOW" ) ),
      59                 :            :                 String( RTL_CONSTASCII_USTRINGPARAM( "WHITE" ) )
      60 [ +  - ][ +  - ]:         96 :             };
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
           [ #  #  #  #  
           #  # ][ +  + ]
      61                 :          8 :             return &aEnglishColors[0];
      62                 :            :         }
      63                 :            :     };
      64                 :            : 
      65                 :            :     struct theEnglishColors
      66                 :            :             : public rtl::StaticAggregate< const String, ImplEnglishColors> {};
      67                 :            : 
      68                 :            : }
      69                 :            : 
      70 [ +  + ][ +  - ]:     243201 : ImpSvNumberformatScan::ImpSvNumberformatScan( SvNumberFormatter* pFormatterP )
         [ +  - ][ +  + ]
         [ +  - ][ +  - ]
         [ +  - ][ +  -  
             #  #  #  # ]
      71                 :            : {
      72                 :       2191 :     pFormatter = pFormatterP;
      73                 :       2191 :     bConvertMode = false;
      74                 :            :     //! All keywords MUST be UPPERCASE!
      75 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_E].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "E" ) );        // Exponent
      76 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_AMPM].AssignAscii( RTL_CONSTASCII_STRINGPARAM(  "AM/PM" ) );    // AM/PM
      77 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_AP].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "A/P" ) );      // AM/PM short
      78 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_MI].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "M" ) );        // Minute
      79 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_MMI].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "MM" ) );       // Minute 02
      80 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_S].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "S" ) );        // Second
      81 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_SS].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "SS" ) );       // Second 02
      82 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_Q].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "Q" ) );        // Quarter short 'Q'
      83 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_QQ].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "QQ" ) );       // Quarter long
      84 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_NN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "NN" ) );       // Day of week short
      85 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_NNN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "NNN" ) );      // Day of week long
      86 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_NNNN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(  "NNNN" ) );     // Day of week long incl. separator
      87 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_WW].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "WW" ) );       // Week of year
      88 [ +  - ][ +  - ]:       2191 :     sKeyword[NF_KEY_CCC].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "CCC" ) );      // Currency abbreviation
      89                 :       2191 :     bKeywordsNeedInit = true;   // locale dependent keywords
      90                 :       2191 :     bCompatCurNeedInit = true;  // locale dependent compatibility currency strings
      91                 :            : 
      92                 :       2191 :     StandardColor[0]  =  Color(COL_BLACK);
      93                 :       2191 :     StandardColor[1]  =  Color(COL_LIGHTBLUE);
      94                 :       2191 :     StandardColor[2]  =  Color(COL_LIGHTGREEN);
      95                 :       2191 :     StandardColor[3]  =  Color(COL_LIGHTCYAN);
      96                 :       2191 :     StandardColor[4]  =  Color(COL_LIGHTRED);
      97                 :       2191 :     StandardColor[5]  =  Color(COL_LIGHTMAGENTA);
      98                 :       2191 :     StandardColor[6]  =  Color(COL_BROWN);
      99                 :       2191 :     StandardColor[7]  =  Color(COL_GRAY);
     100                 :       2191 :     StandardColor[8]  =  Color(COL_YELLOW);
     101                 :       2191 :     StandardColor[9]  =  Color(COL_WHITE);
     102                 :            : 
     103         [ +  - ]:       2191 :     pNullDate = new Date(30,12,1899);
     104                 :       2191 :     nStandardPrec = 2;
     105                 :            : 
     106         [ +  - ]:       2191 :     sErrStr.AssignAscii( RTL_CONSTASCII_STRINGPARAM( "###" ) );
     107                 :       2191 :     Reset();
     108   [ #  #  #  # ]:       2191 : }
     109                 :            : 
     110 [ +  - ][ +  - ]:     202980 : ImpSvNumberformatScan::~ImpSvNumberformatScan()
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
     111                 :            : {
     112                 :       1990 :     delete pNullDate;
     113                 :       1990 :     Reset();
     114 [ +  - ][ +  + ]:     202980 : }
           [ #  #  #  # ]
     115                 :            : 
     116                 :       6677 : void ImpSvNumberformatScan::ChangeIntl()
     117                 :            : {
     118                 :       6677 :     bKeywordsNeedInit = true;
     119                 :       6677 :     bCompatCurNeedInit = true;
     120                 :            :     // may be initialized by InitSpecialKeyword()
     121                 :       6677 :     sKeyword[NF_KEY_TRUE].Erase();
     122                 :       6677 :     sKeyword[NF_KEY_FALSE].Erase();
     123                 :       6677 : }
     124                 :            : 
     125                 :      14656 : void ImpSvNumberformatScan::InitSpecialKeyword( NfKeywordIndex eIdx ) const
     126                 :            : {
     127      [ +  +  - ]:      14656 :     switch ( eIdx )
     128                 :            :     {
     129                 :            :         case NF_KEY_TRUE :
     130         [ +  - ]:       7328 :             ((ImpSvNumberformatScan*)this)->sKeyword[NF_KEY_TRUE] =
     131                 :            :                 pFormatter->GetCharClass()->uppercase(
     132         [ +  - ]:      14656 :                 pFormatter->GetLocaleData()->getTrueWord() );
     133         [ -  + ]:       7328 :             if ( !sKeyword[NF_KEY_TRUE].Len() )
     134                 :            :             {
     135                 :            :                 SAL_WARN( "svl.numbers", "InitSpecialKeyword: TRUE_WORD?" );
     136                 :          0 :                 ((ImpSvNumberformatScan*)this)->sKeyword[NF_KEY_TRUE].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "TRUE" ) );
     137                 :            :             }
     138                 :       7328 :         break;
     139                 :            :         case NF_KEY_FALSE :
     140         [ +  - ]:       7328 :             ((ImpSvNumberformatScan*)this)->sKeyword[NF_KEY_FALSE] =
     141                 :            :                 pFormatter->GetCharClass()->uppercase(
     142         [ +  - ]:      14656 :                 pFormatter->GetLocaleData()->getFalseWord() );
     143         [ -  + ]:       7328 :             if ( !sKeyword[NF_KEY_FALSE].Len() )
     144                 :            :             {
     145                 :            :                 SAL_WARN( "svl.numbers", "InitSpecialKeyword: FALSE_WORD?" );
     146                 :          0 :                 ((ImpSvNumberformatScan*)this)->sKeyword[NF_KEY_FALSE].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "FALSE" ) );
     147                 :            :             }
     148                 :       7328 :         break;
     149                 :            :         default:
     150                 :            :             SAL_WARN( "svl.numbers", "InitSpecialKeyword: unknown request" );
     151                 :            :     }
     152                 :      14656 : }
     153                 :            : 
     154                 :       7203 : void ImpSvNumberformatScan::InitCompatCur() const
     155                 :            : {
     156                 :       7203 :     ImpSvNumberformatScan* pThis = (ImpSvNumberformatScan*)this;
     157                 :            :     // currency symbol for old style ("automatic") compatibility format codes
     158                 :       7203 :     pFormatter->GetCompatibilityCurrency( pThis->sCurSymbol, pThis->sCurAbbrev );
     159                 :            :     // currency symbol upper case
     160 [ +  - ][ +  - ]:       7203 :     pThis->sCurString = pFormatter->GetCharClass()->uppercase( sCurSymbol );
     161                 :       7203 :     bCompatCurNeedInit = false;
     162                 :       7203 : }
     163                 :            : 
     164                 :       9917 : void ImpSvNumberformatScan::InitKeywords() const
     165                 :            : {
     166         [ +  + ]:       9917 :     if ( !bKeywordsNeedInit )
     167                 :       9917 :         return ;
     168                 :       7203 :     ((ImpSvNumberformatScan*)this)->SetDependentKeywords();
     169                 :       7203 :     bKeywordsNeedInit = false;
     170                 :            : }
     171                 :            : 
     172                 :            : /** Extract the name of General, Standard, Whatever, ignoring leading modifiers
     173                 :            :     such as [NatNum1]. */
     174                 :       7203 : static String lcl_extractStandardGeneralName( const ::rtl::OUString & rCode )
     175                 :            : {
     176                 :       7203 :     String aStr;
     177                 :       7203 :     const sal_Unicode* p = rCode.getStr();
     178                 :       7203 :     const sal_Unicode* const pStop = p + rCode.getLength();
     179                 :       7203 :     const sal_Unicode* pBeg = p;    // name begins here
     180                 :       7203 :     bool bMod = false;
     181                 :       7203 :     bool bDone = false;
     182 [ +  + ][ +  - ]:      57646 :     while (p < pStop && !bDone)
                 [ +  + ]
     183                 :            :     {
     184   [ -  -  -  + ]:      50443 :         switch (*p)
     185                 :            :         {
     186                 :            :             case '[':
     187                 :          0 :                 bMod = true;
     188                 :          0 :                 break;
     189                 :            :             case ']':
     190         [ #  # ]:          0 :                 if (bMod)
     191                 :            :                 {
     192                 :          0 :                     bMod = false;
     193                 :          0 :                     pBeg = p+1;
     194                 :            :                 }
     195                 :            :                 // else: would be a locale data error, easily to be spotted in
     196                 :            :                 // UI dialog
     197                 :          0 :                 break;
     198                 :            :             case ';':
     199         [ #  # ]:          0 :                 if (!bMod)
     200                 :            :                 {
     201                 :          0 :                     bDone = true;
     202                 :          0 :                     --p;    // put back, increment by one follows
     203                 :            :                 }
     204                 :          0 :                 break;
     205                 :            :         }
     206                 :      50443 :         ++p;
     207         [ -  + ]:      50443 :         if (bMod)
     208                 :          0 :             pBeg = p;
     209                 :            :     }
     210         [ +  - ]:       7203 :     if (pBeg < p)
     211         [ +  - ]:       7203 :         aStr = rCode.copy( pBeg - rCode.getStr(), p - pBeg);
     212                 :       7203 :     return aStr;
     213                 :            : }
     214                 :            : 
     215                 :       7203 : void ImpSvNumberformatScan::SetDependentKeywords()
     216                 :            : {
     217                 :            :     using namespace ::com::sun::star;
     218                 :            :     using namespace ::com::sun::star::uno;
     219                 :            : 
     220                 :       7203 :     const CharClass* pCharClass = pFormatter->GetCharClass();
     221                 :       7203 :     const LocaleDataWrapper* pLocaleData = pFormatter->GetLocaleData();
     222                 :            :     // #80023# be sure to generate keywords for the loaded Locale, not for the
     223                 :            :     // requested Locale, otherwise number format codes might not match
     224         [ +  - ]:       7203 :     lang::Locale aLoadedLocale = pLocaleData->getLoadedLocale();
     225         [ +  - ]:       7203 :     LanguageType eLang = MsLangId::convertLocaleToLanguage( aLoadedLocale );
     226 [ +  - ][ +  - ]:       7203 :     NumberFormatCodeWrapper aNumberFormatCode( pFormatter->GetServiceManager(), aLoadedLocale );
     227                 :            : 
     228         [ +  - ]:       7203 :     i18n::NumberFormatCode aFormat = aNumberFormatCode.getFormatCode( NF_NUMBER_STANDARD );
     229 [ +  - ][ +  - ]:       7203 :     sNameStandardFormat = lcl_extractStandardGeneralName( aFormat.Code);
                 [ +  - ]
     230 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_GENERAL] = pCharClass->uppercase( sNameStandardFormat );
         [ +  - ][ +  - ]
     231                 :            : 
     232                 :            :     // preset new calendar keywords
     233 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_AAA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "AAA" ) );
     234 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_AAAA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(  "AAAA" ) );
     235 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_EC].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "E" ) );
     236 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_EEC].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "EE" ) );
     237 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_G].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "G" ) );
     238 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_GG].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "GG" ) );
     239 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_GGG].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "GGG" ) );
     240 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_R].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "R" ) );
     241 [ +  - ][ +  - ]:       7203 :     sKeyword[NF_KEY_RR].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "RR" ) );
     242                 :            : 
     243                 :            :     // Thai T NatNum special. Other locale's small letter 't' results in upper
     244                 :            :     // case comparison not matching but length does in conversion mode. Ugly.
     245         [ -  + ]:       7203 :     if (eLang == LANGUAGE_THAI)
     246 [ #  # ][ #  # ]:          0 :         sKeyword[NF_KEY_THAI_T].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "T"));
     247                 :            :     else
     248 [ +  - ][ +  - ]:       7203 :         sKeyword[NF_KEY_THAI_T].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "t"));
     249                 :            : 
     250         [ +  + ]:       7203 :     switch ( eLang )
     251                 :            :     {
     252                 :            :         case LANGUAGE_GERMAN:
     253                 :            :         case LANGUAGE_GERMAN_SWISS:
     254                 :            :         case LANGUAGE_GERMAN_AUSTRIAN:
     255                 :            :         case LANGUAGE_GERMAN_LUXEMBOURG:
     256                 :            :         case LANGUAGE_GERMAN_LIECHTENSTEIN:
     257                 :            :         {
     258                 :            :             //! all capital letters
     259 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_M].AssignAscii( RTL_CONSTASCII_STRINGPARAM(         "M" ) );            // month 1
     260 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_MM].AssignAscii( RTL_CONSTASCII_STRINGPARAM(        "MM" ) );           // month 01
     261 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_MMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM(       "MMM" ) );      // month Jan
     262 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_MMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "MMMM" ) ); // month Januar
     263 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_MMMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "MMMMM" ) );// month J
     264 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_H].AssignAscii( RTL_CONSTASCII_STRINGPARAM(         "H" ) );            // hour 2
     265 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_HH].AssignAscii( RTL_CONSTASCII_STRINGPARAM(        "HH" ) );           // hour 02
     266 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_D].AssignAscii( RTL_CONSTASCII_STRINGPARAM(         "T" ) );
     267 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_DD].AssignAscii( RTL_CONSTASCII_STRINGPARAM(        "TT" ) );
     268 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_DDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM(       "TTT" ) );
     269 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_DDDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "TTTT" ) );
     270 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_YY].AssignAscii( RTL_CONSTASCII_STRINGPARAM(        "JJ" ) );
     271 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_YYYY].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "JJJJ" ) );
     272 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_BOOLEAN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "LOGISCH" ) );
     273 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_COLOR].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "FARBE" ) );
     274 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_BLACK].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "SCHWARZ" ) );
     275 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_BLUE].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "BLAU" ) );
     276 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_GREEN] = UniString( "GR" "\xDC" "N", RTL_TEXTENCODING_ISO_8859_1 );
         [ +  - ][ +  - ]
     277 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_CYAN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "CYAN" ) );
     278 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_RED].AssignAscii( RTL_CONSTASCII_STRINGPARAM(       "ROT" ) );
     279 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_MAGENTA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "MAGENTA" ) );
     280 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_BROWN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "BRAUN" ) );
     281 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_GREY].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "GRAU" ) );
     282 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_YELLOW].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "GELB" ) );
     283 [ +  - ][ +  - ]:          8 :             sKeyword[NF_KEY_WHITE].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "WEISS" ) );
     284                 :            :         }
     285                 :          8 :         break;
     286                 :            :         default:
     287                 :            :         {
     288                 :            :             // day
     289   [ -  +  -  + ]:       7195 :             switch ( eLang )
     290                 :            :             {
     291                 :            :                 case LANGUAGE_ITALIAN       :
     292                 :            :                 case LANGUAGE_ITALIAN_SWISS :
     293 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_D].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "G" ) );
     294 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "GG" ) );
     295 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "GGG" ) );
     296 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DDDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "GGGG" ) );
     297                 :            :                     // must exchange the era code, same as Xcl
     298 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_G].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "X" ) );
     299 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_GG].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "XX" ) );
     300 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_GGG].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "XXX" ) );
     301                 :          0 :                 break;
     302                 :            :                 case LANGUAGE_FRENCH            :
     303                 :            :                 case LANGUAGE_FRENCH_BELGIAN    :
     304                 :            :                 case LANGUAGE_FRENCH_CANADIAN   :
     305                 :            :                 case LANGUAGE_FRENCH_SWISS      :
     306                 :            :                 case LANGUAGE_FRENCH_LUXEMBOURG :
     307                 :            :                 case LANGUAGE_FRENCH_MONACO     :
     308 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_D].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "J" ) );
     309 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_DD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "JJ" ) );
     310 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_DDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "JJJ" ) );
     311 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_DDDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "JJJJ" ) );
     312                 :          6 :                 break;
     313                 :            :                 case LANGUAGE_FINNISH :
     314 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_D].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "P" ) );
     315 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "PP" ) );
     316 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "PPP" ) );
     317 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_DDDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "PPPP" ) );
     318                 :          0 :                 break;
     319                 :            :                 default:
     320 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_D].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "D" ) );
     321 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_DD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "DD" ) );
     322 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_DDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "DDD" ) );
     323 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_DDDD].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "DDDD" ) );
     324                 :            :             }
     325                 :            :             // month
     326         [ -  + ]:       7195 :             switch ( eLang )
     327                 :            :             {
     328                 :            :                 case LANGUAGE_FINNISH :
     329 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_M].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "K" ) );
     330 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_MM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "KK" ) );
     331 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_MMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "KKK" ) );
     332 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_MMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "KKKK" ) );
     333 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_MMMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "KKKKK" ) );
     334                 :          0 :                 break;
     335                 :            :                 default:
     336 [ +  - ][ +  - ]:       7195 :                     sKeyword[NF_KEY_M].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "M" ) );
     337 [ +  - ][ +  - ]:       7195 :                     sKeyword[NF_KEY_MM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "MM" ) );
     338 [ +  - ][ +  - ]:       7195 :                     sKeyword[NF_KEY_MMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "MMM" ) );
     339 [ +  - ][ +  - ]:       7195 :                     sKeyword[NF_KEY_MMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "MMMM" ) );
     340 [ +  - ][ +  - ]:       7195 :                     sKeyword[NF_KEY_MMMMM].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "MMMMM" ) );
     341                 :            :             }
     342                 :            :             // year
     343   [ +  -  -  + ]:       7195 :             switch ( eLang )
     344                 :            :             {
     345                 :            :                 case LANGUAGE_ITALIAN       :
     346                 :            :                 case LANGUAGE_ITALIAN_SWISS :
     347                 :            :                 case LANGUAGE_FRENCH            :
     348                 :            :                 case LANGUAGE_FRENCH_BELGIAN    :
     349                 :            :                 case LANGUAGE_FRENCH_CANADIAN   :
     350                 :            :                 case LANGUAGE_FRENCH_SWISS      :
     351                 :            :                 case LANGUAGE_FRENCH_LUXEMBOURG :
     352                 :            :                 case LANGUAGE_FRENCH_MONACO     :
     353                 :            :                 case LANGUAGE_PORTUGUESE           :
     354                 :            :                 case LANGUAGE_PORTUGUESE_BRAZILIAN :
     355                 :            :                 case LANGUAGE_SPANISH_MODERN      :
     356                 :            :                 case LANGUAGE_SPANISH_DATED       :
     357                 :            :                 case LANGUAGE_SPANISH_MEXICAN     :
     358                 :            :                 case LANGUAGE_SPANISH_GUATEMALA   :
     359                 :            :                 case LANGUAGE_SPANISH_COSTARICA   :
     360                 :            :                 case LANGUAGE_SPANISH_PANAMA      :
     361                 :            :                 case LANGUAGE_SPANISH_DOMINICAN_REPUBLIC :
     362                 :            :                 case LANGUAGE_SPANISH_VENEZUELA   :
     363                 :            :                 case LANGUAGE_SPANISH_COLOMBIA    :
     364                 :            :                 case LANGUAGE_SPANISH_PERU        :
     365                 :            :                 case LANGUAGE_SPANISH_ARGENTINA   :
     366                 :            :                 case LANGUAGE_SPANISH_ECUADOR     :
     367                 :            :                 case LANGUAGE_SPANISH_CHILE       :
     368                 :            :                 case LANGUAGE_SPANISH_URUGUAY     :
     369                 :            :                 case LANGUAGE_SPANISH_PARAGUAY    :
     370                 :            :                 case LANGUAGE_SPANISH_BOLIVIA     :
     371                 :            :                 case LANGUAGE_SPANISH_EL_SALVADOR :
     372                 :            :                 case LANGUAGE_SPANISH_HONDURAS    :
     373                 :            :                 case LANGUAGE_SPANISH_NICARAGUA   :
     374                 :            :                 case LANGUAGE_SPANISH_PUERTO_RICO :
     375 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_YY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "AA" ) );
     376 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_YYYY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "AAAA" ) );
     377                 :            :                     // must exchange the day of week name code, same as Xcl
     378 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_AAA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "OOO" ) );
     379 [ +  - ][ +  - ]:          6 :                     sKeyword[NF_KEY_AAAA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(  "OOOO" ) );
     380                 :          6 :                 break;
     381                 :            :                 case LANGUAGE_DUTCH         :
     382                 :            :                 case LANGUAGE_DUTCH_BELGIAN :
     383 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_YY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "JJ" ) );
     384 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_YYYY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "JJJJ" ) );
     385                 :          0 :                 break;
     386                 :            :                 case LANGUAGE_FINNISH :
     387 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_YY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "VV" ) );
     388 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_YYYY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "VVVV" ) );
     389                 :          0 :                 break;
     390                 :            :                 default:
     391 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_YY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "YY" ) );
     392 [ +  - ][ +  - ]:       7189 :                     sKeyword[NF_KEY_YYYY].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "YYYY" ) );
     393                 :            :             }
     394                 :            :             // hour
     395      [ -  +  + ]:       7195 :             switch ( eLang )
     396                 :            :             {
     397                 :            :                 case LANGUAGE_DUTCH         :
     398                 :            :                 case LANGUAGE_DUTCH_BELGIAN :
     399 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_H].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "U" ) );
     400 [ #  # ][ #  # ]:          0 :                     sKeyword[NF_KEY_HH].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "UU" ) );
     401                 :          0 :                 break;
     402                 :            :                 case LANGUAGE_FINNISH :
     403                 :            :                 case LANGUAGE_SWEDISH         :
     404                 :            :                 case LANGUAGE_SWEDISH_FINLAND :
     405                 :            :                 case LANGUAGE_DANISH :
     406                 :            :                 case LANGUAGE_NORWEGIAN         :
     407                 :            :                 case LANGUAGE_NORWEGIAN_BOKMAL  :
     408                 :            :                 case LANGUAGE_NORWEGIAN_NYNORSK :
     409 [ +  - ][ +  - ]:          8 :                     sKeyword[NF_KEY_H].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "T" ) );
     410 [ +  - ][ +  - ]:          8 :                     sKeyword[NF_KEY_HH].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "TT" ) );
     411                 :          8 :                 break;
     412                 :            :                 default:
     413 [ +  - ][ +  - ]:       7187 :                     sKeyword[NF_KEY_H].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "H" ) );
     414 [ +  - ][ +  - ]:       7187 :                     sKeyword[NF_KEY_HH].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "HH" ) );
     415                 :            :             }
     416                 :            :             // boolean
     417 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_BOOLEAN].AssignAscii( RTL_CONSTASCII_STRINGPARAM( "BOOLEAN" ) );
     418                 :            :             // colours
     419 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_COLOR].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "COLOR" ) );
     420 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_BLACK].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "BLACK" ) );
     421 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_BLUE].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "BLUE" ) );
     422 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_GREEN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "GREEN" ) );
     423 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_CYAN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "CYAN" ) );
     424 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_RED].AssignAscii( RTL_CONSTASCII_STRINGPARAM(       "RED" ) );
     425 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_MAGENTA].AssignAscii( RTL_CONSTASCII_STRINGPARAM(   "MAGENTA" ) );
     426 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_BROWN].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "BROWN" ) );
     427 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_GREY].AssignAscii( RTL_CONSTASCII_STRINGPARAM(      "GREY" ) );
     428 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_YELLOW].AssignAscii( RTL_CONSTASCII_STRINGPARAM(    "YELLOW" ) );
     429 [ +  - ][ +  - ]:       7195 :             sKeyword[NF_KEY_WHITE].AssignAscii( RTL_CONSTASCII_STRINGPARAM(     "WHITE" ) );
     430                 :            :         }
     431                 :       7195 :         break;
     432                 :            :     }
     433                 :            : 
     434                 :            :     // boolean keyords
     435         [ +  - ]:       7203 :     InitSpecialKeyword( NF_KEY_TRUE );
     436         [ +  - ]:       7203 :     InitSpecialKeyword( NF_KEY_FALSE );
     437                 :            : 
     438                 :            :     // compatibility currency strings
     439 [ +  - ][ +  - ]:       7203 :     InitCompatCur();
     440                 :       7203 : }
     441                 :            : 
     442                 :       1617 : void ImpSvNumberformatScan::ChangeNullDate(sal_uInt16 nDay, sal_uInt16 nMonth, sal_uInt16 nYear)
     443                 :            : {
     444         [ +  - ]:       1617 :     if ( pNullDate )
     445                 :       1617 :         *pNullDate = Date(nDay, nMonth, nYear);
     446                 :            :     else
     447                 :          0 :         pNullDate = new Date(nDay, nMonth, nYear);
     448                 :       1617 : }
     449                 :            : 
     450                 :       2246 : void ImpSvNumberformatScan::ChangeStandardPrec(sal_uInt16 nPrec)
     451                 :            : {
     452                 :       2246 :     nStandardPrec = nPrec;
     453                 :       2246 : }
     454                 :            : 
     455                 :      16521 : Color* ImpSvNumberformatScan::GetColor(String& sStr)
     456                 :            : {
     457 [ +  - ][ +  - ]:      16521 :     String sString = pFormatter->GetCharClass()->uppercase(sStr);
                 [ +  - ]
     458         [ +  - ]:      16521 :     const NfKeywordTable & rKeyword = GetKeywords();
     459                 :      16521 :     size_t i = 0;
     460 [ +  + ][ +  + ]:     179235 :     while (i < NF_MAX_DEFAULT_COLORS &&
                 [ +  + ]
     461 [ +  - ][ +  - ]:      88980 :            sString != rKeyword[NF_KEY_FIRSTCOLOR+i] )
     462                 :      73734 :         i++;
     463         [ +  + ]:      16521 :     if ( i >= NF_MAX_DEFAULT_COLORS )
     464                 :            :     {
     465         [ +  - ]:       1275 :         const String* pEnglishColors = theEnglishColors::get();
     466                 :       1275 :         size_t j = 0;
     467 [ +  + ][ +  - ]:      26775 :         while ( j < NF_MAX_DEFAULT_COLORS &&
                 [ +  + ]
     468         [ +  - ]:      12750 :                 sString != pEnglishColors[j] )
     469                 :      12750 :             ++j;
     470         [ -  + ]:       1275 :         if ( j < NF_MAX_DEFAULT_COLORS )
     471                 :          0 :             i = j;
     472                 :            :     }
     473                 :            : 
     474                 :      16521 :     Color* pResult = NULL;
     475         [ +  + ]:      16521 :     if (i >= NF_MAX_DEFAULT_COLORS)
     476                 :            :     {
     477         [ +  - ]:       1275 :         const String& rColorWord = rKeyword[NF_KEY_COLOR];
     478         [ +  - ]:       1275 :         xub_StrLen nPos = sString.Match(rColorWord);
     479         [ +  - ]:       1275 :         if (nPos > 0)
     480                 :            :         {
     481         [ +  - ]:       1275 :             sStr.Erase(0, nPos);
     482 [ +  - ][ +  - ]:       1275 :             sStr = comphelper::string::strip(sStr, ' ');
                 [ +  - ]
     483         [ -  + ]:       1275 :             if (bConvertMode)
     484                 :            :             {
     485         [ #  # ]:          0 :                 pFormatter->ChangeIntl(eNewLnge);
     486 [ #  # ][ #  # ]:          0 :                 sStr.Insert( GetKeywords()[NF_KEY_COLOR], 0 );  // Color -> FARBE
                 [ #  # ]
     487         [ #  # ]:          0 :                 pFormatter->ChangeIntl(eTmpLnge);
     488                 :            :             }
     489                 :            :             else
     490         [ +  - ]:       1275 :                 sStr.Insert(rColorWord,0);
     491         [ +  - ]:       1275 :             sString.Erase(0, nPos);
     492 [ +  - ][ +  - ]:       1275 :             sString = comphelper::string::strip(sString, ' ');
                 [ +  - ]
     493                 :            : 
     494 [ -  + ][ +  - ]:       1275 :             if ( CharClass::isAsciiNumeric( sString ) )
     495                 :            :             {
     496         [ #  # ]:          0 :                 long nIndex = sString.ToInt32();
     497 [ #  # ][ #  # ]:          0 :                 if (nIndex > 0 && nIndex <= 64)
     498         [ #  # ]:          0 :                     pResult = pFormatter->GetUserDefColor((sal_uInt16)nIndex-1);
     499                 :            :             }
     500                 :            :         }
     501                 :            :     }
     502                 :            :     else
     503                 :            :     {
     504         [ +  - ]:      15246 :         sStr.Erase();
     505         [ +  + ]:      15246 :         if (bConvertMode)
     506                 :            :         {
     507         [ +  - ]:        351 :             pFormatter->ChangeIntl(eNewLnge);
     508 [ +  - ][ +  - ]:        351 :             sStr = GetKeywords()[NF_KEY_FIRSTCOLOR+i];           // red -> rot
                 [ +  - ]
     509         [ +  - ]:        351 :             pFormatter->ChangeIntl(eTmpLnge);
     510                 :            :         }
     511                 :            :         else
     512 [ +  - ][ +  - ]:      14895 :             sStr = rKeyword[NF_KEY_FIRSTCOLOR+i];
     513                 :            : 
     514                 :      15246 :         pResult = &(StandardColor[i]);
     515                 :            :     }
     516         [ +  - ]:      16521 :     return pResult;
     517                 :            : }
     518                 :            : 
     519                 :     473810 : short ImpSvNumberformatScan::GetKeyWord( const String& sSymbol, xub_StrLen nPos )
     520                 :            : {
     521 [ +  - ][ +  - ]:     473810 :     String sString = pFormatter->GetCharClass()->uppercase( sSymbol, nPos, sSymbol.Len() - nPos );
                 [ +  - ]
     522         [ +  - ]:     473810 :     const NfKeywordTable & rKeyword = GetKeywords();
     523                 :            :     // #77026# for the Xcl perverts: the GENERAL keyword is recognized anywhere
     524 [ +  - ][ +  - ]:     473810 :     if ( sString.Search( rKeyword[NF_KEY_GENERAL] ) == 0 )
                 [ +  + ]
     525                 :       2481 :         return NF_KEY_GENERAL;
     526                 :            :     //! MUST be a reverse search to find longer strings first
     527                 :     471329 :     short i = NF_KEYWORD_ENTRIES_COUNT-1;
     528                 :     471329 :     bool bFound = false;
     529         [ +  + ]:    5032955 :     for ( ; i > NF_KEY_LASTKEYWORD_SO5; --i )
     530                 :            :     {
     531 [ +  - ][ +  - ]:    4612140 :         bFound = sString.Search(rKeyword[i]) == 0;
     532         [ +  + ]:    4612140 :         if ( bFound )
     533                 :            :         {
     534                 :      50514 :             break;
     535                 :            :         }
     536                 :            :     }
     537                 :            :     // new keywords take precedence over old keywords
     538         [ +  + ]:     471329 :     if ( !bFound )
     539                 :            :     {   // skip the gap of colors et al between new and old keywords and search on
     540                 :     420815 :         i = NF_KEY_LASTKEYWORD;
     541 [ +  + ][ +  - ]:    7546322 :         while ( i > 0 && sString.Search(rKeyword[i]) != 0 )
         [ +  - ][ +  + ]
                 [ +  + ]
     542                 :    7125507 :             i--;
     543 [ +  + ][ +  - ]:     420815 :         if ( i > NF_KEY_LASTOLDKEYWORD && sString != rKeyword[i] )
         [ +  - ][ +  + ]
                 [ +  + ]
     544                 :            :         {   // found something, but maybe it's something else?
     545                 :            :             // e.g. new NNN is found in NNNN, for NNNN we must search on
     546                 :       4876 :             short j = i - 1;
     547 [ +  - ][ +  - ]:      14628 :             while ( j > 0 && sString.Search(rKeyword[j]) != 0 )
         [ +  - ][ +  + ]
                 [ +  + ]
     548                 :       9752 :                 j--;
     549 [ +  - ][ +  - ]:       4876 :             if ( j && rKeyword[j].Len() > rKeyword[i].Len() )
         [ +  - ][ +  - ]
                 [ +  - ]
     550                 :       4876 :                 return j;
     551                 :            :         }
     552                 :            :     }
     553                 :            :     // The Thai T NatNum modifier during Xcl import.
     554 [ +  + ][ +  + ]:     466453 :     if (i == 0 && bConvertMode && sString.GetChar(0) == 'T' && eTmpLnge ==
         [ -  + ][ #  # ]
         [ #  # ][ -  + ]
     555         [ #  # ]:          0 :             LANGUAGE_ENGLISH_US && MsLangId::getRealLanguage( eNewLnge) ==
     556                 :            :             LANGUAGE_THAI)
     557                 :          0 :         i = NF_KEY_THAI_T;
     558         [ +  - ]:     473810 :     return i;       // 0 => not found
     559                 :            : }
     560                 :            : 
     561                 :            : //---------------------------------------------------------------------------
     562                 :            : // Next_Symbol
     563                 :            : //---------------------------------------------------------------------------
     564                 :            : // Zerlegt die Eingabe in Symbole fuer die weitere
     565                 :            : // Verarbeitung (Turing-Maschine).
     566                 :            : //---------------------------------------------------------------------------
     567                 :            : // Ausgangs Zustand = SsStart
     568                 :            : //---------------+-------------------+-----------------------+---------------
     569                 :            : // Alter Zustand | gelesenes Zeichen | Aktion                | Neuer Zustand
     570                 :            : //---------------+-------------------+-----------------------+---------------
     571                 :            : // SsStart       | Buchstabe         | Symbol=Zeichen        | SsGetWord
     572                 :            : //               |    "              | Typ = String          | SsGetString
     573                 :            : //               |    \              | Typ = String          | SsGetChar
     574                 :            : //               |    *              | Typ = Star            | SsGetStar
     575                 :            : //               |    _              | Typ = Blank           | SsGetBlank
     576                 :            : //               | @ # 0 ? / . , % [ | Symbol = Zeichen;     |
     577                 :            : //               | ] ' Blank         | Typ = Steuerzeichen   | SsStop
     578                 :            : //               | $ - + ( ) :       | Typ    = String;      |
     579                 :            : //               | Sonst             | Symbol = Zeichen      | SsStop
     580                 :            : //---------------|-------------------+-----------------------+---------------
     581                 :            : // SsGetChar     | Sonst             | Symbol=Zeichen        | SsStop
     582                 :            : //---------------+-------------------+-----------------------+---------------
     583                 :            : // GetString     | "                 |                       | SsStop
     584                 :            : //               | Sonst             | Symbol+=Zeichen       | GetString
     585                 :            : //---------------+-------------------+-----------------------+---------------
     586                 :            : // SsGetWord     | Buchstabe         | Symbol += Zeichen     |
     587                 :            : //               | + -        (E+ E-)| Symbol += Zeichen     | SsStop
     588                 :            : //               | /          (AM/PM)| Symbol += Zeichen     |
     589                 :            : //               | Sonst             | Pos--, if Key Typ=Word| SsStop
     590                 :            : //---------------+-------------------+-----------------------+---------------
     591                 :            : // SsGetStar     | Sonst             | Symbol+=Zeichen       | SsStop
     592                 :            : //               |                   | markiere Sonderfall * |
     593                 :            : //---------------+-------------------+-----------------------+---------------
     594                 :            : // SsGetBlank    | Sonst             | Symbol+=Zeichen       | SsStop
     595                 :            : //               |                   | markiere Sonderfall _ |
     596                 :            : //---------------+-------------------+-----------------------+---------------
     597                 :            : // Wurde im State SsGetWord ein Schluesselwort erkannt (auch als
     598                 :            : // Anfangsteilwort des Symbols)
     599                 :            : // so werden die restlichen Buchstaben zurueckgeschrieben !!
     600                 :            : 
     601                 :            : enum ScanState
     602                 :            : {
     603                 :            :     SsStop      = 0,
     604                 :            :     SsStart     = 1,
     605                 :            :     SsGetChar   = 2,
     606                 :            :     SsGetString = 3,
     607                 :            :     SsGetWord   = 4,
     608                 :            :     SsGetStar   = 5,
     609                 :            :     SsGetBlank  = 6
     610                 :            : };
     611                 :            : 
     612                 :    1581808 : short ImpSvNumberformatScan::Next_Symbol( const String& rStr,
     613                 :            :             xub_StrLen& nPos, String& sSymbol )
     614                 :            : {
     615         [ -  + ]:    1581808 :     if ( bKeywordsNeedInit )
     616                 :          0 :         InitKeywords();
     617                 :    1581808 :     const CharClass* pChrCls = pFormatter->GetCharClass();
     618                 :    1581808 :     const LocaleDataWrapper* pLoc = pFormatter->GetLocaleData();
     619                 :    1581808 :     const xub_StrLen nStart = nPos;
     620                 :    1581808 :     short eType = 0;
     621                 :    1581808 :     ScanState eState = SsStart;
     622                 :    1581808 :     sSymbol.Erase();
     623 [ +  + ][ +  + ]:    3246584 :     while ( nPos < rStr.Len() && eState != SsStop )
                 [ +  + ]
     624                 :            :     {
     625                 :    1665016 :         sal_Unicode cToken = rStr.GetChar( nPos++ );
     626   [ +  +  +  +  :    1665016 :         switch (eState)
                +  +  - ]
     627                 :            :         {
     628                 :            :             case SsStart:
     629                 :            :             {
     630                 :            :                 // Fetch any currency longer than one character and don't get
     631                 :            :                 // confused later on by "E/" or other combinations of letters
     632                 :            :                 // and meaningful symbols. Necessary for old automatic currency.
     633                 :            :                 // #96158# But don't do it if we're starting a "[...]" section,
     634                 :            :                 // for example a "[$...]" new currency symbol to not parse away
     635                 :            :                 // "$U" (symbol) of "[$UYU]" (abbreviation).
     636         [ +  + ]:    1587552 :                 if ( nCurrPos != STRING_NOTFOUND && sCurString.Len() > 1 &&
           [ +  +  +  + ]
         [ +  + ][ +  + ]
     637                 :       3072 :                         nPos-1 + sCurString.Len() <= rStr.Len() &&
     638         [ +  + ]:       2672 :                         !(nPos > 1 && rStr.GetChar( nPos-2 ) == '[') )
     639                 :            :                 {
     640 [ +  - ][ +  - ]:       2792 :                     String aTest = pChrCls->uppercase( rStr.Copy( nPos-1, sCurString.Len() ) );
         [ +  - ][ +  - ]
                 [ +  - ]
     641 [ +  - ][ +  + ]:       2792 :                     if ( aTest == sCurString )
     642                 :            :                     {
     643 [ +  - ][ +  - ]:        240 :                         sSymbol = rStr.Copy( --nPos, sCurString.Len() );
                 [ +  - ]
     644                 :        240 :                         nPos = nPos + sSymbol.Len();
     645                 :        240 :                         eState = SsStop;
     646                 :        240 :                         eType = NF_SYMBOLTYPE_STRING;
     647                 :       2792 :                         return eType;
     648 [ +  - ][ +  + ]:       2792 :                     }
     649                 :            :                 }
     650   [ +  +  +  +  :    1581568 :                 switch (cToken)
                +  +  + ]
     651                 :            :                 {
     652                 :            :                     case '#':
     653                 :            :                     case '0':
     654                 :            :                     case '?':
     655                 :            :                     case '%':
     656                 :            :                     case '@':
     657                 :            :                     case '[':
     658                 :            :                     case ']':
     659                 :            :                     case ',':
     660                 :            :                     case '.':
     661                 :            :                     case '/':
     662                 :            :                     case '\'':
     663                 :            :                     case ' ':
     664                 :            :                     case ':':
     665                 :            :                     case '-':
     666                 :            :                     {
     667                 :    1012860 :                         eType = NF_SYMBOLTYPE_DEL;
     668                 :    1012860 :                         sSymbol += cToken;
     669                 :    1012860 :                         eState = SsStop;
     670                 :            :                     }
     671                 :    1012860 :                     break;
     672                 :            :                     case '*':
     673                 :            :                     {
     674                 :        672 :                         eType = NF_SYMBOLTYPE_STAR;
     675                 :        672 :                         sSymbol += cToken;
     676                 :        672 :                         eState = SsGetStar;
     677                 :            :                     }
     678                 :        672 :                     break;
     679                 :            :                     case '_':
     680                 :            :                     {
     681                 :       6954 :                         eType = NF_SYMBOLTYPE_BLANK;
     682                 :       6954 :                         sSymbol += cToken;
     683                 :       6954 :                         eState = SsGetBlank;
     684                 :            :                     }
     685                 :       6954 :                     break;
     686                 :            :                     case '"':
     687                 :       1003 :                         eType = NF_SYMBOLTYPE_STRING;
     688                 :       1003 :                         eState = SsGetString;
     689                 :       1003 :                         sSymbol += cToken;
     690                 :       1003 :                     break;
     691                 :            :                     case '\\':
     692                 :        640 :                         eType = NF_SYMBOLTYPE_STRING;
     693                 :        640 :                         eState = SsGetChar;
     694                 :        640 :                         sSymbol += cToken;
     695                 :        640 :                     break;
     696                 :            :                     case '$':
     697                 :            :                     case '+':
     698                 :            :                     case '(':
     699                 :            :                     case ')':
     700                 :      86149 :                         eType = NF_SYMBOLTYPE_STRING;
     701                 :      86149 :                         eState = SsStop;
     702                 :      86149 :                         sSymbol += cToken;
     703                 :      86149 :                     break;
     704                 :            :                     default :
     705                 :            :                     {
     706   [ +  -  +  -  :    2839740 :                         if (StringEqualsChar( pFormatter->GetNumDecimalSep(), cToken) ||
          +  -  +  -  -  
              + ][ -  + ]
     707                 :     473290 :                                 StringEqualsChar( pFormatter->GetNumThousandSep(), cToken) ||
     708                 :     473290 :                                 StringEqualsChar( pFormatter->GetDateSep(), cToken) ||
     709 [ +  - ][ +  - ]:     946580 :                                 StringEqualsChar( pLoc->getTimeSep(), cToken) ||
         [ +  - ][ #  # ]
     710 [ +  - ][ +  - ]:     946580 :                                 StringEqualsChar( pLoc->getTime100SecSep(), cToken))
         [ +  - ][ +  - ]
                 [ #  # ]
     711                 :            :                         {
     712                 :            :                             // Another separator than pre-known ASCII
     713                 :          0 :                             eType = NF_SYMBOLTYPE_DEL;
     714                 :          0 :                             sSymbol += cToken;
     715                 :          0 :                             eState = SsStop;
     716                 :            :                         }
     717         [ +  + ]:     473290 :                         else if ( pChrCls->isLetter( rStr, nPos-1 ) )
     718                 :            :                         {
     719                 :     399274 :                             short nTmpType = GetKeyWord( rStr, nPos-1 );
     720         [ +  + ]:     399274 :                             if ( nTmpType )
     721                 :            :                             {
     722                 :     354092 :                                 bool bCurrency = false;
     723                 :            :                                 // "Automatic" currency may start with keyword,
     724                 :            :                                 // like "R" (Rand) and 'R' (era)
     725   [ +  +  +  -  :     356064 :                                 if ( nCurrPos != STRING_NOTFOUND &&
           -  + ][ -  + ]
     726                 :        986 :                                     nPos-1 + sCurString.Len() <= rStr.Len() &&
     727                 :        986 :                                     sCurString.Search( sKeyword[nTmpType] ) == 0 )
     728                 :            :                                 {
     729 [ #  # ][ #  # ]:          0 :                                     String aTest = pChrCls->uppercase( rStr.Copy( nPos-1, sCurString.Len() ) );
         [ #  # ][ #  # ]
                 [ #  # ]
     730 [ #  # ][ #  # ]:          0 :                                     if ( aTest == sCurString )
     731         [ #  # ]:          0 :                                         bCurrency = true;
     732                 :            :                                 }
     733         [ -  + ]:     354092 :                                 if ( bCurrency )
     734                 :            :                                 {
     735                 :          0 :                                     eState = SsGetWord;
     736                 :          0 :                                     sSymbol += cToken;
     737                 :            :                                 }
     738                 :            :                                 else
     739                 :            :                                 {
     740                 :     354092 :                                     eType = nTmpType;
     741                 :     354092 :                                     xub_StrLen nLen = sKeyword[eType].Len();
     742         [ +  - ]:     354092 :                                     sSymbol = rStr.Copy( nPos-1, nLen );
     743 [ +  + ][ +  + ]:     354092 :                                     if ( eType == NF_KEY_E || IsAmbiguousE( eType ) )
                 [ +  - ]
     744                 :            :                                     {
     745                 :      27728 :                                         sal_Unicode cNext = rStr.GetChar(nPos);
     746      [ +  -  + ]:      27728 :                                         switch ( cNext )
     747                 :            :                                         {
     748                 :            :                                             case '+' :
     749                 :            :                                             case '-' :  // E+ E- combine to one symbol
     750                 :       4976 :                                                 sSymbol += cNext;
     751                 :       4976 :                                                 eType = NF_KEY_E;
     752                 :       4976 :                                                 nPos++;
     753                 :       4976 :                                             break;
     754                 :            :                                             case '0' :
     755                 :            :                                             case '#' :  // scientific E without sign
     756                 :          0 :                                                 eType = NF_KEY_E;
     757                 :      27728 :                                             break;
     758                 :            :                                         }
     759                 :            :                                     }
     760                 :     354092 :                                     nPos--;
     761                 :     354092 :                                     nPos = nPos + nLen;
     762                 :     354092 :                                     eState = SsStop;
     763                 :            :                                 }
     764                 :            :                             }
     765                 :            :                             else
     766                 :            :                             {
     767                 :      45182 :                                 eState = SsGetWord;
     768                 :      45182 :                                 sSymbol += cToken;
     769                 :            :                             }
     770                 :            :                         }
     771                 :            :                         else
     772                 :            :                         {
     773                 :      74016 :                             eType = NF_SYMBOLTYPE_STRING;
     774                 :      74016 :                             eState = SsStop;
     775                 :      74016 :                             sSymbol += cToken;
     776                 :            :                         }
     777                 :            :                     }
     778                 :     473290 :                     break;
     779                 :            :                 }
     780                 :            :             }
     781                 :    1581568 :             break;
     782                 :            :             case SsGetChar:
     783                 :            :             {
     784                 :        640 :                 sSymbol += cToken;
     785                 :        640 :                 eState = SsStop;
     786                 :            :             }
     787                 :        640 :             break;
     788                 :            :             case SsGetString:
     789                 :            :             {
     790         [ +  + ]:       2602 :                 if (cToken == '"')
     791                 :       1003 :                     eState = SsStop;
     792                 :       2602 :                 sSymbol += cToken;
     793                 :            :             }
     794                 :       2602 :             break;
     795                 :            :             case SsGetWord:
     796                 :            :             {
     797         [ +  + ]:      72340 :                 if ( pChrCls->isLetter( rStr, nPos-1 ) )
     798                 :            :                 {
     799                 :      71820 :                     short nTmpType = GetKeyWord( rStr, nPos-1 );
     800         [ +  + ]:      71820 :                     if ( nTmpType )
     801                 :            :                     {   // beginning of keyword, stop scan and put back
     802                 :      42200 :                         eType = NF_SYMBOLTYPE_STRING;
     803                 :      42200 :                         eState = SsStop;
     804                 :      42200 :                         nPos--;
     805                 :            :                     }
     806                 :            :                     else
     807                 :      29620 :                         sSymbol += cToken;
     808                 :            :                 }
     809                 :            :                 else
     810                 :            :                 {
     811                 :        520 :                     bool bDontStop = false;
     812         [ -  + ]:        520 :                     switch (cToken)
     813                 :            :                     {
     814                 :            :                         case '/':                       // AM/PM, A/P
     815                 :            :                         {
     816                 :          0 :                             sal_Unicode cNext = rStr.GetChar(nPos);
     817 [ #  # ][ #  # ]:          0 :                             if ( cNext == 'P' || cNext == 'p' )
     818                 :            :                             {
     819                 :          0 :                                 xub_StrLen nLen = sSymbol.Len();
     820 [ #  # ][ #  #  :          0 :                                 if ( 1 <= nLen
          #  #  #  #  #  
                #  #  # ]
         [ #  # ][ #  #  
             #  #  #  # ]
     821                 :          0 :                                         && (sSymbol.GetChar(0) == 'A' || sSymbol.GetChar(0) == 'a')
     822                 :            :                                         && (nLen == 1 || (nLen == 2
     823                 :          0 :                                             && (sSymbol.GetChar(1) == 'M' || sSymbol.GetChar(1) == 'm')
     824                 :          0 :                                             && (rStr.GetChar(nPos+1) == 'M' || rStr.GetChar(nPos+1) == 'm'))) )
     825                 :            :                                 {
     826                 :          0 :                                     sSymbol += cToken;
     827                 :          0 :                                     bDontStop = true;
     828                 :            :                                 }
     829                 :            :                             }
     830                 :            :                         }
     831                 :          0 :                         break;
     832                 :            :                     }
     833                 :            :                     // anything not recognized will stop the scan
     834 [ +  - ][ +  - ]:        520 :                     if ( eState != SsStop && !bDontStop )
     835                 :            :                     {
     836                 :        520 :                         eState = SsStop;
     837                 :        520 :                         nPos--;
     838                 :        520 :                         eType = NF_SYMBOLTYPE_STRING;
     839                 :            :                     }
     840                 :            :                 }
     841                 :            :             }
     842                 :      72340 :             break;
     843                 :            :             case SsGetStar:
     844                 :            :             {
     845                 :        672 :                 eState = SsStop;
     846                 :        672 :                 sSymbol += cToken;
     847                 :        672 :                 nRepPos = (nPos - nStart) - 1;  // everytime > 0!!
     848                 :            :             }
     849                 :        672 :             break;
     850                 :            :             case SsGetBlank:
     851                 :            :             {
     852                 :       6954 :                 eState = SsStop;
     853                 :       6954 :                 sSymbol += cToken;
     854                 :            :             }
     855                 :       6954 :             break;
     856                 :            :             default:
     857                 :          0 :             break;
     858                 :            :         }                                   // of switch
     859                 :            :     }                                       // of while
     860         [ +  + ]:    1581568 :     if (eState == SsGetWord)
     861                 :       2462 :         eType = NF_SYMBOLTYPE_STRING;
     862                 :    1581808 :     return eType;
     863                 :            : }
     864                 :            : 
     865                 :     199160 : xub_StrLen ImpSvNumberformatScan::Symbol_Division(const String& rString)
     866                 :            : {
     867                 :     199160 :     nCurrPos = STRING_NOTFOUND;
     868                 :            :                                                     // Ist Waehrung im Spiel?
     869 [ +  - ][ +  - ]:     199160 :     String sString = pFormatter->GetCharClass()->uppercase(rString);
                 [ +  - ]
     870                 :     199160 :     xub_StrLen nCPos = 0;
     871         [ +  + ]:     398608 :     while (nCPos != STRING_NOTFOUND)
     872                 :            :     {
     873 [ +  - ][ +  - ]:     199448 :         nCPos = sString.Search(GetCurString(),nCPos);
     874         [ +  + ]:     199448 :         if (nCPos != STRING_NOTFOUND)
     875                 :            :         {
     876                 :            :             // in Quotes?
     877         [ +  - ]:      50699 :             xub_StrLen nQ = SvNumberformat::GetQuoteEnd( sString, nCPos );
     878         [ +  + ]:      50699 :             if ( nQ == STRING_NOTFOUND )
     879                 :            :             {
     880                 :            :                 sal_Unicode c;
     881 [ +  + ][ +  - ]:      50435 :                 if ( nCPos == 0 ||
         [ +  + ][ +  + ]
     882                 :      38014 :                     ((c = sString.GetChar(xub_StrLen(nCPos-1))) != '"'
     883                 :            :                             && c != '\\') )         // dm kann durch "dm
     884                 :            :                 {                                   // \d geschuetzt werden
     885                 :      50411 :                     nCurrPos = nCPos;
     886                 :      50411 :                     nCPos = STRING_NOTFOUND;        // Abbruch
     887                 :            :                 }
     888                 :            :                 else
     889                 :         24 :                     nCPos++;                        // weitersuchen
     890                 :            :             }
     891                 :            :             else
     892                 :        264 :                 nCPos = nQ + 1;                     // weitersuchen
     893                 :            :         }
     894                 :            :     }
     895                 :     199160 :     nAnzStrings = 0;
     896                 :     199160 :     bool bStar = false;                 // wird bei '*'Detektion gesetzt
     897                 :     199160 :     Reset();
     898                 :            : 
     899                 :     199160 :     xub_StrLen nPos = 0;
     900                 :     199160 :     const xub_StrLen nLen = rString.Len();
     901 [ +  + ][ +  - ]:    1780968 :     while (nPos < nLen && nAnzStrings < NF_MAX_FORMAT_SYMBOLS)
                 [ +  + ]
     902                 :            :     {
     903         [ +  - ]:    1581808 :         nTypeArray[nAnzStrings] = Next_Symbol(rString, nPos, sStrArray[nAnzStrings]);
     904         [ +  + ]:    1581808 :         if (nTypeArray[nAnzStrings] == NF_SYMBOLTYPE_STAR)
     905                 :            :         {                               // Ueberwachung des '*'
     906         [ -  + ]:        672 :             if (bStar)
     907                 :          0 :                 return nPos;        // Fehler: doppelter '*'
     908                 :            :             else
     909                 :        672 :                 bStar = true;
     910                 :            :         }
     911                 :    1581808 :         nAnzStrings++;
     912                 :            :     }
     913                 :            : 
     914         [ +  - ]:     199160 :     return 0;                       // 0 => ok
     915                 :            : }
     916                 :            : 
     917                 :    1412308 : void ImpSvNumberformatScan::SkipStrings(sal_uInt16& i, xub_StrLen& nPos)
     918                 :            : {
     919 [ +  + ][ +  + ]:    1466893 :     while (i < nAnzStrings && (   nTypeArray[i] == NF_SYMBOLTYPE_STRING
         [ +  + ][ +  + ]
                 [ +  + ]
     920                 :    1220774 :                                || nTypeArray[i] == NF_SYMBOLTYPE_BLANK
     921                 :    1213820 :                                || nTypeArray[i] == NF_SYMBOLTYPE_STAR) )
     922                 :            :     {
     923                 :      54585 :         nPos = nPos + sStrArray[i].Len();
     924                 :      54585 :         i++;
     925                 :            :     }
     926                 :    1412308 : }
     927                 :            : 
     928                 :      61153 : sal_uInt16 ImpSvNumberformatScan::PreviousKeyword(sal_uInt16 i)
     929                 :            : {
     930                 :      61153 :     short res = 0;
     931 [ +  + ][ +  - ]:      61153 :     if (i > 0 && i < nAnzStrings)
     932                 :            :     {
     933                 :      40320 :         i--;
     934 [ +  + ][ +  + ]:      90560 :         while (i > 0 && nTypeArray[i] <= 0)
                 [ +  + ]
     935                 :      50240 :             i--;
     936         [ +  - ]:      40320 :         if (nTypeArray[i] > 0)
     937                 :      40320 :             res = nTypeArray[i];
     938                 :            :     }
     939                 :      61153 :     return res;
     940                 :            : }
     941                 :            : 
     942                 :      51233 : sal_uInt16 ImpSvNumberformatScan::NextKeyword(sal_uInt16 i)
     943                 :            : {
     944                 :      51233 :     short res = 0;
     945         [ +  + ]:      51233 :     if (i < nAnzStrings-1)
     946                 :            :     {
     947                 :      48548 :         i++;
     948 [ +  + ][ +  + ]:      92056 :         while (i < nAnzStrings-1 && nTypeArray[i] <= 0)
                 [ +  + ]
     949                 :      43508 :             i++;
     950         [ +  - ]:      48548 :         if (nTypeArray[i] > 0)
     951                 :      48548 :             res = nTypeArray[i];
     952                 :            :     }
     953                 :      51233 :     return res;
     954                 :            : }
     955                 :            : 
     956                 :         51 : short ImpSvNumberformatScan::PreviousType( sal_uInt16 i )
     957                 :            : {
     958 [ +  - ][ +  - ]:         51 :     if ( i > 0 && i < nAnzStrings )
     959                 :            :     {
     960 [ +  - ][ -  + ]:         51 :         do
                 [ -  + ]
     961                 :            :         {
     962                 :         51 :             i--;
     963                 :         51 :         } while ( i > 0 && nTypeArray[i] == NF_SYMBOLTYPE_EMPTY );
     964                 :         51 :         return nTypeArray[i];
     965                 :            :     }
     966                 :         51 :     return 0;
     967                 :            : }
     968                 :            : 
     969                 :     117203 : sal_Unicode ImpSvNumberformatScan::PreviousChar(sal_uInt16 i)
     970                 :            : {
     971                 :     117203 :     sal_Unicode res = ' ';
     972 [ +  + ][ +  - ]:     117203 :     if (i > 0 && i < nAnzStrings)
     973                 :            :     {
     974                 :      96370 :         i--;
     975 [ +  + ][ +  + ]:      96382 :         while (i > 0 && (   nTypeArray[i] == NF_SYMBOLTYPE_EMPTY
         [ +  - ][ +  - ]
         [ -  + ][ +  + ]
     976                 :      81015 :                          || nTypeArray[i] == NF_SYMBOLTYPE_STRING
     977                 :      81015 :                          || nTypeArray[i] == NF_SYMBOLTYPE_STAR
     978                 :      81015 :                          || nTypeArray[i] == NF_SYMBOLTYPE_BLANK ) )
     979                 :         12 :             i--;
     980         [ +  - ]:      96370 :         if (sStrArray[i].Len() > 0)
     981                 :      96370 :             res = sStrArray[i].GetChar(xub_StrLen(sStrArray[i].Len()-1));
     982                 :            :     }
     983                 :     117203 :     return res;
     984                 :            : }
     985                 :            : 
     986                 :      76089 : sal_Unicode ImpSvNumberformatScan::NextChar(sal_uInt16 i)
     987                 :            : {
     988                 :      76089 :     sal_Unicode res = ' ';
     989         [ +  - ]:      76089 :     if (i < nAnzStrings-1)
     990                 :            :     {
     991                 :      76089 :         i++;
     992 [ +  + ][ +  - ]:      76089 :         while (i < nAnzStrings-1 &&
         [ +  - ][ +  - ]
         [ -  + ][ -  + ]
     993                 :      76035 :                (   nTypeArray[i] == NF_SYMBOLTYPE_EMPTY
     994                 :      76035 :                 || nTypeArray[i] == NF_SYMBOLTYPE_STRING
     995                 :      76035 :                 || nTypeArray[i] == NF_SYMBOLTYPE_STAR
     996                 :      76035 :                 || nTypeArray[i] == NF_SYMBOLTYPE_BLANK))
     997                 :          0 :             i++;
     998         [ +  - ]:      76089 :         if (sStrArray[i].Len() > 0)
     999                 :      76089 :             res = sStrArray[i].GetChar(0);
    1000                 :            :     }
    1001                 :      76089 :     return res;
    1002                 :            : }
    1003                 :            : 
    1004                 :         12 : bool ImpSvNumberformatScan::IsLastBlankBeforeFrac(sal_uInt16 i)
    1005                 :            : {
    1006                 :         12 :     bool res = true;
    1007         [ +  - ]:         12 :     if (i < nAnzStrings-1)
    1008                 :            :     {
    1009                 :         12 :         bool bStop = false;
    1010                 :         12 :         i++;
    1011 [ +  - ][ +  + ]:         30 :         while (i < nAnzStrings-1 && !bStop)
                 [ +  + ]
    1012                 :            :         {
    1013                 :         18 :             i++;
    1014   [ +  -  +  + ]:         36 :             if ( nTypeArray[i] == NF_SYMBOLTYPE_DEL &&
                 [ +  + ]
    1015                 :         18 :                     sStrArray[i].GetChar(0) == '/')
    1016                 :         12 :                 bStop = true;
    1017   [ +  -  -  + ]:         12 :             else if ( nTypeArray[i] == NF_SYMBOLTYPE_DEL &&
                 [ -  + ]
    1018                 :          6 :                     sStrArray[i].GetChar(0) == ' ')
    1019                 :          0 :                 res = false;
    1020                 :            :         }
    1021         [ -  + ]:         12 :         if (!bStop)                                 // kein '/'
    1022                 :          0 :             res = false;
    1023                 :            :     }
    1024                 :            :     else
    1025                 :          0 :         res = false;                                // kein '/' mehr
    1026                 :            : 
    1027                 :         12 :     return res;
    1028                 :            : }
    1029                 :            : 
    1030                 :     203341 : void ImpSvNumberformatScan::Reset()
    1031                 :            : {
    1032                 :     203341 :     nAnzStrings = 0;
    1033                 :     203341 :     nAnzResStrings = 0;
    1034                 :            : #if 0
    1035                 :            : // ER 20.06.97 14:05   nicht noetig, wenn nAnzStrings beachtet wird
    1036                 :            :     for (size_t i = 0; i < NF_MAX_FORMAT_SYMBOLS; i++)
    1037                 :            :     {
    1038                 :            :         sStrArray[i].Erase();
    1039                 :            :         nTypeArray[i] = 0;
    1040                 :            :     }
    1041                 :            : #endif
    1042                 :     203341 :     eScannedType = NUMBERFORMAT_UNDEFINED;
    1043                 :     203341 :     nRepPos = 0;
    1044                 :     203341 :     bExp = false;
    1045                 :     203341 :     bThousand = false;
    1046                 :     203341 :     nThousand = 0;
    1047                 :     203341 :     bDecSep = false;
    1048                 :     203341 :     nDecPos =  -1;
    1049                 :     203341 :     nExpPos = (sal_uInt16) -1;
    1050                 :     203341 :     nBlankPos = (sal_uInt16) -1;
    1051                 :     203341 :     nCntPre = 0;
    1052                 :     203341 :     nCntPost = 0;
    1053                 :     203341 :     nCntExp = 0;
    1054                 :     203341 :     bFrac = false;
    1055                 :     203341 :     bBlank = false;
    1056                 :     203341 :     nNatNumModifier = 0;
    1057                 :     203341 : }
    1058                 :            : 
    1059                 :      14960 : bool ImpSvNumberformatScan::Is100SecZero( sal_uInt16 i, bool bHadDecSep )
    1060                 :            : {
    1061                 :      14960 :     sal_uInt16 nIndexPre = PreviousKeyword( i );
    1062                 :            :     return (nIndexPre == NF_KEY_S || nIndexPre == NF_KEY_SS)
    1063                 :            :             && (bHadDecSep                 // S, SS ','
    1064 [ +  - ][ -  + ]:      14960 :             || (i>0 && nTypeArray[i-1] == NF_SYMBOLTYPE_STRING));
         [ #  # ][ #  # ]
                 [ +  - ]
    1065                 :            :                 // SS"any"00  take "any" as a valid decimal separator
    1066                 :            : }
    1067                 :            : 
    1068                 :     199160 : xub_StrLen ImpSvNumberformatScan::ScanType()
    1069                 :            : {
    1070                 :     199160 :     const LocaleDataWrapper* pLoc = pFormatter->GetLocaleData();
    1071                 :            : 
    1072                 :     199160 :     xub_StrLen nPos = 0;
    1073                 :     199160 :     sal_uInt16 i = 0;
    1074                 :            :     short eNewType;
    1075                 :     199160 :     bool bMatchBracket = false;
    1076                 :     199160 :     bool bHaveGeneral = false;      // if General/Standard encountered
    1077                 :            : 
    1078                 :     199160 :     SkipStrings(i, nPos);
    1079         [ +  + ]:    1412308 :     while (i < nAnzStrings)
    1080                 :            :     {
    1081         [ +  + ]:    1213148 :         if (nTypeArray[i] > 0)
    1082                 :            :         {                                       // keyword
    1083   [ +  +  +  +  :     294906 :             switch (nTypeArray[i])
                +  +  - ]
    1084                 :            :             {
    1085                 :            :                 case NF_KEY_E:                          // E
    1086                 :       4976 :                     eNewType = NUMBERFORMAT_SCIENTIFIC;
    1087                 :       4976 :                 break;
    1088                 :            :                 case NF_KEY_AMPM:                       // AM,A,PM,P
    1089                 :            :                 case NF_KEY_AP:
    1090                 :            :                 case NF_KEY_H:                          // H
    1091                 :            :                 case NF_KEY_HH:                         // HH
    1092                 :            :                 case NF_KEY_S:                          // S
    1093                 :            :                 case NF_KEY_SS:                         // SS
    1094                 :      43309 :                     eNewType = NUMBERFORMAT_TIME;
    1095                 :      43309 :                 break;
    1096                 :            :                 case NF_KEY_M:                          // M
    1097                 :            :                 case NF_KEY_MM:                         // MM
    1098                 :            :                 {                                       // minute or month
    1099                 :      46193 :                     sal_uInt16 nIndexPre = PreviousKeyword(i);
    1100                 :      46193 :                     sal_uInt16 nIndexNex = NextKeyword(i);
    1101                 :      46193 :                     sal_Unicode cChar = PreviousChar(i);
    1102 [ +  + ][ +  - ]:      46193 :                     if (nIndexPre == NF_KEY_H   ||  // H
         [ +  + ][ -  + ]
                 [ +  + ]
    1103                 :            :                         nIndexPre == NF_KEY_HH  ||  // HH
    1104                 :            :                         nIndexNex == NF_KEY_S   ||  // S
    1105                 :            :                         nIndexNex == NF_KEY_SS  ||  // SS
    1106                 :            :                         cChar == '['  )     // [M
    1107                 :            :                     {
    1108                 :      23116 :                         eNewType = NUMBERFORMAT_TIME;
    1109                 :      23116 :                         nTypeArray[i] -= 2;         // 6 -> 4, 7 -> 5
    1110                 :            :                     }
    1111                 :            :                     else
    1112                 :      23077 :                         eNewType = NUMBERFORMAT_DATE;
    1113                 :            :                 }
    1114                 :      46193 :                 break;
    1115                 :            :                 case NF_KEY_MMM:                // MMM
    1116                 :            :                 case NF_KEY_MMMM:               // MMMM
    1117                 :            :                 case NF_KEY_MMMMM:              // MMMMM
    1118                 :            :                 case NF_KEY_Q:                  // Q
    1119                 :            :                 case NF_KEY_QQ:                 // QQ
    1120                 :            :                 case NF_KEY_D:                  // D
    1121                 :            :                 case NF_KEY_DD:                 // DD
    1122                 :            :                 case NF_KEY_DDD:                // DDD
    1123                 :            :                 case NF_KEY_DDDD:               // DDDD
    1124                 :            :                 case NF_KEY_YY:                 // YY
    1125                 :            :                 case NF_KEY_YYYY:               // YYYY
    1126                 :            :                 case NF_KEY_NN:                 // NN
    1127                 :            :                 case NF_KEY_NNN:                // NNN
    1128                 :            :                 case NF_KEY_NNNN:               // NNNN
    1129                 :            :                 case NF_KEY_WW :                // WW
    1130                 :            :                 case NF_KEY_AAA :               // AAA
    1131                 :            :                 case NF_KEY_AAAA :              // AAAA
    1132                 :            :                 case NF_KEY_EC :                // E
    1133                 :            :                 case NF_KEY_EEC :               // EE
    1134                 :            :                 case NF_KEY_G :                 // G
    1135                 :            :                 case NF_KEY_GG :                // GG
    1136                 :            :                 case NF_KEY_GGG :               // GGG
    1137                 :            :                 case NF_KEY_R :                 // R
    1138                 :            :                 case NF_KEY_RR :                // RR
    1139                 :     195507 :                     eNewType = NUMBERFORMAT_DATE;
    1140                 :     195507 :                 break;
    1141                 :            :                 case NF_KEY_CCC:                // CCC
    1142                 :       2440 :                     eNewType = NUMBERFORMAT_CURRENCY;
    1143                 :       2440 :                 break;
    1144                 :            :                 case NF_KEY_GENERAL:            // Standard
    1145                 :       2481 :                     eNewType = NUMBERFORMAT_NUMBER;
    1146                 :       2481 :                     bHaveGeneral = true;
    1147                 :       2481 :                 break;
    1148                 :            :                 default:
    1149                 :          0 :                     eNewType = NUMBERFORMAT_UNDEFINED;
    1150                 :     294906 :                 break;
    1151                 :            :             }
    1152                 :            :         }
    1153                 :            :         else
    1154                 :            :         {                                       // control character
    1155   [ +  +  +  +  :     918242 :             switch ( sStrArray[i].GetChar(0) )
                +  +  + ]
    1156                 :            :             {
    1157                 :            :                 case '#':
    1158                 :            :                 case '?':
    1159                 :     247482 :                     eNewType = NUMBERFORMAT_NUMBER;
    1160                 :     247482 :                 break;
    1161                 :            :                 case '0':
    1162                 :            :                 {
    1163         [ +  + ]:     199314 :                     if ( (eScannedType & NUMBERFORMAT_TIME) == NUMBERFORMAT_TIME )
    1164                 :            :                     {
    1165         [ +  - ]:       9920 :                         if ( Is100SecZero( i, bDecSep ) )
    1166                 :            :                         {
    1167                 :       9920 :                             bDecSep = true;                 // subsequent 0's
    1168                 :       9920 :                             eNewType = NUMBERFORMAT_TIME;
    1169                 :            :                         }
    1170                 :            :                         else
    1171                 :          0 :                             return nPos;                    // Error
    1172                 :            :                     }
    1173                 :            :                     else
    1174                 :     189394 :                         eNewType = NUMBERFORMAT_NUMBER;
    1175                 :            :                 }
    1176                 :     199314 :                 break;
    1177                 :            :                 case '%':
    1178                 :       4892 :                     eNewType = NUMBERFORMAT_PERCENT;
    1179                 :       4892 :                 break;
    1180                 :            :                 case '/':
    1181                 :      41103 :                     eNewType = NUMBERFORMAT_FRACTION;
    1182                 :      41103 :                 break;
    1183                 :            :                 case '[':
    1184                 :            :                 {
    1185         [ +  - ]:      94870 :                     if ( i < nAnzStrings-1 &&
           [ +  +  +  + ]
                 [ +  + ]
    1186                 :      49955 :                             nTypeArray[i+1] == NF_SYMBOLTYPE_STRING &&
    1187                 :      44915 :                             sStrArray[i+1].GetChar(0) == '$' )
    1188                 :            :                     {   // as of SV_NUMBERFORMATTER_VERSION_NEW_CURR
    1189                 :      25515 :                         eNewType = NUMBERFORMAT_CURRENCY;
    1190                 :      25515 :                         bMatchBracket = true;
    1191                 :            :                     }
    1192         [ +  - ]:      43840 :                     else if ( i < nAnzStrings-1 &&
           [ +  +  +  - ]
                 [ +  + ]
    1193                 :      24440 :                             nTypeArray[i+1] == NF_SYMBOLTYPE_STRING &&
    1194                 :      19400 :                             sStrArray[i+1].GetChar(0) == '~' )
    1195                 :            :                     {   // as of SV_NUMBERFORMATTER_VERSION_CALENDAR
    1196                 :      19400 :                         eNewType = NUMBERFORMAT_DATE;
    1197                 :      19400 :                         bMatchBracket = true;
    1198                 :            :                     }
    1199                 :            :                     else
    1200                 :            :                     {
    1201                 :       5040 :                         sal_uInt16 nIndexNex = NextKeyword(i);
    1202 [ -  + ][ #  # ]:       5040 :                         if (nIndexNex == NF_KEY_H   ||  // H
         [ #  # ][ #  # ]
         [ #  # ][ +  + ]
    1203                 :            :                             nIndexNex == NF_KEY_HH  ||  // HH
    1204                 :            :                             nIndexNex == NF_KEY_M   ||  // M
    1205                 :            :                             nIndexNex == NF_KEY_MM  ||  // MM
    1206                 :            :                             nIndexNex == NF_KEY_S   ||  // S
    1207                 :            :                             nIndexNex == NF_KEY_SS   )  // SS
    1208                 :       5040 :                             eNewType = NUMBERFORMAT_TIME;
    1209                 :            :                         else
    1210                 :          0 :                             return nPos;                // Error
    1211                 :            :                     }
    1212                 :            :                 }
    1213                 :      49955 :                 break;
    1214                 :            :                 case '@':
    1215                 :       2697 :                     eNewType = NUMBERFORMAT_TEXT;
    1216                 :       2697 :                 break;
    1217                 :            :                 default:
    1218 [ +  - ][ +  - ]:     372799 :                     if (pLoc->getTime100SecSep().equals(sStrArray[i]))
                 [ +  + ]
    1219                 :      65779 :                         bDecSep = true;                     // for SS,0
    1220                 :     372799 :                     eNewType = NUMBERFORMAT_UNDEFINED;
    1221                 :     372799 :                 break;
    1222                 :            :             }
    1223                 :            :         }
    1224         [ +  + ]:    1213148 :         if (eScannedType == NUMBERFORMAT_UNDEFINED)
    1225                 :     223863 :             eScannedType = eNewType;
    1226 [ +  + ][ -  + ]:     989285 :         else if (eScannedType == NUMBERFORMAT_TEXT || eNewType == NUMBERFORMAT_TEXT)
    1227                 :         24 :             eScannedType = NUMBERFORMAT_TEXT;               // Text bleibt immer Text
    1228         [ +  + ]:     989261 :         else if (eNewType == NUMBERFORMAT_UNDEFINED)
    1229                 :            :         {                                           // bleibt wie bisher
    1230                 :            :         }
    1231         [ +  + ]:     641379 :         else if (eScannedType != eNewType)
    1232                 :            :         {
    1233   [ +  -  +  -  :     213254 :             switch (eScannedType)
             +  +  +  + ]
    1234                 :            :             {
    1235                 :            :                 case NUMBERFORMAT_DATE:
    1236                 :            :                 {
    1237      [ +  +  - ]:      36334 :                     switch (eNewType)
    1238                 :            :                     {
    1239                 :            :                         case NUMBERFORMAT_TIME:
    1240                 :       5003 :                             eScannedType = NUMBERFORMAT_DATETIME;
    1241                 :       5003 :                         break;
    1242                 :            :                         case NUMBERFORMAT_FRACTION:         // DD/MM
    1243                 :      31331 :                         break;
    1244                 :            :                         default:
    1245                 :            :                         {
    1246         [ #  # ]:          0 :                             if (nCurrPos != STRING_NOTFOUND)
    1247                 :          0 :                                 eScannedType = NUMBERFORMAT_UNDEFINED;
    1248 [ #  # ][ #  # ]:          0 :                             else if ( sStrArray[i] != pFormatter->GetDateSep() )
    1249                 :          0 :                                 return nPos;
    1250                 :            :                         }
    1251                 :            :                     }
    1252                 :            :                 }
    1253                 :      36334 :                 break;
    1254                 :            :                 case NUMBERFORMAT_TIME:
    1255                 :            :                 {
    1256      [ #  #  # ]:          0 :                     switch (eNewType)
    1257                 :            :                     {
    1258                 :            :                         case NUMBERFORMAT_DATE:
    1259                 :          0 :                             eScannedType = NUMBERFORMAT_DATETIME;
    1260                 :          0 :                         break;
    1261                 :            :                         case NUMBERFORMAT_FRACTION:         // MM/SS
    1262                 :          0 :                         break;
    1263                 :            :                         default:
    1264                 :            :                         {
    1265         [ #  # ]:          0 :                             if (nCurrPos != STRING_NOTFOUND)
    1266                 :          0 :                                 eScannedType = NUMBERFORMAT_UNDEFINED;
    1267 [ #  # ][ #  # ]:          0 :                             else if (!pLoc->getTimeSep().equals(sStrArray[i]))
                 [ #  # ]
    1268                 :          0 :                                 return nPos;
    1269                 :            :                         }
    1270                 :            :                     }
    1271                 :            :                 }
    1272                 :          0 :                 break;
    1273                 :            :                 case NUMBERFORMAT_DATETIME:
    1274                 :            :                 {
    1275      [ +  -  - ]:       9868 :                     switch (eNewType)
    1276                 :            :                     {
    1277                 :            :                         case NUMBERFORMAT_TIME:
    1278                 :            :                         case NUMBERFORMAT_DATE:
    1279                 :       9868 :                         break;
    1280                 :            :                         case NUMBERFORMAT_FRACTION:         // DD/MM
    1281                 :          0 :                         break;
    1282                 :            :                         default:
    1283                 :            :                         {
    1284         [ #  # ]:          0 :                             if (nCurrPos != STRING_NOTFOUND)
    1285                 :          0 :                                 eScannedType = NUMBERFORMAT_UNDEFINED;
    1286         [ #  # ]:          0 :                             else if ( pFormatter->GetDateSep() != sStrArray[i]
           [ #  #  #  # ]
                 [ #  # ]
    1287 [ #  # ][ #  # ]:          0 :                                    && !pLoc->getTimeSep().equals(sStrArray[i]) )
         [ #  # ][ #  # ]
    1288                 :          0 :                                 return nPos;
    1289                 :            :                         }
    1290                 :            :                     }
    1291                 :            :                 }
    1292                 :       9868 :                 break;
    1293                 :            :                 case NUMBERFORMAT_PERCENT:
    1294                 :            :                 {
    1295         [ #  # ]:          0 :                     switch (eNewType)
    1296                 :            :                     {
    1297                 :            :                         case NUMBERFORMAT_NUMBER:   // nur Zahl nach Prozent
    1298                 :          0 :                         break;
    1299                 :            :                         default:
    1300                 :          0 :                             return nPos;
    1301                 :            :                     }
    1302                 :            :                 }
    1303                 :          0 :                 break;
    1304                 :            :                 case NUMBERFORMAT_SCIENTIFIC:
    1305                 :            :                 {
    1306         [ +  - ]:      12314 :                     switch (eNewType)
    1307                 :            :                     {
    1308                 :            :                         case NUMBERFORMAT_NUMBER:   // nur Zahl nach E
    1309                 :      12314 :                         break;
    1310                 :            :                         default:
    1311                 :          0 :                             return nPos;
    1312                 :            :                     }
    1313                 :            :                 }
    1314                 :      12314 :                 break;
    1315                 :            :                 case NUMBERFORMAT_NUMBER:
    1316                 :            :                 {
    1317         [ +  - ]:      22693 :                     switch (eNewType)
    1318                 :            :                     {
    1319                 :            :                         case NUMBERFORMAT_SCIENTIFIC:
    1320                 :            :                         case NUMBERFORMAT_PERCENT:
    1321                 :            :                         case NUMBERFORMAT_FRACTION:
    1322                 :            :                         case NUMBERFORMAT_CURRENCY:
    1323                 :      22693 :                             eScannedType = eNewType;
    1324                 :      22693 :                         break;
    1325                 :            :                         default:
    1326         [ #  # ]:          0 :                             if (nCurrPos != STRING_NOTFOUND)
    1327                 :          0 :                                 eScannedType = NUMBERFORMAT_UNDEFINED;
    1328                 :            :                             else
    1329                 :          0 :                                 return nPos;
    1330                 :            :                     }
    1331                 :            :                 }
    1332                 :      22693 :                 break;
    1333                 :            :                 case NUMBERFORMAT_FRACTION:
    1334                 :            :                 {
    1335         [ +  - ]:      12215 :                     switch (eNewType)
    1336                 :            :                     {
    1337                 :            :                         case NUMBERFORMAT_NUMBER:           // nur Zahl nach Bruch
    1338                 :      12215 :                         break;
    1339                 :            :                         default:
    1340                 :          0 :                             return nPos;
    1341                 :            :                     }
    1342                 :            :                 }
    1343                 :      12215 :                 break;
    1344                 :            :                 default:
    1345                 :     213254 :                 break;
    1346                 :            :             }
    1347                 :            :         }
    1348                 :    1213148 :         nPos = nPos + sStrArray[i].Len();           // Korrekturposition
    1349                 :    1213148 :         i++;
    1350         [ +  + ]:    1213148 :         if ( bMatchBracket )
    1351                 :            :         {   // no type detection inside of matching brackets if [$...], [~...]
    1352 [ +  + ][ +  - ]:     358990 :             while ( bMatchBracket && i < nAnzStrings )
                 [ +  + ]
    1353                 :            :             {
    1354   [ +  +  +  + ]:     408693 :                 if ( nTypeArray[i] == NF_SYMBOLTYPE_DEL
                 [ +  + ]
    1355                 :      94618 :                         && sStrArray[i].GetChar(0) == ']' )
    1356                 :      44915 :                     bMatchBracket = false;
    1357                 :            :                 else
    1358                 :     269160 :                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1359                 :     314075 :                 nPos = nPos + sStrArray[i].Len();
    1360                 :     314075 :                 i++;
    1361                 :            :             }
    1362         [ -  + ]:      44915 :             if ( bMatchBracket )
    1363                 :          0 :                 return nPos;    // missing closing bracket at end of code
    1364                 :            :         }
    1365                 :    1213148 :         SkipStrings(i, nPos);
    1366                 :            :     }
    1367                 :            : 
    1368 [ +  + ][ +  + ]:     199160 :     if ((eScannedType == NUMBERFORMAT_NUMBER || eScannedType == NUMBERFORMAT_UNDEFINED)
         [ +  + ][ +  - ]
    1369                 :      24896 :          && nCurrPos != STRING_NOTFOUND && !bHaveGeneral)
    1370                 :      24896 :         eScannedType = NUMBERFORMAT_CURRENCY;   // old "automatic" currency
    1371         [ +  + ]:     199160 :     if (eScannedType == NUMBERFORMAT_UNDEFINED)
    1372                 :        190 :         eScannedType = NUMBERFORMAT_DEFINED;
    1373                 :     199160 :     return 0;                               // Alles ok
    1374                 :            : }
    1375                 :            : 
    1376                 :      70947 : bool ImpSvNumberformatScan::InsertSymbol( sal_uInt16 & nPos, svt::NfSymbolType eType, const String& rStr )
    1377                 :            : {
    1378 [ +  - ][ -  + ]:      70947 :     if (nAnzStrings >= NF_MAX_FORMAT_SYMBOLS || nPos > nAnzStrings)
    1379                 :          0 :         return false;
    1380 [ +  - ][ +  - ]:      70947 :     if (nPos > 0 && nTypeArray[nPos-1] == NF_SYMBOLTYPE_EMPTY)
    1381                 :      70947 :         --nPos;     // reuse position
    1382                 :            :     else
    1383                 :            :     {
    1384         [ #  # ]:          0 :         if ((size_t) (nAnzStrings + 1) >= NF_MAX_FORMAT_SYMBOLS)
    1385                 :          0 :             return false;
    1386                 :          0 :         ++nAnzStrings;
    1387         [ #  # ]:          0 :         for (size_t i = nAnzStrings; i > nPos; --i)
    1388                 :            :         {
    1389                 :          0 :             nTypeArray[i] = nTypeArray[i-1];
    1390                 :          0 :             sStrArray[i] = sStrArray[i-1];
    1391                 :            :         }
    1392                 :            :     }
    1393                 :      70947 :     ++nAnzResStrings;
    1394                 :      70947 :     nTypeArray[nPos] = static_cast<short>(eType);
    1395                 :      70947 :     sStrArray[nPos] = rStr;
    1396                 :      70947 :     return true;
    1397                 :            : }
    1398                 :            : 
    1399                 :     176156 : int ImpSvNumberformatScan::FinalScanGetCalendar( xub_StrLen& nPos, sal_uInt16& i,
    1400                 :            :             sal_uInt16& rAnzResStrings )
    1401                 :            : {
    1402 [ +  + ][ +  - ]:     195556 :     if ( sStrArray[i].GetChar(0) == '[' &&
           [ +  -  +  - ]
                 [ +  + ]
    1403                 :            :             i < nAnzStrings-1 &&
    1404                 :      19400 :             nTypeArray[i+1] == NF_SYMBOLTYPE_STRING &&
    1405                 :      19400 :             sStrArray[i+1].GetChar(0) == '~' )
    1406                 :            :     {   // [~calendarID]
    1407                 :            :         // as of SV_NUMBERFORMATTER_VERSION_CALENDAR
    1408                 :      19400 :         nPos = nPos + sStrArray[i].Len();           // [
    1409                 :      19400 :         nTypeArray[i] = NF_SYMBOLTYPE_CALDEL;
    1410                 :      19400 :         nPos = nPos + sStrArray[++i].Len();     // ~
    1411                 :      19400 :         sStrArray[i-1] += sStrArray[i];     // [~
    1412                 :      19400 :         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1413                 :      19400 :         rAnzResStrings--;
    1414         [ -  + ]:      19400 :         if ( ++i >= nAnzStrings )
    1415                 :          0 :             return -1;      // error
    1416                 :      19400 :         nPos = nPos + sStrArray[i].Len();           // calendarID
    1417                 :      19400 :         String& rStr = sStrArray[i];
    1418                 :      19400 :         nTypeArray[i] = NF_SYMBOLTYPE_CALENDAR; // convert
    1419                 :      19400 :         i++;
    1420   [ +  -  +  + ]:     194000 :         while ( i < nAnzStrings &&
                 [ +  + ]
    1421                 :      97000 :                 sStrArray[i].GetChar(0) != ']' )
    1422                 :            :         {
    1423                 :      77600 :             nPos = nPos + sStrArray[i].Len();
    1424                 :      77600 :             rStr += sStrArray[i];
    1425                 :      77600 :             nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1426                 :      77600 :             rAnzResStrings--;
    1427                 :      77600 :             i++;
    1428                 :            :         }
    1429         [ +  - ]:      38800 :         if ( rStr.Len() && i < nAnzStrings &&
           [ +  -  +  - ]
                 [ +  - ]
    1430                 :      19400 :                 sStrArray[i].GetChar(0) == ']' )
    1431                 :            :         {
    1432                 :      19400 :             nTypeArray[i] = NF_SYMBOLTYPE_CALDEL;
    1433                 :      19400 :             nPos = nPos + sStrArray[i].Len();
    1434                 :      19400 :             i++;
    1435                 :            :         }
    1436                 :            :         else
    1437                 :          0 :             return -1;      // error
    1438                 :      19400 :         return 1;
    1439                 :            :     }
    1440                 :     176156 :     return 0;
    1441                 :            : }
    1442                 :            : 
    1443                 :     199160 : xub_StrLen ImpSvNumberformatScan::FinalScan( String& rString )
    1444                 :            : {
    1445                 :     199160 :     const LocaleDataWrapper* pLoc = pFormatter->GetLocaleData();
    1446                 :            : 
    1447                 :            :     // save values for convert mode
    1448         [ +  - ]:     199160 :     String sOldDecSep       = pFormatter->GetNumDecimalSep();
    1449         [ +  - ]:     199160 :     String sOldThousandSep  = pFormatter->GetNumThousandSep();
    1450         [ +  - ]:     199160 :     String sOldDateSep      = pFormatter->GetDateSep();
    1451 [ +  - ][ +  - ]:     199160 :     String sOldTimeSep      = pLoc->getTimeSep();
    1452 [ +  - ][ +  - ]:     199160 :     String sOldTime100SecSep= pLoc->getTime100SecSep();
    1453 [ +  - ][ +  - ]:     199160 :     String sOldCurSymbol    = GetCurSymbol();
    1454 [ +  - ][ +  - ]:     199160 :     rtl::OUString sOldCurString = GetCurString();
    1455         [ +  - ]:     199160 :     sal_Unicode cOldKeyH    = sKeyword[NF_KEY_H].GetChar(0);
    1456         [ +  - ]:     199160 :     sal_Unicode cOldKeyMI   = sKeyword[NF_KEY_MI].GetChar(0);
    1457         [ +  - ]:     199160 :     sal_Unicode cOldKeyS    = sKeyword[NF_KEY_S].GetChar(0);
    1458                 :            : 
    1459                 :            :     // If the group separator is a Non-Breaking Space (French) continue with a
    1460                 :            :     // normal space instead so queries on space work correctly.
    1461                 :            :     // The format string is adjusted to allow both.
    1462                 :            :     // For output of the format code string the LocaleData characters are used.
    1463 [ +  - ][ +  + ]:     199160 :     if ( sOldThousandSep.GetChar(0) == cNonBreakingSpace && sOldThousandSep.Len() == 1 )
                 [ +  + ]
    1464         [ +  - ]:        201 :         sOldThousandSep = ' ';
    1465                 :            : 
    1466                 :            :     // change locale data et al
    1467         [ +  + ]:     199160 :     if (bConvertMode)
    1468                 :            :     {
    1469         [ +  - ]:       4885 :         pFormatter->ChangeIntl(eNewLnge);
    1470                 :            :         //! pointer may have changed
    1471                 :       4885 :         pLoc = pFormatter->GetLocaleData();
    1472                 :            :         //! init new keywords
    1473         [ +  - ]:       4885 :         InitKeywords();
    1474                 :            :     }
    1475                 :     199160 :     const CharClass* pChrCls = pFormatter->GetCharClass();
    1476                 :            : 
    1477                 :     199160 :     xub_StrLen nPos = 0;                    // error correction position
    1478                 :     199160 :     sal_uInt16 i = 0;                           // symbol loop counter
    1479                 :     199160 :     sal_uInt16 nCounter = 0;                    // counts digits
    1480                 :     199160 :     nAnzResStrings = nAnzStrings;           // counts remaining symbols
    1481                 :     199160 :     bDecSep = false;                        // reset in case already used in TypeCheck
    1482                 :     199160 :     bool bThaiT = false;                    // Thai T NatNum modifier present
    1483                 :            : 
    1484   [ +  +  +  +  :     199160 :     switch (eScannedType)
                   +  - ]
    1485                 :            :     {
    1486                 :            :         case NUMBERFORMAT_TEXT:
    1487                 :            :         case NUMBERFORMAT_DEFINED:
    1488                 :            :         {
    1489         [ +  + ]:       6643 :             while (i < nAnzStrings)
    1490                 :            :             {
    1491      [ +  -  + ]:       3756 :                 switch (nTypeArray[i])
    1492                 :            :                 {
    1493                 :            :                     case NF_SYMBOLTYPE_BLANK:
    1494                 :            :                     case NF_SYMBOLTYPE_STAR:
    1495                 :        789 :                     break;
    1496                 :            :                     case NF_KEY_GENERAL :   // #77026# "General" is the same as "@"
    1497                 :          0 :                     break;
    1498                 :            :                     default:
    1499                 :            :                     {
    1500   [ +  +  +  + ]:       5688 :                         if ( nTypeArray[i] != NF_SYMBOLTYPE_DEL ||
                 [ +  + ]
    1501                 :       2721 :                                 sStrArray[i].GetChar(0) != '@' )
    1502                 :        270 :                             nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1503                 :            :                     }
    1504                 :       2967 :                     break;
    1505                 :            :                 }
    1506                 :       3756 :                 nPos = nPos + sStrArray[i].Len();
    1507                 :       3756 :                 i++;
    1508                 :            :             }                                       // of while
    1509                 :            :         }
    1510                 :       2887 :         break;
    1511                 :            :         case NUMBERFORMAT_NUMBER:
    1512                 :            :         case NUMBERFORMAT_PERCENT:
    1513                 :            :         case NUMBERFORMAT_CURRENCY:
    1514                 :            :         case NUMBERFORMAT_SCIENTIFIC:
    1515                 :            :         case NUMBERFORMAT_FRACTION:
    1516                 :            :         {
    1517         [ +  + ]:     610175 :             while (i < nAnzStrings)
    1518                 :            :             {
    1519                 :            :                 // TODO: rechecking eScannedType is unnecessary.
    1520                 :            :                 // This switch-case is for eScannedType == NUMBERFORMAT_FRACTION anyway
    1521 [ +  + ][ +  +  :     555491 :                 if (eScannedType == NUMBERFORMAT_FRACTION &&    // special case
             +  +  +  + ]
           [ +  -  +  - ]
                 [ +  + ]
    1522                 :      58617 :                     nTypeArray[i] == NF_SYMBOLTYPE_DEL &&           // # ### #/#
    1523                 :      43974 :                     StringEqualsChar( sOldThousandSep, ' ' ) && // e.g. France or Sweden
    1524                 :         54 :                     StringEqualsChar( sStrArray[i], ' ' ) &&
    1525                 :         12 :                     !bFrac                          &&
    1526                 :         12 :                     IsLastBlankBeforeFrac(i) )
    1527                 :            :                 {
    1528                 :         12 :                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;           // del->string
    1529                 :            :                 }                                               // kein Taus.p.
    1530                 :            : 
    1531 [ +  + ][ +  + ]:     511451 :                 if (nTypeArray[i] == NF_SYMBOLTYPE_BLANK    ||
         [ +  + ][ +  + ]
    1532                 :     505174 :                     nTypeArray[i] == NF_SYMBOLTYPE_STAR ||
    1533                 :     504614 :                     nTypeArray[i] == NF_KEY_CCC         ||  // CCC
    1534                 :     502174 :                     nTypeArray[i] == NF_KEY_GENERAL )       // Standard
    1535                 :            :                 {
    1536         [ +  + ]:      11758 :                     if (nTypeArray[i] == NF_KEY_GENERAL)
    1537                 :            :                     {
    1538                 :       2481 :                         nThousand = FLAG_STANDARD_IN_FORMAT;
    1539         [ +  + ]:       2481 :                         if ( bConvertMode )
    1540         [ +  - ]:         39 :                             sStrArray[i] = sNameStandardFormat;
    1541                 :            :                     }
    1542                 :      11758 :                     nPos = nPos + sStrArray[i].Len();
    1543                 :      11758 :                     i++;
    1544                 :            :                 }
    1545 [ +  + ][ +  + ]:     499693 :                 else if (nTypeArray[i] == NF_SYMBOLTYPE_STRING ||  // Strings oder
    1546                 :     448144 :                          nTypeArray[i] > 0)                     // Keywords
    1547                 :            :                 {
    1548 [ +  + ][ +  - ]:      56525 :                     if (eScannedType == NUMBERFORMAT_SCIENTIFIC &&
    1549                 :       4976 :                              nTypeArray[i] == NF_KEY_E)         // E+
    1550                 :            :                     {
    1551         [ -  + ]:       4976 :                         if (bExp)                               // doppelt
    1552                 :          0 :                             return nPos;
    1553                 :       4976 :                         bExp = true;
    1554                 :       4976 :                         nExpPos = i;
    1555         [ +  - ]:       4976 :                         if (bDecSep)
    1556                 :       4976 :                             nCntPost = nCounter;
    1557                 :            :                         else
    1558                 :          0 :                             nCntPre = nCounter;
    1559                 :       4976 :                         nCounter = 0;
    1560                 :       4976 :                         nTypeArray[i] = NF_SYMBOLTYPE_EXP;
    1561                 :            :                     }
    1562   [ +  +  +  + ]:      66204 :                     else if (eScannedType == NUMBERFORMAT_FRACTION &&
                 [ +  + ]
    1563                 :      14655 :                              sStrArray[i].GetChar(0) == ' ')
    1564                 :            :                     {
    1565 [ +  + ][ +  - ]:       9769 :                         if (!bBlank && !bFrac)  // nicht doppelt oder hinter /
    1566                 :            :                         {
    1567 [ -  + ][ #  # ]:         12 :                             if (bDecSep && nCounter > 0)    // Nachkommastellen
    1568                 :          0 :                                 return nPos;                // Fehler
    1569                 :         12 :                             bBlank = true;
    1570                 :         12 :                             nBlankPos = i;
    1571                 :         12 :                             nCntPre = nCounter;
    1572                 :         12 :                             nCounter = 0;
    1573                 :            :                         }
    1574                 :       9769 :                         nTypeArray[i] = NF_SYMBOLTYPE_FRACBLANK;
    1575                 :            :                     }
    1576         [ -  + ]:      41780 :                     else if (nTypeArray[i] == NF_KEY_THAI_T)
    1577                 :            :                     {
    1578                 :          0 :                         bThaiT = true;
    1579 [ #  # ][ #  # ]:          0 :                         sStrArray[i] = sKeyword[nTypeArray[i]];
    1580                 :            :                     }
    1581   [ +  +  +  + ]:      47389 :                     else if (sStrArray[i].GetChar(0) >= '0' &&
                 [ +  + ]
    1582                 :       5609 :                              sStrArray[i].GetChar(0) <= '9')
    1583                 :            :                     {
    1584                 :       4883 :                         rtl::OUString sDiv;
    1585                 :       4883 :                         sal_uInt16 j = i;
    1586         [ +  + ]:      14649 :                         while(j < nAnzStrings)
    1587         [ +  - ]:       9766 :                             sDiv += sStrArray[j++];
    1588         [ +  - ]:       4883 :                         if (rtl::OUString::valueOf(sDiv.toInt32()) == sDiv)
    1589                 :            :                         {
    1590                 :            :                             /* Found a Divisor */
    1591         [ +  + ]:      14649 :                             while (i < j)
    1592                 :       9766 :                                 nTypeArray[i++] = NF_SYMBOLTYPE_FRAC_FDIV;
    1593                 :       4883 :                             i = j - 1;                            // Stop the loop
    1594         [ +  - ]:       4883 :                             if (nCntPost)
    1595                 :       4883 :                                 nCounter = nCntPost;
    1596         [ #  # ]:          0 :                             else if (nCntPre)
    1597                 :          0 :                                 nCounter = nCntPre;
    1598         [ +  + ]:       4883 :                             if (!nCntPre)
    1599                 :          3 :                                 nCntPre++;
    1600                 :       4883 :                         }
    1601                 :            :                     }
    1602                 :            :                     else
    1603                 :      36897 :                         nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1604                 :      56525 :                     nPos = nPos + sStrArray[i].Len();
    1605                 :      56525 :                     i++;
    1606                 :            :                 }
    1607         [ +  - ]:     443168 :                 else if (nTypeArray[i] == NF_SYMBOLTYPE_DEL)
    1608                 :            :                 {
    1609                 :     443168 :                     sal_Unicode cHere = sStrArray[i].GetChar(0);
    1610                 :            :                     // Handle not pre-known separators in switch.
    1611                 :            :                     sal_Unicode cSimplified;
    1612         [ +  + ]:     443168 :                     if (StringEqualsChar( pFormatter->GetNumThousandSep(), cHere))
    1613                 :      70875 :                         cSimplified = ',';
    1614         [ +  + ]:     372293 :                     else if (StringEqualsChar( pFormatter->GetNumDecimalSep(), cHere))
    1615                 :      53448 :                         cSimplified = '.';
    1616                 :            :                     else
    1617                 :     318845 :                         cSimplified = cHere;
    1618   [ +  +  +  +  :     443168 :                     switch ( cSimplified )
                   +  + ]
    1619                 :            :                     {
    1620                 :            :                         case '#':
    1621                 :            :                         case '0':
    1622                 :            :                         case '?':
    1623                 :            :                         {
    1624         [ -  + ]:     230515 :                             if (nThousand > 0)                  // #... #
    1625                 :          0 :                                 return nPos;                    // Fehler
    1626 [ +  + ][ -  + ]:     230515 :                             else if (bFrac && cHere == '0')
    1627                 :          0 :                                 return nPos;                    // 0 im Nenner
    1628                 :     230515 :                             nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
    1629                 :     230515 :                             String& rStr = sStrArray[i];
    1630                 :     230515 :                             nPos = nPos + rStr.Len();
    1631                 :     230515 :                             i++;
    1632                 :     230515 :                             nCounter++;
    1633   [ +  +  +  +  :    1274538 :                             while (i < nAnzStrings &&
             +  +  +  + ]
                 [ +  + ]
    1634                 :     370024 :                                 (sStrArray[i].GetChar(0) == '#' ||
    1635                 :     296528 :                                     sStrArray[i].GetChar(0) == '0' ||
    1636                 :     175990 :                                     sStrArray[i].GetChar(0) == '?')
    1637                 :            :                                 )
    1638                 :            :                             {
    1639                 :     201481 :                                 nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
    1640                 :     201481 :                                 nPos = nPos + sStrArray[i].Len();
    1641                 :     201481 :                                 nCounter++;
    1642                 :     201481 :                                 i++;
    1643                 :            :                             }
    1644                 :            :                         }
    1645                 :     230515 :                         break;
    1646                 :            :                         case '-':
    1647                 :            :                         {
    1648 [ +  + ][ +  - ]:      34753 :                             if ( bDecSep && nDecPos+1 == i &&
                 [ +  - ]
    1649                 :       9760 :                                     nTypeArray[nDecPos] == NF_SYMBOLTYPE_DECSEP )
    1650                 :            :                             {   // "0.--"
    1651                 :       9760 :                                 nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
    1652                 :       9760 :                                 String& rStr = sStrArray[i];
    1653                 :       9760 :                                 nPos = nPos + rStr.Len();
    1654                 :       9760 :                                 i++;
    1655                 :       9760 :                                 nCounter++;
    1656   [ +  +  +  + ]:      29324 :                                 while (i < nAnzStrings &&
                 [ +  + ]
    1657                 :       9804 :                                         (sStrArray[i].GetChar(0) == '-') )
    1658                 :            :                                 {
    1659                 :            :                                     // If more than two dashes are present in
    1660                 :            :                                     // currency formats the last dash will be
    1661                 :            :                                     // interpreted literally as a minus sign.
    1662                 :            :                                     // Has to be this ugly. Period.
    1663   [ +  -  -  + ]:      19520 :                                     if ( eScannedType == NUMBERFORMAT_CURRENCY
           [ #  #  #  # ]
                 [ -  + ]
    1664                 :       9760 :                                             && rStr.Len() >= 2 &&
    1665                 :            :                                             (i == nAnzStrings-1 ||
    1666                 :          0 :                                             sStrArray[i+1].GetChar(0) != '-') )
    1667                 :          0 :                                         break;
    1668         [ +  - ]:       9760 :                                     rStr += sStrArray[i];
    1669                 :       9760 :                                     nPos = nPos + sStrArray[i].Len();
    1670                 :       9760 :                                     nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1671                 :       9760 :                                     nAnzResStrings--;
    1672                 :       9760 :                                     nCounter++;
    1673                 :       9760 :                                     i++;
    1674                 :       9760 :                                 }
    1675                 :            :                             }
    1676                 :            :                             else
    1677                 :            :                             {
    1678                 :      24993 :                                 nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1679                 :      24993 :                                 nPos = nPos + sStrArray[i].Len();
    1680                 :      24993 :                                 i++;
    1681                 :            :                             }
    1682                 :            :                         }
    1683                 :      34753 :                         break;
    1684                 :            :                         case '.':
    1685                 :            :                         case ',':
    1686                 :            :                         case '\'':
    1687                 :            :                         case ' ':
    1688                 :            :                         {
    1689                 :     137721 :                             sal_Unicode cSep = cHere;   // remember
    1690         [ +  + ]:     137721 :                             if ( StringEqualsChar( sOldThousandSep, cSep ) )
    1691                 :            :                             {
    1692                 :            :                                 // previous char with skip empty
    1693                 :      71010 :                                 sal_Unicode cPre = PreviousChar(i);
    1694                 :            :                                 sal_Unicode cNext;
    1695 [ +  - ][ -  + ]:      71010 :                                 if (bExp || bBlank || bFrac)
                 [ +  - ]
    1696                 :            :                                 {   // after E, / or ' '
    1697         [ #  # ]:          0 :                                     if ( !StringEqualsChar( sOldThousandSep, ' ' ) )
    1698                 :            :                                     {
    1699                 :          0 :                                         nPos = nPos + sStrArray[i].Len();
    1700                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1701                 :          0 :                                         nAnzResStrings--;
    1702                 :          0 :                                         i++;                // eat it
    1703                 :            :                                     }
    1704                 :            :                                     else
    1705                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1706                 :            :                                 }
    1707 [ +  - ][ +  - ]:      71010 :                                 else if (i > 0 && i < nAnzStrings-1   &&
         [ +  + ][ +  + ]
         [ +  + ][ -  + ]
                 [ +  + ]
    1708                 :            :                                     (cPre == '#' || cPre == '0')      &&
    1709                 :      70998 :                                     ((cNext = NextChar(i)) == '#' || cNext == '0')
    1710                 :            :                                     )                   // #,#
    1711                 :            :                                 {
    1712                 :      70947 :                                     nPos = nPos + sStrArray[i].Len();
    1713         [ +  - ]:      70947 :                                     if (!bThousand)                 // only once
    1714                 :      70947 :                                         bThousand = true;
    1715                 :            :                                     // Eat it, will be reinserted at proper
    1716                 :            :                                     // grouping positions further down.
    1717                 :      70947 :                                     nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1718                 :      70947 :                                     nAnzResStrings--;
    1719                 :      70947 :                                     i++;
    1720                 :            :                                 }
    1721 [ +  - ][ +  - ]:        114 :                                 else if (i > 0 && (cPre == '#' || cPre == '0')
           [ +  +  +  - ]
         [ +  - ][ +  + ]
    1722                 :         51 :                                     && PreviousType(i) == NF_SYMBOLTYPE_DIGIT
    1723                 :            :                                     && nThousand < FLAG_STANDARD_IN_FORMAT )
    1724                 :            :                                 {                                   // #,,,,
    1725         [ +  - ]:         51 :                                     if ( StringEqualsChar( sOldThousandSep, ' ' ) )
    1726                 :            :                                     {   // strange, those French..
    1727                 :         51 :                                         bool bFirst = true;
    1728                 :         51 :                                         String& rStr = sStrArray[i];
    1729                 :            :                                         //  set a hard Non-Breaking Space or ConvertMode
    1730                 :         51 :                                         const String& rSepF = pFormatter->GetNumThousandSep();
    1731         [ +  - ]:        153 :                                         while ( i < nAnzStrings
           [ +  -  -  + ]
                 [ -  + ]
    1732         [ +  - ]:         51 :                                             && sStrArray[i] == sOldThousandSep
    1733                 :         51 :                                             && StringEqualsChar( sOldThousandSep, NextChar(i) ) )
    1734                 :            :                                         {   // last was a space or another space
    1735                 :            :                                             // is following => separator
    1736                 :          0 :                                             nPos = nPos + sStrArray[i].Len();
    1737         [ #  # ]:          0 :                                             if ( bFirst )
    1738                 :            :                                             {
    1739                 :          0 :                                                 bFirst = false;
    1740         [ #  # ]:          0 :                                                 rStr = rSepF;
    1741                 :          0 :                                                 nTypeArray[i] = NF_SYMBOLTYPE_THSEP;
    1742                 :            :                                             }
    1743                 :            :                                             else
    1744                 :            :                                             {
    1745         [ #  # ]:          0 :                                                 rStr += rSepF;
    1746                 :          0 :                                                 nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1747                 :          0 :                                                 nAnzResStrings--;
    1748                 :            :                                             }
    1749                 :          0 :                                             nThousand++;
    1750                 :          0 :                                             i++;
    1751                 :            :                                         }
    1752 [ +  - ][ +  - ]:        102 :                                         if ( i < nAnzStrings-1
                 [ +  - ]
    1753         [ +  - ]:         51 :                                             && sStrArray[i] == sOldThousandSep )
    1754                 :            :                                         {   // something following last space
    1755                 :            :                                             // => space if currency contained,
    1756                 :            :                                             // else separator
    1757                 :         51 :                                             nPos = nPos + sStrArray[i].Len();
    1758 [ +  + ][ +  -  :        150 :                                             if ( (nPos <= nCurrPos &&
             +  -  +  - ]
                 [ +  - ]
           [ +  -  +  + ]
    1759                 :         51 :                                                     nCurrPos < nPos + sStrArray[i+1].Len())
    1760                 :         27 :                                                 || nTypeArray[i+1] == NF_KEY_CCC
    1761                 :            :                                                 || (i < nAnzStrings-2 &&
    1762                 :         24 :                                                 sStrArray[i+1].GetChar(0) == '[' &&
    1763                 :         24 :                                                 sStrArray[i+2].GetChar(0) == '$') )
    1764                 :            :                                             {
    1765                 :         51 :                                                 nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1766                 :            :                                             }
    1767                 :            :                                             else
    1768                 :            :                                             {
    1769         [ #  # ]:          0 :                                                 if ( bFirst )
    1770                 :            :                                                 {
    1771                 :          0 :                                                     bFirst = false;
    1772         [ #  # ]:          0 :                                                     rStr = rSepF;
    1773                 :          0 :                                                     nTypeArray[i] = NF_SYMBOLTYPE_THSEP;
    1774                 :            :                                                 }
    1775                 :            :                                                 else
    1776                 :            :                                                 {
    1777         [ #  # ]:          0 :                                                     rStr += rSepF;
    1778                 :          0 :                                                     nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1779                 :          0 :                                                     nAnzResStrings--;
    1780                 :            :                                                 }
    1781                 :          0 :                                                 nThousand++;
    1782                 :            :                                             }
    1783                 :         51 :                                             i++;
    1784                 :            :                                         }
    1785                 :            :                                     }
    1786                 :            :                                     else
    1787                 :            :                                     {
    1788 [ #  # ][ #  # ]:          0 :                                         do
                 [ #  # ]
    1789                 :            :                                         {
    1790                 :          0 :                                             nThousand++;
    1791                 :          0 :                                             nTypeArray[i] = NF_SYMBOLTYPE_THSEP;
    1792                 :          0 :                                             nPos = nPos + sStrArray[i].Len();
    1793         [ #  # ]:          0 :                                             sStrArray[i] = pFormatter->GetNumThousandSep();
    1794                 :          0 :                                             i++;
    1795                 :            :                                         } while (i < nAnzStrings &&
    1796         [ #  # ]:          0 :                                                 sStrArray[i] == sOldThousandSep);
    1797                 :            :                                     }
    1798                 :            :                                 }
    1799                 :            :                                 else                    // any grsep
    1800                 :            :                                 {
    1801                 :         12 :                                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1802                 :         12 :                                     String& rStr = sStrArray[i];
    1803                 :         12 :                                     nPos = nPos + rStr.Len();
    1804                 :         12 :                                     i++;
    1805 [ +  - ][ -  + ]:      71022 :                                     while ( i < nAnzStrings &&
                 [ -  + ]
    1806         [ +  - ]:         12 :                                         sStrArray[i] == sOldThousandSep )
    1807                 :            :                                     {
    1808         [ #  # ]:          0 :                                         rStr += sStrArray[i];
    1809                 :          0 :                                         nPos = nPos + sStrArray[i].Len();
    1810                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1811                 :          0 :                                         nAnzResStrings--;
    1812                 :          0 :                                         i++;
    1813                 :            :                                     }
    1814                 :            :                                 }
    1815                 :            :                             }
    1816         [ +  + ]:      66711 :                             else if ( StringEqualsChar( sOldDecSep, cSep ) )
    1817                 :            :                             {
    1818 [ +  - ][ -  + ]:      53448 :                                 if (bBlank || bFrac)    // . behind / or ' '
    1819                 :          0 :                                     return nPos;        // error
    1820         [ -  + ]:      53448 :                                 else if (bExp)          // behind E
    1821                 :            :                                 {
    1822                 :          0 :                                     nPos = nPos + sStrArray[i].Len();
    1823                 :          0 :                                     nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1824                 :          0 :                                     nAnzResStrings--;
    1825                 :          0 :                                     i++;                // eat it
    1826                 :            :                                 }
    1827         [ -  + ]:      53448 :                                 else if (bDecSep)       // any .
    1828                 :            :                                 {
    1829                 :          0 :                                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1830                 :          0 :                                     String& rStr = sStrArray[i];
    1831                 :          0 :                                     nPos = nPos + rStr.Len();
    1832                 :          0 :                                     i++;
    1833 [ #  # ][ #  # ]:          0 :                                     while ( i < nAnzStrings &&
                 [ #  # ]
    1834         [ #  # ]:          0 :                                         sStrArray[i] == sOldDecSep )
    1835                 :            :                                     {
    1836         [ #  # ]:          0 :                                         rStr += sStrArray[i];
    1837                 :          0 :                                         nPos = nPos + sStrArray[i].Len();
    1838                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1839                 :          0 :                                         nAnzResStrings--;
    1840                 :          0 :                                         i++;
    1841                 :            :                                     }
    1842                 :            :                                 }
    1843                 :            :                                 else
    1844                 :            :                                 {
    1845                 :      53448 :                                     nPos = nPos + sStrArray[i].Len();
    1846                 :      53448 :                                     nTypeArray[i] = NF_SYMBOLTYPE_DECSEP;
    1847         [ +  - ]:      53448 :                                     sStrArray[i] = pFormatter->GetNumDecimalSep();
    1848                 :      53448 :                                     bDecSep = true;
    1849                 :      53448 :                                     nDecPos = i;
    1850                 :      53448 :                                     nCntPre = nCounter;
    1851                 :      53448 :                                     nCounter = 0;
    1852                 :            : 
    1853                 :      53448 :                                     i++;
    1854                 :            :                                 }
    1855                 :            :                             }                           // of else = DecSep
    1856                 :            :                             else                        // . without meaning
    1857                 :            :                             {
    1858         [ +  - ]:      23020 :                                 if (cSep == ' ' &&
           [ +  +  +  - ]
                 [ +  + ]
    1859                 :            :                                     eScannedType == NUMBERFORMAT_FRACTION &&
    1860                 :       9757 :                                     StringEqualsChar( sStrArray[i], ' ' ) )
    1861                 :            :                                 {
    1862 [ +  - ][ +  - ]:       9757 :                                     if (!bBlank && !bFrac)  // no dups
    1863                 :            :                                     {                       // or behind /
    1864 [ -  + ][ #  # ]:       9757 :                                         if (bDecSep && nCounter > 0)// dec.
    1865                 :          0 :                                             return nPos;            // error
    1866                 :       9757 :                                         bBlank = true;
    1867                 :       9757 :                                         nBlankPos = i;
    1868                 :       9757 :                                         nCntPre = nCounter;
    1869                 :       9757 :                                         nCounter = 0;
    1870                 :            :                                     }
    1871                 :       9757 :                                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1872                 :       9757 :                                     nPos = nPos + sStrArray[i].Len();
    1873                 :            :                                 }
    1874                 :            :                                 else
    1875                 :            :                                 {
    1876                 :       3506 :                                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1877                 :       3506 :                                     String& rStr = sStrArray[i];
    1878                 :       3506 :                                     nPos = nPos + rStr.Len();
    1879                 :       3506 :                                     i++;
    1880   [ +  +  -  + ]:       6926 :                                     while (i < nAnzStrings &&
                 [ -  + ]
    1881                 :       3420 :                                         StringEqualsChar( sStrArray[i], cSep ) )
    1882                 :            :                                     {
    1883         [ #  # ]:          0 :                                         rStr += sStrArray[i];
    1884                 :          0 :                                         nPos = nPos + sStrArray[i].Len();
    1885                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1886                 :          0 :                                         nAnzResStrings--;
    1887                 :          0 :                                         i++;
    1888                 :            :                                     }
    1889                 :            :                                 }
    1890                 :            :                             }
    1891                 :            :                         }
    1892                 :     137721 :                         break;
    1893                 :            :                         case '/':
    1894                 :            :                         {
    1895         [ +  - ]:       9772 :                             if (eScannedType == NUMBERFORMAT_FRACTION)
    1896                 :            :                             {
    1897 [ +  - ][ -  + ]:       9772 :                                 if ( i == 0 ||
                 [ #  # ]
    1898                 :       9772 :                                         (nTypeArray[i-1] != NF_SYMBOLTYPE_DIGIT &&
    1899                 :          0 :                                          nTypeArray[i-1] != NF_SYMBOLTYPE_EMPTY) )
    1900         [ #  # ]:          0 :                                     return nPos ? nPos : 1; // /? not allowed
    1901 [ -  + ][ #  # ]:       9772 :                                 else if (!bFrac || (bDecSep && nCounter > 0))
                 [ #  # ]
    1902                 :            :                                 {
    1903                 :       9772 :                                     bFrac = true;
    1904                 :       9772 :                                     nCntPost = nCounter;
    1905                 :       9772 :                                     nCounter = 0;
    1906                 :       9772 :                                     nTypeArray[i] = NF_SYMBOLTYPE_FRAC;
    1907                 :       9772 :                                     nPos = nPos + sStrArray[i].Len();
    1908                 :       9772 :                                     i++;
    1909                 :            :                                 }
    1910                 :            :                                 else                // / doppelt od. , imZaehl
    1911                 :          0 :                                     return nPos;    // Fehler
    1912                 :            :                             }
    1913                 :            :                             else
    1914                 :            :                             {
    1915                 :          0 :                                 nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1916                 :          0 :                                 nPos = nPos + sStrArray[i].Len();
    1917                 :          0 :                                 i++;
    1918                 :            :                             }
    1919                 :            :                         }
    1920                 :       9772 :                         break;
    1921                 :            :                         case '[' :
    1922                 :            :                         {
    1923 [ +  - ][ +  - ]:      51030 :                             if ( eScannedType == NUMBERFORMAT_CURRENCY &&
           [ +  -  +  - ]
                 [ +  - ]
    1924                 :            :                                     i < nAnzStrings-1 &&
    1925                 :      25515 :                                     nTypeArray[i+1] == NF_SYMBOLTYPE_STRING &&
    1926                 :      25515 :                                     sStrArray[i+1].GetChar(0) == '$' )
    1927                 :            :                             {   // [$DM-xxx]
    1928                 :            :                                 // ab SV_NUMBERFORMATTER_VERSION_NEW_CURR
    1929                 :      25515 :                                 nPos = nPos + sStrArray[i].Len();           // [
    1930                 :      25515 :                                 nTypeArray[i] = NF_SYMBOLTYPE_CURRDEL;
    1931                 :      25515 :                                 nPos = nPos + sStrArray[++i].Len();     // $
    1932         [ +  - ]:      25515 :                                 sStrArray[i-1] += sStrArray[i];     // [$
    1933                 :      25515 :                                 nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1934                 :      25515 :                                 nAnzResStrings--;
    1935         [ -  + ]:      25515 :                                 if ( ++i >= nAnzStrings )
    1936                 :          0 :                                     return nPos;        // Fehler
    1937                 :      25515 :                                 nPos = nPos + sStrArray[i].Len();           // DM
    1938                 :      25515 :                                 String& rStr = sStrArray[i];
    1939                 :      25515 :                                 String* pStr = &sStrArray[i];
    1940                 :      25515 :                                 nTypeArray[i] = NF_SYMBOLTYPE_CURRENCY; // wandeln
    1941                 :      25515 :                                 bool bHadDash = false;
    1942                 :      25515 :                                 i++;
    1943   [ +  -  +  + ]:     254490 :                                 while ( i < nAnzStrings &&
                 [ +  + ]
    1944                 :     127245 :                                         sStrArray[i].GetChar(0) != ']' )
    1945                 :            :                                 {
    1946                 :     101730 :                                     nPos = nPos + sStrArray[i].Len();
    1947         [ +  + ]:     101730 :                                     if ( bHadDash )
    1948                 :            :                                     {
    1949         [ +  - ]:      74538 :                                         *pStr += sStrArray[i];
    1950                 :      74538 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1951                 :      74538 :                                         nAnzResStrings--;
    1952                 :            :                                     }
    1953                 :            :                                     else
    1954                 :            :                                     {
    1955         [ +  + ]:      27192 :                                         if ( sStrArray[i].GetChar(0) == '-' )
    1956                 :            :                                         {
    1957                 :      24850 :                                             bHadDash = true;
    1958                 :      24850 :                                             pStr = &sStrArray[i];
    1959                 :      24850 :                                             nTypeArray[i] = NF_SYMBOLTYPE_CURREXT;
    1960                 :            :                                         }
    1961                 :            :                                         else
    1962                 :            :                                         {
    1963         [ +  - ]:       2342 :                                             *pStr += sStrArray[i];
    1964                 :       2342 :                                             nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    1965                 :       2342 :                                             nAnzResStrings--;
    1966                 :            :                                         }
    1967                 :            :                                     }
    1968                 :     101730 :                                     i++;
    1969                 :            :                                 }
    1970         [ +  - ]:      51030 :                                 if ( rStr.Len() && i < nAnzStrings &&
           [ +  -  +  - ]
                 [ +  - ]
    1971                 :      25515 :                                         sStrArray[i].GetChar(0) == ']' )
    1972                 :            :                                 {
    1973                 :      25515 :                                     nTypeArray[i] = NF_SYMBOLTYPE_CURRDEL;
    1974                 :      25515 :                                     nPos = nPos + sStrArray[i].Len();
    1975                 :      25515 :                                     i++;
    1976                 :            :                                 }
    1977                 :            :                                 else
    1978                 :          0 :                                     return nPos;        // Fehler
    1979                 :            :                             }
    1980                 :            :                             else
    1981                 :            :                             {
    1982                 :          0 :                                 nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1983                 :          0 :                                 nPos = nPos + sStrArray[i].Len();
    1984                 :          0 :                                 i++;
    1985                 :            :                             }
    1986                 :            :                         }
    1987                 :      25515 :                         break;
    1988                 :            :                         default:                    // andere Dels
    1989                 :            :                         {
    1990 [ +  - ][ +  - ]:       4892 :                             if (eScannedType == NUMBERFORMAT_PERCENT &&
    1991                 :            :                                     cHere == '%')
    1992                 :       4892 :                                 nTypeArray[i] = NF_SYMBOLTYPE_PERCENT;
    1993                 :            :                             else
    1994                 :          0 :                                 nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    1995                 :       4892 :                             nPos = nPos + sStrArray[i].Len();
    1996                 :       4892 :                             i++;
    1997                 :            :                         }
    1998                 :     443168 :                         break;
    1999                 :            :                     }                               // of switch (Del)
    2000                 :            :                 }                                   // of else Del
    2001                 :            :                 else
    2002                 :            :                 {
    2003                 :            :                     SAL_WARN( "svl.numbers", "unknown NF_SYMBOLTYPE_..." );
    2004                 :          0 :                     nPos = nPos + sStrArray[i].Len();
    2005                 :          0 :                     i++;
    2006                 :            :                 }
    2007                 :            :             }                                       // of while
    2008         [ +  + ]:      98724 :             if (eScannedType == NUMBERFORMAT_FRACTION)
    2009                 :            :             {
    2010         [ +  - ]:       9772 :                 if (bFrac)
    2011                 :       9772 :                     nCntExp = nCounter;
    2012         [ #  # ]:          0 :                 else if (bBlank)
    2013                 :          0 :                     nCntPost = nCounter;
    2014                 :            :                 else
    2015                 :          0 :                     nCntPre = nCounter;
    2016                 :            :             }
    2017                 :            :             else
    2018                 :            :             {
    2019         [ +  + ]:      88952 :                 if (bExp)
    2020                 :       4976 :                     nCntExp = nCounter;
    2021         [ +  + ]:      83976 :                 else if (bDecSep)
    2022                 :      48472 :                     nCntPost = nCounter;
    2023                 :            :                 else
    2024                 :      35504 :                     nCntPre = nCounter;
    2025                 :            :             }
    2026         [ +  + ]:      98724 :             if (bThousand)                          // Expansion of grouping separators
    2027                 :            :             {
    2028                 :            :                 sal_uInt16 nMaxPos;
    2029         [ -  + ]:      70947 :                 if (bFrac)
    2030                 :            :                 {
    2031         [ #  # ]:          0 :                     if (bBlank)
    2032                 :          0 :                         nMaxPos = nBlankPos;
    2033                 :            :                     else
    2034                 :          0 :                         nMaxPos = 0;                // no grouping
    2035                 :            :                 }
    2036         [ +  + ]:      70947 :                 else if (bDecSep)                   // decimal separator present
    2037                 :      43087 :                     nMaxPos = nDecPos;
    2038         [ -  + ]:      27860 :                 else if (bExp)                      // 'E' exponent present
    2039                 :          0 :                     nMaxPos = nExpPos;
    2040                 :            :                 else                                // up to end
    2041                 :      27860 :                     nMaxPos = i;
    2042                 :            :                 // Insert separators at proper positions.
    2043                 :      70947 :                 xub_StrLen nCount = 0;
    2044 [ +  - ][ +  - ]:      70947 :                 utl::DigitGroupingIterator aGrouping( pLoc->getDigitGrouping());
                 [ +  - ]
    2045                 :      70947 :                 size_t nFirstDigitSymbol = nMaxPos;
    2046                 :      70947 :                 size_t nFirstGroupingSymbol = nMaxPos;
    2047                 :      70947 :                 i = nMaxPos;
    2048         [ +  + ]:     614826 :                 while (i-- > 0)
    2049                 :            :                 {
    2050         [ +  + ]:     543879 :                     if (nTypeArray[i] == NF_SYMBOLTYPE_DIGIT)
    2051                 :            :                     {
    2052                 :     283788 :                         nFirstDigitSymbol = i;
    2053                 :     283788 :                         nCount = nCount + sStrArray[i].Len();   // MSC converts += to int and then warns, so ...
    2054                 :            :                         // Insert separator only if not leftmost symbol.
    2055 [ +  + ][ +  + ]:     283788 :                         if (i > 0 && nCount >= aGrouping.getPos())
                 [ +  + ]
    2056                 :            :                         {
    2057                 :            :                             DBG_ASSERT( sStrArray[i].Len() == 1,
    2058                 :            :                                     "ImpSvNumberformatScan::FinalScan: combined digits in group separator insertion");
    2059         [ -  + ]:      70947 :                             if (!InsertSymbol( i, NF_SYMBOLTYPE_THSEP,
    2060         [ +  - ]:      70947 :                                         pFormatter->GetNumThousandSep()))
    2061                 :            :                                 // nPos isn't correct here, but signals error
    2062                 :          0 :                                 return nPos;
    2063                 :            :                             // i may have been decremented by 1
    2064                 :      70947 :                             nFirstDigitSymbol = i + 1;
    2065                 :      70947 :                             nFirstGroupingSymbol = i;
    2066         [ +  - ]:      70947 :                             aGrouping.advance();
    2067                 :            :                         }
    2068                 :            :                     }
    2069                 :            :                 }
    2070                 :            :                 // Generated something like "string",000; remove separator again.
    2071         [ -  + ]:      70947 :                 if (nFirstGroupingSymbol < nFirstDigitSymbol)
    2072                 :            :                 {
    2073                 :          0 :                     nTypeArray[nFirstGroupingSymbol] = NF_SYMBOLTYPE_EMPTY;
    2074                 :      70947 :                     nAnzResStrings--;
    2075 [ +  - ][ +  - ]:      70947 :                 }
    2076                 :            :             }
    2077                 :            :             // Combine digits into groups to save memory (Info will be copied
    2078                 :            :             // later, taking only non-empty symbols).
    2079         [ +  + ]:     615033 :             for (i = 0; i < nAnzStrings; ++i)
    2080                 :            :             {
    2081         [ +  + ]:     516309 :                 if (nTypeArray[i] == NF_SYMBOLTYPE_DIGIT)
    2082                 :            :                 {
    2083                 :     240275 :                     String& rStr = sStrArray[i];
    2084 [ +  + ][ +  + ]:     441756 :                     while (++i < nAnzStrings &&
                 [ +  + ]
    2085                 :     379784 :                             nTypeArray[i] == NF_SYMBOLTYPE_DIGIT)
    2086                 :            :                     {
    2087         [ +  - ]:     201481 :                         rStr += sStrArray[i];
    2088                 :     201481 :                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2089                 :     201481 :                         nAnzResStrings--;
    2090                 :            :                     }
    2091                 :            :                 }
    2092                 :            :             }
    2093                 :            :         }
    2094                 :      98724 :         break;                                      // of NUMBERFORMAT_NUMBER
    2095                 :            :         case NUMBERFORMAT_DATE:
    2096                 :            :         {
    2097         [ +  + ]:     455824 :             while (i < nAnzStrings)
    2098                 :            :             {
    2099   [ +  +  -  +  :     381399 :                 switch (nTypeArray[i])
                      - ]
    2100                 :            :                 {
    2101                 :            :                     case NF_SYMBOLTYPE_BLANK:
    2102                 :            :                     case NF_SYMBOLTYPE_STAR:
    2103                 :            :                     case NF_SYMBOLTYPE_STRING:
    2104                 :       4897 :                         nPos = nPos + sStrArray[i].Len();
    2105                 :       4897 :                         i++;
    2106                 :       4897 :                     break;
    2107                 :            :                     case NF_SYMBOLTYPE_DEL:
    2108                 :            :                     {
    2109                 :            :                         int nCalRet;
    2110 [ +  - ][ +  + ]:     172911 :                         if (sStrArray[i] == sOldDateSep)
    2111                 :            :                         {
    2112                 :      21597 :                             nTypeArray[i] = NF_SYMBOLTYPE_DATESEP;
    2113                 :      21597 :                             nPos = nPos + sStrArray[i].Len();
    2114         [ +  + ]:      21597 :                             if (bConvertMode)
    2115         [ +  - ]:       1890 :                                 sStrArray[i] = pFormatter->GetDateSep();
    2116                 :      21597 :                             i++;
    2117                 :            :                         }
    2118 [ +  - ][ +  + ]:     151314 :                         else if ( (nCalRet = FinalScanGetCalendar( nPos, i, nAnzResStrings )) != 0 )
    2119                 :            :                         {
    2120         [ -  + ]:      19400 :                             if ( nCalRet < 0  )
    2121                 :          0 :                                 return nPos;        // error
    2122                 :            :                         }
    2123                 :            :                         else
    2124                 :            :                         {
    2125                 :     131914 :                             nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2126                 :     131914 :                             nPos = nPos + sStrArray[i].Len();
    2127                 :     131914 :                             i++;
    2128                 :            :                         }
    2129                 :            :                     }
    2130                 :     172911 :                     break;
    2131                 :            :                     case NF_KEY_THAI_T :
    2132                 :          0 :                         bThaiT = true;
    2133                 :            :                         // fall thru
    2134                 :            :                     case NF_KEY_M:                          // M
    2135                 :            :                     case NF_KEY_MM:                         // MM
    2136                 :            :                     case NF_KEY_MMM:                        // MMM
    2137                 :            :                     case NF_KEY_MMMM:                       // MMMM
    2138                 :            :                     case NF_KEY_MMMMM:                      // MMMMM
    2139                 :            :                     case NF_KEY_Q:                          // Q
    2140                 :            :                     case NF_KEY_QQ:                         // QQ
    2141                 :            :                     case NF_KEY_D:                          // D
    2142                 :            :                     case NF_KEY_DD:                         // DD
    2143                 :            :                     case NF_KEY_DDD:                        // DDD
    2144                 :            :                     case NF_KEY_DDDD:                       // DDDD
    2145                 :            :                     case NF_KEY_YY:                         // YY
    2146                 :            :                     case NF_KEY_YYYY:                       // YYYY
    2147                 :            :                     case NF_KEY_NN:                         // NN
    2148                 :            :                     case NF_KEY_NNN:                        // NNN
    2149                 :            :                     case NF_KEY_NNNN:                       // NNNN
    2150                 :            :                     case NF_KEY_WW :                        // WW
    2151                 :            :                     case NF_KEY_AAA :                       // AAA
    2152                 :            :                     case NF_KEY_AAAA :                      // AAAA
    2153                 :            :                     case NF_KEY_EC :                        // E
    2154                 :            :                     case NF_KEY_EEC :                       // EE
    2155                 :            :                     case NF_KEY_G :                         // G
    2156                 :            :                     case NF_KEY_GG :                        // GG
    2157                 :            :                     case NF_KEY_GGG :                       // GGG
    2158                 :            :                     case NF_KEY_R :                         // R
    2159                 :            :                     case NF_KEY_RR :                        // RR
    2160 [ +  - ][ +  - ]:     203591 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2161                 :     203591 :                         nPos = nPos + sStrArray[i].Len();
    2162                 :     203591 :                         i++;
    2163                 :     203591 :                     break;
    2164                 :            :                     default:                            // andere Keywords
    2165                 :          0 :                         nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2166                 :          0 :                         nPos = nPos + sStrArray[i].Len();
    2167                 :          0 :                         i++;
    2168                 :          0 :                     break;
    2169                 :            :                 }
    2170                 :            :             }                                       // of while
    2171                 :            :         }
    2172                 :      74425 :         break;                                      // of NUMBERFORMAT_DATE
    2173                 :            :         case NUMBERFORMAT_TIME:
    2174                 :            :         {
    2175         [ +  + ]:     123268 :             while (i < nAnzStrings)
    2176                 :            :             {
    2177   [ -  +  +  +  :     105147 :                 switch (nTypeArray[i])
                -  +  - ]
    2178                 :            :                 {
    2179                 :            :                     case NF_SYMBOLTYPE_BLANK:
    2180                 :            :                     case NF_SYMBOLTYPE_STAR:
    2181                 :            :                     {
    2182                 :          0 :                         nPos = nPos + sStrArray[i].Len();
    2183                 :          0 :                         i++;
    2184                 :            :                     }
    2185                 :          0 :                     break;
    2186                 :            :                     case NF_SYMBOLTYPE_DEL:
    2187                 :            :                     {
    2188   [ +  -  +  +  :      53587 :                         switch( sStrArray[i].GetChar(0) )
                      + ]
    2189                 :            :                         {
    2190                 :            :                             case '0':
    2191                 :            :                             {
    2192         [ +  - ]:       5040 :                                 if ( Is100SecZero( i, bDecSep ) )
    2193                 :            :                                 {
    2194                 :       5040 :                                     bDecSep = true;
    2195                 :       5040 :                                     nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
    2196                 :       5040 :                                     String& rStr = sStrArray[i];
    2197                 :       5040 :                                     i++;
    2198                 :       5040 :                                     nPos = nPos + sStrArray[i].Len();
    2199                 :       5040 :                                     nCounter++;
    2200   [ +  +  +  - ]:      14800 :                                     while (i < nAnzStrings &&
                 [ +  + ]
    2201                 :       4880 :                                            sStrArray[i].GetChar(0) == '0')
    2202                 :            :                                     {
    2203         [ +  - ]:       4880 :                                         rStr += sStrArray[i];
    2204                 :       4880 :                                         nPos = nPos + sStrArray[i].Len();
    2205                 :       4880 :                                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2206                 :       4880 :                                         nAnzResStrings--;
    2207                 :       4880 :                                         nCounter++;
    2208                 :       4880 :                                         i++;
    2209                 :            :                                     }
    2210                 :            :                                 }
    2211                 :            :                                 else
    2212                 :          0 :                                     return nPos;
    2213                 :            :                             }
    2214                 :       5040 :                             break;
    2215                 :            :                             case '#':
    2216                 :            :                             case '?':
    2217                 :          0 :                                 return nPos;
    2218                 :            :                             case '[':
    2219                 :            :                             {
    2220         [ -  + ]:       5040 :                                 if (bThousand)              // doppelt
    2221                 :          0 :                                     return nPos;
    2222                 :       5040 :                                 bThousand = true;           // bei Time frei
    2223         [ +  - ]:       5040 :                                 sal_Unicode cChar = pChrCls->uppercase(rtl::OUString(NextChar(i)))[0];
    2224         [ +  - ]:       5040 :                                 if ( cChar == cOldKeyH )
    2225                 :       5040 :                                     nThousand = 1;      // H
    2226         [ #  # ]:          0 :                                 else if ( cChar == cOldKeyMI )
    2227                 :          0 :                                     nThousand = 2;      // M
    2228         [ #  # ]:          0 :                                 else if ( cChar == cOldKeyS )
    2229                 :          0 :                                     nThousand = 3;      // S
    2230                 :            :                                 else
    2231                 :          0 :                                     return nPos;
    2232                 :       5040 :                                 nPos = nPos + sStrArray[i].Len();
    2233                 :       5040 :                                 i++;
    2234                 :            :                             }
    2235                 :       5040 :                             break;
    2236                 :            :                             case ']':
    2237                 :            :                             {
    2238         [ -  + ]:       5040 :                                 if (!bThousand)             // kein [ vorher
    2239                 :          0 :                                     return nPos;
    2240                 :       5040 :                                 nPos = nPos + sStrArray[i].Len();
    2241                 :       5040 :                                 i++;
    2242                 :            :                             }
    2243                 :       5040 :                             break;
    2244                 :            :                             default:
    2245                 :            :                             {
    2246                 :      38467 :                                 nPos = nPos + sStrArray[i].Len();
    2247 [ +  + ][ +  - ]:      38467 :                                 if ( sStrArray[i] == sOldTimeSep )
    2248                 :            :                                 {
    2249                 :      28427 :                                     nTypeArray[i] = NF_SYMBOLTYPE_TIMESEP;
    2250         [ +  + ]:      28427 :                                     if ( bConvertMode )
    2251 [ +  - ][ +  - ]:       1507 :                                         sStrArray[i] = pLoc->getTimeSep();
    2252                 :            :                                 }
    2253 [ +  - ][ +  + ]:      10040 :                                 else if ( sStrArray[i] == sOldTime100SecSep )
    2254                 :            :                                 {
    2255                 :       5040 :                                     bDecSep = true;
    2256                 :       5040 :                                     nTypeArray[i] = NF_SYMBOLTYPE_TIME100SECSEP;
    2257         [ +  + ]:       5040 :                                     if ( bConvertMode )
    2258 [ +  - ][ +  - ]:        152 :                                         sStrArray[i] = pLoc->getTime100SecSep();
    2259                 :            :                                 }
    2260                 :            :                                 else
    2261                 :       5000 :                                     nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2262                 :      38467 :                                 i++;
    2263                 :            :                             }
    2264                 :      38467 :                             break;
    2265                 :            :                         }
    2266                 :            :                     }
    2267                 :      53587 :                     break;
    2268                 :            :                     case NF_SYMBOLTYPE_STRING:
    2269                 :            :                     {
    2270                 :          6 :                         nPos = nPos + sStrArray[i].Len();
    2271                 :          6 :                         i++;
    2272                 :            :                     }
    2273                 :          6 :                     break;
    2274                 :            :                     case NF_KEY_AMPM:                       // AM/PM
    2275                 :            :                     case NF_KEY_AP:                         // A/P
    2276                 :            :                     {
    2277                 :       5006 :                         bExp = true;                    // missbraucht fuer A/P
    2278 [ +  - ][ +  - ]:       5006 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2279                 :       5006 :                         nPos = nPos + sStrArray[i].Len();
    2280                 :       5006 :                         i++;
    2281                 :            :                     }
    2282                 :       5006 :                     break;
    2283                 :            :                     case NF_KEY_THAI_T :
    2284                 :          0 :                         bThaiT = true;
    2285                 :            :                         // fall thru
    2286                 :            :                     case NF_KEY_MI:                         // M
    2287                 :            :                     case NF_KEY_MMI:                        // MM
    2288                 :            :                     case NF_KEY_H:                          // H
    2289                 :            :                     case NF_KEY_HH:                         // HH
    2290                 :            :                     case NF_KEY_S:                          // S
    2291                 :            :                     case NF_KEY_SS:                         // SS
    2292                 :            :                     {
    2293 [ +  - ][ +  - ]:      46548 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2294                 :      46548 :                         nPos = nPos + sStrArray[i].Len();
    2295                 :      46548 :                         i++;
    2296                 :            :                     }
    2297                 :      46548 :                     break;
    2298                 :            :                     default:                            // andere Keywords
    2299                 :            :                     {
    2300                 :          0 :                         nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2301                 :          0 :                         nPos = nPos + sStrArray[i].Len();
    2302                 :          0 :                         i++;
    2303                 :            :                     }
    2304                 :          0 :                     break;
    2305                 :            :                 }
    2306                 :            :             }                                       // of while
    2307                 :      18121 :             nCntPost = nCounter;                    // Zaehler der Nullen
    2308         [ +  + ]:      18121 :             if (bExp)
    2309                 :       5006 :                 nCntExp = 1;                        // merkt AM/PM
    2310                 :            :         }
    2311                 :      18121 :         break;                                      // of NUMBERFORMAT_TIME
    2312                 :            :         case NUMBERFORMAT_DATETIME:
    2313                 :            :         {
    2314                 :       5003 :             bool bTimePart = false;
    2315         [ +  + ]:      59736 :             while (i < nAnzStrings)
    2316                 :            :             {
    2317   [ +  +  +  +  :      54733 :                 switch (nTypeArray[i])
                +  -  - ]
    2318                 :            :                 {
    2319                 :            :                     case NF_SYMBOLTYPE_BLANK:
    2320                 :            :                     case NF_SYMBOLTYPE_STAR:
    2321                 :            :                     case NF_SYMBOLTYPE_STRING:
    2322                 :         27 :                         nPos = nPos + sStrArray[i].Len();
    2323                 :         27 :                         i++;
    2324                 :         27 :                     break;
    2325                 :            :                     case NF_SYMBOLTYPE_DEL:
    2326                 :            :                     {
    2327                 :            :                         int nCalRet;
    2328 [ +  - ][ -  + ]:      24842 :                         if ( (nCalRet = FinalScanGetCalendar( nPos, i, nAnzResStrings )) != 0 )
    2329                 :            :                         {
    2330         [ #  # ]:          0 :                             if ( nCalRet < 0  )
    2331                 :          0 :                                 return nPos;        // error
    2332                 :            :                         }
    2333                 :            :                         else
    2334                 :            :                         {
    2335      [ -  -  + ]:      24842 :                             switch( sStrArray[i].GetChar(0) )
    2336                 :            :                             {
    2337                 :            :                                 case '0':
    2338                 :            :                                 {
    2339 [ #  # ][ #  # ]:          0 :                                     if ( bTimePart && Is100SecZero( i, bDecSep ) )
                 [ #  # ]
    2340                 :            :                                     {
    2341                 :          0 :                                         bDecSep = true;
    2342                 :          0 :                                         nTypeArray[i] = NF_SYMBOLTYPE_DIGIT;
    2343                 :          0 :                                         String& rStr = sStrArray[i];
    2344                 :          0 :                                         i++;
    2345                 :          0 :                                         nPos = nPos + sStrArray[i].Len();
    2346                 :          0 :                                         nCounter++;
    2347   [ #  #  #  # ]:          0 :                                         while (i < nAnzStrings &&
                 [ #  # ]
    2348                 :          0 :                                             sStrArray[i].GetChar(0) == '0')
    2349                 :            :                                         {
    2350         [ #  # ]:          0 :                                             rStr += sStrArray[i];
    2351                 :          0 :                                             nPos = nPos + sStrArray[i].Len();
    2352                 :          0 :                                             nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2353                 :          0 :                                             nAnzResStrings--;
    2354                 :          0 :                                             nCounter++;
    2355                 :          0 :                                             i++;
    2356                 :            :                                         }
    2357                 :            :                                     }
    2358                 :            :                                     else
    2359                 :          0 :                                         return nPos;
    2360                 :            :                                 }
    2361                 :          0 :                                 break;
    2362                 :            :                                 case '#':
    2363                 :            :                                 case '?':
    2364                 :          0 :                                     return nPos;
    2365                 :            :                                 default:
    2366                 :            :                                 {
    2367                 :      24842 :                                     nPos = nPos + sStrArray[i].Len();
    2368         [ +  + ]:      24842 :                                     if (bTimePart)
    2369                 :            :                                     {
    2370 [ +  - ][ +  + ]:       9860 :                                         if ( sStrArray[i] == sOldTimeSep )
    2371                 :            :                                         {
    2372                 :       7435 :                                             nTypeArray[i] = NF_SYMBOLTYPE_TIMESEP;
    2373         [ +  + ]:       7435 :                                             if ( bConvertMode )
    2374 [ +  - ][ +  - ]:        107 :                                                 sStrArray[i] = pLoc->getTimeSep();
    2375                 :            :                                         }
    2376 [ +  - ][ -  + ]:       2425 :                                         else if ( sStrArray[i] == sOldTime100SecSep )
    2377                 :            :                                         {
    2378                 :          0 :                                             bDecSep = true;
    2379                 :          0 :                                             nTypeArray[i] = NF_SYMBOLTYPE_TIME100SECSEP;
    2380         [ #  # ]:          0 :                                             if ( bConvertMode )
    2381 [ #  # ][ #  # ]:          0 :                                                 sStrArray[i] = pLoc->getTime100SecSep();
    2382                 :            :                                         }
    2383                 :            :                                         else
    2384                 :       2425 :                                             nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2385                 :            :                                     }
    2386                 :            :                                     else
    2387                 :            :                                     {
    2388 [ +  - ][ +  + ]:      14982 :                                         if ( sStrArray[i] == sOldDateSep )
    2389                 :            :                                         {
    2390                 :       9990 :                                             nTypeArray[i] = NF_SYMBOLTYPE_DATESEP;
    2391         [ +  + ]:       9990 :                                             if (bConvertMode)
    2392         [ +  - ]:        214 :                                                 sStrArray[i] = pFormatter->GetDateSep();
    2393                 :            :                                         }
    2394                 :            :                                         else
    2395                 :       4992 :                                             nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2396                 :            :                                     }
    2397                 :      24842 :                                     i++;
    2398                 :            :                                 }
    2399                 :            :                             }
    2400                 :            :                         }
    2401                 :            :                     }
    2402                 :      24842 :                     break;
    2403                 :            :                     case NF_KEY_AMPM:                       // AM/PM
    2404                 :            :                     case NF_KEY_AP:                         // A/P
    2405                 :            :                     {
    2406                 :       2425 :                         bTimePart = true;
    2407                 :       2425 :                         bExp = true;                    // missbraucht fuer A/P
    2408 [ +  - ][ +  - ]:       2425 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2409                 :       2425 :                         nPos = nPos + sStrArray[i].Len();
    2410                 :       2425 :                         i++;
    2411                 :            :                     }
    2412                 :       2425 :                     break;
    2413                 :            :                     case NF_KEY_MI:                         // M
    2414                 :            :                     case NF_KEY_MMI:                        // MM
    2415                 :            :                     case NF_KEY_H:                          // H
    2416                 :            :                     case NF_KEY_HH:                         // HH
    2417                 :            :                     case NF_KEY_S:                          // S
    2418                 :            :                     case NF_KEY_SS:                         // SS
    2419                 :      12446 :                         bTimePart = true;
    2420 [ +  - ][ +  - ]:      12446 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2421                 :      12446 :                         nPos = nPos + sStrArray[i].Len();
    2422                 :      12446 :                         i++;
    2423                 :      12446 :                     break;
    2424                 :            :                     case NF_KEY_M:                          // M
    2425                 :            :                     case NF_KEY_MM:                         // MM
    2426                 :            :                     case NF_KEY_MMM:                        // MMM
    2427                 :            :                     case NF_KEY_MMMM:                       // MMMM
    2428                 :            :                     case NF_KEY_MMMMM:                      // MMMMM
    2429                 :            :                     case NF_KEY_Q:                          // Q
    2430                 :            :                     case NF_KEY_QQ:                         // QQ
    2431                 :            :                     case NF_KEY_D:                          // D
    2432                 :            :                     case NF_KEY_DD:                         // DD
    2433                 :            :                     case NF_KEY_DDD:                        // DDD
    2434                 :            :                     case NF_KEY_DDDD:                       // DDDD
    2435                 :            :                     case NF_KEY_YY:                         // YY
    2436                 :            :                     case NF_KEY_YYYY:                       // YYYY
    2437                 :            :                     case NF_KEY_NN:                         // NN
    2438                 :            :                     case NF_KEY_NNN:                        // NNN
    2439                 :            :                     case NF_KEY_NNNN:                       // NNNN
    2440                 :            :                     case NF_KEY_WW :                        // WW
    2441                 :            :                     case NF_KEY_AAA :                       // AAA
    2442                 :            :                     case NF_KEY_AAAA :                      // AAAA
    2443                 :            :                     case NF_KEY_EC :                        // E
    2444                 :            :                     case NF_KEY_EEC :                       // EE
    2445                 :            :                     case NF_KEY_G :                         // G
    2446                 :            :                     case NF_KEY_GG :                        // GG
    2447                 :            :                     case NF_KEY_GGG :                       // GGG
    2448                 :            :                     case NF_KEY_R :                         // R
    2449                 :            :                     case NF_KEY_RR :                        // RR
    2450                 :      14993 :                         bTimePart = false;
    2451 [ +  - ][ +  - ]:      14993 :                         sStrArray[i] = sKeyword[nTypeArray[i]]; // tTtT -> TTTT
    2452                 :      14993 :                         nPos = nPos + sStrArray[i].Len();
    2453                 :      14993 :                         i++;
    2454                 :      14993 :                     break;
    2455                 :            :                     case NF_KEY_THAI_T :
    2456                 :          0 :                         bThaiT = true;
    2457 [ #  # ][ #  # ]:          0 :                         sStrArray[i] = sKeyword[nTypeArray[i]];
    2458                 :          0 :                         nPos = nPos + sStrArray[i].Len();
    2459                 :          0 :                         i++;
    2460                 :          0 :                     break;
    2461                 :            :                     default:                            // andere Keywords
    2462                 :          0 :                         nTypeArray[i] = NF_SYMBOLTYPE_STRING;
    2463                 :          0 :                         nPos = nPos + sStrArray[i].Len();
    2464                 :          0 :                         i++;
    2465                 :          0 :                     break;
    2466                 :            :                 }
    2467                 :            :             }                                       // of while
    2468                 :       5003 :             nCntPost = nCounter;                    // decimals (100th seconds)
    2469         [ +  + ]:       5003 :             if (bExp)
    2470                 :       2425 :                 nCntExp = 1;                        // merkt AM/PM
    2471                 :            :         }
    2472                 :       5003 :         break;                                      // of NUMBERFORMAT_DATETIME
    2473                 :            :         default:
    2474                 :          0 :         break;
    2475                 :            :     }
    2476 [ +  + ][ +  - ]:     199160 :     if (eScannedType == NUMBERFORMAT_SCIENTIFIC &&
                 [ -  + ]
    2477                 :            :         (nCntPre + nCntPost == 0 || nCntExp == 0))
    2478                 :          0 :         return nPos;
    2479 [ +  + ][ +  - ]:     199160 :     else if (eScannedType == NUMBERFORMAT_FRACTION && (nCntExp > 8 || nCntExp == 0))
                 [ -  + ]
    2480                 :          0 :         return nPos;
    2481                 :            : 
    2482 [ -  + ][ #  # ]:     199160 :     if (bThaiT && !GetNatNumModifier())
                 [ -  + ]
    2483                 :          0 :         SetNatNumModifier(1);
    2484                 :            : 
    2485         [ +  + ]:     199160 :     if ( bConvertMode )
    2486                 :            :     {   // strings containing keywords of the target locale must be quoted, so
    2487                 :            :         // the user sees the difference and is able to edit the format string
    2488         [ +  + ]:      35829 :         for ( i=0; i < nAnzStrings; i++ )
    2489                 :            :         {
    2490   [ +  +  +  + ]:      34432 :             if ( nTypeArray[i] == NF_SYMBOLTYPE_STRING &&
                 [ +  + ]
    2491                 :       3488 :                     sStrArray[i].GetChar(0) != '\"' )
    2492                 :            :             {
    2493 [ -  + ][ #  # ]:       2716 :                 if ( bConvertSystemToSystem && eScannedType == NUMBERFORMAT_CURRENCY )
    2494                 :            :                 {   // don't stringize automatic currency, will be converted
    2495 [ #  # ][ #  # ]:          0 :                     if ( sStrArray[i] == sOldCurSymbol )
    2496                 :          0 :                         continue;   // for
    2497                 :            :                     // DM might be splitted into D and M
    2498   [ #  #  #  # ]:          0 :                     if ( sStrArray[i].Len() < sOldCurSymbol.Len() &&
                 [ #  # ]
    2499 [ #  # ][ #  # ]:          0 :                             pChrCls->uppercase( sStrArray[i], 0, 1 )[0] ==
         [ #  # ][ #  # ]
           [ #  #  #  # ]
    2500                 :          0 :                             sOldCurString[0] )
    2501                 :            :                     {
    2502         [ #  # ]:          0 :                         String aTmp( sStrArray[i] );
    2503                 :          0 :                         sal_uInt16 j = i + 1;
    2504 [ #  # ][ #  # ]:          0 :                         while ( aTmp.Len() < sOldCurSymbol.Len() &&
         [ #  # ][ #  # ]
    2505                 :            :                                 j < nAnzStrings &&
    2506                 :          0 :                                 nTypeArray[j] == NF_SYMBOLTYPE_STRING )
    2507                 :            :                         {
    2508         [ #  # ]:          0 :                             aTmp += sStrArray[j++];
    2509                 :            :                         }
    2510 [ #  # ][ #  # ]:          0 :                         if ( pChrCls->uppercase( aTmp ) == sOldCurString )
                 [ #  # ]
    2511                 :            :                         {
    2512         [ #  # ]:          0 :                             sStrArray[i++] = aTmp;
    2513         [ #  # ]:          0 :                             for ( ; i<j; i++ )
    2514                 :            :                             {
    2515                 :          0 :                                 nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2516                 :          0 :                                 nAnzResStrings--;
    2517                 :            :                             }
    2518                 :          0 :                             i = j - 1;
    2519                 :          0 :                             continue;   // for
    2520 [ #  # ][ #  # ]:          0 :                         }
    2521                 :            :                     }
    2522                 :            :                 }
    2523                 :       2716 :                 String& rStr = sStrArray[i];
    2524                 :       2716 :                 xub_StrLen nLen = rStr.Len();
    2525         [ +  + ]:       6072 :                 for ( xub_StrLen j=0; j<nLen; j++ )
    2526                 :            :                 {
    2527 [ +  + ][ -  + ]:       3356 :                     if ( (j == 0 || rStr.GetChar(j-1) != '\\') && GetKeyWord( rStr, j ) )
         [ +  - ][ -  + ]
                 [ -  + ]
    2528                 :            :                     {
    2529         [ #  # ]:          0 :                         rStr.Insert( '\"', 0 );
    2530         [ #  # ]:          0 :                         rStr += '\"';
    2531                 :          0 :                         break;  // for
    2532                 :            :                     }
    2533                 :            :                 }
    2534                 :            :             }
    2535                 :            :         }
    2536                 :            :     }
    2537                 :            :     // concatenate strings, remove quotes for output, and rebuild the format string
    2538         [ +  - ]:     199160 :     rString.Erase();
    2539                 :     199160 :     i = 0;
    2540         [ +  + ]:    1738868 :     while (i < nAnzStrings)
    2541                 :            :     {
    2542   [ +  +  -  +  :    1539708 :         switch ( nTypeArray[i] )
                      + ]
    2543                 :            :         {
    2544                 :            :             case NF_SYMBOLTYPE_STRING :
    2545                 :            :             {
    2546                 :     172890 :                 xub_StrLen nStringPos = rString.Len();
    2547                 :     172890 :                 xub_StrLen nArrPos = 0;
    2548                 :     172890 :                 sal_uInt16 iPos = i;
    2549 [ +  + ][ +  + ]:     214990 :                 do
                 [ +  + ]
    2550                 :            :                 {
    2551   [ +  +  +  + ]:     218202 :                     if (sStrArray[i].Len() == 2 &&
                 [ +  + ]
    2552                 :       3212 :                             sStrArray[i].GetChar(0) == '\\')
    2553                 :            :                     {
    2554                 :            :                         // Unescape some simple forms of symbols even in the UI
    2555                 :            :                         // visible string to prevent duplicates that differ
    2556                 :            :                         // only in notation, originating from import.
    2557                 :            :                         // e.g. YYYY-MM-DD and YYYY\-MM\-DD are identical,
    2558                 :            :                         // but 0\ 000 0 and 0 000 0 in a French locale are not.
    2559                 :        640 :                         sal_Unicode c = sStrArray[i].GetChar(1);
    2560      [ +  +  + ]:        640 :                         switch (c)
    2561                 :            :                         {
    2562                 :            :                             case '+':
    2563                 :            :                             case '-':
    2564         [ +  - ]:        165 :                                 rString += c;
    2565                 :        165 :                                 break;
    2566                 :            :                             case ' ':
    2567                 :            :                             case '.':
    2568                 :            :                             case '/':
    2569   [ +  +  +  -  :        565 :                                 if (((eScannedType & NUMBERFORMAT_DATE) == 0)
                   +  - ]
           [ +  -  -  + ]
                 [ -  + ]
    2570                 :            :                                         && (StringEqualsChar(
    2571                 :        136 :                                                 pFormatter->GetNumThousandSep(),
    2572                 :        136 :                                                 c) || StringEqualsChar(
    2573                 :        136 :                                                     pFormatter->GetNumDecimalSep(),
    2574                 :        136 :                                                     c) || (c == ' ' &&
    2575                 :            :                                                         StringEqualsChar(
    2576                 :        136 :                                                             pFormatter->GetNumThousandSep(),
    2577                 :        136 :                                                             cNonBreakingSpace))))
    2578         [ #  # ]:          0 :                                     rString += sStrArray[i];
    2579   [ +  +  -  + ]:        178 :                                 else if ((eScannedType & NUMBERFORMAT_DATE) &&
                 [ -  + ]
    2580                 :            :                                         StringEqualsChar(
    2581                 :         21 :                                             pFormatter->GetDateSep(), c))
    2582         [ #  # ]:          0 :                                     rString += sStrArray[i];
    2583   [ +  +  +  -  :        332 :                                 else if ((eScannedType & NUMBERFORMAT_TIME) &&
           -  + ][ -  + ]
    2584         [ +  - ]:          9 :                                         (StringEqualsChar( pLoc->getTimeSep(),
    2585 [ +  - ][ +  + ]:        166 :                                                            c) ||
         [ +  - ][ #  # ]
    2586                 :            :                                          StringEqualsChar(
    2587 [ +  - ][ +  - ]:        166 :                                              pLoc->getTime100SecSep(), c)))
         [ +  + ][ +  - ]
                 [ #  # ]
    2588         [ #  # ]:          0 :                                     rString += sStrArray[i];
    2589         [ +  + ]:        157 :                                 else if (eScannedType & NUMBERFORMAT_FRACTION)
    2590         [ +  - ]:          3 :                                     rString += sStrArray[i];
    2591                 :            :                                 else
    2592         [ +  - ]:        154 :                                     rString += c;
    2593                 :        157 :                                 break;
    2594                 :            :                             default:
    2595         [ +  - ]:        640 :                                 rString += sStrArray[i];
    2596                 :            :                         }
    2597                 :            :                     }
    2598                 :            :                     else
    2599         [ +  - ]:     214350 :                         rString += sStrArray[i];
    2600 [ +  - ][ +  + ]:     214990 :                     if ( RemoveQuotes( sStrArray[i] ) > 0 )
    2601                 :            :                     {   // update currency up to quoted string
    2602         [ +  + ]:       1643 :                         if ( eScannedType == NUMBERFORMAT_CURRENCY )
    2603                 :            :                         {   // dM -> DM  or  DM -> $  in old automatic
    2604                 :            :                             // currency formats, oh my ..., why did we ever
    2605                 :            :                             // introduce them?
    2606                 :            :                             String aTmp( pChrCls->uppercase(
    2607                 :         36 :                                 sStrArray[iPos], nArrPos,
    2608 [ +  - ][ +  - ]:         36 :                                 sStrArray[iPos].Len()-nArrPos ) );
                 [ +  - ]
    2609 [ +  - ][ +  - ]:         36 :                             xub_StrLen nCPos = aTmp.Search( sOldCurString );
                 [ +  - ]
    2610         [ -  + ]:         36 :                             if ( nCPos != STRING_NOTFOUND )
    2611                 :            :                             {
    2612                 :            :                                 const String& rCur =
    2613                 :            :                                     bConvertMode && bConvertSystemToSystem ?
    2614 [ #  # ][ #  # ]:          0 :                                     GetCurSymbol() : sOldCurSymbol;
                 [ #  # ]
    2615                 :          0 :                                 sStrArray[iPos].Replace( nArrPos+nCPos,
    2616         [ #  # ]:          0 :                                     sOldCurString.getLength(), rCur );
    2617                 :            :                                 rString.Replace( nStringPos+nCPos,
    2618         [ #  # ]:          0 :                                     sOldCurString.getLength(), rCur );
    2619                 :            :                             }
    2620                 :         36 :                             nStringPos = rString.Len();
    2621         [ +  - ]:         36 :                             if ( iPos == i )
    2622                 :         36 :                                 nArrPos = sStrArray[iPos].Len();
    2623                 :            :                             else
    2624         [ +  - ]:         36 :                                 nArrPos = sStrArray[iPos].Len() + sStrArray[i].Len();
    2625                 :            :                         }
    2626                 :            :                     }
    2627         [ +  + ]:     214990 :                     if ( iPos != i )
    2628                 :            :                     {
    2629         [ +  - ]:      42100 :                         sStrArray[iPos] += sStrArray[i];
    2630                 :      42100 :                         nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2631                 :      42100 :                         nAnzResStrings--;
    2632                 :            :                     }
    2633                 :     214990 :                     i++;
    2634                 :     206570 :                 } while ( i < nAnzStrings && nTypeArray[i] == NF_SYMBOLTYPE_STRING );
    2635         [ +  + ]:     172890 :                 if ( i < nAnzStrings )
    2636                 :     164470 :                     i--;    // enter switch on next symbol again
    2637 [ +  + ][ +  + ]:     172890 :                 if ( eScannedType == NUMBERFORMAT_CURRENCY && nStringPos < rString.Len() )
                 [ +  + ]
    2638                 :            :                 {   // same as above, since last RemoveQuotes
    2639                 :            :                     String aTmp( pChrCls->uppercase(
    2640                 :      40973 :                         sStrArray[iPos], nArrPos,
    2641 [ +  - ][ +  - ]:      40973 :                         sStrArray[iPos].Len()-nArrPos ) );
                 [ +  - ]
    2642 [ +  - ][ +  - ]:      40973 :                     xub_StrLen nCPos = aTmp.Search( sOldCurString );
                 [ +  - ]
    2643         [ +  + ]:      40973 :                     if ( nCPos != STRING_NOTFOUND )
    2644                 :            :                     {
    2645                 :            :                         const String& rCur =
    2646                 :            :                             bConvertMode && bConvertSystemToSystem ?
    2647 [ +  + ][ -  + ]:      24896 :                             GetCurSymbol() : sOldCurSymbol;
                 [ #  # ]
    2648                 :      24896 :                         sStrArray[iPos].Replace( nArrPos+nCPos,
    2649         [ +  - ]:      24896 :                             sOldCurString.getLength(), rCur );
    2650                 :            :                         rString.Replace( nStringPos+nCPos,
    2651         [ +  - ]:      24896 :                             sOldCurString.getLength(), rCur );
    2652         [ +  - ]:      40973 :                     }
    2653                 :            :                 }
    2654                 :            :             }
    2655                 :     172890 :             break;
    2656                 :            :             case NF_SYMBOLTYPE_CURRENCY :
    2657                 :            :             {
    2658         [ +  - ]:      25515 :                 rString += sStrArray[i];
    2659         [ +  - ]:      25515 :                 RemoveQuotes( sStrArray[i] );
    2660                 :            :             }
    2661                 :      25515 :             break;
    2662                 :            :             case NF_KEY_THAI_T:
    2663 [ #  # ][ #  # ]:          0 :                 if (bThaiT && GetNatNumModifier() == 1)
                 [ #  # ]
    2664                 :            :                 {   // Remove T from format code, will be replaced with a [NatNum1] prefix.
    2665                 :          0 :                     nTypeArray[i] = NF_SYMBOLTYPE_EMPTY;
    2666                 :          0 :                     nAnzResStrings--;
    2667                 :            :                 }
    2668                 :            :                 else
    2669         [ #  # ]:          0 :                     rString += sStrArray[i];
    2670                 :          0 :             break;
    2671                 :            :             case NF_SYMBOLTYPE_EMPTY :
    2672                 :            :                 // nothing
    2673                 :     415516 :             break;
    2674                 :            :             default:
    2675         [ +  - ]:     925787 :                 rString += sStrArray[i];
    2676                 :            :         }
    2677                 :    1539708 :         i++;
    2678                 :            :     }
    2679 [ +  - ][ +  - ]:     199160 :     return 0;
         [ +  - ][ +  - ]
         [ +  - ][ +  - ]
    2680                 :            : }
    2681                 :            : 
    2682                 :     240505 : xub_StrLen ImpSvNumberformatScan::RemoveQuotes( String& rStr )
    2683                 :            : {
    2684         [ +  + ]:     240505 :     if ( rStr.Len() > 1 )
    2685                 :            :     {
    2686                 :       7224 :         sal_Unicode c = rStr.GetChar(0);
    2687                 :            :         xub_StrLen n;
    2688 [ +  - ][ +  + ]:       7224 :         if ( c == '"' && rStr.GetChar( (n = xub_StrLen(rStr.Len()-1)) ) == '"' )
                 [ +  + ]
    2689                 :            :         {
    2690                 :       1003 :             rStr.Erase(n,1);
    2691                 :       1003 :             rStr.Erase(0,1);
    2692                 :       1003 :             return 2;
    2693                 :            :         }
    2694         [ +  + ]:       6221 :         else if ( c == '\\' )
    2695                 :            :         {
    2696                 :        640 :             rStr.Erase(0,1);
    2697                 :        640 :             return 1;
    2698                 :            :         }
    2699                 :            :     }
    2700                 :     240505 :     return 0;
    2701                 :            : }
    2702                 :            : 
    2703                 :     199160 : xub_StrLen ImpSvNumberformatScan::ScanFormat( String& rString )
    2704                 :            : {
    2705                 :     199160 :     xub_StrLen res = Symbol_Division(rString);  //lexikalische Analyse
    2706         [ +  - ]:     199160 :     if (!res)
    2707                 :     199160 :         res = ScanType(); // Erkennung des Formattyps
    2708         [ +  - ]:     199160 :     if (!res)
    2709                 :     199160 :         res = FinalScan( rString );         // Typabhaengige Endanalyse
    2710                 :     199160 :     return res;                             // res = Kontrollposition
    2711                 :            :                                             // res = 0 => Format ok
    2712                 :            : }
    2713                 :            : 
    2714                 :     199160 : void ImpSvNumberformatScan::CopyInfo(ImpSvNumberformatInfo* pInfo, sal_uInt16 nAnz)
    2715                 :            : {
    2716                 :            :     size_t i,j;
    2717                 :     199160 :     j = 0;
    2718                 :     199160 :     i = 0;
    2719 [ +  + ][ +  - ]:    1684185 :     while (i < nAnz && j < NF_MAX_FORMAT_SYMBOLS)
                 [ +  + ]
    2720                 :            :     {
    2721         [ +  + ]:    1485025 :         if (nTypeArray[j] != NF_SYMBOLTYPE_EMPTY)
    2722                 :            :         {
    2723                 :    1124192 :             pInfo->sStrArray[i]  = sStrArray[j];
    2724                 :    1124192 :             pInfo->nTypeArray[i] = nTypeArray[j];
    2725                 :    1124192 :             i++;
    2726                 :            :         }
    2727                 :    1485025 :         j++;
    2728                 :            :     }
    2729                 :     199160 :     pInfo->eScannedType = eScannedType;
    2730                 :     199160 :     pInfo->bThousand    = bThousand;
    2731                 :     199160 :     pInfo->nThousand    = nThousand;
    2732                 :     199160 :     pInfo->nCntPre      = nCntPre;
    2733                 :     199160 :     pInfo->nCntPost     = nCntPost;
    2734                 :     199160 :     pInfo->nCntExp      = nCntExp;
    2735                 :     199160 : }
    2736                 :            : 
    2737                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10