xml11entityscanner.java

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

JAVA
1,525
字号
                         }                         if (fCurrentEntity.position == delimOffset + delimLen) {                            done = true;                            break;                         }                    }                    else if (c == '\n' || c == '\r' || c == 0x85 || c == 0x2028) {                        fCurrentEntity.position--;                        break;                    }                    // In external entities control characters cannot appear                     // as literals so do not skip over them.                    else if (!XML11Char.isXML11ValidLiteral(c)) {                        fCurrentEntity.position--;                        int length = fCurrentEntity.position - offset;                        fCurrentEntity.columnNumber += length - newlines;                        buffer.append(fCurrentEntity.ch, offset, length);                         return true;                    }                }            }            else {                OUTER: while (fCurrentEntity.position < fCurrentEntity.count) {                    c = fCurrentEntity.ch[fCurrentEntity.position++];                    if (c == charAt0) {                        // looks like we just hit the delimiter                        int delimOffset = fCurrentEntity.position - 1;                        for (int i = 1; i < delimLen; i++) {                            if (fCurrentEntity.position == fCurrentEntity.count) {                                fCurrentEntity.position -= i;                                break OUTER;                            }                            c = fCurrentEntity.ch[fCurrentEntity.position++];                            if (delimiter.charAt(i) != c) {                                fCurrentEntity.position--;                                break;                            }                        }                        if (fCurrentEntity.position == delimOffset + delimLen) {                            done = true;                            break;                        }                    }                    else if (c == '\n') {                        fCurrentEntity.position--;                        break;                    }                    // Control characters are allowed to appear as literals                    // in internal entities.                    else if (!XML11Char.isXML11Valid(c)) {                        fCurrentEntity.position--;                        int length = fCurrentEntity.position - offset;                        fCurrentEntity.columnNumber += length - newlines;                        buffer.append(fCurrentEntity.ch, offset, length);                         return true;                    }                }            }            int length = fCurrentEntity.position - offset;            fCurrentEntity.columnNumber += length - newlines;            if (done) {                length -= delimLen;            }            buffer.append(fCurrentEntity.ch, offset, length);            // return true if string was skipped        } while (!done);        return !done;    } // scanData(String,XMLString)    /**     * Skips a character appearing immediately on the input.     * <p>     * <strong>Note:</strong> The character is consumed only if it matches     * the specified character.     *     * @param c The character to skip.     *     * @return Returns true if the character was skipped.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public boolean skipChar(int c) throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // skip character        int cc = fCurrentEntity.ch[fCurrentEntity.position];        if (cc == c) {            fCurrentEntity.position++;            if (c == '\n') {                fCurrentEntity.lineNumber++;                fCurrentEntity.columnNumber = 1;            }            else {                fCurrentEntity.columnNumber++;            }            return true;        }        else if (c == '\n' && ((cc == 0x2028 || cc == 0x85) && fCurrentEntity.isExternal())) {            fCurrentEntity.position++;            fCurrentEntity.lineNumber++;            fCurrentEntity.columnNumber = 1;            return true;        }        else if (c == '\n' && (cc == '\r' ) && fCurrentEntity.isExternal()) {            // handle newlines            if (fCurrentEntity.position == fCurrentEntity.count) {                fCurrentEntity.ch[0] = (char)cc;                load(1, false);            }            int ccc = fCurrentEntity.ch[++fCurrentEntity.position];            if (ccc == '\n' || ccc == 0x85) {                fCurrentEntity.position++;            }            fCurrentEntity.lineNumber++;            fCurrentEntity.columnNumber = 1;            return true;        }        // character was not skipped        return false;    } // skipChar(int):boolean    /**     * Skips space characters appearing immediately on the input.     * <p>     * <strong>Note:</strong> The characters are consumed only if they are     * space characters.     *     * @return Returns true if at least one space character was skipped.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     *     * @see com.sun.org.apache.xerces.internal.util.XMLChar#isSpace     * @see com.sun.org.apache.xerces.internal.util.XML11Char#isXML11Space     */    public boolean skipSpaces() throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }                        //we are doing this check only in skipSpace() because it is called by        //fMiscDispatcher and we want the parser to exit gracefully when document        //is well-formed.        //it is possible that end of document is reached and        //fCurrentEntity becomes null        //nothing was read so entity changed  'false' should be returned.        if(fCurrentEntity == null){            return false ;        }                // skip spaces        int c = fCurrentEntity.ch[fCurrentEntity.position];                // External --  Match: S + 0x85 + 0x2028, and perform end of line normalization        if (fCurrentEntity.isExternal()) {            if (XML11Char.isXML11Space(c)) {                do {                    boolean entityChanged = false;                    // handle newlines                    if (c == '\n' || c == '\r' || c == 0x85 || c == 0x2028) {                        fCurrentEntity.lineNumber++;                        fCurrentEntity.columnNumber = 1;                        if (fCurrentEntity.position == fCurrentEntity.count - 1) {                            fCurrentEntity.ch[0] = (char)c;                            entityChanged = load(1, true);                            if (!entityChanged) {                                // the load change the position to be 1,                                // need to restore it when entity not changed                                fCurrentEntity.startPosition = 0;                                fCurrentEntity.position = 0;                            } else if(fCurrentEntity == null){                                return true ;                            }                                                    }                        if (c == '\r') {                            // REVISIT: Does this need to be updated to fix the                            //          #x0D ^#x0A newline normalization problem? -Ac                            int cc = fCurrentEntity.ch[++fCurrentEntity.position];                            if (cc != '\n' && cc != 0x85 ) {                                fCurrentEntity.position--;                            }                        }                    }                    else {                        fCurrentEntity.columnNumber++;                    }                    // load more characters, if needed                    if (!entityChanged)                        fCurrentEntity.position++;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        load(0, true);                                                if(fCurrentEntity == null){                        return true ;                        }                                            }                } while (XML11Char.isXML11Space(c = fCurrentEntity.ch[fCurrentEntity.position]));                return true;            }        }        // Internal -- Match: S (only)        else if (XMLChar.isSpace(c)) {            do {                boolean entityChanged = false;                // handle newlines                if (c == '\n') {                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count - 1) {                        fCurrentEntity.ch[0] = (char)c;                        entityChanged = load(1, true);                        if (!entityChanged) {                            // the load change the position to be 1,                            // need to restore it when entity not changed                            fCurrentEntity.startPosition = 0;                            fCurrentEntity.position = 0;                        } else if(fCurrentEntity == null){                        return true ;                        }                    }                }                else {                    fCurrentEntity.columnNumber++;                }                // load more characters, if needed                if (!entityChanged)                    fCurrentEntity.position++;                if (fCurrentEntity.position == fCurrentEntity.count) {                    load(0, true);                                        if(fCurrentEntity == null){                        return true ;                    }                                    }            } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));            return true;        }        // no spaces were found        return false;    } // skipSpaces():boolean    /**     * Skips the specified string appearing immediately on the input.     * <p>     * <strong>Note:</strong> The characters are consumed only if they are     * space characters.     *     * @param s The string to skip.     *     * @return Returns true if the string was skipped.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public boolean skipString(String s) throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // skip string        final int length = s.length();        for (int i = 0; i < length; i++) {            char c = fCurrentEntity.ch[fCurrentEntity.position++];            if (c != s.charAt(i)) {                fCurrentEntity.position -= i + 1;                return false;            }            if (i < length - 1 && fCurrentEntity.position == fCurrentEntity.count) {                System.arraycopy(fCurrentEntity.ch, fCurrentEntity.count - i - 1, fCurrentEntity.ch, 0, i + 1);                // REVISIT: Can a string to be skipped cross an                //          entity boundary? -Ac                if (load(i + 1, false)) {                    fCurrentEntity.startPosition -= i + 1;                    fCurrentEntity.position -= i + 1;                    return false;                }            }        }        fCurrentEntity.columnNumber += length;        return true;    } // skipString(String):boolean} // class XML11EntityScanner

⌨️ 快捷键说明

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