**** Merged from MCS ****
[mono-project.git] / mcs / class / System.XML / System.Xml / XmlChar.cs
blob8d342faff601425dbdc424914243ef5305e0fae9
1 // -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
2 //
3 // System.Xml.XmlChar.cs
4 //
5 // Author:
6 // Jason Diamond (jason@injektilo.org)
7 //
8 // (C) 2001 Jason Diamond http://injektilo.org/
9 //
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
19 //
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
22 //
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 namespace System.Xml
34 // Now, "XmlChar" and "XmlConstructs" are made as equivalent, so
35 // I dicided to rename XmlConstruts class as "XmlChar" and use it
36 // for default build.
37 // However, this class will be used for the future compact framework
38 // (XmlConstruts class uses not a little memory).
39 internal class XmlChar
41 public static readonly char [] WhitespaceChars = new char [] {' ', '\n', '\t', '\r'};
43 public static bool IsWhitespace (int ch)
45 return ch == 0x20 || ch == 0x9 || ch == 0xD || ch == 0xA;
48 public static bool IsWhitespace (string str)
50 for (int i = 0; i < str.Length; i++)
51 if (!IsWhitespace (str [i])) return false;
53 return true;
56 public static bool IsFirstNameChar (int ch)
58 bool result = false;
60 if (ch >= 0 && ch <= 0xFFFF)
62 result = (nameBitmap[(firstNamePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
65 return result;
68 public static bool IsValid (int ch)
70 return !IsInvalid (ch);
73 public static bool IsInvalid (int ch)
75 switch (ch) {
76 case 9:
77 case 10:
78 case 13:
79 return false;
81 if (ch < 32)
82 return true;
83 if (ch < 0xD800)
84 return false;
85 if (ch < 0xE000)
86 return true;
87 if (ch < 0xFFFE)
88 return false;
89 if (ch < 0x10000)
90 return true;
91 if (ch < 0x110000)
92 return false;
93 else
94 return true;
97 public static bool IsNameChar (int ch)
99 bool result = false;
101 if (ch >= 0 && ch <= 0xFFFF)
103 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
106 return result;
109 public static bool IsNCNameChar (int ch)
111 bool result = false;
113 if (ch >= 0 && ch <= 0xFFFF && ch != ':')
115 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
118 return result;
121 public static bool IsName (string str)
123 if (str.Length == 0)
124 return false;
125 if (!IsFirstNameChar (str [0]))
126 return false;
127 for (int i = 1; i < str.Length; i++)
128 if (!IsNameChar (str [i]))
129 return false;
130 return true;
133 public static bool IsNCName (string str)
135 if (str.Length == 0)
136 return false;
137 if (!IsFirstNameChar (str [0]))
138 return false;
139 for (int i = 0; i < str.Length; i++)
140 if (!IsNCNameChar (str [i]))
141 return false;
142 return true;
145 public static bool IsNmToken (string str)
147 if (str.Length == 0)
148 return false;
149 for (int i = 0; i < str.Length; i++)
150 if (!IsNameChar (str [i]))
151 return false;
152 return true;
155 public static bool IsPubidChar (int ch)
157 return (IsWhitespace(ch) && ch != '\t') | ('a' <= ch && ch <= 'z') | ('A' <= ch && ch <= 'Z') | ('0' <= ch && ch <= '9') | "-'()+,./:=?;!*#@$_%".IndexOf((char)ch) >= 0;
160 public static bool IsPubid (string str)
162 for (int i = 0; i < str.Length; i++)
163 if (!IsPubidChar (str [i]))
164 return false;
165 return true;
168 // encodings (copied from XmlConstructs.cs)
170 /// <summary>
171 /// Returns true if the encoding name is a valid IANA encoding.
172 /// This method does not verify that there is a decoder available
173 /// for this encoding, only that the characters are valid for an
174 /// IANA encoding name.
175 /// </summary>
176 /// <param name="ianaEncoding">The encoding to check.</param>
177 /// <returns></returns>
178 public static bool IsValidIANAEncoding (String ianaEncoding)
180 if (ianaEncoding != null)
182 int length = ianaEncoding.Length;
183 if (length > 0)
185 char c = ianaEncoding[0];
186 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
188 for (int i = 1; i < length; i++)
190 c = ianaEncoding[i];
191 if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
192 (c < '0' || c > '9') && c != '.' && c != '_' &&
193 c != '-')
195 return false;
198 return true;
202 return false;
205 public static int GetPredefinedEntity (string name)
207 switch (name) {
208 case "amp":
209 return '&';
210 case "lt":
211 return '<';
212 case "gt":
213 return '>';
214 case "quot":
215 return '"';
216 case "apos":
217 return '\'';
218 default:
219 return -1;
223 static readonly byte [] firstNamePages =
225 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00,
226 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
227 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,
229 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
235 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
236 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
237 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
238 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
239 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
240 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
241 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
242 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
243 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
244 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
247 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
248 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
249 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
250 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
251 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
255 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
259 static readonly byte [] namePages =
261 0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00,
262 0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
263 0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,
265 0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
271 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
272 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
273 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
274 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
275 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
276 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
277 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
278 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
279 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
280 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,
281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
283 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
284 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
285 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
286 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
287 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,
288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
295 static readonly uint [] nameBitmap =
297 0x00000000, 0x00000000, 0x00000000, 0x00000000,
298 0x00000000, 0x00000000, 0x00000000, 0x00000000,
299 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
300 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
301 0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE,
302 0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF,
303 0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF,
304 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF,
305 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
306 0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000,
307 0x00000000, 0x00000000, 0x00000000, 0x00000000,
308 0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,
309 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,
310 0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,
311 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,
312 0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF,
313 0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000,
314 0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060,
315 0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003,
316 0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003,
317 0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
318 0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001,
319 0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003,
320 0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000,
321 0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003,
322 0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003,
323 0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003,
324 0x00000000, 0x00000000, 0x00000000, 0x00000000,
325 0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000,
326 0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000,
327 0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF,
328 0x00000000, 0x00000000, 0x00000000, 0x00000000,
329 0x00000000, 0x00000000, 0x00000000, 0x00000000,
330 0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF,
331 0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB,
332 0x40000000, 0xF580C900, 0x00000007, 0x02010800,
333 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
334 0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,
335 0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
336 0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
337 0x00000000, 0x00004C40, 0x00000000, 0x00000000,
338 0x00000007, 0x00000000, 0x00000000, 0x00000000,
339 0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF,
340 0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF,
341 0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000,
342 0x00000000, 0x00000000, 0x00000000, 0x00000000,
343 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
344 0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
345 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
346 0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
347 0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE,
348 0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF,
349 0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
350 0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000,
351 0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003,
352 0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,
353 0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,
354 0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,
355 0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,
356 0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF,
357 0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF,
358 0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF,
359 0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF,
360 0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF,
361 0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0,
362 0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1,
363 0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3,
364 0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80,
365 0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3,
366 0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3,
367 0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3,
368 0x00000000, 0x00000000, 0x00000000, 0x00000000,
369 0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000,
370 0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000,
371 0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF,
372 0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000,
373 0x00000000, 0x00000000, 0x00000000, 0x00000000,
374 0x00000000, 0x00000000, 0x1FFF0000, 0x00000002,
375 0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
376 0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF