xmlentityscanner.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,660 行 · 第 1/5 页

JAVA
1,660
字号
        //          So if this code is updated to NOT buffer, the scanning        //          code for comments and processing instructions will         //          need to be updated to do its own buffering. The code         //          for CDATA sections is safe as-is. -Ac        boolean found = false;        int delimLen = delimiter.length();        char charAt0 = delimiter.charAt(0);        boolean external = fCurrentEntity.isExternal();        if (DEBUG_BUFFER) {            System.out.print("(scanData: ");            XMLEntityManager.print(fCurrentEntity);            System.out.println();        }        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        boolean bNextEntity = false;        while ((fCurrentEntity.position >= fCurrentEntity.count - delimLen)            && (!bNextEntity))        {          System.arraycopy(fCurrentEntity.ch,                           fCurrentEntity.position,                           fCurrentEntity.ch,                           0,                           fCurrentEntity.count - fCurrentEntity.position);          bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false);          fCurrentEntity.position = 0;        }        if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) {            // something must be wrong with the input:  e.g., file ends  an unterminated comment            int length = fCurrentEntity.count - fCurrentEntity.position;            buffer.append (fCurrentEntity.ch, fCurrentEntity.position, length);             fCurrentEntity.columnNumber += fCurrentEntity.count;            fCurrentEntity.position = fCurrentEntity.count;            load(0,true);            return false;        }        // normalize newlines        int offset = fCurrentEntity.position;        int c = fCurrentEntity.ch[offset];        int newlines = 0;        if (c == '\n' || (c == '\r' && external)) {            if (DEBUG_BUFFER) {                System.out.print("[newline, "+offset+", "+fCurrentEntity.position+": ");                XMLEntityManager.print(fCurrentEntity);                System.out.println();            }            do {                c = fCurrentEntity.ch[fCurrentEntity.position++];                if (c == '\r' && external) {                    newlines++;                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        offset = 0;                        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;                        fCurrentEntity.position = newlines;                        fCurrentEntity.count = 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) {                buffer.append(fCurrentEntity.ch, offset, length);                if (DEBUG_BUFFER) {                    System.out.print("]newline, "+offset+", "+fCurrentEntity.position+": ");                    XMLEntityManager.print(fCurrentEntity);                    System.out.println();                }                return true;            }            if (DEBUG_BUFFER) {                System.out.print("]newline, "+offset+", "+fCurrentEntity.position+": ");                XMLEntityManager.print(fCurrentEntity);                System.out.println();            }        }        // iterate over buffer looking for delimiter        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) {                    found = true;                    break;                }            }            else if (c == '\n' || (external && c == '\r')) {                fCurrentEntity.position--;                break;            }            else if (XMLChar.isInvalid(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 (found) {            length -= delimLen;        }        buffer.append (fCurrentEntity.ch, offset, length);        // return true if string was skipped        if (DEBUG_BUFFER) {            System.out.print(")scanData: ");            XMLEntityManager.print(fCurrentEntity);            System.out.println(" -> " + !found);        }        return !found;    } // scanData(String,XMLString):boolean    /**     * 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 {        if (DEBUG_BUFFER) {            System.out.print("(skipChar, '"+(char)c+"': ");            XMLEntityManager.print(fCurrentEntity);            System.out.println();        }        // 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++;            }            if (DEBUG_BUFFER) {                System.out.print(")skipChar, '"+(char)c+"': ");                XMLEntityManager.print(fCurrentEntity);                System.out.println(" -> true");            }            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);            }            fCurrentEntity.position++;            if (fCurrentEntity.ch[fCurrentEntity.position] == '\n') {                fCurrentEntity.position++;            }            fCurrentEntity.lineNumber++;            fCurrentEntity.columnNumber = 1;            if (DEBUG_BUFFER) {                System.out.print(")skipChar, '"+(char)c+"': ");                XMLEntityManager.print(fCurrentEntity);                System.out.println(" -> true");            }            return true;        }        // character was not skipped        if (DEBUG_BUFFER) {            System.out.print(")skipChar, '"+(char)c+"': ");            XMLEntityManager.print(fCurrentEntity);            System.out.println(" -> false");        }        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     */    public boolean skipSpaces() throws IOException {        if (DEBUG_BUFFER) {            System.out.print("(skipSpaces: ");            XMLEntityManager.print(fCurrentEntity);            System.out.println();        }        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        // skip spaces        int c = fCurrentEntity.ch[fCurrentEntity.position];        if (XMLChar.isSpace(c)) {            boolean external = fCurrentEntity.isExternal();            do {                boolean entityChanged = false;                // handle newlines                if (c == '\n' || (external && c == '\r')) {                    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.position = 0;                    }                    if (c == '\r' && external) {                        // REVISIT: Does this need to be updated to fix the                        //          #x0D ^#x0A newline normalization problem? -Ac                        if (fCurrentEntity.ch[++fCurrentEntity.position] != '\n') {                            fCurrentEntity.position--;                        }                    }                    /*** NEWLINE NORMALIZATION ***                    else {                        if (fCurrentEntity.ch[fCurrentEntity.position + 1] == '\r'                            && external) {                            fCurrentEntity.position++;                        }                    }                    /***/                }                else {                    fCurrentEntity.columnNumber++;                }                // load more characters, if needed                if (!entityChanged)                    fCurrentEntity.position++;                if (fCurrentEntity.position == fCurrentEntity.count) {                    load(0, true);                }            } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));            if (DEBUG_BUFFER) {                System.out.print(")skipSpaces: ");                XMLEntityManager.print(fCurrentEntity);                System.out.println(" -> true");            }            return true;        }        // no spaces were found        if (DEBUG_BUFFER) {            System.out.print(")skipSpaces: ");            XMLEntityManager.print(fCurrentEntity);            System.out.println(" -> false");        }        return false;    } // skipSpaces():boolean    /**     * Skips space characters appearing immediately on the input that would     * match non-terminal S (0x09, 0x0A, 0x0D, 0x20) before end of line      * normalization is performed. This is useful when scanning structures      * such as the XMLDecl and TextDecl that can only contain US-ASCII 

⌨️ 快捷键说明

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