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 : }
|