Reviewed by Darin.
[WebKit-https.git] / JavaScriptCore / kxmlcore / unicode / icu / UnicodeIcu.h
1 // -*- c-basic-offset: 2 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 2006 George Staikos <staikos@kde.org>
5  *  Copyright (C) 2006 Alexey Proskuryakov <ap@nypop.com>
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 KJS_UNICODE_ICU_H
25 #define KJS_UNICODE_ICU_H
26
27 #include <unicode/uchar.h>
28 #include <unicode/ustring.h>
29
30 #include "../UnicodeCategory.h"
31
32 namespace KXMLCore {
33   namespace Unicode {
34
35     inline int toLower(uint16_t* str, int strLength, uint16_t*& destIfNeeded)
36     {
37       UErrorCode err = U_ZERO_ERROR;
38       int resultLength;
39       destIfNeeded = 0;
40
41       resultLength = u_strToLower(0, 0, str, strLength, "", &err);
42
43       if (resultLength <= strLength) {
44         err = U_ZERO_ERROR;
45         u_strToLower(str, resultLength, str, strLength, "", &err);
46       } else {
47         err = U_ZERO_ERROR;
48         destIfNeeded = (uint16_t*)malloc(resultLength * sizeof(uint16_t));
49         u_strToLower(destIfNeeded, resultLength, str, strLength, "", &err);
50       }
51
52       return U_FAILURE(err) ? -1 : resultLength;
53     }
54
55     inline int toUpper(uint16_t* str, int strLength, uint16_t*& destIfNeeded)
56     {
57       UErrorCode err = U_ZERO_ERROR;
58       int resultLength;
59       destIfNeeded = 0;
60
61       resultLength = u_strToUpper(0, 0, str, strLength, "", &err);
62
63       if (resultLength <= strLength) {
64         err = U_ZERO_ERROR;
65         u_strToUpper(str, resultLength, str, strLength, "", &err);
66       } else {
67         err = U_ZERO_ERROR;
68         destIfNeeded = (uint16_t*)malloc(resultLength * sizeof(uint16_t));
69         u_strToUpper(destIfNeeded, resultLength, str, strLength, "", &err);
70       }
71
72       return U_FAILURE(err) ? -1 : resultLength;
73     }
74
75     inline bool isFormatChar(int32_t c)
76     {
77       return u_charType(c) == U_FORMAT_CHAR;
78     }
79
80     inline bool isSeparatorSpace(int32_t c)
81     {
82       return u_charType(c) == U_SPACE_SEPARATOR;
83     }
84
85     inline CharCategory category(int32_t c)
86     {
87       switch (u_charType(c)) {
88         case U_NON_SPACING_MARK:
89           return Mark_NonSpacing;
90         case U_COMBINING_SPACING_MARK:
91           return Mark_SpacingCombining;
92         case U_ENCLOSING_MARK:
93           return Mark_Enclosing;
94         case U_DECIMAL_DIGIT_NUMBER:
95           return Number_DecimalDigit;
96         case U_LETTER_NUMBER:
97           return Number_Letter;
98         case U_OTHER_NUMBER:
99           return Number_Other;
100         case U_SPACE_SEPARATOR:
101           return Separator_Space;
102         case U_LINE_SEPARATOR:
103           return Separator_Line;
104         case U_PARAGRAPH_SEPARATOR:
105           return Separator_Paragraph;
106         case U_CONTROL_CHAR:
107           return Other_Control;
108         case U_FORMAT_CHAR:
109           return Other_Format;
110         case U_SURROGATE:
111           return Other_Surrogate;
112         case U_PRIVATE_USE_CHAR:
113           return Other_PrivateUse;
114         case U_GENERAL_OTHER_TYPES:
115           return Other_NotAssigned;
116         case U_UPPERCASE_LETTER:
117           return Letter_Uppercase;
118         case U_LOWERCASE_LETTER:
119           return Letter_Lowercase;
120         case U_TITLECASE_LETTER:
121           return Letter_Titlecase;
122         case U_MODIFIER_LETTER:
123           return Letter_Modifier;
124         case U_OTHER_LETTER:
125           return Letter_Other;
126         case U_CONNECTOR_PUNCTUATION:
127           return Punctuation_Connector;
128         case U_DASH_PUNCTUATION:
129           return Punctuation_Dash;
130         case U_START_PUNCTUATION:
131           return Punctuation_Open;
132         case U_END_PUNCTUATION:
133           return Punctuation_Close;
134         case U_INITIAL_PUNCTUATION:
135           return Punctuation_InitialQuote;
136         case U_FINAL_PUNCTUATION:
137           return Punctuation_FinalQuote;
138         case U_OTHER_PUNCTUATION:
139           return Punctuation_Other;
140         case U_MATH_SYMBOL:
141           return Symbol_Math;
142         case U_CURRENCY_SYMBOL:
143           return Symbol_Currency;
144         case U_MODIFIER_SYMBOL:
145           return Symbol_Modifier;
146         case U_OTHER_SYMBOL:
147           return Symbol_Other;
148         default:
149           return NoCategory;
150       }
151     }
152   }
153 }
154
155 #endif
156 // vim: ts=2 sw=2 et