2005-12-05 Lluis Sanchez Gual <lluis@novell.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 -*-
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 //
10
11 //
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.
30 //
31
32 namespace System.Xml
33 {
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
40         {
41                 public static readonly char [] WhitespaceChars = new char [] {' ', '\n', '\t', '\r'};
42
43                 public static bool IsWhitespace (int ch)
44                 {
45                         return ch == 0x20 || ch == 0x9 || ch == 0xD || ch == 0xA;
46                 }
47
48                 public static bool IsWhitespace (string str)
49                 {
50                         for (int i = 0; i < str.Length; i++)
51                                 if (!IsWhitespace (str [i])) return false;
52                                 
53                         return true;
54                 }
55
56                 public static bool IsFirstNameChar (int ch)
57                 {
58                         bool result = false;
59
60                         if (ch >= 0 && ch <= 0xFFFF)
61                         {
62                                 result = (nameBitmap[(firstNamePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
63                         }
64
65                         return result;
66                 }
67
68                 public static bool IsValid (int ch)
69                 {
70                         return !IsInvalid (ch);
71                 }
72
73                 public static bool IsInvalid (int ch)
74                 {
75                         switch (ch) {
76                         case 9:
77                         case 10:
78                         case 13:
79                                 return false;
80                         }
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;
95                 }
96
97                 public static bool IsNameChar (int ch)
98                 {
99                         bool result = false;
100
101                         if (ch >= 0 && ch <= 0xFFFF)
102                         {
103                                 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
104                         }
105
106                         return result;
107                 }
108
109                 public static bool IsNCNameChar (int ch)
110                 {
111                         bool result = false;
112
113                         if (ch >= 0 && ch <= 0xFFFF && ch != ':')
114                         {
115                                 result = (nameBitmap[(namePages[ch >> 8] << 3) + ((ch & 0xFF) >> 5)] & (1 << (ch & 0x1F))) != 0;
116                         }
117
118                         return result;
119                 }
120
121                 public static bool IsName (string str)
122                 {
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;
131                 }
132
133                 public static bool IsNCName (string str)
134                 {
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;
143                 }
144
145                 public static bool IsNmToken (string str)
146                 {
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;
153                 }
154
155                 public static bool IsPubidChar (int ch)
156                 {
157                         return (IsWhitespace(ch) && ch != '\t') | ('a' <= ch && ch <= 'z') | ('A' <= ch && ch <= 'Z') | ('0' <= ch && ch <= '9') | "-'()+,./:=?;!*#@$_%".IndexOf((char)ch) >= 0;
158                 }
159
160                 public static bool IsPubid (string str)
161                 {
162                         for (int i = 0; i < str.Length; i++)
163                                 if (!IsPubidChar (str [i]))
164                                         return false;
165                         return true;
166                 }
167
168                 // encodings (copied from XmlConstructs.cs)
169
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) 
179                 {
180                         if (ianaEncoding != null) 
181                         {
182                                 int length = ianaEncoding.Length;
183                                 if (length > 0) 
184                                 {
185                                         char c = ianaEncoding[0];
186                                         if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) 
187                                         {
188                                                 for (int i = 1; i < length; i++) 
189                                                 {
190                                                         c = ianaEncoding[i];
191                                                         if ((c < 'A' || c > 'Z') && (c < 'a' || c > 'z') &&
192                                                                 (c < '0' || c > '9') && c != '.' && c != '_' &&
193                                                                 c != '-') 
194                                                         {
195                                                                 return false;
196                                                         }
197                                                 }
198                                                 return true;
199                                         }
200                                 }
201                         }
202                         return false;
203                 }
204
205                 public static int GetPredefinedEntity (string name)
206                 {
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;
220                         }
221                 }
222
223                 static readonly byte [] firstNamePages =
224                 {
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
257                 };
258
259                 static readonly byte [] namePages =
260                 {
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
293                 };
294
295                 static readonly uint [] nameBitmap =
296                 {
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
377                 };
378         }
379 }