19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.serializer.utils;
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Arrays;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * THIS IS A COPY OF THE XERCES-2J CLASS org.apache.xerces.utls.XMLChar
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class defines the basic properties of characters in XML 1.1. The data
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in this class can be used to verify that a character is a valid
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * XML 1.1 character or if the character is a space, name start, or name
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * character.
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A series of convenience methods are supplied to ease the burden
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of the developer.  Using the character as an index into the <code>XML11CHARS</code>
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * array and applying the appropriate mask flag (e.g.
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>MASK_VALID</code>), yields the same results as calling the
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * convenience methods. There is one exception: check the comments
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for the <code>isValid</code> method for details.
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Glenn Marcy, IBM
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Andy Clark, IBM
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Arnaud  Le Hors, IBM
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Neil Graham, IBM
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @author Michael Glavassevich, IBM
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @version $Id: $
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class XML11Char {
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Constants
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** Character flags for XML 1.1. */
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static final byte XML11CHARS [] = new byte [1 << 16];
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 Valid character mask. */
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_VALID = 0x01;
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 Space character mask. */
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_SPACE = 0x02;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 Name start character mask. */
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_NAME_START = 0x04;
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 Name character mask. */
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_NAME = 0x08;
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 control character mask */
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_CONTROL = 0x10;
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 content for external entities (valid - "special" chars - control chars) */
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_CONTENT = 0x20;
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML namespaces 1.1 NCNameStart */
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_NCNAME_START = 0x40;
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML namespaces 1.1 NCName */
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_NCNAME = 0x80;
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** XML 1.1 content for internal entities (valid - "special" chars) */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static final int MASK_XML11_CONTENT_INTERNAL = MASK_XML11_CONTROL | MASK_XML11_CONTENT;
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Static initialization
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static {
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Initializing the Character Flag Array
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Code generated by: XML11CharGenerator.
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 1, 9, (byte) 17 ); // Fill 8 of value (byte) 17
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[9] = 35;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[10] = 3;
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 11, 13, (byte) 17 ); // Fill 2 of value (byte) 17
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[13] = 3;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 14, 32, (byte) 17 ); // Fill 18 of value (byte) 17
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[32] = 35;
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 33, 38, (byte) 33 ); // Fill 5 of value (byte) 33
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[38] = 1;
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 39, 45, (byte) 33 ); // Fill 6 of value (byte) 33
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 45, 47, (byte) -87 ); // Fill 2 of value (byte) -87
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[47] = 33;
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 48, 58, (byte) -87 ); // Fill 10 of value (byte) -87
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[58] = 45;
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[59] = 33;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[60] = 1;
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 61, 65, (byte) 33 ); // Fill 4 of value (byte) 33
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 65, 91, (byte) -19 ); // Fill 26 of value (byte) -19
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 91, 93, (byte) 33 ); // Fill 2 of value (byte) 33
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[93] = 1;
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[94] = 33;
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[95] = -19;
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[96] = 33;
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 97, 123, (byte) -19 ); // Fill 26 of value (byte) -19
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 123, 127, (byte) 33 ); // Fill 4 of value (byte) 33
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 127, 133, (byte) 17 ); // Fill 6 of value (byte) 17
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[133] = 35;
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 134, 160, (byte) 17 ); // Fill 26 of value (byte) 17
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 160, 183, (byte) 33 ); // Fill 23 of value (byte) 33
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[183] = -87;
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 184, 192, (byte) 33 ); // Fill 8 of value (byte) 33
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 192, 215, (byte) -19 ); // Fill 23 of value (byte) -19
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[215] = 33;
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 216, 247, (byte) -19 ); // Fill 31 of value (byte) -19
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[247] = 33;
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 248, 768, (byte) -19 ); // Fill 520 of value (byte) -19
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 768, 880, (byte) -87 ); // Fill 112 of value (byte) -87
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 880, 894, (byte) -19 ); // Fill 14 of value (byte) -19
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[894] = 33;
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 895, 8192, (byte) -19 ); // Fill 7297 of value (byte) -19
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8192, 8204, (byte) 33 ); // Fill 12 of value (byte) 33
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8204, 8206, (byte) -19 ); // Fill 2 of value (byte) -19
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8206, 8232, (byte) 33 ); // Fill 26 of value (byte) 33
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        XML11CHARS[8232] = 35;
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8233, 8255, (byte) 33 ); // Fill 22 of value (byte) 33
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8255, 8257, (byte) -87 ); // Fill 2 of value (byte) -87
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8257, 8304, (byte) 33 ); // Fill 47 of value (byte) 33
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8304, 8592, (byte) -19 ); // Fill 288 of value (byte) -19
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 8592, 11264, (byte) 33 ); // Fill 2672 of value (byte) 33
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 11264, 12272, (byte) -19 ); // Fill 1008 of value (byte) -19
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 12272, 12289, (byte) 33 ); // Fill 17 of value (byte) 33
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 12289, 55296, (byte) -19 ); // Fill 43007 of value (byte) -19
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 57344, 63744, (byte) 33 ); // Fill 6400 of value (byte) 33
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 63744, 64976, (byte) -19 ); // Fill 1232 of value (byte) -19
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 64976, 65008, (byte) 33 ); // Fill 32 of value (byte) 33
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Arrays.fill(XML11CHARS, 65008, 65534, (byte) -19 ); // Fill 526 of value (byte) -19
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // <clinit>()
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Public static methods
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is a space character
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * as amdended in the XML 1.1 specification.
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11Space(int c) {
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_SPACE) != 0);
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11Space(int):boolean
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is valid. This method
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * also checks the surrogate character range from 0x10000 to 0x10FFFF.
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <p>
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * If the program chooses to apply the mask directly to the
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * <code>XML11CHARS</code> array, then they are responsible for checking
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * the surrogate character range.
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11Valid(int c) {
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_VALID) != 0)
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || (0x10000 <= c && c <= 0x10FFFF);
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11Valid(int):boolean
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is invalid.
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11Invalid(int c) {
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return !isXML11Valid(c);
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11Invalid(int):boolean
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is valid and permitted outside
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * of a character reference.
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * That is, this method will return false for the same set as
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * isXML11Valid, except it also reports false for "control characters".
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11ValidLiteral(int c) {
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return ((c < 0x10000 && ((XML11CHARS[c] & MASK_XML11_VALID) != 0 && (XML11CHARS[c] & MASK_XML11_CONTROL) == 0))
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (0x10000 <= c && c <= 0x10FFFF));
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11ValidLiteral(int):boolean
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character can be considered
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * content in an external parsed entity.
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11Content(int c) {
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT) != 0) ||
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               (0x10000 <= c && c <= 0x10FFFF);
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11Content(int):boolean
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character can be considered
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * content in an internal parsed entity.
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11InternalEntityContent(int c) {
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_CONTENT_INTERNAL) != 0) ||
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               (0x10000 <= c && c <= 0x10FFFF);
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11InternalEntityContent(int):boolean
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is a valid name start
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character as defined by production [4] in the XML 1.1
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * specification.
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11NameStart(int c) {
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME_START) != 0)
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (0x10000 <= c && c < 0xF0000);
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11NameStart(int):boolean
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is a valid name
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character as defined by production [4a] in the XML 1.1
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * specification.
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11Name(int c) {
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NAME) != 0)
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (c >= 0x10000 && c < 0xF0000);
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11Name(int):boolean
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is a valid NCName start
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character as defined by production [4] in Namespaces in XML
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * 1.1 recommendation.
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11NCNameStart(int c) {
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME_START) != 0)
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (0x10000 <= c && c < 0xF0000);
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11NCNameStart(int):boolean
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the specified character is a valid NCName
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * character as defined by production [5] in Namespaces in XML
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * 1.1 recommendation.
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11NCName(int c) {
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c < 0x10000 && (XML11CHARS[c] & MASK_XML11_NCNAME) != 0)
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            || (0x10000 <= c && c < 0xF0000);
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11NCName(int):boolean
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns whether the given character is a valid
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * high surrogate for a name character. This includes
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * all high surrogates for characters [0x10000-0xEFFFF].
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * In other words everything excluding planes 15 and 16.
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param c The character to check.
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11NameHighSurrogate(int c) {
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (0xD800 <= c && c <= 0xDB7F);
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /*
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * [5] Name ::= NameStartChar NameChar*
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Check to see if a string is a valid Name according to [5]
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * in the XML 1.1 Recommendation
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name string to check
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if name is a valid Name
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11ValidName(String name) {
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int length = name.length();
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length == 0)
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int i = 1;
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        char ch = name.charAt(0);
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if( !isXML11NameStart(ch) ) {
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                char ch2 = name.charAt(1);
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( !XMLChar.isLowSurrogate(ch2) ||
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     !isXML11NameStart(XMLChar.supplemental(ch, ch2)) ) {
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return false;
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                i = 2;
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else {
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return false;
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (i < length) {
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ch = name.charAt(i);
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( !isXML11Name(ch) ) {
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    char ch2 = name.charAt(i);
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if ( !XMLChar.isLowSurrogate(ch2) ||
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        return false;
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else {
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return false;
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ++i;
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11ValidName(String):boolean
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /*
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * from the namespace 1.1 rec
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * [4] NCName ::= NCNameStartChar NCNameChar*
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Check to see if a string is a valid NCName according to [4]
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * from the XML Namespaces 1.1 Recommendation
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param ncName string to check
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if name is a valid NCName
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11ValidNCName(String ncName) {
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int length = ncName.length();
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length == 0)
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int i = 1;
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        char ch = ncName.charAt(0);
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if( !isXML11NCNameStart(ch) ) {
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( length > 1 && isXML11NameHighSurrogate(ch) ) {
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                char ch2 = ncName.charAt(1);
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( !XMLChar.isLowSurrogate(ch2) ||
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                     !isXML11NCNameStart(XMLChar.supplemental(ch, ch2)) ) {
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return false;
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                i = 2;
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else {
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return false;
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        while (i < length) {
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ch = ncName.charAt(i);
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( !isXML11NCName(ch) ) {
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    char ch2 = ncName.charAt(i);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if ( !XMLChar.isLowSurrogate(ch2) ||
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         !isXML11NCName(XMLChar.supplemental(ch, ch2)) ) {
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        return false;
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else {
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return false;
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            ++i;
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11ValidNCName(String):boolean
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /*
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * [7] Nmtoken ::= (NameChar)+
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Check to see if a string is a valid Nmtoken according to [7]
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * in the XML 1.1 Recommendation
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nmtoken string to check
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return true if nmtoken is a valid Nmtoken
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public static boolean isXML11ValidNmtoken(String nmtoken) {
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        int length = nmtoken.length();
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (length == 0)
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        for (int i = 0; i < length; ++i ) {
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            char ch = nmtoken.charAt(i);
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if( !isXML11Name(ch) ) {
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( ++i < length && isXML11NameHighSurrogate(ch) ) {
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    char ch2 = nmtoken.charAt(i);
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if ( !XMLChar.isLowSurrogate(ch2) ||
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                         !isXML11Name(XMLChar.supplemental(ch, ch2)) ) {
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        return false;
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else {
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return false;
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    } // isXML11ValidName(String):boolean
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} // class XML11Char
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
415