2003-02-21 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / metadata / unicode.c
1 /*
2  * unicode.h: Unicode support
3  *
4  * Author:
5  *      Dietmar Maurer (dietmar@ximian.com)
6  *
7  * (C) 2001 Ximian, Inc.
8  */
9
10 #include <config.h>
11 #include <glib.h>
12 #include <errno.h>
13
14 #include <mono/metadata/object.h>
15 #include <mono/metadata/unicode.h>
16 #include <mono/metadata/exception.h>
17
18 static MonoUnicodeCategory catmap[] = {
19         /* G_UNICODE_CONTROL = */              Control,
20         /* G_UNICODE_FORMAT = */               Format,
21         /* G_UNICODE_UNASSIGNED = */           OtherNotAssigned,
22         /* G_UNICODE_PRIVATE_USE = */          PrivateUse,
23         /* G_UNICODE_SURROGATE = */            Surrogate,
24         /* G_UNICODE_LOWERCASE_LETTER = */     LowercaseLetter,
25         /* G_UNICODE_MODIFIER_LETTER = */      ModifierLetter,
26         /* G_UNICODE_OTHER_LETTER = */         OtherLetter,
27         /* G_UNICODE_TITLECASE_LETTER = */     TitlecaseLetter,
28         /* G_UNICODE_UPPERCASE_LETTER = */     UppercaseLetter,
29         /* G_UNICODE_COMBINING_MARK = */       SpaceCombiningMark,
30         /* G_UNICODE_ENCLOSING_MARK = */       EnclosingMark,
31         /* G_UNICODE_NON_SPACING_MARK = */     NonSpacingMark,
32         /* G_UNICODE_DECIMAL_NUMBER = */       DecimalDigitNumber,
33         /* G_UNICODE_LETTER_NUMBER = */        LetterNumber,
34         /* G_UNICODE_OTHER_NUMBER = */         OtherNumber,
35         /* G_UNICODE_CONNECT_PUNCTUATION = */  ConnectorPunctuation,
36         /* G_UNICODE_DASH_PUNCTUATION = */     DashPunctuation,
37         /* G_UNICODE_CLOSE_PUNCTUATION = */    ClosePunctuation,
38         /* G_UNICODE_FINAL_PUNCTUATION = */    FinalQuotePunctuation,
39         /* G_UNICODE_INITIAL_PUNCTUATION = */  InitialQuotePunctuation,
40         /* G_UNICODE_OTHER_PUNCTUATION = */    OtherPunctuation,
41         /* G_UNICODE_OPEN_PUNCTUATION = */     OpenPunctuation,
42         /* G_UNICODE_CURRENCY_SYMBOL = */      CurrencySymbol,
43         /* G_UNICODE_MODIFIER_SYMBOL = */      ModifierSymbol,
44         /* G_UNICODE_MATH_SYMBOL = */          MathSymbol,
45         /* G_UNICODE_OTHER_SYMBOL = */         OtherSymbol,
46         /* G_UNICODE_LINE_SEPARATOR = */       LineSeperator,
47         /* G_UNICODE_PARAGRAPH_SEPARATOR = */  ParagraphSeperator,
48         /* G_UNICODE_SPACE_SEPARATOR = */      SpaceSeperator,
49 };
50
51 double 
52 ves_icall_System_Char_GetNumericValue (gunichar2 c)
53 {
54         MONO_ARCH_SAVE_REGS;
55
56         return (double)g_unichar_digit_value (c);
57 }
58
59 MonoUnicodeCategory 
60 ves_icall_System_Char_GetUnicodeCategory (gunichar2 c)
61 {
62         MONO_ARCH_SAVE_REGS;
63
64         return catmap [g_unichar_type (c)];
65 }
66
67 gboolean 
68 ves_icall_System_Char_IsControl (gunichar2 c)
69 {
70         MONO_ARCH_SAVE_REGS;
71
72         return g_unichar_iscntrl (c);
73 }
74
75 gboolean 
76 ves_icall_System_Char_IsDigit (gunichar2 c)
77 {
78         MONO_ARCH_SAVE_REGS;
79
80         return g_unichar_isdigit (c);
81 }
82
83 gboolean 
84 ves_icall_System_Char_IsLetter (gunichar2 c)
85 {
86         MONO_ARCH_SAVE_REGS;
87
88         return g_unichar_isalpha (c);
89 }
90
91 gboolean 
92 ves_icall_System_Char_IsLower (gunichar2 c)
93 {
94         MONO_ARCH_SAVE_REGS;
95
96         return g_unichar_islower (c);
97 }
98
99 gboolean 
100 ves_icall_System_Char_IsUpper (gunichar2 c)
101 {
102         MONO_ARCH_SAVE_REGS;
103
104         return g_unichar_isupper (c);
105 }
106
107 gboolean 
108 ves_icall_System_Char_IsNumber (gunichar2 c)
109 {
110         GUnicodeType t = g_unichar_type (c);
111
112         MONO_ARCH_SAVE_REGS;
113
114         return t == G_UNICODE_DECIMAL_NUMBER ||
115                 t == G_UNICODE_LETTER_NUMBER ||
116                 t == G_UNICODE_OTHER_NUMBER;
117 }
118
119 gboolean 
120 ves_icall_System_Char_IsPunctuation (gunichar2 c)
121 {
122         MONO_ARCH_SAVE_REGS;
123
124         return g_unichar_ispunct (c);
125 }
126
127 gboolean 
128 ves_icall_System_Char_IsSeparator (gunichar2 c)
129 {
130         GUnicodeType t = g_unichar_type (c);
131
132         MONO_ARCH_SAVE_REGS;
133
134         return (t == G_UNICODE_LINE_SEPARATOR ||
135                 t == G_UNICODE_PARAGRAPH_SEPARATOR ||
136                 t == G_UNICODE_SPACE_SEPARATOR);
137 }
138
139 gboolean 
140 ves_icall_System_Char_IsSurrogate (gunichar2 c)
141 {
142         MONO_ARCH_SAVE_REGS;
143
144         return (g_unichar_type (c) == G_UNICODE_SURROGATE);
145 }
146
147 gboolean 
148 ves_icall_System_Char_IsSymbol (gunichar2 c)
149 {
150         GUnicodeType t = g_unichar_type (c);
151
152         MONO_ARCH_SAVE_REGS;
153
154         return (t == G_UNICODE_CURRENCY_SYMBOL ||
155                 t == G_UNICODE_MODIFIER_SYMBOL ||
156                 t == G_UNICODE_MATH_SYMBOL ||
157                 t == G_UNICODE_OTHER_SYMBOL);
158 }
159
160 gboolean 
161 ves_icall_System_Char_IsWhiteSpace (gunichar2 c)
162 {
163         MONO_ARCH_SAVE_REGS;
164
165         return g_unichar_isspace (c);
166 }
167
168 gunichar2
169 ves_icall_System_Char_ToLower (gunichar2 c)
170 {
171         MONO_ARCH_SAVE_REGS;
172
173         return g_unichar_tolower (c);
174 }
175
176 gunichar2
177 ves_icall_System_Char_ToUpper (gunichar2 c)
178 {
179         MONO_ARCH_SAVE_REGS;
180
181         return g_unichar_toupper (c);
182 }
183