xml11entityscanner.java

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

JAVA
1,525
字号
            // REVISIT: Does this need to be updated to fix the            //          #x0D ^#x0A newline normalization problem? -Ac            if ((c == '\r' || c == 0x85 || c == 0x2028) && external) {                c = '\n';            }        }        else {            c = -1;        }        return c;    } // scanContent(XMLString):int    /**     * Scans a range of attribute value data, setting the fields of the     * XMLString structure, appropriately.     * <p>     * <strong>Note:</strong> The characters are consumed.     * <p>     * <strong>Note:</strong> This method does not guarantee to return     * the longest run of attribute value data. This method may return     * before the quote character due to reaching the end of the input     * buffer or any other reason.     * <p>     * <strong>Note:</strong> The fields contained in the XMLString     * structure are not guaranteed to remain valid upon subsequent calls     * to the entity scanner. Therefore, the caller is responsible for     * immediately using the returned character data or making a copy of     * the character data.     *     * @param quote   The quote character that signifies the end of the     *                attribute value data.     * @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 scanLiteral(int quote, XMLString content)        throws IOException {        // load more characters, if needed        if (fCurrentEntity.position == fCurrentEntity.count) {            load(0, true);        }        else if (fCurrentEntity.position == fCurrentEntity.count - 1) {            fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1];            load(1, false);            fCurrentEntity.startPosition = 0;            fCurrentEntity.position = 0;        }        // normalize newlines        int offset = fCurrentEntity.position;        int c = fCurrentEntity.ch[offset];        int newlines = 0;        boolean external = fCurrentEntity.isExternal();        if (c == '\n' || ((c == '\r' || c == 0x85 || c == 0x2028) && external)) {            do {                c = fCurrentEntity.ch[fCurrentEntity.position++];                if ((c == '\r' ) && external) {                    newlines++;                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        offset = 0;                        fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition);                        fCurrentEntity.position = newlines;                        fCurrentEntity.startPosition = newlines;                        if (load(newlines, false)) {                            break;                        }                    }                    int cc = fCurrentEntity.ch[fCurrentEntity.position];                     if (cc == '\n' || cc == 0x85) {                        fCurrentEntity.position++;                        offset++;                    }                    /*** NEWLINE NORMALIZATION ***/                    else {                        newlines++;                    }                }                else if (c == '\n' || ((c == 0x85 || c == 0x2028) && external)) {                    newlines++;                    fCurrentEntity.lineNumber++;                    fCurrentEntity.columnNumber = 1;                    if (fCurrentEntity.position == fCurrentEntity.count) {                        offset = 0;                        fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition);                        fCurrentEntity.position = newlines;                        fCurrentEntity.startPosition = 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) {                content.setValues(fCurrentEntity.ch, offset, length);                return -1;            }        }        // scan literal value        if (external) {            while (fCurrentEntity.position < fCurrentEntity.count) {                c = fCurrentEntity.ch[fCurrentEntity.position++];                if (c == quote || c == '%' || !XML11Char.isXML11Content(c)                     || c == 0x85 || c == 0x2028) {                    fCurrentEntity.position--;                    break;                }            }        }        else {            while (fCurrentEntity.position < fCurrentEntity.count) {                c = fCurrentEntity.ch[fCurrentEntity.position++];                // In internal entities control characters are allowed to appear unescaped.                if ((c == quote && !fCurrentEntity.literal)                    || c == '%' || !XML11Char.isXML11InternalEntityContent(c)) {                    fCurrentEntity.position--;                    break;                }            }        }        int length = fCurrentEntity.position - offset;        fCurrentEntity.columnNumber += length - newlines;        content.setValues(fCurrentEntity.ch, offset, length);        // return next character        if (fCurrentEntity.position != fCurrentEntity.count) {            c = fCurrentEntity.ch[fCurrentEntity.position];            // NOTE: We don't want to accidentally signal the            //       end of the literal if we're expanding an            //       entity appearing in the literal. -Ac            if (c == quote && fCurrentEntity.literal) {                c = -1;            }        }        else {            c = -1;        }        return c;    } // scanLiteral(int,XMLString):int    /**     * Scans a range of character data up to the specicied delimiter,     * setting the fields of the XMLString structure, appropriately.     * <p>     * <strong>Note:</strong> The characters are consumed.     * <p>     * <strong>Note:</strong> This assumes that the internal buffer is     * at least the same size, or bigger, than the length of the delimiter     * and that the delimiter contains at least one character.     * <p>     * <strong>Note:</strong> This method does not guarantee to return     * the longest run of character data. This method may return before     * the delimiter due to reaching the end of the input buffer or any     * other reason.     * <p>     * <strong>Note:</strong> The fields contained in the XMLString     * structure are not guaranteed to remain valid upon subsequent calls     * to the entity scanner. Therefore, the caller is responsible for     * immediately using the returned character data or making a copy of     * the character data.     *     * @param delimiter The string that signifies the end of the character     *                  data to be scanned.     * @param data      The data structure to fill.     *     * @return Returns true if there is more data to scan, false otherwise.     *     * @throws IOException  Thrown if i/o error occurs.     * @throws EOFException Thrown on end of file.     */    public boolean scanData(String delimiter, XMLStringBuffer buffer)        throws IOException {        boolean done = false;        int delimLen = delimiter.length();        char charAt0 = delimiter.charAt(0);        boolean external = fCurrentEntity.isExternal();        do {            // 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;              fCurrentEntity.startPosition = 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.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition);                fCurrentEntity.position = fCurrentEntity.count;                fCurrentEntity.startPosition = 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' || c == 0x85 || c == 0x2028) && external)) {                do {                    c = fCurrentEntity.ch[fCurrentEntity.position++];                    if ((c == '\r' ) && external) {                        newlines++;                        fCurrentEntity.lineNumber++;                        fCurrentEntity.columnNumber = 1;                        if (fCurrentEntity.position == fCurrentEntity.count) {                            offset = 0;                            fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition);                            fCurrentEntity.position = newlines;                            fCurrentEntity.startPosition = newlines;                            if (load(newlines, false)) {                                break;                            }                        }                        int cc = fCurrentEntity.ch[fCurrentEntity.position];                         if (cc == '\n' || cc == 0x85) {                            fCurrentEntity.position++;                            offset++;                        }                        /*** NEWLINE NORMALIZATION ***/                        else {                            newlines++;                        }                    }                    else if (c == '\n' || ((c == 0x85 || c == 0x2028) && external)) {                        newlines++;                        fCurrentEntity.lineNumber++;                        fCurrentEntity.columnNumber = 1;                        if (fCurrentEntity.position == fCurrentEntity.count) {                            offset = 0;                            fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition);                            fCurrentEntity.position = newlines;                            fCurrentEntity.startPosition = 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);                    return true;                }            }            // iterate over buffer looking for delimiter            if (external) {                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;                            }

⌨️ 快捷键说明

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