2004-01-19 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 const 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         GUnicodeType t = g_unichar_type (c);
123         MONO_ARCH_SAVE_REGS;
124
125         /* The .NET spec is very specific about what IsPunctuation is */
126         return (t == G_UNICODE_CONNECT_PUNCTUATION || t == G_UNICODE_DASH_PUNCTUATION ||
127                 t == G_UNICODE_OPEN_PUNCTUATION || t == G_UNICODE_CLOSE_PUNCTUATION ||
128                 t == G_UNICODE_INITIAL_PUNCTUATION || t == G_UNICODE_FINAL_PUNCTUATION ||
129                 t == G_UNICODE_OTHER_PUNCTUATION);
130 }
131
132 gboolean 
133 ves_icall_System_Char_IsSeparator (gunichar2 c)
134 {
135         GUnicodeType t = g_unichar_type (c);
136
137         MONO_ARCH_SAVE_REGS;
138
139         return (t == G_UNICODE_LINE_SEPARATOR ||
140                 t == G_UNICODE_PARAGRAPH_SEPARATOR ||
141                 t == G_UNICODE_SPACE_SEPARATOR);
142 }
143
144 gboolean 
145 ves_icall_System_Char_IsSurrogate (gunichar2 c)
146 {
147         MONO_ARCH_SAVE_REGS;
148
149         return (g_unichar_type (c) == G_UNICODE_SURROGATE);
150 }
151
152 gboolean 
153 ves_icall_System_Char_IsSymbol (gunichar2 c)
154 {
155         GUnicodeType t = g_unichar_type (c);
156
157         MONO_ARCH_SAVE_REGS;
158
159         return (t == G_UNICODE_CURRENCY_SYMBOL ||
160                 t == G_UNICODE_MODIFIER_SYMBOL ||
161                 t == G_UNICODE_MATH_SYMBOL ||
162                 t == G_UNICODE_OTHER_SYMBOL);
163 }
164
165 gboolean 
166 ves_icall_System_Char_IsWhiteSpace (gunichar2 c)
167 {
168         MONO_ARCH_SAVE_REGS;
169
170         return g_unichar_isspace (c);
171 }
172
173 gunichar2
174 ves_icall_System_Char_ToLower (gunichar2 c)
175 {
176         MONO_ARCH_SAVE_REGS;
177
178         return g_unichar_tolower (c);
179 }
180
181 gunichar2
182 ves_icall_System_Char_ToUpper (gunichar2 c)
183 {
184         MONO_ARCH_SAVE_REGS;
185
186         return g_unichar_toupper (c);
187 }
188