View Javadoc
1   /*-- 
2    *
3    * $Id$
4    *
5    * Copyright 2000-2004 Jason Hunter & Brett McLaughlin.
6    * All rights reserved.
7    *
8    * Redistribution and use in source and binary forms, with or without
9    * modification, are permitted provided that the following conditions are
10   * met:
11   * 
12   *   * Redistributions of source code must retain the above copyright
13   *     notice, this list of conditions and the following disclaimer.
14   * 
15   *   * Redistributions in binary form must reproduce the above copyright
16   *     notice, this list of conditions and the following disclaimer in the
17   *     documentation and/or other materials provided with the distribution.
18   * 
19   *   * Neither the name of the Jaxen Project nor the names of its
20   *     contributors may be used to endorse or promote products derived 
21   *     from this software without specific prior written permission.
22   * 
23   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25   * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
26   * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
27   * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34   *
35   * ====================================================================
36   * This software consists of voluntary contributions made by many 
37   * individuals on behalf of the Jaxen Project and was originally 
38   * created by bob mcwhirter <bob@werken.com> and 
39   * James Strachan <jstrachan@apache.org>.  For more information on the 
40   * Jaxen Project, please see <http://www.jaxen.org/>.
41   *  
42   */
43  
44  package org.jaxen.saxpath.base;
45  
46  /**
47   * A utility class to handle well-formedness checks on names. 
48   *
49   * @author  Brett McLaughlin
50   * @author  Elliotte Rusty Harold
51   * @author  Jason Hunter
52   * @author  Bradley S. Huffman
53   */
54  final class Verifier {
55  
56      /**
57       * Utility function for determining whether a specified 
58       * character is a name character according to production 4 of the 
59       * XML 1.0 specification.
60       *
61       * @param c <code>char</code> to check for XML name compliance.
62       * @return <code>boolean</code> true if it's a name character, 
63       *                                false otherwise
64       */
65       static boolean isXMLNCNameCharacter(char c) {
66      
67        return (isXMLLetter(c) || isXMLDigit(c) || c == '.' || c == '-' 
68                               || c == '_' || isXMLCombiningChar(c) 
69                               || isXMLExtender(c));
70      }
71  
72      /**
73       * Utility function for determining whether a specified 
74       * character is a legal name start character according to production 5
75       * of the XML 1.0 specification. This production does allow names
76       * to begin with colons which the Namespaces in XML Recommendation
77       * disallows. 
78       *
79       * @param c <code>char</code> to check for XML name start compliance
80       * @return true if <code>c</code> is a name start character, false otherwise
81       */
82      static boolean isXMLNCNameStartCharacter(char c) {
83      
84        return (isXMLLetter(c) || c == '_');
85      
86      }
87  
88      /**
89       * Determine whether a specified character
90       * is a letter according to production 84 of the XML 1.0 specification.
91       *
92       * @param c <code>char</code> to check for XML name compliance
93       * @return true if <code>c</code> is a letter, false otherwise
94       */
95      static boolean isXMLLetter(char c) {
96          // Note that order is very important here.  The search proceeds 
97          // from lowest to highest values, so that no searching occurs 
98          // above the character's value.  BTW, the first line is equivalent to:
99          // if (c >= 0x0041 && c <= 0x005A) return true;
100 
101         if (c < 0x0041) return false;  if (c <= 0x005a) return true;
102         if (c < 0x0061) return false;  if (c <= 0x007A) return true;
103         if (c < 0x00C0) return false;  if (c <= 0x00D6) return true;
104         if (c < 0x00D8) return false;  if (c <= 0x00F6) return true;
105         if (c < 0x00F8) return false;  if (c <= 0x0131) return true;
106         if (c < 0x0134) return false;  if (c <= 0x013E) return true;
107         if (c < 0x0141) return false;  if (c <= 0x0148) return true;
108         if (c < 0x014A) return false;  if (c <= 0x017E) return true;
109         if (c < 0x0180) return false;  if (c <= 0x01C3) return true;
110         if (c < 0x01CD) return false;  if (c <= 0x01F0) return true;
111         if (c < 0x01F4) return false;  if (c <= 0x01F5) return true;
112         if (c < 0x01FA) return false;  if (c <= 0x0217) return true;
113         if (c < 0x0250) return false;  if (c <= 0x02A8) return true;
114         if (c < 0x02BB) return false;  if (c <= 0x02C1) return true;
115         if (c == 0x0386) return true;
116         if (c < 0x0388) return false;  if (c <= 0x038A) return true;
117         if (c == 0x038C) return true;
118         if (c < 0x038E) return false;  if (c <= 0x03A1) return true;
119         if (c < 0x03A3) return false;  if (c <= 0x03CE) return true;
120         if (c < 0x03D0) return false;  if (c <= 0x03D6) return true;
121         if (c == 0x03DA) return true;
122         if (c == 0x03DC) return true;
123         if (c == 0x03DE) return true;
124         if (c == 0x03E0) return true;
125         if (c < 0x03E2) return false;  if (c <= 0x03F3) return true;
126         if (c < 0x0401) return false;  if (c <= 0x040C) return true;
127         if (c < 0x040E) return false;  if (c <= 0x044F) return true;
128         if (c < 0x0451) return false;  if (c <= 0x045C) return true;
129         if (c < 0x045E) return false;  if (c <= 0x0481) return true;
130         if (c < 0x0490) return false;  if (c <= 0x04C4) return true;
131         if (c < 0x04C7) return false;  if (c <= 0x04C8) return true;
132         if (c < 0x04CB) return false;  if (c <= 0x04CC) return true;
133         if (c < 0x04D0) return false;  if (c <= 0x04EB) return true;
134         if (c < 0x04EE) return false;  if (c <= 0x04F5) return true;
135         if (c < 0x04F8) return false;  if (c <= 0x04F9) return true;
136         if (c < 0x0531) return false;  if (c <= 0x0556) return true;
137         if (c == 0x0559) return true;
138         if (c < 0x0561) return false;  if (c <= 0x0586) return true;
139         if (c < 0x05D0) return false;  if (c <= 0x05EA) return true;
140         if (c < 0x05F0) return false;  if (c <= 0x05F2) return true;
141         if (c < 0x0621) return false;  if (c <= 0x063A) return true;
142         if (c < 0x0641) return false;  if (c <= 0x064A) return true;
143         if (c < 0x0671) return false;  if (c <= 0x06B7) return true;
144         if (c < 0x06BA) return false;  if (c <= 0x06BE) return true;
145         if (c < 0x06C0) return false;  if (c <= 0x06CE) return true;
146         if (c < 0x06D0) return false;  if (c <= 0x06D3) return true;
147         if (c == 0x06D5) return true;
148         if (c < 0x06E5) return false;  if (c <= 0x06E6) return true;
149         if (c < 0x0905) return false;  if (c <= 0x0939) return true;
150         if (c == 0x093D) return true;
151         if (c < 0x0958) return false;  if (c <= 0x0961) return true;
152         if (c < 0x0985) return false;  if (c <= 0x098C) return true;
153         if (c < 0x098F) return false;  if (c <= 0x0990) return true;
154         if (c < 0x0993) return false;  if (c <= 0x09A8) return true;
155         if (c < 0x09AA) return false;  if (c <= 0x09B0) return true;
156         if (c == 0x09B2) return true;
157         if (c < 0x09B6) return false;  if (c <= 0x09B9) return true;
158         if (c < 0x09DC) return false;  if (c <= 0x09DD) return true;
159         if (c < 0x09DF) return false;  if (c <= 0x09E1) return true;
160         if (c < 0x09F0) return false;  if (c <= 0x09F1) return true;
161         if (c < 0x0A05) return false;  if (c <= 0x0A0A) return true;
162         if (c < 0x0A0F) return false;  if (c <= 0x0A10) return true;
163         if (c < 0x0A13) return false;  if (c <= 0x0A28) return true;
164         if (c < 0x0A2A) return false;  if (c <= 0x0A30) return true;
165         if (c < 0x0A32) return false;  if (c <= 0x0A33) return true;
166         if (c < 0x0A35) return false;  if (c <= 0x0A36) return true;
167         if (c < 0x0A38) return false;  if (c <= 0x0A39) return true;
168         if (c < 0x0A59) return false;  if (c <= 0x0A5C) return true;
169         if (c == 0x0A5E) return true;
170         if (c < 0x0A72) return false;  if (c <= 0x0A74) return true;
171         if (c < 0x0A85) return false;  if (c <= 0x0A8B) return true;
172         if (c == 0x0A8D) return true;
173         if (c < 0x0A8F) return false;  if (c <= 0x0A91) return true;
174         if (c < 0x0A93) return false;  if (c <= 0x0AA8) return true;
175         if (c < 0x0AAA) return false;  if (c <= 0x0AB0) return true;
176         if (c < 0x0AB2) return false;  if (c <= 0x0AB3) return true;
177         if (c < 0x0AB5) return false;  if (c <= 0x0AB9) return true;
178         if (c == 0x0ABD) return true;
179         if (c == 0x0AE0) return true;
180         if (c < 0x0B05) return false;  if (c <= 0x0B0C) return true;
181         if (c < 0x0B0F) return false;  if (c <= 0x0B10) return true;
182         if (c < 0x0B13) return false;  if (c <= 0x0B28) return true;
183         if (c < 0x0B2A) return false;  if (c <= 0x0B30) return true;
184         if (c < 0x0B32) return false;  if (c <= 0x0B33) return true;
185         if (c < 0x0B36) return false;  if (c <= 0x0B39) return true;
186         if (c == 0x0B3D) return true;
187         if (c < 0x0B5C) return false;  if (c <= 0x0B5D) return true;
188         if (c < 0x0B5F) return false;  if (c <= 0x0B61) return true;
189         if (c < 0x0B85) return false;  if (c <= 0x0B8A) return true;
190         if (c < 0x0B8E) return false;  if (c <= 0x0B90) return true;
191         if (c < 0x0B92) return false;  if (c <= 0x0B95) return true;
192         if (c < 0x0B99) return false;  if (c <= 0x0B9A) return true;
193         if (c == 0x0B9C) return true;
194         if (c < 0x0B9E) return false;  if (c <= 0x0B9F) return true;
195         if (c < 0x0BA3) return false;  if (c <= 0x0BA4) return true;
196         if (c < 0x0BA8) return false;  if (c <= 0x0BAA) return true;
197         if (c < 0x0BAE) return false;  if (c <= 0x0BB5) return true;
198         if (c < 0x0BB7) return false;  if (c <= 0x0BB9) return true;
199         if (c < 0x0C05) return false;  if (c <= 0x0C0C) return true;
200         if (c < 0x0C0E) return false;  if (c <= 0x0C10) return true;
201         if (c < 0x0C12) return false;  if (c <= 0x0C28) return true;
202         if (c < 0x0C2A) return false;  if (c <= 0x0C33) return true;
203         if (c < 0x0C35) return false;  if (c <= 0x0C39) return true;
204         if (c < 0x0C60) return false;  if (c <= 0x0C61) return true;
205         if (c < 0x0C85) return false;  if (c <= 0x0C8C) return true;
206         if (c < 0x0C8E) return false;  if (c <= 0x0C90) return true;
207         if (c < 0x0C92) return false;  if (c <= 0x0CA8) return true;
208         if (c < 0x0CAA) return false;  if (c <= 0x0CB3) return true;
209         if (c < 0x0CB5) return false;  if (c <= 0x0CB9) return true;
210         if (c == 0x0CDE) return true;
211         if (c < 0x0CE0) return false;  if (c <= 0x0CE1) return true;
212         if (c < 0x0D05) return false;  if (c <= 0x0D0C) return true;
213         if (c < 0x0D0E) return false;  if (c <= 0x0D10) return true;
214         if (c < 0x0D12) return false;  if (c <= 0x0D28) return true;
215         if (c < 0x0D2A) return false;  if (c <= 0x0D39) return true;
216         if (c < 0x0D60) return false;  if (c <= 0x0D61) return true;
217         if (c < 0x0E01) return false;  if (c <= 0x0E2E) return true;
218         if (c == 0x0E30) return true;
219         if (c < 0x0E32) return false;  if (c <= 0x0E33) return true;
220         if (c < 0x0E40) return false;  if (c <= 0x0E45) return true;
221         if (c < 0x0E81) return false;  if (c <= 0x0E82) return true;
222         if (c == 0x0E84) return true;
223         if (c < 0x0E87) return false;  if (c <= 0x0E88) return true;
224         if (c == 0x0E8A) return true;
225         if (c == 0x0E8D) return true;
226         if (c < 0x0E94) return false;  if (c <= 0x0E97) return true;
227         if (c < 0x0E99) return false;  if (c <= 0x0E9F) return true;
228         if (c < 0x0EA1) return false;  if (c <= 0x0EA3) return true;
229         if (c == 0x0EA5) return true;
230         if (c == 0x0EA7) return true;
231         if (c < 0x0EAA) return false;  if (c <= 0x0EAB) return true;
232         if (c < 0x0EAD) return false;  if (c <= 0x0EAE) return true;
233         if (c == 0x0EB0) return true;
234         if (c < 0x0EB2) return false;  if (c <= 0x0EB3) return true;
235         if (c == 0x0EBD) return true;
236         if (c < 0x0EC0) return false;  if (c <= 0x0EC4) return true;
237         if (c < 0x0F40) return false;  if (c <= 0x0F47) return true;
238         if (c < 0x0F49) return false;  if (c <= 0x0F69) return true;
239         if (c < 0x10A0) return false;  if (c <= 0x10C5) return true;
240         if (c < 0x10D0) return false;  if (c <= 0x10F6) return true;
241         if (c == 0x1100) return true;
242         if (c < 0x1102) return false;  if (c <= 0x1103) return true;
243         if (c < 0x1105) return false;  if (c <= 0x1107) return true;
244         if (c == 0x1109) return true;
245         if (c < 0x110B) return false;  if (c <= 0x110C) return true;
246         if (c < 0x110E) return false;  if (c <= 0x1112) return true;
247         if (c == 0x113C) return true;
248         if (c == 0x113E) return true;
249         if (c == 0x1140) return true;
250         if (c == 0x114C) return true;
251         if (c == 0x114E) return true;
252         if (c == 0x1150) return true;
253         if (c < 0x1154) return false;  if (c <= 0x1155) return true;
254         if (c == 0x1159) return true;
255         if (c < 0x115F) return false;  if (c <= 0x1161) return true;
256         if (c == 0x1163) return true;
257         if (c == 0x1165) return true;
258         if (c == 0x1167) return true;
259         if (c == 0x1169) return true;
260         if (c < 0x116D) return false;  if (c <= 0x116E) return true;
261         if (c < 0x1172) return false;  if (c <= 0x1173) return true;
262         if (c == 0x1175) return true;
263         if (c == 0x119E) return true;
264         if (c == 0x11A8) return true;
265         if (c == 0x11AB) return true;
266         if (c < 0x11AE) return false;  if (c <= 0x11AF) return true;
267         if (c < 0x11B7) return false;  if (c <= 0x11B8) return true;
268         if (c == 0x11BA) return true;
269         if (c < 0x11BC) return false;  if (c <= 0x11C2) return true;
270         if (c == 0x11EB) return true;
271         if (c == 0x11F0) return true;
272         if (c == 0x11F9) return true;
273         if (c < 0x1E00) return false;  if (c <= 0x1E9B) return true;
274         if (c < 0x1EA0) return false;  if (c <= 0x1EF9) return true;
275         if (c < 0x1F00) return false;  if (c <= 0x1F15) return true;
276         if (c < 0x1F18) return false;  if (c <= 0x1F1D) return true;
277         if (c < 0x1F20) return false;  if (c <= 0x1F45) return true;
278         if (c < 0x1F48) return false;  if (c <= 0x1F4D) return true;
279         if (c < 0x1F50) return false;  if (c <= 0x1F57) return true;
280         if (c == 0x1F59) return true;
281         if (c == 0x1F5B) return true;
282         if (c == 0x1F5D) return true;
283         if (c < 0x1F5F) return false;  if (c <= 0x1F7D) return true;
284         if (c < 0x1F80) return false;  if (c <= 0x1FB4) return true;
285         if (c < 0x1FB6) return false;  if (c <= 0x1FBC) return true;
286         if (c == 0x1FBE) return true;
287         if (c < 0x1FC2) return false;  if (c <= 0x1FC4) return true;
288         if (c < 0x1FC6) return false;  if (c <= 0x1FCC) return true;
289         if (c < 0x1FD0) return false;  if (c <= 0x1FD3) return true;
290         if (c < 0x1FD6) return false;  if (c <= 0x1FDB) return true;
291         if (c < 0x1FE0) return false;  if (c <= 0x1FEC) return true;
292         if (c < 0x1FF2) return false;  if (c <= 0x1FF4) return true;
293         if (c < 0x1FF6) return false;  if (c <= 0x1FFC) return true;
294         if (c == 0x2126) return true;
295         if (c < 0x212A) return false;  if (c <= 0x212B) return true;
296         if (c == 0x212E) return true;
297         if (c < 0x2180) return false;  if (c <= 0x2182) return true;
298         if (c == 0x3007) return true;                          
299         if (c < 0x3021) return false;  if (c <= 0x3029) return true;
300         if (c < 0x3041) return false;  if (c <= 0x3094) return true;
301         if (c < 0x30A1) return false;  if (c <= 0x30FA) return true;
302         if (c < 0x3105) return false;  if (c <= 0x312C) return true;
303         if (c < 0x4E00) return false;  if (c <= 0x9FA5) return true;
304         if (c < 0xAC00) return false;  if (c <= 0xD7A3) return true;
305       
306         return false;
307         
308     }
309 
310     /**
311      * Determine whether a specified character
312      * is a combining character according to production 87
313      * of the XML 1.0 specification.
314      *
315      * @param c <code>char</code> to check
316      * @return true if <code>c</code> is a combining character,
317      *         false otherwise
318      */
319     static boolean isXMLCombiningChar(char c) {
320         // CombiningChar
321         if (c < 0x0300) return false;  if (c <= 0x0345) return true;
322         if (c < 0x0360) return false;  if (c <= 0x0361) return true;
323         if (c < 0x0483) return false;  if (c <= 0x0486) return true;
324         if (c < 0x0591) return false;  if (c <= 0x05A1) return true;
325                                        
326         if (c < 0x05A3) return false;  if (c <= 0x05B9) return true;
327         if (c < 0x05BB) return false;  if (c <= 0x05BD) return true;
328         if (c == 0x05BF) return true;
329         if (c < 0x05C1) return false;  if (c <= 0x05C2) return true;
330                                        
331         if (c == 0x05C4) return true;
332         if (c < 0x064B) return false;  if (c <= 0x0652) return true;
333         if (c == 0x0670) return true;
334         if (c < 0x06D6) return false;  if (c <= 0x06E4) return true;
335         if (c < 0x06E7) return false;  if (c <= 0x06E8) return true;
336                                        
337         if (c < 0x06EA) return false;  if (c <= 0x06ED) return true;
338         if (c < 0x0901) return false;  if (c <= 0x0903) return true;
339         if (c == 0x093C) return true;
340         if (c < 0x093E) return false;  if (c <= 0x094C) return true;
341                                        
342         if (c == 0x094D) return true;
343         if (c < 0x0951) return false;  if (c <= 0x0954) return true;
344         if (c < 0x0962) return false;  if (c <= 0x0963) return true;
345         if (c < 0x0981) return false;  if (c <= 0x0983) return true;
346                                        
347         if (c == 0x09BC) return true;
348         if (c == 0x09BE) return true;
349         if (c == 0x09BF) return true;
350         if (c < 0x09C0) return false;  if (c <= 0x09C4) return true;
351         if (c < 0x09C7) return false;  if (c <= 0x09C8) return true;
352                                        
353         if (c < 0x09CB) return false;  if (c <= 0x09CD) return true;
354         if (c == 0x09D7) return true;
355         if (c < 0x09E2) return false;  if (c <= 0x09E3) return true;
356         if (c == 0x0A02) return true;
357         if (c == 0x0A3C) return true;
358                                        
359         if (c == 0x0A3E) return true;
360         if (c == 0x0A3F) return true;
361         if (c < 0x0A40) return false;  if (c <= 0x0A42) return true;
362         if (c < 0x0A47) return false;  if (c <= 0x0A48) return true;
363                                        
364         if (c < 0x0A4B) return false;  if (c <= 0x0A4D) return true;
365         if (c < 0x0A70) return false;  if (c <= 0x0A71) return true;
366         if (c < 0x0A81) return false;  if (c <= 0x0A83) return true;
367         if (c == 0x0ABC) return true;
368                                        
369         if (c < 0x0ABE) return false;  if (c <= 0x0AC5) return true;
370         if (c < 0x0AC7) return false;  if (c <= 0x0AC9) return true;
371         if (c < 0x0ACB) return false;  if (c <= 0x0ACD) return true;
372                                        
373         if (c < 0x0B01) return false;  if (c <= 0x0B03) return true;
374         if (c == 0x0B3C) return true;
375         if (c < 0x0B3E) return false;  if (c <= 0x0B43) return true;
376         if (c < 0x0B47) return false;  if (c <= 0x0B48) return true;
377                                        
378         if (c < 0x0B4B) return false;  if (c <= 0x0B4D) return true;
379         if (c < 0x0B56) return false;  if (c <= 0x0B57) return true;
380         if (c < 0x0B82) return false;  if (c <= 0x0B83) return true;
381                                        
382         if (c < 0x0BBE) return false;  if (c <= 0x0BC2) return true;
383         if (c < 0x0BC6) return false;  if (c <= 0x0BC8) return true;
384         if (c < 0x0BCA) return false;  if (c <= 0x0BCD) return true;
385         if (c == 0x0BD7) return true;
386                                        
387         if (c < 0x0C01) return false;  if (c <= 0x0C03) return true;
388         if (c < 0x0C3E) return false;  if (c <= 0x0C44) return true;
389         if (c < 0x0C46) return false;  if (c <= 0x0C48) return true;
390                                        
391         if (c < 0x0C4A) return false;  if (c <= 0x0C4D) return true;
392         if (c < 0x0C55) return false;  if (c <= 0x0C56) return true;
393         if (c < 0x0C82) return false;  if (c <= 0x0C83) return true;
394                                        
395         if (c < 0x0CBE) return false;  if (c <= 0x0CC4) return true;
396         if (c < 0x0CC6) return false;  if (c <= 0x0CC8) return true;
397         if (c < 0x0CCA) return false;  if (c <= 0x0CCD) return true;
398                                        
399         if (c < 0x0CD5) return false;  if (c <= 0x0CD6) return true;
400         if (c < 0x0D02) return false;  if (c <= 0x0D03) return true;
401         if (c < 0x0D3E) return false;  if (c <= 0x0D43) return true;
402                                        
403         if (c < 0x0D46) return false;  if (c <= 0x0D48) return true;
404         if (c < 0x0D4A) return false;  if (c <= 0x0D4D) return true;
405         if (c == 0x0D57) return true;
406         if (c == 0x0E31) return true;
407                                        
408         if (c < 0x0E34) return false;  if (c <= 0x0E3A) return true;
409         if (c < 0x0E47) return false;  if (c <= 0x0E4E) return true;
410         if (c == 0x0EB1) return true;
411         if (c < 0x0EB4) return false;  if (c <= 0x0EB9) return true;
412                                        
413         if (c < 0x0EBB) return false;  if (c <= 0x0EBC) return true;
414         if (c < 0x0EC8) return false;  if (c <= 0x0ECD) return true;
415         if (c < 0x0F18) return false;  if (c <= 0x0F19) return true;
416         if (c == 0x0F35) return true;
417                                        
418         if (c == 0x0F37) return true;
419         if (c == 0x0F39) return true;
420         if (c == 0x0F3E) return true;
421         if (c == 0x0F3F) return true;
422         if (c < 0x0F71) return false;  if (c <= 0x0F84) return true;
423                                        
424         if (c < 0x0F86) return false;  if (c <= 0x0F8B) return true;
425         if (c < 0x0F90) return false;  if (c <= 0x0F95) return true;
426         if (c == 0x0F97) return true;
427         if (c < 0x0F99) return false;  if (c <= 0x0FAD) return true;
428                                        
429         if (c < 0x0FB1) return false;  if (c <= 0x0FB7) return true;
430         if (c == 0x0FB9) return true;
431         if (c < 0x20D0) return false;  if (c <= 0x20DC) return true;
432         if (c == 0x20E1) return true;
433                                        
434         if (c < 0x302A) return false;  if (c <= 0x302F) return true;
435         if (c == 0x3099) return true;
436         if (c == 0x309A) return true; 
437         
438         return false;
439         
440     }
441     
442     /**
443      * Determine whether a specified 
444      * character is an extender according to production 88 of the XML 1.0
445      * specification.
446      *
447      * @param c <code>char</code> to check
448      * @return true if <code>c</code> is an extender, false otherwise
449      */
450     static boolean isXMLExtender(char c) {
451 
452         if (c < 0x00B6) return false;  // quick short circuit
453 
454         // Extenders                               
455         if (c == 0x00B7) return true;
456         if (c == 0x02D0) return true;
457         if (c == 0x02D1) return true;
458         if (c == 0x0387) return true;
459         if (c == 0x0640) return true;
460         if (c == 0x0E46) return true;
461         if (c == 0x0EC6) return true;
462         if (c == 0x3005) return true;
463                                        
464         if (c < 0x3031) return false;  if (c <= 0x3035) return true;
465         if (c < 0x309D) return false;  if (c <= 0x309E) return true;
466         if (c < 0x30FC) return false;  if (c <= 0x30FE) return true;
467         
468         return false;
469         
470     }
471       
472     /**
473      * Determine whether a specified Unicode character
474      * is a digit according to production 88 of the XML 1.0 specification.
475      *
476      * @param c <code>char</code> to check for XML digit compliance
477      * @return true if <code>c</code> is a a digit, false otherwise
478      */
479     static boolean isXMLDigit(char c) {
480       
481         if (c < 0x0030) return false;  if (c <= 0x0039) return true;
482         if (c < 0x0660) return false;  if (c <= 0x0669) return true;
483         if (c < 0x06F0) return false;  if (c <= 0x06F9) return true;
484         if (c < 0x0966) return false;  if (c <= 0x096F) return true;
485                                        
486         if (c < 0x09E6) return false;  if (c <= 0x09EF) return true;
487         if (c < 0x0A66) return false;  if (c <= 0x0A6F) return true;
488         if (c < 0x0AE6) return false;  if (c <= 0x0AEF) return true;
489                                        
490         if (c < 0x0B66) return false;  if (c <= 0x0B6F) return true;
491         if (c < 0x0BE7) return false;  if (c <= 0x0BEF) return true;
492         if (c < 0x0C66) return false;  if (c <= 0x0C6F) return true;
493                                        
494         if (c < 0x0CE6) return false;  if (c <= 0x0CEF) return true;
495         if (c < 0x0D66) return false;  if (c <= 0x0D6F) return true;
496         if (c < 0x0E50) return false;  if (c <= 0x0E59) return true;
497                                        
498         if (c < 0x0ED0) return false;  if (c <= 0x0ED9) return true;
499         if (c < 0x0F20) return false;  if (c <= 0x0F29) return true; 
500       
501         return false;
502     }  
503     
504 }