LCOV - code coverage report
Current view: top level - i18npool/source/characterclassification - cclass_unicode_parser.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 261 382 68.3 %
Date: 2012-08-25 Functions: 11 11 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 228 458 49.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 <cclass_unicode.hxx>
      22                 :            : #include <unicode/uchar.h>
      23                 :            : #include <rtl/math.hxx>
      24                 :            : #include <rtl/ustring.hxx>
      25                 :            : #include <com/sun/star/i18n/KParseTokens.hpp>
      26                 :            : #include <com/sun/star/i18n/KParseType.hpp>
      27                 :            : #include <com/sun/star/i18n/UnicodeType.hpp>
      28                 :            : #include <com/sun/star/i18n/XLocaleData.hpp>
      29                 :            : #include <com/sun/star/i18n/NativeNumberMode.hpp>
      30                 :            : 
      31                 :            : #include <string.h>     // memcpy()
      32                 :            : 
      33                 :            : using namespace ::com::sun::star::uno;
      34                 :            : using namespace ::com::sun::star::lang;
      35                 :            : using namespace ::rtl;
      36                 :            : 
      37                 :            : namespace com { namespace sun { namespace star { namespace i18n {
      38                 :            : 
      39                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_ILLEGAL       = 0x00000000;
      40                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR          = 0x00000001;
      41                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_BOOL = 0x00000002;
      42                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_WORD = 0x00000004;
      43                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_VALUE    = 0x00000008;
      44                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_STRING   = 0x00000010;
      45                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_CHAR_DONTCARE= 0x00000020;
      46                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_BOOL          = 0x00000040;
      47                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_WORD          = 0x00000080;
      48                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_WORD_SEP      = 0x00000100;
      49                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE     = 0x00000200;
      50                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_SEP = 0x00000400;
      51                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_EXP = 0x00000800;
      52                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_SIGN    = 0x00001000;
      53                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_EXP_VALUE   = 0x00002000;
      54                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_VALUE_DIGIT   = 0x00004000;
      55                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_NAME_SEP      = 0x20000000;
      56                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_STRING_SEP    = 0x40000000;
      57                 :            : const UPT_FLAG_TYPE cclass_Unicode::TOKEN_EXCLUDED      = 0x80000000;
      58                 :            : 
      59                 :            : #define TOKEN_DIGIT_FLAGS (TOKEN_CHAR_VALUE | TOKEN_VALUE | TOKEN_VALUE_EXP | TOKEN_VALUE_EXP_VALUE | TOKEN_VALUE_DIGIT)
      60                 :            : 
      61                 :            : // Default identifier/name specification is [A-Za-z_][A-Za-z0-9_]*
      62                 :            : 
      63                 :            : const sal_uInt8 cclass_Unicode::nDefCnt = 128;
      64                 :            : const UPT_FLAG_TYPE cclass_Unicode::pDefaultParserTable[ nDefCnt ] =
      65                 :            : {
      66                 :            : // (...) == Calc formula compiler specific, commented out and modified
      67                 :            : 
      68                 :            :     /* \0 */    TOKEN_EXCLUDED,
      69                 :            :                 TOKEN_ILLEGAL,
      70                 :            :                 TOKEN_ILLEGAL,
      71                 :            :                 TOKEN_ILLEGAL,
      72                 :            :                 TOKEN_ILLEGAL,
      73                 :            :                 TOKEN_ILLEGAL,
      74                 :            :                 TOKEN_ILLEGAL,
      75                 :            :                 TOKEN_ILLEGAL,
      76                 :            :                 TOKEN_ILLEGAL,
      77                 :            :     /*  9 \t */ TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,     // (TOKEN_ILLEGAL)
      78                 :            :                 TOKEN_ILLEGAL,
      79                 :            :     /* 11 \v */ TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,     // (TOKEN_ILLEGAL)
      80                 :            :                 TOKEN_ILLEGAL,
      81                 :            :                 TOKEN_ILLEGAL,
      82                 :            :                 TOKEN_ILLEGAL,
      83                 :            :                 TOKEN_ILLEGAL,
      84                 :            :                 TOKEN_ILLEGAL,
      85                 :            :                 TOKEN_ILLEGAL,
      86                 :            :                 TOKEN_ILLEGAL,
      87                 :            :                 TOKEN_ILLEGAL,
      88                 :            :                 TOKEN_ILLEGAL,
      89                 :            :                 TOKEN_ILLEGAL,
      90                 :            :                 TOKEN_ILLEGAL,
      91                 :            :                 TOKEN_ILLEGAL,
      92                 :            :                 TOKEN_ILLEGAL,
      93                 :            :                 TOKEN_ILLEGAL,
      94                 :            :                 TOKEN_ILLEGAL,
      95                 :            :                 TOKEN_ILLEGAL,
      96                 :            :                 TOKEN_ILLEGAL,
      97                 :            :                 TOKEN_ILLEGAL,
      98                 :            :                 TOKEN_ILLEGAL,
      99                 :            :                 TOKEN_ILLEGAL,
     100                 :            :     /*  32   */ TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     101                 :            :     /*  33 ! */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     102                 :            :     /*  34 " */ TOKEN_CHAR_STRING | TOKEN_STRING_SEP,
     103                 :            :     /*  35 # */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_WORD_SEP)
     104                 :            :     /*  36 $ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_CHAR_WORD | TOKEN_WORD)
     105                 :            :     /*  37 % */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_VALUE)
     106                 :            :     /*  38 & */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     107                 :            :     /*  39 ' */ TOKEN_NAME_SEP,
     108                 :            :     /*  40 ( */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     109                 :            :     /*  41 ) */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     110                 :            :     /*  42 * */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     111                 :            :     /*  43 + */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP | TOKEN_VALUE_EXP | TOKEN_VALUE_SIGN,
     112                 :            :     /*  44 , */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_CHAR_VALUE | TOKEN_VALUE)
     113                 :            :     /*  45 - */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP | TOKEN_VALUE_EXP | TOKEN_VALUE_SIGN,
     114                 :            :     /*  46 . */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_WORD | TOKEN_CHAR_VALUE | TOKEN_VALUE)
     115                 :            :     /*  47 / */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     116                 :            :     //for ( i = 48; i < 58; i++ )
     117                 :            :     /*  48 0 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     118                 :            :     /*  49 1 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     119                 :            :     /*  50 2 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     120                 :            :     /*  51 3 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     121                 :            :     /*  52 4 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     122                 :            :     /*  53 5 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     123                 :            :     /*  54 6 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     124                 :            :     /*  55 7 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     125                 :            :     /*  56 8 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     126                 :            :     /*  57 9 */ TOKEN_DIGIT_FLAGS | TOKEN_WORD,
     127                 :            :     /*  58 : */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_WORD)
     128                 :            :     /*  59 ; */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     129                 :            :     /*  60 < */ TOKEN_CHAR_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     130                 :            :     /*  61 = */ TOKEN_CHAR | TOKEN_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     131                 :            :     /*  62 > */ TOKEN_CHAR_BOOL | TOKEN_BOOL | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     132                 :            :     /*  63 ? */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_CHAR_WORD | TOKEN_WORD)
     133                 :            :     /*  64 @ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     134                 :            :     //for ( i = 65; i < 91; i++ )
     135                 :            :     /*  65 A */ TOKEN_CHAR_WORD | TOKEN_WORD,
     136                 :            :     /*  66 B */ TOKEN_CHAR_WORD | TOKEN_WORD,
     137                 :            :     /*  67 C */ TOKEN_CHAR_WORD | TOKEN_WORD,
     138                 :            :     /*  68 D */ TOKEN_CHAR_WORD | TOKEN_WORD,
     139                 :            :     /*  69 E */ TOKEN_CHAR_WORD | TOKEN_WORD,
     140                 :            :     /*  70 F */ TOKEN_CHAR_WORD | TOKEN_WORD,
     141                 :            :     /*  71 G */ TOKEN_CHAR_WORD | TOKEN_WORD,
     142                 :            :     /*  72 H */ TOKEN_CHAR_WORD | TOKEN_WORD,
     143                 :            :     /*  73 I */ TOKEN_CHAR_WORD | TOKEN_WORD,
     144                 :            :     /*  74 J */ TOKEN_CHAR_WORD | TOKEN_WORD,
     145                 :            :     /*  75 K */ TOKEN_CHAR_WORD | TOKEN_WORD,
     146                 :            :     /*  76 L */ TOKEN_CHAR_WORD | TOKEN_WORD,
     147                 :            :     /*  77 M */ TOKEN_CHAR_WORD | TOKEN_WORD,
     148                 :            :     /*  78 N */ TOKEN_CHAR_WORD | TOKEN_WORD,
     149                 :            :     /*  79 O */ TOKEN_CHAR_WORD | TOKEN_WORD,
     150                 :            :     /*  80 P */ TOKEN_CHAR_WORD | TOKEN_WORD,
     151                 :            :     /*  81 Q */ TOKEN_CHAR_WORD | TOKEN_WORD,
     152                 :            :     /*  82 R */ TOKEN_CHAR_WORD | TOKEN_WORD,
     153                 :            :     /*  83 S */ TOKEN_CHAR_WORD | TOKEN_WORD,
     154                 :            :     /*  84 T */ TOKEN_CHAR_WORD | TOKEN_WORD,
     155                 :            :     /*  85 U */ TOKEN_CHAR_WORD | TOKEN_WORD,
     156                 :            :     /*  86 V */ TOKEN_CHAR_WORD | TOKEN_WORD,
     157                 :            :     /*  87 W */ TOKEN_CHAR_WORD | TOKEN_WORD,
     158                 :            :     /*  88 X */ TOKEN_CHAR_WORD | TOKEN_WORD,
     159                 :            :     /*  89 Y */ TOKEN_CHAR_WORD | TOKEN_WORD,
     160                 :            :     /*  90 Z */ TOKEN_CHAR_WORD | TOKEN_WORD,
     161                 :            :     /*  91 [ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     162                 :            :     /*  92 \ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     163                 :            :     /*  93 ] */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     164                 :            :     /*  94 ^ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,
     165                 :            :     /*  95 _ */ TOKEN_CHAR_WORD | TOKEN_WORD,
     166                 :            :     /*  96 ` */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     167                 :            :     //for ( i = 97; i < 123; i++ )
     168                 :            :     /*  97 a */ TOKEN_CHAR_WORD | TOKEN_WORD,
     169                 :            :     /*  98 b */ TOKEN_CHAR_WORD | TOKEN_WORD,
     170                 :            :     /*  99 c */ TOKEN_CHAR_WORD | TOKEN_WORD,
     171                 :            :     /* 100 d */ TOKEN_CHAR_WORD | TOKEN_WORD,
     172                 :            :     /* 101 e */ TOKEN_CHAR_WORD | TOKEN_WORD,
     173                 :            :     /* 102 f */ TOKEN_CHAR_WORD | TOKEN_WORD,
     174                 :            :     /* 103 g */ TOKEN_CHAR_WORD | TOKEN_WORD,
     175                 :            :     /* 104 h */ TOKEN_CHAR_WORD | TOKEN_WORD,
     176                 :            :     /* 105 i */ TOKEN_CHAR_WORD | TOKEN_WORD,
     177                 :            :     /* 106 j */ TOKEN_CHAR_WORD | TOKEN_WORD,
     178                 :            :     /* 107 k */ TOKEN_CHAR_WORD | TOKEN_WORD,
     179                 :            :     /* 108 l */ TOKEN_CHAR_WORD | TOKEN_WORD,
     180                 :            :     /* 109 m */ TOKEN_CHAR_WORD | TOKEN_WORD,
     181                 :            :     /* 110 n */ TOKEN_CHAR_WORD | TOKEN_WORD,
     182                 :            :     /* 111 o */ TOKEN_CHAR_WORD | TOKEN_WORD,
     183                 :            :     /* 112 p */ TOKEN_CHAR_WORD | TOKEN_WORD,
     184                 :            :     /* 113 q */ TOKEN_CHAR_WORD | TOKEN_WORD,
     185                 :            :     /* 114 r */ TOKEN_CHAR_WORD | TOKEN_WORD,
     186                 :            :     /* 115 s */ TOKEN_CHAR_WORD | TOKEN_WORD,
     187                 :            :     /* 116 t */ TOKEN_CHAR_WORD | TOKEN_WORD,
     188                 :            :     /* 117 u */ TOKEN_CHAR_WORD | TOKEN_WORD,
     189                 :            :     /* 118 v */ TOKEN_CHAR_WORD | TOKEN_WORD,
     190                 :            :     /* 119 w */ TOKEN_CHAR_WORD | TOKEN_WORD,
     191                 :            :     /* 120 x */ TOKEN_CHAR_WORD | TOKEN_WORD,
     192                 :            :     /* 121 y */ TOKEN_CHAR_WORD | TOKEN_WORD,
     193                 :            :     /* 122 z */ TOKEN_CHAR_WORD | TOKEN_WORD,
     194                 :            :     /* 123 { */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     195                 :            :     /* 124 | */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     196                 :            :     /* 125 } */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     197                 :            :     /* 126 ~ */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP,  // (TOKEN_ILLEGAL // UNUSED)
     198                 :            :     /* 127   */ TOKEN_CHAR | TOKEN_WORD_SEP | TOKEN_VALUE_SEP   // (TOKEN_ILLEGAL // UNUSED)
     199                 :            : };
     200                 :            : 
     201                 :            : 
     202                 :            : const sal_Int32 cclass_Unicode::pParseTokensType[ nDefCnt ] =
     203                 :            : {
     204                 :            :     /* \0 */    KParseTokens::ASC_OTHER,
     205                 :            :                 KParseTokens::ASC_CONTROL,
     206                 :            :                 KParseTokens::ASC_CONTROL,
     207                 :            :                 KParseTokens::ASC_CONTROL,
     208                 :            :                 KParseTokens::ASC_CONTROL,
     209                 :            :                 KParseTokens::ASC_CONTROL,
     210                 :            :                 KParseTokens::ASC_CONTROL,
     211                 :            :                 KParseTokens::ASC_CONTROL,
     212                 :            :                 KParseTokens::ASC_CONTROL,
     213                 :            :     /*  9 \t */ KParseTokens::ASC_CONTROL,
     214                 :            :                 KParseTokens::ASC_CONTROL,
     215                 :            :     /* 11 \v */ KParseTokens::ASC_CONTROL,
     216                 :            :                 KParseTokens::ASC_CONTROL,
     217                 :            :                 KParseTokens::ASC_CONTROL,
     218                 :            :                 KParseTokens::ASC_CONTROL,
     219                 :            :                 KParseTokens::ASC_CONTROL,
     220                 :            :                 KParseTokens::ASC_CONTROL,
     221                 :            :                 KParseTokens::ASC_CONTROL,
     222                 :            :                 KParseTokens::ASC_CONTROL,
     223                 :            :                 KParseTokens::ASC_CONTROL,
     224                 :            :                 KParseTokens::ASC_CONTROL,
     225                 :            :                 KParseTokens::ASC_CONTROL,
     226                 :            :                 KParseTokens::ASC_CONTROL,
     227                 :            :                 KParseTokens::ASC_CONTROL,
     228                 :            :                 KParseTokens::ASC_CONTROL,
     229                 :            :                 KParseTokens::ASC_CONTROL,
     230                 :            :                 KParseTokens::ASC_CONTROL,
     231                 :            :                 KParseTokens::ASC_CONTROL,
     232                 :            :                 KParseTokens::ASC_CONTROL,
     233                 :            :                 KParseTokens::ASC_CONTROL,
     234                 :            :                 KParseTokens::ASC_CONTROL,
     235                 :            :                 KParseTokens::ASC_CONTROL,
     236                 :            :     /*  32   */ KParseTokens::ASC_OTHER,
     237                 :            :     /*  33 ! */ KParseTokens::ASC_OTHER,
     238                 :            :     /*  34 " */ KParseTokens::ASC_OTHER,
     239                 :            :     /*  35 # */ KParseTokens::ASC_OTHER,
     240                 :            :     /*  36 $ */ KParseTokens::ASC_DOLLAR,
     241                 :            :     /*  37 % */ KParseTokens::ASC_OTHER,
     242                 :            :     /*  38 & */ KParseTokens::ASC_OTHER,
     243                 :            :     /*  39 ' */ KParseTokens::ASC_OTHER,
     244                 :            :     /*  40 ( */ KParseTokens::ASC_OTHER,
     245                 :            :     /*  41 ) */ KParseTokens::ASC_OTHER,
     246                 :            :     /*  42 * */ KParseTokens::ASC_OTHER,
     247                 :            :     /*  43 + */ KParseTokens::ASC_OTHER,
     248                 :            :     /*  44 , */ KParseTokens::ASC_OTHER,
     249                 :            :     /*  45 - */ KParseTokens::ASC_OTHER,
     250                 :            :     /*  46 . */ KParseTokens::ASC_DOT,
     251                 :            :     /*  47 / */ KParseTokens::ASC_OTHER,
     252                 :            :     //for ( i = 48; i < 58; i++ )
     253                 :            :     /*  48 0 */ KParseTokens::ASC_DIGIT,
     254                 :            :     /*  49 1 */ KParseTokens::ASC_DIGIT,
     255                 :            :     /*  50 2 */ KParseTokens::ASC_DIGIT,
     256                 :            :     /*  51 3 */ KParseTokens::ASC_DIGIT,
     257                 :            :     /*  52 4 */ KParseTokens::ASC_DIGIT,
     258                 :            :     /*  53 5 */ KParseTokens::ASC_DIGIT,
     259                 :            :     /*  54 6 */ KParseTokens::ASC_DIGIT,
     260                 :            :     /*  55 7 */ KParseTokens::ASC_DIGIT,
     261                 :            :     /*  56 8 */ KParseTokens::ASC_DIGIT,
     262                 :            :     /*  57 9 */ KParseTokens::ASC_DIGIT,
     263                 :            :     /*  58 : */ KParseTokens::ASC_COLON,
     264                 :            :     /*  59 ; */ KParseTokens::ASC_OTHER,
     265                 :            :     /*  60 < */ KParseTokens::ASC_OTHER,
     266                 :            :     /*  61 = */ KParseTokens::ASC_OTHER,
     267                 :            :     /*  62 > */ KParseTokens::ASC_OTHER,
     268                 :            :     /*  63 ? */ KParseTokens::ASC_OTHER,
     269                 :            :     /*  64 @ */ KParseTokens::ASC_OTHER,
     270                 :            :     //for ( i = 65; i < 91; i++ )
     271                 :            :     /*  65 A */ KParseTokens::ASC_UPALPHA,
     272                 :            :     /*  66 B */ KParseTokens::ASC_UPALPHA,
     273                 :            :     /*  67 C */ KParseTokens::ASC_UPALPHA,
     274                 :            :     /*  68 D */ KParseTokens::ASC_UPALPHA,
     275                 :            :     /*  69 E */ KParseTokens::ASC_UPALPHA,
     276                 :            :     /*  70 F */ KParseTokens::ASC_UPALPHA,
     277                 :            :     /*  71 G */ KParseTokens::ASC_UPALPHA,
     278                 :            :     /*  72 H */ KParseTokens::ASC_UPALPHA,
     279                 :            :     /*  73 I */ KParseTokens::ASC_UPALPHA,
     280                 :            :     /*  74 J */ KParseTokens::ASC_UPALPHA,
     281                 :            :     /*  75 K */ KParseTokens::ASC_UPALPHA,
     282                 :            :     /*  76 L */ KParseTokens::ASC_UPALPHA,
     283                 :            :     /*  77 M */ KParseTokens::ASC_UPALPHA,
     284                 :            :     /*  78 N */ KParseTokens::ASC_UPALPHA,
     285                 :            :     /*  79 O */ KParseTokens::ASC_UPALPHA,
     286                 :            :     /*  80 P */ KParseTokens::ASC_UPALPHA,
     287                 :            :     /*  81 Q */ KParseTokens::ASC_UPALPHA,
     288                 :            :     /*  82 R */ KParseTokens::ASC_UPALPHA,
     289                 :            :     /*  83 S */ KParseTokens::ASC_UPALPHA,
     290                 :            :     /*  84 T */ KParseTokens::ASC_UPALPHA,
     291                 :            :     /*  85 U */ KParseTokens::ASC_UPALPHA,
     292                 :            :     /*  86 V */ KParseTokens::ASC_UPALPHA,
     293                 :            :     /*  87 W */ KParseTokens::ASC_UPALPHA,
     294                 :            :     /*  88 X */ KParseTokens::ASC_UPALPHA,
     295                 :            :     /*  89 Y */ KParseTokens::ASC_UPALPHA,
     296                 :            :     /*  90 Z */ KParseTokens::ASC_UPALPHA,
     297                 :            :     /*  91 [ */ KParseTokens::ASC_OTHER,
     298                 :            :     /*  92 \ */ KParseTokens::ASC_OTHER,
     299                 :            :     /*  93 ] */ KParseTokens::ASC_OTHER,
     300                 :            :     /*  94 ^ */ KParseTokens::ASC_OTHER,
     301                 :            :     /*  95 _ */ KParseTokens::ASC_UNDERSCORE,
     302                 :            :     /*  96 ` */ KParseTokens::ASC_OTHER,
     303                 :            :     //for ( i = 97; i < 123; i++ )
     304                 :            :     /*  97 a */ KParseTokens::ASC_LOALPHA,
     305                 :            :     /*  98 b */ KParseTokens::ASC_LOALPHA,
     306                 :            :     /*  99 c */ KParseTokens::ASC_LOALPHA,
     307                 :            :     /* 100 d */ KParseTokens::ASC_LOALPHA,
     308                 :            :     /* 101 e */ KParseTokens::ASC_LOALPHA,
     309                 :            :     /* 102 f */ KParseTokens::ASC_LOALPHA,
     310                 :            :     /* 103 g */ KParseTokens::ASC_LOALPHA,
     311                 :            :     /* 104 h */ KParseTokens::ASC_LOALPHA,
     312                 :            :     /* 105 i */ KParseTokens::ASC_LOALPHA,
     313                 :            :     /* 106 j */ KParseTokens::ASC_LOALPHA,
     314                 :            :     /* 107 k */ KParseTokens::ASC_LOALPHA,
     315                 :            :     /* 108 l */ KParseTokens::ASC_LOALPHA,
     316                 :            :     /* 109 m */ KParseTokens::ASC_LOALPHA,
     317                 :            :     /* 110 n */ KParseTokens::ASC_LOALPHA,
     318                 :            :     /* 111 o */ KParseTokens::ASC_LOALPHA,
     319                 :            :     /* 112 p */ KParseTokens::ASC_LOALPHA,
     320                 :            :     /* 113 q */ KParseTokens::ASC_LOALPHA,
     321                 :            :     /* 114 r */ KParseTokens::ASC_LOALPHA,
     322                 :            :     /* 115 s */ KParseTokens::ASC_LOALPHA,
     323                 :            :     /* 116 t */ KParseTokens::ASC_LOALPHA,
     324                 :            :     /* 117 u */ KParseTokens::ASC_LOALPHA,
     325                 :            :     /* 118 v */ KParseTokens::ASC_LOALPHA,
     326                 :            :     /* 119 w */ KParseTokens::ASC_LOALPHA,
     327                 :            :     /* 120 x */ KParseTokens::ASC_LOALPHA,
     328                 :            :     /* 121 y */ KParseTokens::ASC_LOALPHA,
     329                 :            :     /* 122 z */ KParseTokens::ASC_LOALPHA,
     330                 :            :     /* 123 { */ KParseTokens::ASC_OTHER,
     331                 :            :     /* 124 | */ KParseTokens::ASC_OTHER,
     332                 :            :     /* 125 } */ KParseTokens::ASC_OTHER,
     333                 :            :     /* 126 ~ */ KParseTokens::ASC_OTHER,
     334                 :            :     /* 127   */ KParseTokens::ASC_OTHER
     335                 :            : };
     336                 :            : 
     337                 :            : 
     338                 :            : // static
     339                 :         45 : const sal_Unicode* cclass_Unicode::StrChr( const sal_Unicode* pStr, sal_Unicode c )
     340                 :            : {
     341         [ -  + ]:         45 :     if ( !pStr )
     342                 :          0 :         return NULL;
     343         [ +  + ]:        135 :     while ( *pStr )
     344                 :            :     {
     345         [ -  + ]:         90 :         if ( *pStr == c )
     346                 :          0 :             return pStr;
     347                 :         90 :         pStr++;
     348                 :            :     }
     349                 :         45 :     return NULL;
     350                 :            : }
     351                 :            : 
     352                 :            : 
     353                 :     211712 : sal_Int32 cclass_Unicode::getParseTokensType( const sal_Unicode* aStr, sal_Int32 nPos )
     354                 :            : {
     355                 :     211712 :     sal_Unicode c = aStr[nPos];
     356         [ +  + ]:     211712 :     if ( c < nDefCnt )
     357                 :     210596 :         return pParseTokensType[ sal_uInt8(c) ];
     358                 :            :     else
     359                 :            :     {
     360                 :            : 
     361                 :            :         //! all KParseTokens::UNI_... must be matched
     362   [ -  +  -  -  :       1116 :         switch ( u_charType( (sal_uInt32) c ) )
          -  -  -  -  -  
                      + ]
     363                 :            :         {
     364                 :            :             case U_UPPERCASE_LETTER :
     365                 :          0 :                 return KParseTokens::UNI_UPALPHA;
     366                 :            :             case U_LOWERCASE_LETTER :
     367                 :        558 :                 return KParseTokens::UNI_LOALPHA;
     368                 :            :             case U_TITLECASE_LETTER :
     369                 :          0 :                 return KParseTokens::UNI_TITLE_ALPHA;
     370                 :            :             case U_MODIFIER_LETTER :
     371                 :          0 :                 return KParseTokens::UNI_MODIFIER_LETTER;
     372                 :            :             case U_OTHER_LETTER :
     373                 :            :                 // Non_Spacing_Mark could not be as leading character
     374         [ #  # ]:          0 :                 if (nPos == 0) break;
     375                 :            :                 // fall through, treat it as Other_Letter.
     376                 :            :             case U_NON_SPACING_MARK :
     377                 :          0 :                 return KParseTokens::UNI_OTHER_LETTER;
     378                 :            :             case U_DECIMAL_DIGIT_NUMBER :
     379                 :          0 :                 return KParseTokens::UNI_DIGIT;
     380                 :            :             case U_LETTER_NUMBER :
     381                 :          0 :                 return KParseTokens::UNI_LETTER_NUMBER;
     382                 :            :             case U_OTHER_NUMBER :
     383                 :          0 :                 return KParseTokens::UNI_OTHER_NUMBER;
     384                 :            :         }
     385                 :            : 
     386                 :     211712 :         return KParseTokens::UNI_OTHER;
     387                 :            :     }
     388                 :            : }
     389                 :            : 
     390                 :      27776 : sal_Bool cclass_Unicode::setupInternational( const Locale& rLocale )
     391                 :            : {
     392                 :      27776 :     sal_Bool bChanged = (aParserLocale.Language != rLocale.Language
     393                 :       2238 :         || aParserLocale.Country != rLocale.Country
     394         [ -  + ]:      30014 :         || aParserLocale.Variant != rLocale.Variant);
           [ +  +  +  - ]
     395         [ +  + ]:      27776 :     if ( bChanged )
     396                 :            :     {
     397                 :      25538 :         aParserLocale.Language = rLocale.Language;
     398                 :      25538 :         aParserLocale.Country = rLocale.Country;
     399                 :      25538 :         aParserLocale.Variant = rLocale.Variant;
     400                 :            :     }
     401 [ +  + ][ +  - ]:      27776 :     if ( !xLocaleData.is() && xMSF.is() )
                 [ +  + ]
     402                 :            :     {
     403                 :            :         Reference <
     404                 :            :             XInterface > xI =
     405         [ +  - ]:      25538 :             xMSF->createInstance( OUString(
     406 [ +  - ][ +  - ]:      25538 :             RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.i18n.LocaleData" ) ) );
     407         [ +  - ]:      25538 :         if ( xI.is() )
     408                 :            :         {
     409 [ +  - ][ +  - ]:      25538 :             Any x = xI->queryInterface( getCppuType((const Reference< XLocaleData>*)0) );
                 [ +  - ]
     410         [ +  - ]:      25538 :             x >>= xLocaleData;
     411                 :      25538 :         }
     412                 :            :     }
     413                 :      27776 :     return bChanged;
     414                 :            : }
     415                 :            : 
     416                 :            : 
     417                 :      52982 : void cclass_Unicode::setupParserTable( const Locale& rLocale, sal_Int32 startCharTokenType,
     418                 :            :             const OUString& userDefinedCharactersStart, sal_Int32 contCharTokenType,
     419                 :            :             const OUString& userDefinedCharactersCont )
     420                 :            : {
     421                 :      52982 :     bool bIntlEqual = (rLocale.Language == aParserLocale.Language &&
     422                 :      27444 :         rLocale.Country == aParserLocale.Country &&
     423         [ +  - ]:      80426 :         rLocale.Variant == aParserLocale.Variant);
           [ +  +  +  - ]
     424 [ +  + ][ +  - ]:     103394 :     if ( !pTable || !bIntlEqual ||
         [ +  + ][ +  -  
             +  -  -  + ]
                 [ +  + ]
     425                 :            :             startCharTokenType != nStartTypes ||
     426                 :            :             contCharTokenType != nContTypes ||
     427                 :      25206 :             userDefinedCharactersStart != aStartChars ||
     428                 :      25206 :             userDefinedCharactersCont != aContChars )
     429                 :            :         initParserTable( rLocale, startCharTokenType, userDefinedCharactersStart,
     430                 :      27776 :             contCharTokenType, userDefinedCharactersCont );
     431                 :      52982 : }
     432                 :            : 
     433                 :            : 
     434                 :      27776 : void cclass_Unicode::initParserTable( const Locale& rLocale, sal_Int32 startCharTokenType,
     435                 :            :             const OUString& userDefinedCharactersStart, sal_Int32 contCharTokenType,
     436                 :            :             const OUString& userDefinedCharactersCont )
     437                 :            : {
     438                 :            :     // (Re)Init
     439                 :      27776 :     setupInternational( rLocale );
     440                 :            :     // Memory of pTable is reused.
     441         [ +  + ]:      27776 :     if ( !pTable )
     442                 :      25538 :         pTable = new UPT_FLAG_TYPE[nDefCnt];
     443                 :      27776 :     memcpy( pTable, pDefaultParserTable, sizeof(UPT_FLAG_TYPE) * nDefCnt );
     444                 :            :     // Start and cont tables only need reallocation if different length.
     445 [ +  + ][ +  - ]:      27776 :     if ( pStart && userDefinedCharactersStart.getLength() != aStartChars.getLength() )
                 [ +  + ]
     446                 :            :     {
     447         [ +  - ]:          3 :         delete [] pStart;
     448                 :          3 :         pStart = NULL;
     449                 :            :     }
     450 [ +  + ][ +  - ]:      27776 :     if ( pCont && userDefinedCharactersCont.getLength() != aContChars.getLength() )
                 [ +  + ]
     451                 :            :     {
     452         [ +  - ]:          3 :         delete [] pCont;
     453                 :          3 :         pCont = NULL;
     454                 :            :     }
     455                 :      27776 :     nStartTypes = startCharTokenType;
     456                 :      27776 :     nContTypes = contCharTokenType;
     457                 :      27776 :     aStartChars = userDefinedCharactersStart;
     458                 :      27776 :     aContChars = userDefinedCharactersCont;
     459                 :            : 
     460                 :            :     // specials
     461         [ +  - ]:      27776 :     if( xLocaleData.is() )
     462                 :            :     {
     463                 :            :         LocaleDataItem aItem =
     464 [ +  - ][ +  - ]:      27776 :             xLocaleData->getLocaleItem( aParserLocale );
     465                 :            : //!TODO: theoretically separators may be a string, adjustment would have to be
     466                 :            : //! done here and in parsing and in ::rtl::math::stringToDouble()
     467                 :      27776 :         cGroupSep = aItem.thousandSeparator.getStr()[0];
     468                 :      27776 :         cDecimalSep = aItem.decimalSeparator.getStr()[0];
     469                 :            :     }
     470                 :            : 
     471         [ +  - ]:      27776 :     if ( cGroupSep < nDefCnt )
     472                 :      27776 :         pTable[cGroupSep] |= TOKEN_VALUE;
     473         [ +  - ]:      27776 :     if ( cDecimalSep < nDefCnt )
     474                 :      27776 :         pTable[cDecimalSep] |= TOKEN_CHAR_VALUE | TOKEN_VALUE;
     475                 :            : 
     476                 :            :     // Modify characters according to KParseTokens definitions.
     477                 :            :     {
     478                 :            :         using namespace KParseTokens;
     479                 :            :         sal_uInt8 i;
     480                 :            : 
     481         [ +  + ]:      27776 :         if ( !(nStartTypes & ASC_UPALPHA) )
     482         [ +  + ]:      60264 :             for ( i = 65; i < 91; i++ )
     483                 :      58032 :                 pTable[i] &= ~TOKEN_CHAR_WORD;  // not allowed as start character
     484         [ +  + ]:      27776 :         if ( !(nContTypes & ASC_UPALPHA) )
     485         [ +  + ]:      60264 :             for ( i = 65; i < 91; i++ )
     486                 :      58032 :                 pTable[i] &= ~TOKEN_WORD;       // not allowed as cont character
     487                 :            : 
     488         [ +  + ]:      27776 :         if ( !(nStartTypes & ASC_LOALPHA) )
     489         [ +  + ]:      60264 :             for ( i = 97; i < 123; i++ )
     490                 :      58032 :                 pTable[i] &= ~TOKEN_CHAR_WORD;  // not allowed as start character
     491         [ +  + ]:      27776 :         if ( !(nContTypes & ASC_LOALPHA) )
     492         [ +  + ]:      60264 :             for ( i = 97; i < 123; i++ )
     493                 :      58032 :                 pTable[i] &= ~TOKEN_WORD;       // not allowed as cont character
     494                 :            : 
     495         [ +  - ]:      27776 :         if ( nStartTypes & ASC_DIGIT )
     496         [ +  + ]:     305536 :             for ( i = 48; i < 58; i++ )
     497                 :     277760 :                 pTable[i] |= TOKEN_CHAR_WORD;   // allowed as start character
     498         [ -  + ]:      27776 :         if ( !(nContTypes & ASC_DIGIT) )
     499         [ #  # ]:          0 :             for ( i = 48; i < 58; i++ )
     500                 :          0 :                 pTable[i] &= ~TOKEN_WORD;       // not allowed as cont character
     501                 :            : 
     502         [ +  + ]:      27776 :         if ( !(nStartTypes & ASC_UNDERSCORE) )
     503                 :      27736 :             pTable[95] &= ~TOKEN_CHAR_WORD;     // not allowed as start character
     504         [ +  + ]:      27776 :         if ( !(nContTypes & ASC_UNDERSCORE) )
     505                 :      27736 :             pTable[95] &= ~TOKEN_WORD;          // not allowed as cont character
     506                 :            : 
     507         [ +  + ]:      27776 :         if ( nStartTypes & ASC_DOLLAR )
     508                 :          3 :             pTable[36] |= TOKEN_CHAR_WORD;      // allowed as start character
     509         [ +  + ]:      27776 :         if ( nContTypes & ASC_DOLLAR )
     510                 :          3 :             pTable[36] |= TOKEN_WORD;           // allowed as cont character
     511                 :            : 
     512         [ -  + ]:      27776 :         if ( nStartTypes & ASC_DOT )
     513                 :          0 :             pTable[46] |= TOKEN_CHAR_WORD;      // allowed as start character
     514         [ +  + ]:      27776 :         if ( nContTypes & ASC_DOT )
     515                 :      27747 :             pTable[46] |= TOKEN_WORD;           // allowed as cont character
     516                 :            : 
     517         [ -  + ]:      27776 :         if ( nStartTypes & ASC_COLON )
     518                 :          0 :             pTable[58] |= TOKEN_CHAR_WORD;      // allowed as start character
     519         [ -  + ]:      27776 :         if ( nContTypes & ASC_COLON )
     520                 :          0 :             pTable[58] |= TOKEN_WORD;           // allowed as cont character
     521                 :            : 
     522         [ -  + ]:      27776 :         if ( nStartTypes & ASC_CONTROL )
     523         [ #  # ]:          0 :             for ( i = 1; i < 32; i++ )
     524                 :          0 :                 pTable[i] |= TOKEN_CHAR_WORD;   // allowed as start character
     525         [ -  + ]:      27776 :         if ( nContTypes & ASC_CONTROL )
     526         [ #  # ]:          0 :             for ( i = 1; i < 32; i++ )
     527                 :          0 :                 pTable[i] |= TOKEN_WORD;        // allowed as cont character
     528                 :            : 
     529         [ -  + ]:      27776 :         if ( nStartTypes & ASC_ANY_BUT_CONTROL )
     530         [ #  # ]:          0 :             for ( i = 32; i < nDefCnt; i++ )
     531                 :          0 :                 pTable[i] |= TOKEN_CHAR_WORD;   // allowed as start character
     532         [ -  + ]:      27776 :         if ( nContTypes & ASC_ANY_BUT_CONTROL )
     533         [ #  # ]:          0 :             for ( i = 32; i < nDefCnt; i++ )
     534                 :          0 :                 pTable[i] |= TOKEN_WORD;        // allowed as cont character
     535                 :            : 
     536                 :            :     }
     537                 :            : 
     538                 :            :     // Merge in (positively override with) user defined characters.
     539                 :            :     // StartChars
     540                 :      27776 :     sal_Int32 nLen = aStartChars.getLength();
     541         [ +  + ]:      27776 :     if ( nLen )
     542                 :            :     {
     543         [ +  - ]:          3 :         if ( !pStart )
     544                 :          3 :             pStart = new UPT_FLAG_TYPE[ nLen ];
     545                 :          3 :         const sal_Unicode* p = aStartChars.getStr();
     546         [ +  + ]:          9 :         for ( sal_Int32 j=0; j<nLen; j++, p++ )
     547                 :            :         {
     548                 :          6 :             pStart[j] = TOKEN_CHAR_WORD;
     549         [ +  - ]:          6 :             if ( *p < nDefCnt )
     550                 :          6 :                 pTable[*p] |= TOKEN_CHAR_WORD;
     551                 :            :         }
     552                 :            :     }
     553                 :            :     // ContChars
     554                 :      27776 :     nLen = aContChars.getLength();
     555         [ +  + ]:      27776 :     if ( nLen )
     556                 :            :     {
     557         [ +  - ]:          3 :         if ( !pCont )
     558                 :          3 :             pCont = new UPT_FLAG_TYPE[ nLen ];
     559                 :          3 :         const sal_Unicode* p = aContChars.getStr();
     560         [ +  + ]:          9 :         for ( sal_Int32 j=0; j<nLen; j++ )
     561                 :            :         {
     562                 :          6 :             pCont[j] = TOKEN_WORD;
     563         [ +  - ]:          6 :             if ( *p < nDefCnt )
     564                 :          6 :                 pTable[*p] |= TOKEN_WORD;
     565                 :            :         }
     566                 :            :     }
     567                 :      27776 : }
     568                 :            : 
     569                 :            : 
     570                 :      34612 : void cclass_Unicode::destroyParserTable()
     571                 :            : {
     572         [ -  + ]:      34612 :     if ( pCont )
     573         [ #  # ]:          0 :         delete [] pCont;
     574         [ -  + ]:      34612 :     if ( pStart )
     575         [ #  # ]:          0 :         delete [] pStart;
     576         [ +  + ]:      34612 :     if ( pTable )
     577         [ +  - ]:      25519 :         delete [] pTable;
     578                 :      34612 : }
     579                 :            : 
     580                 :            : 
     581                 :     211712 : UPT_FLAG_TYPE cclass_Unicode::getFlags( const sal_Unicode* aStr, sal_Int32 nPos )
     582                 :            : {
     583                 :            :     UPT_FLAG_TYPE nMask;
     584                 :     211712 :     sal_Unicode c = aStr[nPos];
     585         [ +  + ]:     211712 :     if ( c < nDefCnt )
     586                 :     210596 :         nMask = pTable[ sal_uInt8(c) ];
     587                 :            :     else
     588                 :       1116 :         nMask = getFlagsExtended( aStr, nPos );
     589      [ +  +  + ]:     211712 :     switch ( eState )
     590                 :            :     {
     591                 :            :         case ssGetChar :
     592                 :            :         case ssRewindFromValue :
     593                 :            :         case ssIgnoreLeadingInRewind :
     594                 :            :         case ssGetWordFirstChar :
     595         [ +  + ]:      52994 :             if ( !(nMask & TOKEN_CHAR_WORD) )
     596                 :            :             {
     597                 :      14116 :                 nMask |= getStartCharsFlags( c );
     598         [ -  + ]:      14116 :                 if ( nMask & TOKEN_CHAR_WORD )
     599                 :          0 :                     nMask &= ~TOKEN_EXCLUDED;
     600                 :            :             }
     601                 :      52994 :         break;
     602                 :            :         case ssGetValue :
     603                 :            :         case ssGetWord :
     604         [ +  + ]:     158454 :             if ( !(nMask & TOKEN_WORD) )
     605                 :            :             {
     606                 :      13575 :                 nMask |= getContCharsFlags( c );
     607         [ -  + ]:      13575 :                 if ( nMask & TOKEN_WORD )
     608                 :          0 :                     nMask &= ~TOKEN_EXCLUDED;
     609                 :            :             }
     610                 :     158454 :         break;
     611                 :            :         default:
     612                 :            :             ;   // other cases aren't needed, no compiler warning
     613                 :            :     }
     614                 :     211712 :     return nMask;
     615                 :            : }
     616                 :            : 
     617                 :            : 
     618                 :       1116 : UPT_FLAG_TYPE cclass_Unicode::getFlagsExtended( const sal_Unicode* aStr, sal_Int32 nPos )
     619                 :            : {
     620                 :       1116 :     sal_Unicode c = aStr[nPos];
     621         [ -  + ]:       1116 :     if ( c == cGroupSep )
     622                 :          0 :         return TOKEN_VALUE;
     623         [ -  + ]:       1116 :     else if ( c == cDecimalSep )
     624                 :          0 :         return TOKEN_CHAR_VALUE | TOKEN_VALUE;
     625                 :            :     using namespace i18n;
     626                 :            :     bool bStart = (eState == ssGetChar || eState == ssGetWordFirstChar ||
     627 [ +  + ][ +  - ]:       1116 :             eState == ssRewindFromValue || eState == ssIgnoreLeadingInRewind);
         [ +  - ][ -  + ]
     628         [ +  + ]:       1116 :     sal_Int32 nTypes = (bStart ? nStartTypes : nContTypes);
     629                 :            : 
     630                 :            :     //! all KParseTokens::UNI_... must be matched
     631   [ -  +  -  -  :       1116 :     switch ( u_charType( (sal_uInt32) c ) )
          -  -  -  -  -  
                   -  + ]
     632                 :            :     {
     633                 :            :         case U_UPPERCASE_LETTER :
     634                 :            :             return (nTypes & KParseTokens::UNI_UPALPHA) ?
     635                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     636 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL;
     637                 :            :         case U_LOWERCASE_LETTER :
     638                 :            :             return (nTypes & KParseTokens::UNI_LOALPHA) ?
     639                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     640 [ +  - ][ +  + ]:        558 :                 TOKEN_ILLEGAL;
     641                 :            :         case U_TITLECASE_LETTER :
     642                 :            :             return (nTypes & KParseTokens::UNI_TITLE_ALPHA) ?
     643                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     644 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL;
     645                 :            :         case U_MODIFIER_LETTER :
     646                 :            :             return (nTypes & KParseTokens::UNI_MODIFIER_LETTER) ?
     647                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     648 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL;
     649                 :            :         case U_NON_SPACING_MARK :
     650                 :            :         case U_COMBINING_SPACING_MARK :
     651                 :            :             // Non_Spacing_Mark can't be a leading character,
     652                 :            :             // nor can a spacing combining mark.
     653         [ #  # ]:          0 :             if (bStart)
     654                 :          0 :                 return TOKEN_ILLEGAL;
     655                 :            :             // fall through, treat it as Other_Letter.
     656                 :            :         case U_OTHER_LETTER :
     657                 :            :             return (nTypes & KParseTokens::UNI_OTHER_LETTER) ?
     658                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     659 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL;
     660                 :            :         case U_DECIMAL_DIGIT_NUMBER :
     661                 :            :             return ((nTypes & KParseTokens::UNI_DIGIT) ?
     662                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     663 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
     664                 :            :         case U_LETTER_NUMBER :
     665                 :            :             return ((nTypes & KParseTokens::UNI_LETTER_NUMBER) ?
     666                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     667 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
     668                 :            :         case U_OTHER_NUMBER :
     669                 :            :             return ((nTypes & KParseTokens::UNI_OTHER_NUMBER) ?
     670                 :            :                 (bStart ? TOKEN_CHAR_WORD : TOKEN_WORD) :
     671 [ #  # ][ #  # ]:          0 :                 TOKEN_ILLEGAL) | TOKEN_DIGIT_FLAGS;
     672                 :            :         case U_SPACE_SEPARATOR :
     673                 :            :             return ((nTypes & KParseTokens::IGNORE_LEADING_WS) ?
     674 [ #  # ][ #  # ]:          0 :                 TOKEN_CHAR_DONTCARE : (bStart ? TOKEN_CHAR_WORD : (TOKEN_CHAR_DONTCARE | TOKEN_WORD_SEP | TOKEN_VALUE_SEP) ));
     675                 :            :     }
     676                 :            : 
     677                 :       1116 :     return TOKEN_ILLEGAL;
     678                 :            : }
     679                 :            : 
     680                 :            : 
     681                 :      14116 : UPT_FLAG_TYPE cclass_Unicode::getStartCharsFlags( sal_Unicode c )
     682                 :            : {
     683         [ -  + ]:      14116 :     if ( pStart )
     684                 :            :     {
     685                 :          0 :         const sal_Unicode* pStr = aStartChars.getStr();
     686                 :          0 :         const sal_Unicode* p = StrChr( pStr, c );
     687         [ #  # ]:          0 :         if ( p )
     688                 :          0 :             return pStart[ p - pStr ];
     689                 :            :     }
     690                 :      14116 :     return TOKEN_ILLEGAL;
     691                 :            : }
     692                 :            : 
     693                 :            : 
     694                 :      13575 : UPT_FLAG_TYPE cclass_Unicode::getContCharsFlags( sal_Unicode c )
     695                 :            : {
     696         [ +  + ]:      13575 :     if ( pCont )
     697                 :            :     {
     698                 :         45 :         const sal_Unicode* pStr = aContChars.getStr();
     699                 :         45 :         const sal_Unicode* p = StrChr( pStr, c );
     700         [ -  + ]:         45 :         if ( p )
     701                 :          0 :             return pCont[ p - pStr ];
     702                 :            :     }
     703                 :      13575 :     return TOKEN_ILLEGAL;
     704                 :            : }
     705                 :            : 
     706                 :            : 
     707                 :      52982 : void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32 nPos, sal_Int32 nTokenType )
     708                 :            : {
     709                 :            :     using namespace i18n;
     710                 :      52982 :     const sal_Unicode* const pTextStart = rText.getStr() + nPos;
     711                 :      52982 :     eState = ssGetChar;
     712                 :            : 
     713                 :            :     //! All the variables below (plus ParseResult) have to be resetted on ssRewindFromValue!
     714                 :      52982 :     const sal_Unicode* pSym = pTextStart;
     715                 :      52982 :     const sal_Unicode* pSrc = pSym;
     716                 :      52982 :     OUString aSymbol;
     717                 :      52982 :     sal_Unicode c = *pSrc;
     718                 :      52982 :     sal_Unicode cLast = 0;
     719                 :      52982 :     int nDecSeps = 0;
     720                 :      52982 :     bool bQuote = false;
     721                 :      52982 :     bool bMightBeWord = true;
     722                 :      52982 :     bool bMightBeWordLast = true;
     723                 :            :     //! All the variables above (plus ParseResult) have to be resetted on ssRewindFromValue!
     724                 :            : 
     725 [ +  + ][ +  + ]:     264694 :     while ( (c != 0) && (eState != ssStop) )
                 [ +  + ]
     726                 :            :     {
     727         [ +  - ]:     211712 :         UPT_FLAG_TYPE nMask = getFlags( pTextStart, pSrc - pTextStart );
     728         [ -  + ]:     211712 :         if ( nMask & TOKEN_EXCLUDED )
     729                 :          0 :             eState = ssBounce;
     730         [ +  + ]:     211712 :         if ( bMightBeWord )
     731                 :            :         {   // only relevant for ssGetValue fall back
     732 [ +  + ][ +  - ]:     211412 :             if ( eState == ssGetChar || eState == ssRewindFromValue ||
                 [ -  + ]
     733                 :            :                     eState == ssIgnoreLeadingInRewind )
     734                 :      52994 :                 bMightBeWord = ((nMask & TOKEN_CHAR_WORD) != 0);
     735                 :            :             else
     736                 :     211412 :                 bMightBeWord = ((nMask & TOKEN_WORD) != 0);
     737                 :            :         }
     738         [ +  - ]:     211712 :         sal_Int32 nParseTokensType = getParseTokensType( pTextStart, pSrc - pTextStart );
     739                 :     211712 :         pSrc++;
     740   [ +  +  -  +  :     211712 :         switch (eState)
             +  +  -  - ]
     741                 :            :         {
     742                 :            :             case ssGetChar :
     743                 :            :             case ssRewindFromValue :
     744                 :            :             case ssIgnoreLeadingInRewind :
     745                 :            :             {
     746 [ +  + ][ +  - ]:      52994 :                 if ( (nMask & TOKEN_CHAR_VALUE) && eState != ssRewindFromValue
                 [ +  - ]
     747                 :            :                         && eState != ssIgnoreLeadingInRewind )
     748                 :            :                 {   //! must be first, may fall back to ssGetWord via bMightBeWord
     749                 :       4500 :                     eState = ssGetValue;
     750         [ +  - ]:       9000 :                     if ( nMask & TOKEN_VALUE_DIGIT )
     751                 :            :                     {
     752         [ -  + ]:       4500 :                         if ( 128 <= c )
     753                 :          0 :                             r.TokenType = KParseType::UNI_NUMBER;
     754                 :            :                         else
     755                 :       4500 :                             r.TokenType = KParseType::ASC_NUMBER;
     756                 :            :                     }
     757         [ #  # ]:          0 :                     else if ( c == cDecimalSep )
     758                 :            :                     {
     759         [ #  # ]:          0 :                         if ( *pSrc )
     760                 :          0 :                             ++nDecSeps;
     761                 :            :                         else
     762                 :          0 :                             eState = ssRewindFromValue;
     763                 :            :                             // retry for ONE_SINGLE_CHAR or others
     764                 :            :                     }
     765                 :            :                 }
     766         [ +  + ]:      48494 :                 else if ( nMask & TOKEN_CHAR_WORD )
     767                 :            :                 {
     768                 :      34378 :                     eState = ssGetWord;
     769                 :      34378 :                     r.TokenType = KParseType::IDENTNAME;
     770                 :            :                 }
     771         [ -  + ]:      14116 :                 else if ( nMask & TOKEN_NAME_SEP )
     772                 :            :                 {
     773                 :          0 :                     eState = ssGetWordFirstChar;
     774                 :          0 :                     bQuote = true;
     775                 :          0 :                     pSym++;
     776                 :          0 :                     nParseTokensType = 0;   // will be taken of first real character
     777                 :          0 :                     r.TokenType = KParseType::SINGLE_QUOTE_NAME;
     778                 :            :                 }
     779         [ +  + ]:      14116 :                 else if ( nMask & TOKEN_CHAR_STRING )
     780                 :            :                 {
     781                 :          6 :                     eState = ssGetString;
     782                 :          6 :                     pSym++;
     783                 :          6 :                     nParseTokensType = 0;   // will be taken of first real character
     784                 :          6 :                     r.TokenType = KParseType::DOUBLE_QUOTE_STRING;
     785                 :            :                 }
     786         [ +  + ]:      14110 :                 else if ( nMask & TOKEN_CHAR_DONTCARE )
     787                 :            :                 {
     788         [ +  - ]:         12 :                     if ( nStartTypes & KParseTokens::IGNORE_LEADING_WS )
     789                 :            :                     {
     790         [ -  + ]:         12 :                         if (eState == ssRewindFromValue)
     791                 :          0 :                             eState = ssIgnoreLeadingInRewind;
     792                 :         12 :                         r.LeadingWhiteSpace++;
     793                 :         12 :                         pSym++;
     794                 :         12 :                         nParseTokensType = 0;   // wait until real character
     795                 :         12 :                         bMightBeWord = true;
     796                 :            :                     }
     797                 :            :                     else
     798                 :          0 :                         eState = ssBounce;
     799                 :            :                 }
     800         [ +  + ]:      14098 :                 else if ( nMask & TOKEN_CHAR_BOOL )
     801                 :            :                 {
     802                 :        252 :                     eState = ssGetBool;
     803                 :        252 :                     r.TokenType = KParseType::BOOLEAN;
     804                 :            :                 }
     805         [ +  + ]:      13846 :                 else if ( nMask & TOKEN_CHAR )
     806                 :            :                 {   //! must be last
     807                 :      13324 :                     eState = ssStop;
     808                 :      13324 :                     r.TokenType = KParseType::ONE_SINGLE_CHAR;
     809                 :            :                 }
     810                 :            :                 else
     811                 :        522 :                     eState = ssBounce;      // not known
     812                 :            :             }
     813                 :      52994 :             break;
     814                 :            :             case ssGetValue :
     815                 :            :             {
     816         [ -  + ]:       4536 :                 if ( nMask & TOKEN_VALUE_DIGIT )
     817                 :            :                 {
     818         [ #  # ]:          0 :                     if ( 128 <= c )
     819                 :          0 :                         r.TokenType = KParseType::UNI_NUMBER;
     820         [ #  # ]:          0 :                     else if ( r.TokenType != KParseType::UNI_NUMBER )
     821                 :          0 :                         r.TokenType = KParseType::ASC_NUMBER;
     822                 :            :                 }
     823         [ +  + ]:       4536 :                 if ( nMask & TOKEN_VALUE )
     824                 :            :                 {
     825 [ -  + ][ #  # ]:         36 :                     if ( c == cDecimalSep && ++nDecSeps > 1 )
                 [ -  + ]
     826                 :            :                     {
     827         [ #  # ]:          0 :                         if ( pSrc - pTextStart == 2 )
     828                 :          0 :                             eState = ssRewindFromValue;
     829                 :            :                             // consecutive separators
     830                 :            :                         else
     831                 :          0 :                             eState = ssStopBack;
     832                 :            :                     }
     833                 :            :                     // else keep it going
     834                 :            :                 }
     835 [ +  - ][ -  + ]:       4500 :                 else if ( c == 'E' || c == 'e' )
     836                 :            :                 {
     837         [ #  # ]:          0 :                     UPT_FLAG_TYPE nNext = getFlags( pTextStart, pSrc - pTextStart );
     838         [ #  # ]:          0 :                     if ( nNext & TOKEN_VALUE_EXP )
     839                 :            :                         ;   // keep it going
     840 [ #  # ][ #  # ]:          0 :                     else if ( bMightBeWord && ((nNext & TOKEN_WORD) || !*pSrc) )
                 [ #  # ]
     841                 :            :                     {   // might be a numerical name (1.2efg)
     842                 :          0 :                         eState = ssGetWord;
     843                 :          0 :                         r.TokenType = KParseType::IDENTNAME;
     844                 :            :                     }
     845                 :            :                     else
     846                 :          0 :                         eState = ssStopBack;
     847                 :            :                 }
     848         [ +  + ]:       4500 :                 else if ( nMask & TOKEN_VALUE_SIGN )
     849                 :            :                 {
     850 [ +  - ][ -  + ]:        108 :                     if ( (cLast == 'E') || (cLast == 'e') )
     851                 :            :                     {
     852         [ #  # ]:          0 :                         UPT_FLAG_TYPE nNext = getFlags( pTextStart, pSrc - pTextStart );
     853         [ #  # ]:          0 :                         if ( nNext & TOKEN_VALUE_EXP_VALUE )
     854                 :            :                             ;   // keep it going
     855 [ #  # ][ #  # ]:          0 :                         else if ( bMightBeWord && ((nNext & TOKEN_WORD) || !*pSrc) )
                 [ #  # ]
     856                 :            :                         {   // might be a numerical name (1.2e+fg)
     857                 :          0 :                             eState = ssGetWord;
     858                 :          0 :                             r.TokenType = KParseType::IDENTNAME;
     859                 :            :                         }
     860                 :            :                         else
     861                 :          0 :                             eState = ssStopBack;
     862                 :            :                     }
     863         [ -  + ]:        108 :                     else if ( bMightBeWord )
     864                 :            :                     {   // might be a numerical name (1.2+fg)
     865                 :          0 :                         eState = ssGetWord;
     866                 :          0 :                         r.TokenType = KParseType::IDENTNAME;
     867                 :            :                     }
     868                 :            :                     else
     869                 :        108 :                         eState = ssStopBack;
     870                 :            :                 }
     871 [ -  + ][ #  # ]:       4392 :                 else if ( bMightBeWord && (nMask & TOKEN_WORD) )
     872                 :            :                 {   // might be a numerical name (1995.A1)
     873                 :          0 :                     eState = ssGetWord;
     874                 :          0 :                     r.TokenType = KParseType::IDENTNAME;
     875                 :            :                 }
     876                 :            :                 else
     877                 :       4392 :                     eState = ssStopBack;
     878                 :            :             }
     879                 :       4536 :             break;
     880                 :            :             case ssGetWordFirstChar :
     881                 :          0 :                 eState = ssGetWord;
     882                 :            :                 // fall thru
     883                 :            :             case ssGetWord :
     884                 :            :             {
     885         [ +  + ]:     153918 :                 if ( nMask & TOKEN_WORD )
     886                 :            :                     ;   // keep it going
     887         [ -  + ]:       9039 :                 else if ( nMask & TOKEN_NAME_SEP )
     888                 :            :                 {
     889         [ #  # ]:          0 :                     if ( bQuote )
     890                 :            :                     {
     891         [ #  # ]:          0 :                         if ( cLast == '\\' )
     892                 :            :                         {   // escaped
     893                 :          0 :                             aSymbol += OUString( pSym, pSrc - pSym - 2 );
     894                 :          0 :                             aSymbol += OUString( &c, 1);
     895                 :            :                         }
     896                 :            :                         else
     897                 :            :                         {
     898                 :          0 :                             eState = ssStop;
     899                 :          0 :                             aSymbol += OUString( pSym, pSrc - pSym - 1 );
     900                 :            :                         }
     901                 :          0 :                         pSym = pSrc;
     902                 :            :                     }
     903                 :            :                     else
     904                 :          0 :                         eState = ssStopBack;
     905                 :            :                 }
     906         [ +  - ]:       9039 :                 else if ( bQuote )
     907                 :            :                     ;   // keep it going
     908                 :            :                 else
     909                 :       9039 :                     eState = ssStopBack;
     910                 :            :             }
     911                 :     153918 :             break;
     912                 :            :             case ssGetString :
     913                 :            :             {
     914         [ +  + ]:         12 :                 if ( nMask & TOKEN_STRING_SEP )
     915                 :            :                 {
     916         [ -  + ]:          6 :                     if ( cLast == '\\' )
     917                 :            :                     {   // escaped
     918                 :          0 :                         aSymbol += OUString( pSym, pSrc - pSym - 2 );
     919                 :          0 :                         aSymbol += OUString( &c, 1);
     920                 :            :                     }
     921 [ -  + ][ #  # ]:          6 :                     else if ( c == *pSrc &&
     922                 :          0 :                             !(nContTypes & KParseTokens::TWO_DOUBLE_QUOTES_BREAK_STRING) )
     923                 :            :                     {   // "" => literal " escaped
     924                 :          0 :                         aSymbol += OUString( pSym, pSrc - pSym );
     925                 :          0 :                         pSrc++;
     926                 :            :                     }
     927                 :            :                     else
     928                 :            :                     {
     929                 :          6 :                         eState = ssStop;
     930                 :          6 :                         aSymbol += OUString( pSym, pSrc - pSym - 1 );
     931                 :            :                     }
     932                 :          6 :                     pSym = pSrc;
     933                 :            :                 }
     934                 :            :             }
     935                 :         12 :             break;
     936                 :            :             case ssGetBool :
     937                 :            :             {
     938         [ -  + ]:        252 :                 if ( (nMask & TOKEN_BOOL) )
     939                 :          0 :                     eState = ssStop;    // maximum 2: <, >, <>, <=, >=
     940                 :            :                 else
     941                 :        252 :                     eState = ssStopBack;
     942                 :            :             }
     943                 :        252 :             break;
     944                 :            :             case ssStopBack :
     945                 :            :             case ssBounce :
     946                 :            :             case ssStop :
     947                 :            :                 ;   // nothing, no compiler warning
     948                 :          0 :             break;
     949                 :            :         }
     950         [ -  + ]:     211712 :         if ( eState == ssRewindFromValue )
     951                 :            :         {
     952                 :          0 :             r = ParseResult();
     953                 :          0 :             pSym = pTextStart;
     954                 :          0 :             pSrc = pSym;
     955                 :          0 :             aSymbol = OUString();
     956                 :          0 :             c = *pSrc;
     957                 :          0 :             cLast = 0;
     958                 :          0 :             nDecSeps = 0;
     959                 :          0 :             bQuote = false;
     960                 :          0 :             bMightBeWord = true;
     961                 :          0 :             bMightBeWordLast = true;
     962                 :            :         }
     963                 :            :         else
     964                 :            :         {
     965         [ +  + ]:     211712 :             if ( !(r.TokenType & nTokenType) )
     966                 :            :             {
     967 [ -  + ][ #  # ]:        534 :                 if ( (r.TokenType & (KParseType::ASC_NUMBER | KParseType::UNI_NUMBER))
                 [ #  # ]
     968                 :            :                         && (nTokenType & KParseType::IDENTNAME) && bMightBeWord )
     969                 :            :                     ;   // keep a number that might be a word
     970         [ +  + ]:        534 :                 else if ( r.LeadingWhiteSpace == (pSrc - pTextStart) )
     971                 :            :                     ;   // keep ignored white space
     972 [ +  - ][ -  + ]:        522 :                 else if ( !r.TokenType && eState == ssGetValue && (nMask & TOKEN_VALUE_SEP) )
                 [ #  # ]
     973                 :            :                     ;   // keep uncertain value
     974                 :            :                 else
     975                 :        534 :                     eState = ssBounce;
     976                 :            :             }
     977         [ +  + ]:     211712 :             if ( eState == ssBounce )
     978                 :            :             {
     979                 :        522 :                 r.TokenType = 0;
     980                 :        522 :                 eState = ssStopBack;
     981                 :            :             }
     982         [ +  + ]:     211712 :             if ( eState == ssStopBack )
     983                 :            :             {   // put back
     984                 :      14313 :                 pSrc--;
     985                 :      14313 :                 bMightBeWord = bMightBeWordLast;
     986                 :      14313 :                 eState = ssStop;
     987                 :            :             }
     988         [ +  + ]:     211712 :             if ( eState != ssStop )
     989                 :            :             {
     990         [ +  + ]:     184069 :                 if ( !r.StartFlags )
     991                 :      39154 :                     r.StartFlags |= nParseTokensType;
     992                 :            :                 else
     993                 :     144915 :                     r.ContFlags |= nParseTokensType;
     994                 :            :             }
     995                 :     211712 :             bMightBeWordLast = bMightBeWord;
     996                 :     211712 :             cLast = c;
     997                 :     211712 :             c = *pSrc;
     998                 :            :         }
     999                 :            :     }
    1000                 :            :     // r.CharLen is the length in characters (not code points) of the parsed
    1001                 :            :     // token not including any leading white space, change this calculation if
    1002                 :            :     // multi-code-point Unicode characters are to be supported.
    1003                 :      52982 :     r.CharLen = pSrc - pTextStart - r.LeadingWhiteSpace;
    1004                 :      52982 :     r.EndPos = nPos + (pSrc - pTextStart);
    1005         [ +  + ]:      52982 :     if ( r.TokenType & KParseType::ASC_NUMBER )
    1006                 :            :     {
    1007                 :            :         r.Value = rtl_math_uStringToDouble( pTextStart + r.LeadingWhiteSpace,
    1008                 :       4500 :                 pTextStart + r.EndPos, cDecimalSep, cGroupSep, NULL, NULL );
    1009         [ +  + ]:       4500 :         if ( bMightBeWord )
    1010                 :       4464 :             r.TokenType |= KParseType::IDENTNAME;
    1011                 :            :     }
    1012         [ -  + ]:      48482 :     else if ( r.TokenType & KParseType::UNI_NUMBER )
    1013                 :            :     {
    1014         [ #  # ]:          0 :         if ( !xNatNumSup.is() )
    1015                 :            :         {
    1016                 :            : #define NATIVENUMBERSUPPLIER_SERVICENAME "com.sun.star.i18n.NativeNumberSupplier"
    1017         [ #  # ]:          0 :             if ( xMSF.is() )
    1018                 :            :             {
    1019                 :            :                 xNatNumSup = Reference< XNativeNumberSupplier > (
    1020         [ #  # ]:          0 :                         xMSF->createInstance( OUString(
    1021                 :            :                                 RTL_CONSTASCII_USTRINGPARAM(
    1022                 :          0 :                                     NATIVENUMBERSUPPLIER_SERVICENAME ) ) ),
    1023 [ #  # ][ #  # ]:          0 :                         UNO_QUERY );
         [ #  # ][ #  # ]
    1024                 :            :             }
    1025         [ #  # ]:          0 :             if ( !xNatNumSup.is() )
    1026                 :            :             {
    1027                 :            :                 throw RuntimeException( OUString(
    1028                 :            : #ifdef DBG_UTIL
    1029                 :            :                     RTL_CONSTASCII_USTRINGPARAM(
    1030                 :            :                         "cclass_Unicode::parseText: can't instanciate "
    1031                 :            :                         NATIVENUMBERSUPPLIER_SERVICENAME )
    1032                 :            : #endif
    1033 [ #  # ][ #  # ]:          0 :                     ), *this );
    1034                 :            :             }
    1035                 :            : #undef NATIVENUMBERSUPPLIER_SERVICENAME
    1036                 :            :         }
    1037                 :            :         OUString aTmp( pTextStart + r.LeadingWhiteSpace, r.EndPos - nPos +
    1038                 :          0 :                 r.LeadingWhiteSpace );
    1039                 :            :         // transliterate to ASCII
    1040         [ #  # ]:          0 :         aTmp = xNatNumSup->getNativeNumberString( aTmp, aParserLocale,
    1041         [ #  # ]:          0 :                 NativeNumberMode::NATNUM0 );
    1042                 :          0 :         r.Value = ::rtl::math::stringToDouble( aTmp, cDecimalSep, cGroupSep, NULL, NULL );
    1043         [ #  # ]:          0 :         if ( bMightBeWord )
    1044                 :          0 :             r.TokenType |= KParseType::IDENTNAME;
    1045                 :            :     }
    1046         [ +  + ]:      48482 :     else if ( r.TokenType & (KParseType::SINGLE_QUOTE_NAME | KParseType::DOUBLE_QUOTE_STRING) )
    1047                 :            :     {
    1048         [ -  + ]:          6 :         if ( pSym < pSrc )
    1049                 :            :         {   //! open quote
    1050                 :          0 :             aSymbol += OUString( pSym, pSrc - pSym );
    1051                 :          0 :             r.TokenType |= KParseType::MISSING_QUOTE;
    1052                 :            :         }
    1053                 :          6 :         r.DequotedNameOrString = aSymbol;
    1054                 :      52982 :     }
    1055                 :      52982 : }
    1056                 :            : 
    1057                 :            : } } } }
    1058                 :            : 
    1059                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10