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