1 // -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
\r
3 // System.Xml.XmlChar.cs
\r
6 // Jason Diamond (jason@injektilo.org)
\r
8 // (C) 2001 Jason Diamond http://injektilo.org/
\r
11 namespace System.Xml
\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
20 public static char [] WhitespaceChars = new char [] {' ', '\n', '\t', '\r'};
22 public static bool IsWhitespace (int ch)
\r
24 return ch == 0x20 || ch == 0x9 || ch == 0xD || ch == 0xA;
\r
27 public static bool IsWhitespace (string str)
\r
29 for (int i = 0; i < str.Length; i++)
30 if (!IsWhitespace (str [i])) return false;
35 public static bool IsFirstNameChar (int ch)
\r
37 bool result = false;
\r
39 if (ch >= 0 && ch <= 0xFFFF)
\r
41 result = (nameBitmap[(firstNamePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
\r
47 public static bool IsValid (int ch)
\r
49 return !IsInvalid (ch);
\r
52 public static bool IsInvalid (int ch)
\r
76 public static bool IsNameChar (int ch)
\r
78 bool result = false;
\r
80 if (ch >= 0 && ch <= 0xFFFF)
\r
82 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
\r
88 public static bool IsNCNameChar (int ch)
\r
90 bool result = false;
\r
92 if (ch >= 0 && ch <= 0xFFFF && ch != ':')
\r
94 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
\r
100 public static bool IsName (string str)
\r
102 if (str.Length == 0)
\r
104 if (!IsFirstNameChar (str [0]))
\r
106 for (int i = 1; i < str.Length; i++)
\r
107 if (!IsNameChar (str [i]))
\r
112 public static bool IsNCName (string str)
\r
114 if (str.Length == 0)
\r
116 if (!IsFirstNameChar (str [0]))
\r
118 for (int i = 0; i < str.Length; i++)
\r
119 if (!IsNCNameChar (str [i]))
\r
124 public static bool IsNmToken (string str)
\r
126 if (str.Length == 0)
\r
128 for (int i = 0; i < str.Length; i++)
\r
129 if (!IsNameChar (str [i]))
\r
134 public static bool IsPubidChar (int ch)
\r
136 return (IsWhitespace(ch) && ch != '\t') | ('a' <= ch && ch <= 'z') | ('A' <= ch && ch <= 'Z') | ('0' <= ch && ch <= '9') | "-'()+,./:=?;!*#@$_%".IndexOf((char)ch) >= 0;
\r
139 public static bool IsPubid (string str)
\r
141 for (int i = 0; i < str.Length; i++)
\r
142 if (!IsPubidChar (str [i]))
\r
147 // encodings (copied from XmlConstructs.cs)
\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
155 /// <param name="ianaEncoding">The encoding to check.</param>
\r
156 /// <returns></returns>
\r
157 public static bool IsValidIANAEncoding (String ianaEncoding)
\r
159 if (ianaEncoding != null)
\r
161 int length = ianaEncoding.Length;
\r
164 char c = ianaEncoding[0];
\r
165 if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
\r
167 for (int i = 1; i < length; i++)
\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
184 public static int GetPredefinedEntity (string name)
\r
202 private static byte[] firstNamePages =
\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
238 private static byte[] namePages =
\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
274 private static uint[] nameBitmap =
\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