2004-04-05 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml / XmlChar.cs
1 // -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-\r
2 //\r
3 // System.Xml.XmlChar.cs\r
4 //\r
5 // Author:\r
6 //   Jason Diamond (jason@injektilo.org)\r
7 //\r
8 // (C) 2001 Jason Diamond  http://injektilo.org/\r
9 //\r
10 \r
11 namespace System.Xml\r
12 {\r
13         // Now, "XmlChar" and "XmlConstructs" are made as equivalent, so\r
14         // I dicided to rename XmlConstruts class as "XmlChar" and use it\r
15         // for default build.\r
16         // However, this class will be used for the future compact framework \r
17         // (XmlConstruts class uses not a little memory).\r
18         internal class XmlCharCompact\r
19         {\r
20                 public static char [] WhitespaceChars = new char [] {' ', '\n', '\t', '\r'};
21 \r
22                 public static bool IsWhitespace (int ch)\r
23                 {\r
24                         return ch == 0x20 || ch == 0x9 || ch == 0xD || ch == 0xA;\r
25                 }\r
26 \r
27                 public static bool IsWhitespace (string str)\r
28                 {\r
29                         for (int i = 0; i < str.Length; i++)
30                                 if (!IsWhitespace (str [i])) return false;
31                                 \r
32                         return true;\r
33                 }\r
34 \r
35                 public static bool IsFirstNameChar (int ch)\r
36                 {\r
37                         bool result = false;\r
38 \r
39                         if (ch >= 0 && ch <= 0xFFFF)\r
40                         {\r
41                                 result = (nameBitmap[(firstNamePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;\r
42                         }\r
43 \r
44                         return result;\r
45                 }\r
46 \r
47                 public static bool IsValid (int ch)\r
48                 {\r
49                         return !IsInvalid (ch);\r
50                 }\r
51 \r
52                 public static bool IsInvalid (int ch)\r
53                 {\r
54                         switch (ch) {\r
55                         case 9:\r
56                         case 10:\r
57                         case 13:\r
58                                 return false;\r
59                         }\r
60                         if (ch < 32)\r
61                                 return true;\r
62                         if (ch < 0xD800)\r
63                                 return false;\r
64                         if (ch < 0xE000)\r
65                                 return true;\r
66                         if (ch < 0xFFFE)\r
67                                 return false;\r
68                         if (ch < 0x10000)\r
69                                 return true;\r
70                         if (ch < 0x110000)\r
71                                 return false;\r
72                         else\r
73                                 return true;\r
74                 }\r
75 \r
76                 public static bool IsNameChar (int ch)\r
77                 {\r
78                         bool result = false;\r
79 \r
80                         if (ch >= 0 && ch <= 0xFFFF)\r
81                         {\r
82                                 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;\r
83                         }\r
84 \r
85                         return result;\r
86                 }\r
87 \r
88                 public static bool IsNCNameChar (int ch)\r
89                 {\r
90                         bool result = false;\r
91 \r
92                         if (ch >= 0 && ch <= 0xFFFF && ch != ':')\r
93                         {\r
94                                 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;\r
95                         }\r
96 \r
97                         return result;\r
98                 }\r
99 \r
100                 public static bool IsName (string str)\r
101                 {\r
102                         if (str.Length == 0)\r
103                                 return false;\r
104                         if (!IsFirstNameChar (str [0]))\r
105                                 return false;\r
106                         for (int i = 1; i < str.Length; i++)\r
107                                 if (!IsNameChar (str [i]))\r
108                                         return false;\r
109                         return true;\r
110                 }\r
111 \r
112                 public static bool IsNCName (string str)\r
113                 {\r
114                         if (str.Length == 0)\r
115                                 return false;\r
116                         if (!IsFirstNameChar (str [0]))\r
117                                 return false;\r
118                         for (int i = 0; i < str.Length; i++)\r
119                                 if (!IsNCNameChar (str [i]))\r
120                                         return false;\r
121                         return true;\r
122                 }\r
123 \r
124                 public static bool IsNmToken (string str)\r
125                 {\r
126                         if (str.Length == 0)\r
127                                 return false;\r
128                         for (int i = 0; i < str.Length; i++)\r
129                                 if (!IsNameChar (str [i]))\r
130                                         return false;\r
131                         return true;\r
132                 }\r
133 \r
134                 public static bool IsPubidChar (int ch)\r
135                 {\r
136                         return (IsWhitespace(ch) && ch != '\t') | ('a' <= ch && ch <= 'z') | ('A' <= ch && ch <= 'Z') | ('0' <= ch && ch <= '9') | "-'()+,./:=?;!*#@$_%".IndexOf((char)ch) >= 0;\r
137                 }\r
138 \r
139                 public static bool IsPubid (string str)\r
140                 {\r
141                         for (int i = 0; i < str.Length; i++)\r
142                                 if (!IsPubidChar (str [i]))\r
143                                         return false;\r
144                         return true;\r
145                 }\r
146 \r
147                 // encodings (copied from XmlConstructs.cs)\r
148 \r
149                 /// <summary>\r
150                 /// Returns true if the encoding name is a valid IANA encoding.\r
151                 /// This method does not verify that there is a decoder available\r
152                 /// for this encoding, only that the characters are valid for an\r
153                 /// IANA encoding name.\r
154                 /// </summary>\r
155                 /// <param name="ianaEncoding">The encoding to check.</param>\r
156                 /// <returns></returns>\r
157                 public static bool IsValidIANAEncoding (String ianaEncoding) \r
158                 {\r
159                         if (ianaEncoding != null) \r
160                         {\r
161                                 int length = ianaEncoding.Length;\r
162                                 if (length > 0) \r
163                                 {\r
164                                         char c = ianaEncoding[0];\r
165                                         if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) \r
166                                         {\r
167                                                 for (int i = 1; i < length; i++) \r
168                                                 {\r
169                                                         c = ianaEncoding[i];\r
170                                                         if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&\r
171                                                                 (c < '0' || c > '9') && c != '.' && c != '_' &&\r
172                                                                 c != '-') \r
173                                                         {\r
174                                                                 return false;\r
175                                                         }\r
176                                                 }\r
177                                                 return true;\r
178                                         }\r
179                                 }\r
180                         }\r
181                         return false;\r
182                 }\r
183 \r
184                 public static int GetPredefinedEntity (string name)\r
185                 {\r
186                         switch (name) {\r
187                         case "amp":\r
188                                 return '&';\r
189                         case "lt":\r
190                                 return '<';\r
191                         case "gt":\r
192                                 return '>';\r
193                         case "quot":\r
194                                 return '"';\r
195                         case "apos":\r
196                                 return '\'';\r
197                         default:\r
198                                 return -1;\r
199                         }\r
200                 }\r
201 \r
202                 private static byte[] firstNamePages =\r
203                 {\r
204                         0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00,\r
205                         0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\r
206                         0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
207                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,\r
208                         0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
209                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
210                         0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
211                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
212                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
213                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,\r
214                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
215                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
216                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
217                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
218                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
219                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
220                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
221                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
222                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
223                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,\r
224                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
225                         0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,\r
226                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
227                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
228                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
229                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
230                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,\r
231                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
232                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
233                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
234                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
235                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
236                 };\r
237 \r
238                 private static byte[] namePages =\r
239                 {\r
240                         0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00,\r
241                         0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,\r
242                         0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
243                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,\r
244                         0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
245                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
246                         0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
247                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
248                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
249                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,\r
250                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
251                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
252                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
253                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
254                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
255                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
256                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
257                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
258                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
259                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,\r
260                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
261                         0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,\r
262                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
263                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
264                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
265                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
266                         0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,\r
267                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
268                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
269                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
270                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
271                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\r
272                 };\r
273 \r
274                 private static uint[] nameBitmap =\r
275                 {\r
276                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
277                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
278                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
279                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
280                         0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE,\r
281                         0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF,\r
282                         0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF,\r
283                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF,\r
284                         0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,\r
285                         0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000,\r
286                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
287                         0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,\r
288                         0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,\r
289                         0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,\r
290                         0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,\r
291                         0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF,\r
292                         0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000,\r
293                         0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060,\r
294                         0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003,\r
295                         0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003,\r
296                         0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,\r
297                         0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001,\r
298                         0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003,\r
299                         0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000,\r
300                         0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003,\r
301                         0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003,\r
302                         0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003,\r
303                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
304                         0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000,\r
305                         0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000,\r
306                         0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF,\r
307                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
308                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
309                         0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF,\r
310                         0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB,\r
311                         0x40000000, 0xF580C900, 0x00000007, 0x02010800,\r
312                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
313                         0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,\r
314                         0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,\r
315                         0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,\r
316                         0x00000000, 0x00004C40, 0x00000000, 0x00000000,\r
317                         0x00000007, 0x00000000, 0x00000000, 0x00000000,\r
318                         0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF,\r
319                         0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF,\r
320                         0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000,\r
321                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
322                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
323                         0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,\r
324                         0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
325                         0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,\r
326                         0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE,\r
327                         0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF,\r
328                         0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,\r
329                         0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000,\r
330                         0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003,\r
331                         0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,\r
332                         0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,\r
333                         0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,\r
334                         0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,\r
335                         0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF,\r
336                         0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF,\r
337                         0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF,\r
338                         0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF,\r
339                         0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF,\r
340                         0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0,\r
341                         0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1,\r
342                         0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3,\r
343                         0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80,\r
344                         0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3,\r
345                         0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3,\r
346                         0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3,\r
347                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
348                         0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000,\r
349                         0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000,\r
350                         0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF,\r
351                         0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000,\r
352                         0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
353                         0x00000000, 0x00000000, 0x1FFF0000, 0x00000002,\r
354                         0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,\r
355                         0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF\r
356                 };\r
357         }\r
358 }\r