nsBidiUtils.cpp (3278B)
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 \ 9 (START_HINDI_DIGITS - START_ARABIC_DIGITS) 10 #define PERSIAN_TO_HINDI_DIGIT_INCREMENT \ 11 (START_HINDI_DIGITS - START_FARSI_DIGITS) 12 #define ARABIC_TO_PERSIAN_DIGIT_INCREMENT \ 13 (START_FARSI_DIGITS - START_ARABIC_DIGITS) 14 #define NUM_TO_ARABIC(c) \ 15 ((((c) >= START_HINDI_DIGITS) && ((c) <= END_HINDI_DIGITS)) \ 16 ? ((c) - (uint16_t)ARABIC_TO_HINDI_DIGIT_INCREMENT) \ 17 : ((((c) >= START_FARSI_DIGITS) && ((c) <= END_FARSI_DIGITS)) \ 18 ? ((c) - (uint16_t)ARABIC_TO_PERSIAN_DIGIT_INCREMENT) \ 19 : (c))) 20 #define NUM_TO_HINDI(c) \ 21 ((((c) >= START_ARABIC_DIGITS) && ((c) <= END_ARABIC_DIGITS)) \ 22 ? ((c) + (uint16_t)ARABIC_TO_HINDI_DIGIT_INCREMENT) \ 23 : ((((c) >= START_FARSI_DIGITS) && ((c) <= END_FARSI_DIGITS)) \ 24 ? ((c) + (uint16_t)PERSIAN_TO_HINDI_DIGIT_INCREMENT) \ 25 : (c))) 26 #define NUM_TO_PERSIAN(c) \ 27 ((((c) >= START_HINDI_DIGITS) && ((c) <= END_HINDI_DIGITS)) \ 28 ? ((c) - (uint16_t)PERSIAN_TO_HINDI_DIGIT_INCREMENT) \ 29 : ((((c) >= START_ARABIC_DIGITS) && ((c) <= END_ARABIC_DIGITS)) \ 30 ? ((c) + (uint16_t)ARABIC_TO_PERSIAN_DIGIT_INCREMENT) \ 31 : (c))) 32 33 char16_t HandleNumberInChar(char16_t aChar, bool aPrevCharArabic, 34 uint32_t aNumFlag) { 35 // IBMBIDI_NUMERAL_NOMINAL * 36 // IBMBIDI_NUMERAL_REGULAR 37 // IBMBIDI_NUMERAL_HINDICONTEXT 38 // IBMBIDI_NUMERAL_ARABIC 39 // IBMBIDI_NUMERAL_HINDI 40 41 switch (aNumFlag) { 42 case IBMBIDI_NUMERAL_HINDI: 43 return NUM_TO_HINDI(aChar); 44 case IBMBIDI_NUMERAL_ARABIC: 45 return NUM_TO_ARABIC(aChar); 46 case IBMBIDI_NUMERAL_PERSIAN: 47 return NUM_TO_PERSIAN(aChar); 48 case IBMBIDI_NUMERAL_REGULAR: 49 case IBMBIDI_NUMERAL_HINDICONTEXT: 50 case IBMBIDI_NUMERAL_PERSIANCONTEXT: 51 // for clipboard handling 52 // XXX do we really want to convert numerals when copying text? 53 if (aPrevCharArabic) { 54 return aNumFlag == IBMBIDI_NUMERAL_PERSIANCONTEXT 55 ? NUM_TO_PERSIAN(aChar) 56 : NUM_TO_HINDI(aChar); 57 } 58 return NUM_TO_ARABIC(aChar); 59 case IBMBIDI_NUMERAL_NOMINAL: 60 default: 61 return aChar; 62 } 63 } 64 65 nsresult HandleNumbers(char16_t* aBuffer, uint32_t aSize, uint32_t aNumFlag) { 66 uint32_t i; 67 68 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 for (i = 0; i < aSize; i++) 76 aBuffer[i] = HandleNumberInChar( 77 aBuffer[i], !!(i > 0 ? aBuffer[i - 1] : 0), aNumFlag); 78 break; 79 case IBMBIDI_NUMERAL_NOMINAL: 80 default: 81 break; 82 } 83 return NS_OK; 84 }