LCOV - code coverage report
Current view: top level - intl/unicharutil/util - nsBidiUtils.cpp (source / functions) Hit Total Coverage
Test: output.info Lines: 9 28 32.1 %
Date: 2017-07-14 16:53:18 Functions: 1 3 33.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
       2             :  *
       3             :  * This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : #include "nsBidiUtils.h"
       7             : 
       8             : #define ARABIC_TO_HINDI_DIGIT_INCREMENT (START_HINDI_DIGITS - START_ARABIC_DIGITS)
       9             : #define PERSIAN_TO_HINDI_DIGIT_INCREMENT (START_HINDI_DIGITS - START_FARSI_DIGITS)
      10             : #define ARABIC_TO_PERSIAN_DIGIT_INCREMENT (START_FARSI_DIGITS - START_ARABIC_DIGITS)
      11             : #define NUM_TO_ARABIC(c) \
      12             :   ((((c)>=START_HINDI_DIGITS) && ((c)<=END_HINDI_DIGITS)) ? \
      13             :    ((c) - (uint16_t)ARABIC_TO_HINDI_DIGIT_INCREMENT) : \
      14             :    ((((c)>=START_FARSI_DIGITS) && ((c)<=END_FARSI_DIGITS)) ? \
      15             :     ((c) - (uint16_t)ARABIC_TO_PERSIAN_DIGIT_INCREMENT) : \
      16             :      (c)))
      17             : #define NUM_TO_HINDI(c) \
      18             :   ((((c)>=START_ARABIC_DIGITS) && ((c)<=END_ARABIC_DIGITS)) ? \
      19             :    ((c) + (uint16_t)ARABIC_TO_HINDI_DIGIT_INCREMENT): \
      20             :    ((((c)>=START_FARSI_DIGITS) && ((c)<=END_FARSI_DIGITS)) ? \
      21             :     ((c) + (uint16_t)PERSIAN_TO_HINDI_DIGIT_INCREMENT) : \
      22             :      (c)))
      23             : #define NUM_TO_PERSIAN(c) \
      24             :   ((((c)>=START_HINDI_DIGITS) && ((c)<=END_HINDI_DIGITS)) ? \
      25             :    ((c) - (uint16_t)PERSIAN_TO_HINDI_DIGIT_INCREMENT) : \
      26             :    ((((c)>=START_ARABIC_DIGITS) && ((c)<=END_ARABIC_DIGITS)) ? \
      27             :     ((c) + (uint16_t)ARABIC_TO_PERSIAN_DIGIT_INCREMENT) : \
      28             :      (c)))
      29             : 
      30           0 : char16_t HandleNumberInChar(char16_t aChar, bool aPrevCharArabic, uint32_t aNumFlag)
      31             : {
      32             :   // IBMBIDI_NUMERAL_NOMINAL *
      33             :   // IBMBIDI_NUMERAL_REGULAR
      34             :   // IBMBIDI_NUMERAL_HINDICONTEXT
      35             :   // IBMBIDI_NUMERAL_ARABIC
      36             :   // IBMBIDI_NUMERAL_HINDI
      37             : 
      38           0 :   switch (aNumFlag) {
      39             :     case IBMBIDI_NUMERAL_HINDI:
      40           0 :       return NUM_TO_HINDI(aChar);
      41             :     case IBMBIDI_NUMERAL_ARABIC:
      42           0 :       return NUM_TO_ARABIC(aChar);
      43             :     case IBMBIDI_NUMERAL_PERSIAN:
      44           0 :       return NUM_TO_PERSIAN(aChar);
      45             :     case IBMBIDI_NUMERAL_REGULAR:
      46             :     case IBMBIDI_NUMERAL_HINDICONTEXT:
      47             :     case IBMBIDI_NUMERAL_PERSIANCONTEXT:
      48             :       // for clipboard handling
      49             :       //XXX do we really want to convert numerals when copying text?
      50           0 :       if (aPrevCharArabic) {
      51           0 :         if (aNumFlag == IBMBIDI_NUMERAL_PERSIANCONTEXT)
      52           0 :           return NUM_TO_PERSIAN(aChar);
      53             :         else
      54           0 :           return NUM_TO_HINDI(aChar);
      55             :       }
      56             :       else
      57           0 :         return NUM_TO_ARABIC(aChar);
      58             :     case IBMBIDI_NUMERAL_NOMINAL:
      59             :     default:
      60           0 :       return aChar;
      61             :   }
      62             : }
      63             : 
      64           0 : nsresult HandleNumbers(char16_t* aBuffer, uint32_t aSize, uint32_t aNumFlag)
      65             : {
      66             :   uint32_t i;
      67             : 
      68           0 :   switch (aNumFlag) {
      69             :     case IBMBIDI_NUMERAL_HINDI:
      70             :     case IBMBIDI_NUMERAL_ARABIC:
      71             :     case IBMBIDI_NUMERAL_PERSIAN:
      72             :     case IBMBIDI_NUMERAL_REGULAR:
      73             :     case IBMBIDI_NUMERAL_HINDICONTEXT:
      74             :     case IBMBIDI_NUMERAL_PERSIANCONTEXT:
      75           0 :       for (i=0;i<aSize;i++)
      76           0 :         aBuffer[i] = HandleNumberInChar(aBuffer[i], !!(i>0 ? aBuffer[i-1] : 0), aNumFlag);
      77           0 :       break;
      78             :     case IBMBIDI_NUMERAL_NOMINAL:
      79             :     default:
      80           0 :       break;
      81             :   }
      82           0 :   return NS_OK;
      83             : }
      84             : 
      85          27 : bool HasRTLChars(const char16_t* aText, uint32_t aLength)
      86             : {
      87             :   // This is used to determine whether a string has right-to-left characters
      88             :   // that mean it will require bidi processing.
      89          27 :   const char16_t* cp = aText;
      90          27 :   const char16_t* end = cp + aLength;
      91         591 :   while (cp < end) {
      92         282 :     uint32_t ch = *cp++;
      93         282 :     if (NS_IS_HIGH_SURROGATE(ch) && cp < end && NS_IS_LOW_SURROGATE(*cp)) {
      94           2 :       ch = SURROGATE_TO_UCS4(ch, *cp++);
      95             :     }
      96         282 :     if (UTF32_CHAR_IS_BIDI(ch) || IsBidiControlRTL(ch)) {
      97           0 :       return true;
      98             :     }
      99             :   }
     100          27 :   return false;
     101             : }

Generated by: LCOV version 1.13