xml11entityscanner.java

来自「JAVA 所有包」· Java 代码 · 共 1,525 行 · 第 1/5 页

JAVA
1,525
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 1999-2002 The Apache Software Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.impl;import java.io.IOException;import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;import com.sun.org.apache.xerces.internal.util.XMLChar;import com.sun.org.apache.xerces.internal.util.XML11Char;import com.sun.org.apache.xerces.internal.util.XMLStringBuffer;import com.sun.org.apache.xerces.internal.xni.QName;import com.sun.org.apache.xerces.internal.xni.XMLString;/** * Implements the entity scanner methods in * the context of XML 1.1. * * @xerces.internal * * @author Michael Glavassevich, IBM * @author Neil Graham, IBM * @version $Id: XML11EntityScanner.java,v 1.2 2005/08/16 22:51:36 jeffsuttor Exp $ */public class XML11EntityScanner    extends XMLEntityScanner {    //    // Constructors    //    /** Default constructor. */    public XML11EntityScanner() {        super();    } // <init>()    //    // XMLEntityScanner methods    //    /**     * Returns the next character on the input.     * <p>     * <strong>Note:</strong> The character is <em>not</em> consumed.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public int peekChar() throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // peek at character        int c = fCurrentEntity.ch[fCurrentEntity.position];        // return peeked character        if (fCurrentEntity.isExternal()) {            return (c != '\r' && c != 0x85 && c != 0x2028) ? c : '\n';        }        else {            return c;        }    } // peekChar():int    /**     * Returns the next character on the input.     * <p>     * <strong>Note:</strong> The character is consumed.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public int scanChar() throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // scan character        int c = fCurrentEntity.ch[fCurrentEntity.position++];        boolean external = false;        if (c == '\n' ||            ((c == '\r' || c == 0x85 || c == 0x2028) && (external = fCurrentEntity.isExternal()))) {            fCurrentEntity.lineNumber++;            fCurrentEntity.columnNumber = 1;            if (fCurrentEntity.position == fCurrentEntity.count) {                fCurrentEntity.ch[0] = (char)c;                load(1, false);            }            if (c == '\r' && external) {                int cc = fCurrentEntity.ch[fCurrentEntity.position++];                if (cc != '\n' && cc != 0x85) {                    fCurrentEntity.position--;                }            }            c = '\n';        }        // return character that was scanned        fCurrentEntity.columnNumber++;        return c;    } // scanChar():int    /**     * Returns a string matching the NMTOKEN production appearing immediately     * on the input as a symbol, or null if NMTOKEN Name string is present.     * <p>     * <strong>Note:</strong> The NMTOKEN characters are consumed.     * <p>     * <strong>Note:</strong> The string returned must be a symbol. The     * SymbolTable can be used for this purpose.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     *     * @see com.sun.org.apache.xerces.internal.util.SymbolTable     * @see com.sun.org.apache.xerces.internal.util.XML11Char#isXML11Name     */    public String scanNmtoken() throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // scan nmtoken        int offset = fCurrentEntity.position;                do {            char ch = fCurrentEntity.ch[fCurrentEntity.position];            if (XML11Char.isXML11Name(ch)) {                if (++fCurrentEntity.position == fCurrentEntity.count) {                    int length = fCurrentEntity.position - offset;                    if (length == fCurrentEntity.ch.length) {                        // bad luck we have to resize our buffer                        char[] tmp = new char[fCurrentEntity.ch.length << 1];                        System.arraycopy(fCurrentEntity.ch, offset,                                         tmp, 0, length);                        fCurrentEntity.ch = tmp;                    }                    else {                        System.arraycopy(fCurrentEntity.ch, offset,                                         fCurrentEntity.ch, 0, length);                    }                    offset = 0;                    if (load(length, false)) {                        break;                    }                }            }            else if (XML11Char.isXML11NameHighSurrogate(ch)) {                if (++fCurrentEntity.position == fCurrentEntity.count) {                    int length = fCurrentEntity.position - offset;                    if (length == fCurrentEntity.ch.length) {                        // bad luck we have to resize our buffer                        char[] tmp = new char[fCurrentEntity.ch.length << 1];                        System.arraycopy(fCurrentEntity.ch, offset,                                         tmp, 0, length);                        fCurrentEntity.ch = tmp;                    }                    else {                        System.arraycopy(fCurrentEntity.ch, offset,                                         fCurrentEntity.ch, 0, length);                    }                    offset = 0;                    if (load(length, false)) {                        --fCurrentEntity.startPosition;                        --fCurrentEntity.position;                        break;                    }                }                char ch2 = fCurrentEntity.ch[fCurrentEntity.position];                if ( !XMLChar.isLowSurrogate(ch2) ||                     !XML11Char.isXML11Name(XMLChar.supplemental(ch, ch2)) ) {                    --fCurrentEntity.position;                    break;                }                if (++fCurrentEntity.position == fCurrentEntity.count) {                    int length = fCurrentEntity.position - offset;                    if (length == fCurrentEntity.ch.length) {                        // bad luck we have to resize our buffer                        char[] tmp = new char[fCurrentEntity.ch.length << 1];                        System.arraycopy(fCurrentEntity.ch, offset,                                         tmp, 0, length);                        fCurrentEntity.ch = tmp;                    }                    else {                        System.arraycopy(fCurrentEntity.ch, offset,                                         fCurrentEntity.ch, 0, length);                    }                    offset = 0;                    if (load(length, false)) {                        break;                    }                }            }            else {                break;            }        }        while (true);                int length = fCurrentEntity.position - offset;        fCurrentEntity.columnNumber += length;        // return nmtoken        String symbol = null;        if (length > 0) {            symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, offset, length);        }        return symbol;    } // scanNmtoken():String    /**     * Returns a string matching the Name production appearing immediately     * on the input as a symbol, or null if no Name string is present.     * <p>     * <strong>Note:</strong> The Name characters are consumed.     * <p>     * <strong>Note:</strong> The string returned must be a symbol. The     * SymbolTable can be used for this purpose.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     *     * @see com.sun.org.apache.xerces.internal.util.SymbolTable     * @see com.sun.org.apache.xerces.internal.util.XML11Char#isXML11Name     * @see com.sun.org.apache.xerces.internal.util.XML11Char#isXML11NameStart     */    public String scanName() throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // scan name        int offset = fCurrentEntity.position;        char ch = fCurrentEntity.ch[offset];                if (XML11Char.isXML11NameStart(ch)) {            if (++fCurrentEntity.position == fCurrentEntity.count) {                fCurrentEntity.ch[0] = ch;                offset = 0;                if (load(1, false)) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?