]> git.lizzy.rs Git - rust.git/blob - src/libextra/unicode.rs
auto merge of #8285 : huonw/rust/deriving+++, r=alexcrichton
[rust.git] / src / libextra / unicode.rs
1 // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 #[allow(missing_doc)];
12
13 pub mod icu {
14     pub type UBool = u8;
15     pub type UProperty = int;
16     pub type UChar32 = char;
17
18     pub static TRUE : u8 = 1u8;
19     pub static FALSE : u8 = 0u8;
20
21     pub static UCHAR_ALPHABETIC : UProperty = 0;
22     pub static UCHAR_BINARY_START : UProperty = 0; // = UCHAR_ALPHABETIC
23     pub static UCHAR_ASCII_HEX_DIGIT : UProperty = 1;
24     pub static UCHAR_BIDI_CONTROL : UProperty = 2;
25
26     pub static UCHAR_BIDI_MIRRORED : UProperty = 3;
27     pub static UCHAR_DASH : UProperty = 4;
28     pub static UCHAR_DEFAULT_IGNORABLE_CODE_POINT : UProperty = 5;
29     pub static UCHAR_DEPRECATED : UProperty = 6;
30
31     pub static UCHAR_DIACRITIC : UProperty = 7;
32     pub static UCHAR_EXTENDER : UProperty = 8;
33     pub static UCHAR_FULL_COMPOSITION_EXCLUSION : UProperty = 9;
34     pub static UCHAR_GRAPHEME_BASE : UProperty = 10;
35
36     pub static UCHAR_GRAPHEME_EXTEND : UProperty = 11;
37     pub static UCHAR_GRAPHEME_LINK : UProperty = 12;
38     pub static UCHAR_HEX_DIGIT : UProperty = 13;
39     pub static UCHAR_HYPHEN : UProperty = 14;
40
41     pub static UCHAR_ID_CONTINUE : UProperty = 15;
42     pub static UCHAR_ID_START : UProperty = 16;
43     pub static UCHAR_IDEOGRAPHIC : UProperty = 17;
44     pub static UCHAR_IDS_BINARY_OPERATOR : UProperty = 18;
45
46     pub static UCHAR_IDS_TRINARY_OPERATOR : UProperty = 19;
47     pub static UCHAR_JOIN_CONTROL : UProperty = 20;
48     pub static UCHAR_LOGICAL_ORDER_EXCEPTION : UProperty = 21;
49     pub static UCHAR_LOWERCASE : UProperty = 22;
50
51     pub static UCHAR_MATH : UProperty = 23;
52     pub static UCHAR_NONCHARACTER_CODE_POINT : UProperty = 24;
53     pub static UCHAR_QUOTATION_MARK : UProperty = 25;
54     pub static UCHAR_RADICAL : UProperty = 26;
55
56     pub static UCHAR_SOFT_DOTTED : UProperty = 27;
57     pub static UCHAR_TERMINAL_PUNCTUATION : UProperty = 28;
58     pub static UCHAR_UNIFIED_IDEOGRAPH : UProperty = 29;
59     pub static UCHAR_UPPERCASE : UProperty = 30;
60
61     pub static UCHAR_WHITE_SPACE : UProperty = 31;
62     pub static UCHAR_XID_CONTINUE : UProperty = 32;
63     pub static UCHAR_XID_START : UProperty = 33;
64     pub static UCHAR_CASE_SENSITIVE : UProperty = 34;
65
66     pub static UCHAR_S_TERM : UProperty = 35;
67     pub static UCHAR_VARIATION_SELECTOR : UProperty = 36;
68     pub static UCHAR_NFD_INERT : UProperty = 37;
69     pub static UCHAR_NFKD_INERT : UProperty = 38;
70
71     pub static UCHAR_NFC_INERT : UProperty = 39;
72     pub static UCHAR_NFKC_INERT : UProperty = 40;
73     pub static UCHAR_SEGMENT_STARTER : UProperty = 41;
74     pub static UCHAR_PATTERN_SYNTAX : UProperty = 42;
75
76     pub static UCHAR_PATTERN_WHITE_SPACE : UProperty = 43;
77     pub static UCHAR_POSIX_ALNUM : UProperty = 44;
78     pub static UCHAR_POSIX_BLANK : UProperty = 45;
79     pub static UCHAR_POSIX_GRAPH : UProperty = 46;
80
81     pub static UCHAR_POSIX_PRINT : UProperty = 47;
82     pub static UCHAR_POSIX_XDIGIT : UProperty = 48;
83     pub static UCHAR_CASED : UProperty = 49;
84     pub static UCHAR_CASE_IGNORABLE : UProperty = 50;
85
86     pub static UCHAR_CHANGES_WHEN_LOWERCASED : UProperty = 51;
87     pub static UCHAR_CHANGES_WHEN_UPPERCASED : UProperty = 52;
88     pub static UCHAR_CHANGES_WHEN_TITLECASED : UProperty = 53;
89     pub static UCHAR_CHANGES_WHEN_CASEFOLDED : UProperty = 54;
90
91     pub static UCHAR_CHANGES_WHEN_CASEMAPPED : UProperty = 55;
92     pub static UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED : UProperty = 56;
93     pub static UCHAR_BINARY_LIMIT : UProperty = 57;
94     pub static UCHAR_BIDI_CLASS : UProperty = 0x1000;
95
96     pub static UCHAR_INT_START : UProperty = 0x1000; // UCHAR_BIDI_CLASS
97     pub static UCHAR_BLOCK : UProperty = 0x1001;
98     pub static UCHAR_CANONICAL_COMBINING_CLASS : UProperty = 0x1002;
99     pub static UCHAR_DECOMPOSITION_TYPE : UProperty = 0x1003;
100
101     pub static UCHAR_EAST_ASIAN_WIDTH : UProperty = 0x1004;
102     pub static UCHAR_GENERAL_CATEGORY : UProperty = 0x1005;
103     pub static UCHAR_JOINING_GROUP : UProperty = 0x1006;
104     pub static UCHAR_JOINING_TYPE : UProperty = 0x1007;
105
106     pub static UCHAR_LINE_BREAK : UProperty = 0x1008;
107     pub static UCHAR_NUMERIC_TYPE : UProperty = 0x1009;
108     pub static UCHAR_SCRIPT : UProperty = 0x100A;
109     pub static UCHAR_HANGUL_SYLLABLE_TYPE : UProperty = 0x100B;
110
111     pub static UCHAR_NFD_QUICK_CHECK : UProperty = 0x100C;
112     pub static UCHAR_NFKD_QUICK_CHECK : UProperty = 0x100D;
113     pub static UCHAR_NFC_QUICK_CHECK : UProperty = 0x100E;
114     pub static UCHAR_NFKC_QUICK_CHECK : UProperty = 0x100F;
115
116     pub static UCHAR_LEAD_CANONICAL_COMBINING_CLASS : UProperty = 0x1010;
117     pub static UCHAR_TRAIL_CANONICAL_COMBINING_CLASS : UProperty = 0x1011;
118     pub static UCHAR_GRAPHEME_CLUSTER_BREAK : UProperty = 0x1012;
119     pub static UCHAR_SENTENCE_BREAK : UProperty = 0x1013;
120
121     pub static UCHAR_WORD_BREAK : UProperty = 0x1014;
122     pub static UCHAR_INT_LIMIT : UProperty = 0x1015;
123
124     pub static UCHAR_GENERAL_CATEGORY_MASK : UProperty = 0x2000;
125     pub static UCHAR_MASK_START : UProperty = 0x2000;
126     // = UCHAR_GENERAL_CATEGORY_MASK
127     pub static UCHAR_MASK_LIMIT : UProperty = 0x2001;
128
129     pub static UCHAR_NUMERIC_VALUE : UProperty = 0x3000;
130     pub static UCHAR_DOUBLE_START : UProperty = 0x3000;
131     // = UCHAR_NUMERIC_VALUE
132     pub static UCHAR_DOUBLE_LIMIT : UProperty = 0x3001;
133
134     pub static UCHAR_AGE : UProperty = 0x4000;
135     pub static UCHAR_STRING_START : UProperty = 0x4000; // = UCHAR_AGE
136     pub static UCHAR_BIDI_MIRRORING_GLYPH : UProperty = 0x4001;
137     pub static UCHAR_CASE_FOLDING : UProperty = 0x4002;
138
139     pub static UCHAR_ISO_COMMENT : UProperty = 0x4003;
140     pub static UCHAR_LOWERCASE_MAPPING : UProperty = 0x4004;
141     pub static UCHAR_NAME : UProperty = 0x4005;
142     pub static UCHAR_SIMPLE_CASE_FOLDING : UProperty = 0x4006;
143
144     pub static UCHAR_SIMPLE_LOWERCASE_MAPPING : UProperty = 0x4007;
145     pub static UCHAR_SIMPLE_TITLECASE_MAPPING : UProperty = 0x4008;
146     pub static UCHAR_SIMPLE_UPPERCASE_MAPPING : UProperty = 0x4009;
147     pub static UCHAR_TITLECASE_MAPPING : UProperty = 0x400A;
148
149     pub static UCHAR_UNICODE_1_NAME : UProperty = 0x400B;
150     pub static UCHAR_UPPERCASE_MAPPING : UProperty = 0x400C;
151     pub static UCHAR_STRING_LIMIT : UProperty = 0x400D;
152
153     pub static UCHAR_SCRIPT_EXTENSIONS : UProperty = 0x7000;
154     pub static UCHAR_OTHER_PROPERTY_START : UProperty = 0x7000;
155     // = UCHAR_SCRIPT_EXTENSIONS;
156     pub static UCHAR_OTHER_PROPERTY_LIMIT : UProperty = 0x7001;
157
158     pub static UCHAR_INVALID_CODE : UProperty = -1;
159
160     pub mod libicu {
161         use unicode::icu::*;
162
163         // #[link_name = "icuuc"]
164         #[link_args = "-licuuc"]
165         #[abi = "cdecl"]
166         extern {
167             pub fn u_hasBinaryProperty(c: UChar32, which: UProperty) -> UBool;
168             pub fn u_isdigit(c: UChar32) -> UBool;
169             pub fn u_islower(c: UChar32) -> UBool;
170             pub fn u_isspace(c: UChar32) -> UBool;
171             pub fn u_isupper(c: UChar32) -> UBool;
172             pub fn u_tolower(c: UChar32) -> UChar32;
173             pub fn u_toupper(c: UChar32) -> UChar32;
174         }
175     }
176 }
177
178 pub fn is_XID_start(c: char) -> bool {
179     unsafe {
180         return icu::libicu::u_hasBinaryProperty(c, icu::UCHAR_XID_START)
181             == icu::TRUE;
182     }
183 }
184
185 pub fn is_XID_continue(c: char) -> bool {
186     unsafe {
187         return icu::libicu::u_hasBinaryProperty(c, icu::UCHAR_XID_START)
188             == icu::TRUE;
189     }
190 }
191
192 /*
193 Function: is_digit
194
195 Returns true if a character is a digit.
196 */
197 pub fn is_digit(c: char) -> bool {
198     unsafe {
199         return icu::libicu::u_isdigit(c) == icu::TRUE;
200     }
201 }
202
203 /*
204 Function: is_lower
205
206 Returns true if a character is a lowercase letter.
207 */
208 pub fn is_lower(c: char) -> bool {
209     unsafe {
210         return icu::libicu::u_islower(c) == icu::TRUE;
211     }
212 }
213
214 /*
215 Function: is_space
216
217 Returns true if a character is space.
218 */
219 pub fn is_space(c: char) -> bool {
220     unsafe {
221         return icu::libicu::u_isspace(c) == icu::TRUE;
222     }
223 }
224
225 /*
226 Function: is_upper
227
228 Returns true if a character is an uppercase letter.
229 */
230 pub fn is_upper(c: char) -> bool {
231     unsafe {
232         return icu::libicu::u_isupper(c) == icu::TRUE;
233     }
234 }
235
236 #[cfg(test)]
237 mod tests {
238     use unicode::*;
239
240     #[test]
241     fn test_is_digit() {
242         assert!((is_digit('0')));
243         assert!((!is_digit('m')));
244     }
245
246     #[test]
247     fn test_is_lower() {
248         assert!((is_lower('m')));
249         assert!((!is_lower('M')));
250     }
251
252     #[test]
253     fn test_is_space() {
254         assert!((is_space(' ')));
255         assert!((!is_space('m')));
256     }
257
258     #[test]
259     fn test_is_upper() {
260         assert!((is_upper('M')));
261         assert!((!is_upper('m')));
262     }
263 }