xmlentityscanner.java

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

JAVA
1,674
字号
            }                        // 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 -= i;                            break;                        }                    }                    if (fCurrentEntity.position == delimOffset + delimLen) {                        done = true;                        break;                    }                } else if (c == '\n' || (isExternal && 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 (done) {                length -= delimLen;            }            buffer.append(fCurrentEntity.ch, offset, length);                        // return true if string was skipped            if (DEBUG_BUFFER) {                System.out.print(")scanData: ");                print();                System.out.println(" -> " + done);            }        } 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 {        if (DEBUG_BUFFER) {            System.out.print("(skipChar, '"+(char)c+"': ");            print();            System.out.println();        }                // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            invokeListeners(0);            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+"': ");                print();                System.out.println(" -> true");            }            return true;        } else if (c == '\n' && cc == '\r' && isExternal) {            // handle newlines            if (fCurrentEntity.position == fCurrentEntity.count) {                invokeListeners(1);                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+"': ");                print();                System.out.println(" -> true");            }            return true;        }                // character was not skipped        if (DEBUG_BUFFER) {            System.out.print(")skipChar, '"+(char)c+"': ");            print();            System.out.println(" -> false");        }        return false;            } // skipChar(int):boolean        public boolean isSpace(char ch){        return (ch == ' ') || (ch == '\n') || (ch == '\t') || (ch == '\r');    }    /**     * 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: ");            print();            System.out.println();        }        //boolean entityChanged = false;        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            invokeListeners(0);            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];        if (XMLChar.isSpace(c)) {            do {                boolean entityChanged = false;                // handle newlines                if (c == '\n' || (isExternal && c == '\r')) {                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count - 1) {                        invokeListeners(0);                        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;                        }else if(fCurrentEntity == null){                            return true ;                        }                    }                    if (c == '\r' && isExternal) {                        // REVISIT: Does this need to be updated to fix the                        //          #x0D ^#x0A newline normalization problem? -Ac                        if (fCurrentEntity.ch[++fCurrentEntity.position] != '\n') {                            fCurrentEntity.position--;                        }                    }                } else {                    fCurrentEntity.columnNumber++;                }                // load more characters, if needed                if (!entityChanged){                    fCurrentEntity.position++;                }                                if (fCurrentEntity.position == fCurrentEntity.count) {                    invokeListeners(0);                    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 true ;                    }                                    }            } while (XMLChar.isSpace(c = fCurrentEntity.ch[fCurrentEntity.position]));            if (DEBUG_BUFFER) {                System.out.print(")skipSpaces: ");                print();                System.out.println(" -> true");            }            return true;        }                // no spaces were found        if (DEBUG_BUFFER) {            System.out.print(")skipSpaces: ");            print();            System.out.println(" -> false");        }        return false;            } // skipSpaces():boolean            /**     * @param legnth This function checks that following number of characters are available.     * to the underlying buffer.     * @return This function returns true if capacity asked is available.     */    public boolean arrangeCapacity(int length) throws IOException{        return arrangeCapacity(length, false);    }        /**     * @param legnth This function checks that following number of characters are available.     * to the underlying buffer.     * @param if the underlying function should change the entity     * @return This function returns true if capacity asked is available.     *     */    public boolean arrangeCapacity(int length, boolean changeEntity) throws IOException{        //check if the capacity is availble in the current buffer        //count is no. of characters in the buffer   [x][m][l]        //position is '0' based        //System.out.println("fCurrent Entity " + fCurrentEntity);        if((fCurrentEntity.count - fCurrentEntity.position) >= length) {            return true;        }        if(DEBUG_SKIP_STRING){            System.out.println("fCurrentEntity.count = " + fCurrentEntity.count);            System.out.println("fCurrentEntity.position = " + fCurrentEntity.position);            System.out.println("length = " + length);        }        boolean entityChanged = false;        //load more characters -- this function shouldn't change the entity        while((fCurrentEntity.count - fCurrentEntity.position) < length){            if( (fCurrentEntity.ch.length - fCurrentEntity.position) < length){                invokeListeners(0);                System.arraycopy(fCurrentEntity.ch, fCurrentEntity.position, fCurrentEntity.ch,0,fCurrentEntity.count - fCurrentEntity.position);                fCurrentEntity.count = fCurrentEntity.count - fCurrentEntity.position;                fCurrentEntity.position = 0;            }                        if((fCurrentEntity.count - fCurrentEntity.position) < length){                int pos = fCurrentEntity.position;                invokeListeners(pos);                entityChanged = load(fCurrentEntity.count, changeEntity);                fCurrentEntity.position = pos;                if(entityChanged)break;            }            if(DEBUG_SKIP_STRING){                System.out.println("fCurrentEntity.count = " + fCurrentEntity.count);                System.out.println("fCurrentEntity.position = " + fCurrentEntity.position);                System.out.println("length = " + length);            }        }        //load changes the position.. set it back to the point where we started.                //after loading check again.        if((fCurrentEntity.count - fCurrentEntity.position) >= length) {            return true;        } else {            return false;        }    }        /**     * Skips the specified string appearing immediately on the input.     * <p>     * <strong>Note:</strong> The characters are consumed only if all     * the characters are skipped.     *     * @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 {               final int length = s.length();                //first make sure that required capacity is avaible        if(arrangeCapacity(length, false)){            final int beforeSkip = fCurrentEntity.position ;            int afterSkip = fCurrentEntity.position + length - 1 ;            if(DEBUG_SKIP_STRING){                System.out.println("skipString,length = " + s + "," + length);                System.out.println("Buffer string to be skipped = " + new String(fCurrentEntity.ch, beforeSkip,  length));            }                        //s.charAt() indexes are 0 to 'Length -1' based.            int i = length - 1 ;            //check from reverse            while(s.charAt(i--) == fCurrentEntity.ch[afterSkip]){                if(afterSkip-- == beforeSkip){                    fCurrentEntity.position = fCurrentEntity.position + length ;                    fCurrentEntity.columnNumber += length;                    return true;                }            }

⌨️ 快捷键说明

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