xmlentityscanner.java

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

JAVA
1,674
字号
        int offset = fCurrentEntity.position;        if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {            if (++fCurrentEntity.position == fCurrentEntity.count) {                invokeListeners(1);                fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];                offset = 0;                if (load(1, false)) {                    fCurrentEntity.columnNumber++;                    String symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);                                        if (DEBUG_BUFFER) {                        System.out.print(")scanName: ");                        print();                        System.out.println(" -> "+String.valueOf(symbol));                    }                    return symbol;                }            }            boolean vc =false;            while (true ){                //XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) ;                char c = fCurrentEntity.ch[fCurrentEntity.position];                if(c < 127){                    vc = VALID_NAMES[c];                }else{                    vc = XMLChar.isName(c);                }                if(!vc)break;                if (++fCurrentEntity.position == fCurrentEntity.count) {                    int length = fCurrentEntity.position - offset;                    invokeListeners(length);                    if (length == fCurrentEntity.fBufferSize) {                        // bad luck we have to resize our buffer                        char[] tmp = new char[fCurrentEntity.fBufferSize * 2];                        System.arraycopy(fCurrentEntity.ch, offset,                                tmp, 0, length);                        fCurrentEntity.ch = tmp;                        fCurrentEntity.fBufferSize *= 2;                    } else {                        System.arraycopy(fCurrentEntity.ch, offset,                                fCurrentEntity.ch, 0, length);                    }                    offset = 0;                    if (load(length, false)) {                        break;                    }                }            }        }        int length = fCurrentEntity.position - offset;        fCurrentEntity.columnNumber += length;                // return name        String symbol;        if (length > 0) {            symbol = fSymbolTable.addSymbol(fCurrentEntity.ch, offset, length);        } else            symbol = null;        if (DEBUG_BUFFER) {            System.out.print(")scanName: ");            print();            System.out.println(" -> "+String.valueOf(symbol));        }        return symbol;            } // scanName():String        /**     * Scans a qualified name from the input, setting the fields of the     * QName structure appropriately.     * <p>     * <strong>Note:</strong> The qualified name characters are consumed.     * <p>     * <strong>Note:</strong> The strings used to set the values of the     * QName structure must be symbols. The SymbolTable can be used for     * this purpose.     *     * @param qname The qualified name structure to fill.     *     * @return Returns true if a qualified name appeared immediately on     *         the input and was scanned, false otherwise.     *     * @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.XMLChar#isName     * @see com.sun.org.apache.xerces.internal.util.XMLChar#isNameStart     */    public boolean scanQName(QName qname) throws IOException {        if (DEBUG_BUFFER) {            System.out.print("(scanQName, "+qname+": ");            print();            System.out.println();        }                // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            invokeListeners(0);            load(0, true);        }                // scan qualified name        int offset = fCurrentEntity.position;                //making a check if if the specified character is a valid name start character        //as defined by production [5] in the XML 1.0 specification.        // Name ::= (Letter | '_' | ':') (NameChar)*                if (XMLChar.isNameStart(fCurrentEntity.ch[offset])) {            if (++fCurrentEntity.position == fCurrentEntity.count) {                invokeListeners(1);                fCurrentEntity.ch[0] = fCurrentEntity.ch[offset];                offset = 0;                                if (load(1, false)) {                    fCurrentEntity.columnNumber++;                    //adding into symbol table.                    //XXX We are trying to add single character in SymbolTable??????                    String name = fSymbolTable.addSymbol(fCurrentEntity.ch, 0, 1);                    qname.setValues(null, name, name, null);                    if (DEBUG_BUFFER) {                        System.out.print(")scanQName, "+qname+": ");                        print();                        System.out.println(" -> true");                    }                    return true;                }            }            int index = -1;            boolean vc = false;            while ( true){                                //XMLChar.isName(fCurrentEntity.ch[fCurrentEntity.position])) ;                char c = fCurrentEntity.ch[fCurrentEntity.position];                if(c < 127){                    vc = VALID_NAMES[c];                }else{                    vc = XMLChar.isName(c);                }                if(!vc)break;                if (c == ':') {                    if (index != -1) {                        break;                    }                    index = fCurrentEntity.position;                }                if (++fCurrentEntity.position == fCurrentEntity.count) {                    int length = fCurrentEntity.position - offset;                    invokeListeners(length);                    if (length == fCurrentEntity.fBufferSize) {                        // bad luck we have to resize our buffer                        char[] tmp = new char[fCurrentEntity.fBufferSize * 2];                        System.arraycopy(fCurrentEntity.ch, offset,                                tmp, 0, length);                        fCurrentEntity.ch = tmp;                        fCurrentEntity.fBufferSize *= 2;                    } else {                        System.arraycopy(fCurrentEntity.ch, offset,                                fCurrentEntity.ch, 0, length);                    }                    if (index != -1) {                        index = index - offset;                    }                    offset = 0;                    if (load(length, false)) {                        break;                    }                }            }            int length = fCurrentEntity.position - offset;            fCurrentEntity.columnNumber += length;            if (length > 0) {                String prefix = null;                String localpart = null;                String rawname = fSymbolTable.addSymbol(fCurrentEntity.ch,                        offset, length);                                if (index != -1) {                    int prefixLength = index - offset;                    prefix = fSymbolTable.addSymbol(fCurrentEntity.ch,                            offset, prefixLength);                    int len = length - prefixLength - 1;                    localpart = fSymbolTable.addSymbol(fCurrentEntity.ch,                            index + 1, len);                                    } else {                    localpart = rawname;                }                qname.setValues(prefix, localpart, rawname, null);                if (DEBUG_BUFFER) {                    System.out.print(")scanQName, "+qname+": ");                    print();                    System.out.println(" -> true");                }                return true;            }        }                // no qualified name found        if (DEBUG_BUFFER) {            System.out.print(")scanQName, "+qname+": ");            print();            System.out.println(" -> false");        }        return false;            } // scanQName(QName):boolean        /**     * CHANGED:     * Scans a range of parsed character data, This function appends the character data to     * the supplied buffer.     * <p>     * <strong>Note:</strong> The characters are consumed.     * <p>     * <strong>Note:</strong> This method does not guarantee to return     * the longest run of parsed character data. This method may return     * before markup due to reaching the end of the input buffer or any     * other reason.     * <p>     *     * @param content The content structure to fill.     *     * @return Returns the next character on the input, if known. This     *         value may be -1 but this does <em>note</em> designate     *         end of file.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public int scanContent(XMLString content) throws IOException {        if (DEBUG_BUFFER) {            System.out.print("(scanContent: ");            print();            System.out.println();        }                // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            invokeListeners(0);            load(0, true);        } else if (fCurrentEntity.position == fCurrentEntity.count - 1) {            invokeListeners(0);            fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];            load(1, false);            fCurrentEntity.position = 0;        }                // normalize newlines        int offset = fCurrentEntity.position;        int c = fCurrentEntity.ch[offset];        int newlines = 0;        if (c == '\n' || (c == '\r' && isExternal)) {            if (DEBUG_BUFFER) {                System.out.print("[newline, "+offset+", "+fCurrentEntity.position+": ");                print();                System.out.println();            }            do {                c = fCurrentEntity.ch[fCurrentEntity.position++];                if (c == '\r' && isExternal) {                    newlines++;                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        offset = 0;                        invokeListeners(newlines);                        fCurrentEntity.position = newlines;                        if (load(newlines, false)) {                            break;                        }                    }                    if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {                        fCurrentEntity.position++;                        offset++;                    }                    /*** NEWLINE NORMALIZATION ***/                    else {                        newlines++;                    }                } else if (c == '\n') {                    newlines++;                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        offset = 0;                        invokeListeners(newlines);                        fCurrentEntity.position = newlines;                        if (load(newlines, false)) {                            break;                        }                    }                } else {                    fCurrentEntity.position--;                    break;                }            } while (fCurrentEntity.position < fCurrentEntity.count - 1);            for (int i = offset; i < fCurrentEntity.position; i++) {                fCurrentEntity.ch[i] = '\n';            }            int length = fCurrentEntity.position - offset;            if (fCurrentEntity.position == fCurrentEntity.count - 1) {                //CHANGED: dont replace the value.. append to the buffer. This gives control to the callee                //on buffering the data..                content.setValues(fCurrentEntity.ch, offset, length);                //content.append(fCurrentEntity.ch, offset, length);                if (DEBUG_BUFFER) {                    System.out.print("]newline, "+offset+", "+fCurrentEntity.position+": ");                    print();                    System.out.println();                }                return -1;            }            if (DEBUG_BUFFER) {                System.out.print("]newline, "+offset+", "+fCurrentEntity.position+": ");                print();                System.out.println();            }        }                while (fCurrentEntity.position < fCurrentEntity.count) {            c = fCurrentEntity.ch[fCurrentEntity.position++];            if (!XMLChar.isContent(c)) {                fCurrentEntity.position--;                break;            }        }        int length = fCurrentEntity.position - offset;        fCurrentEntity.columnNumber += length - newlines;                //CHANGED: dont replace the value.. append to the buffer. This gives control to the callee        //on buffering the data..        content.setValues(fCurrentEntity.ch, offset, length);        //content.append(fCurrentEntity.ch, offset, length);

⌨️ 快捷键说明

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