1 /* 2 * Copyright (C) 2006 George Staikos <staikos (at) kde.org> 3 * Copyright (C) 2006 Alexey Proskuryakov <ap (at) nypop.com> 4 * Copyright (C) 2007 Apple Computer, Inc. All rights reserved. 5 * Copyright (C) 2007-2009 Torch Mobile, Inc. 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Library General Public 9 * License as published by the Free Software Foundation; either 10 * version 2 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Library General Public License for more details. 16 * 17 * You should have received a copy of the GNU Library General Public License 18 * along with this library; see the file COPYING.LIB. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20 * Boston, MA 02110-1301, USA. 21 * 22 */ 23 24 #ifndef WTF_UnicodeWinCE_h 25 #define WTF_UnicodeWinCE_h 26 27 #include "UnicodeMacrosFromICU.h" 28 29 #include "ce_unicode.h" 30 31 #define TO_MASK(x) (1 << (x)) 32 33 namespace WTF { 34 namespace Unicode { 35 36 enum Direction { 37 LeftToRight = UnicodeCE::U_LEFT_TO_RIGHT, 38 RightToLeft = UnicodeCE::U_RIGHT_TO_LEFT, 39 EuropeanNumber = UnicodeCE::U_EUROPEAN_NUMBER, 40 EuropeanNumberSeparator = UnicodeCE::U_EUROPEAN_NUMBER_SEPARATOR, 41 EuropeanNumberTerminator = UnicodeCE::U_EUROPEAN_NUMBER_TERMINATOR, 42 ArabicNumber = UnicodeCE::U_ARABIC_NUMBER, 43 CommonNumberSeparator = UnicodeCE::U_COMMON_NUMBER_SEPARATOR, 44 BlockSeparator = UnicodeCE::U_BLOCK_SEPARATOR, 45 SegmentSeparator = UnicodeCE::U_SEGMENT_SEPARATOR, 46 WhiteSpaceNeutral = UnicodeCE::U_WHITE_SPACE_NEUTRAL, 47 OtherNeutral = UnicodeCE::U_OTHER_NEUTRAL, 48 LeftToRightEmbedding = UnicodeCE::U_LEFT_TO_RIGHT_EMBEDDING, 49 LeftToRightOverride = UnicodeCE::U_LEFT_TO_RIGHT_OVERRIDE, 50 RightToLeftArabic = UnicodeCE::U_RIGHT_TO_LEFT_ARABIC, 51 RightToLeftEmbedding = UnicodeCE::U_RIGHT_TO_LEFT_EMBEDDING, 52 RightToLeftOverride = UnicodeCE::U_RIGHT_TO_LEFT_OVERRIDE, 53 PopDirectionalFormat = UnicodeCE::U_POP_DIRECTIONAL_FORMAT, 54 NonSpacingMark = UnicodeCE::U_DIR_NON_SPACING_MARK, 55 BoundaryNeutral = UnicodeCE::U_BOUNDARY_NEUTRAL 56 }; 57 58 enum DecompositionType { 59 DecompositionNone = UnicodeCE::U_DT_NONE, 60 DecompositionCanonical = UnicodeCE::U_DT_CANONICAL, 61 DecompositionCompat = UnicodeCE::U_DT_COMPAT, 62 DecompositionCircle = UnicodeCE::U_DT_CIRCLE, 63 DecompositionFinal = UnicodeCE::U_DT_FINAL, 64 DecompositionFont = UnicodeCE::U_DT_FONT, 65 DecompositionFraction = UnicodeCE::U_DT_FRACTION, 66 DecompositionInitial = UnicodeCE::U_DT_INITIAL, 67 DecompositionIsolated = UnicodeCE::U_DT_ISOLATED, 68 DecompositionMedial = UnicodeCE::U_DT_MEDIAL, 69 DecompositionNarrow = UnicodeCE::U_DT_NARROW, 70 DecompositionNoBreak = UnicodeCE::U_DT_NOBREAK, 71 DecompositionSmall = UnicodeCE::U_DT_SMALL, 72 DecompositionSquare = UnicodeCE::U_DT_SQUARE, 73 DecompositionSub = UnicodeCE::U_DT_SUB, 74 DecompositionSuper = UnicodeCE::U_DT_SUPER, 75 DecompositionVertical = UnicodeCE::U_DT_VERTICAL, 76 DecompositionWide = UnicodeCE::U_DT_WIDE 77 }; 78 79 enum CharCategory { 80 NoCategory = 0, 81 Other_NotAssigned = TO_MASK(UnicodeCE::U_GENERAL_OTHER_TYPES), 82 Letter_Uppercase = TO_MASK(UnicodeCE::U_UPPERCASE_LETTER), 83 Letter_Lowercase = TO_MASK(UnicodeCE::U_LOWERCASE_LETTER), 84 Letter_Titlecase = TO_MASK(UnicodeCE::U_TITLECASE_LETTER), 85 Letter_Modifier = TO_MASK(UnicodeCE::U_MODIFIER_LETTER), 86 Letter_Other = TO_MASK(UnicodeCE::U_OTHER_LETTER), 87 88 Mark_NonSpacing = TO_MASK(UnicodeCE::U_NON_SPACING_MARK), 89 Mark_Enclosing = TO_MASK(UnicodeCE::U_ENCLOSING_MARK), 90 Mark_SpacingCombining = TO_MASK(UnicodeCE::U_COMBINING_SPACING_MARK), 91 92 Number_DecimalDigit = TO_MASK(UnicodeCE::U_DECIMAL_DIGIT_NUMBER), 93 Number_Letter = TO_MASK(UnicodeCE::U_LETTER_NUMBER), 94 Number_Other = TO_MASK(UnicodeCE::U_OTHER_NUMBER), 95 96 Separator_Space = TO_MASK(UnicodeCE::U_SPACE_SEPARATOR), 97 Separator_Line = TO_MASK(UnicodeCE::U_LINE_SEPARATOR), 98 Separator_Paragraph = TO_MASK(UnicodeCE::U_PARAGRAPH_SEPARATOR), 99 100 Other_Control = TO_MASK(UnicodeCE::U_CONTROL_CHAR), 101 Other_Format = TO_MASK(UnicodeCE::U_FORMAT_CHAR), 102 Other_PrivateUse = TO_MASK(UnicodeCE::U_PRIVATE_USE_CHAR), 103 Other_Surrogate = TO_MASK(UnicodeCE::U_SURROGATE), 104 105 Punctuation_Dash = TO_MASK(UnicodeCE::U_DASH_PUNCTUATION), 106 Punctuation_Open = TO_MASK(UnicodeCE::U_START_PUNCTUATION), 107 Punctuation_Close = TO_MASK(UnicodeCE::U_END_PUNCTUATION), 108 Punctuation_Connector = TO_MASK(UnicodeCE::U_CONNECTOR_PUNCTUATION), 109 Punctuation_Other = TO_MASK(UnicodeCE::U_OTHER_PUNCTUATION), 110 111 Symbol_Math = TO_MASK(UnicodeCE::U_MATH_SYMBOL), 112 Symbol_Currency = TO_MASK(UnicodeCE::U_CURRENCY_SYMBOL), 113 Symbol_Modifier = TO_MASK(UnicodeCE::U_MODIFIER_SYMBOL), 114 Symbol_Other = TO_MASK(UnicodeCE::U_OTHER_SYMBOL), 115 116 Punctuation_InitialQuote = TO_MASK(UnicodeCE::U_INITIAL_PUNCTUATION), 117 Punctuation_FinalQuote = TO_MASK(UnicodeCE::U_FINAL_PUNCTUATION) 118 }; 119 120 CharCategory category(unsigned int); 121 122 bool isSpace(UChar); 123 bool isLetter(UChar); 124 bool isPrintableChar(UChar); 125 bool isUpper(UChar); 126 bool isLower(UChar); 127 bool isPunct(UChar); 128 bool isDigit(UChar); 129 bool isAlphanumeric(UChar); 130 inline bool isSeparatorSpace(UChar c) { return category(c) == Separator_Space; } 131 inline bool isHighSurrogate(UChar c) { return (c & 0xfc00) == 0xd800; } 132 inline bool isLowSurrogate(UChar c) { return (c & 0xfc00) == 0xdc00; } 133 134 UChar toLower(UChar); 135 UChar toUpper(UChar); 136 UChar foldCase(UChar); 137 UChar toTitleCase(UChar); 138 int toLower(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError); 139 int toUpper(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError); 140 int foldCase(UChar* result, int resultLength, const UChar* source, int sourceLength, bool* isError); 141 142 int digitValue(UChar); 143 144 UChar mirroredChar(UChar32); 145 unsigned char combiningClass(UChar32); 146 DecompositionType decompositionType(UChar32); 147 Direction direction(UChar32); 148 inline bool isArabicChar(UChar32 c) 149 { 150 return c >= 0x0600 && c <= 0x06FF; 151 } 152 153 inline bool hasLineBreakingPropertyComplexContext(UChar32) 154 { 155 return false; // FIXME: implement! 156 } 157 158 inline int umemcasecmp(const UChar* a, const UChar* b, int len) 159 { 160 for (int i = 0; i < len; ++i) { 161 UChar c1 = foldCase(a[i]); 162 UChar c2 = foldCase(b[i]); 163 if (c1 != c2) 164 return c1 - c2; 165 } 166 return 0; 167 } 168 169 inline UChar32 surrogateToUcs4(UChar high, UChar low) 170 { 171 return (UChar32(high) << 10) + low - 0x35fdc00; 172 } 173 174 } // namespace Unicode 175 } // namespace WTF 176 177 #endif // WTF_UnicodeWinCE_h 178