mrglavas 2004/09/02 08:43:32 Modified: java/src/org/apache/xerces/dom DOMLocatorImpl.java DOMErrorImpl.java java/src/org/apache/xerces/impl/xs/opti SchemaDOMParser.java ElementImpl.java SchemaDOM.java java/src/org/apache/xerces/impl/xs/traversers XSDHandler.java java/src/org/apache/xerces/impl XMLEntityScanner.java XMLVersionDetector.java XMLEntityManager.java XML11EntityScanner.java java/src/org/apache/xerces/util DOMErrorHandlerWrapper.java java/src/org/apache/xerces/impl/xs/util SimpleLocator.java Log: Adding support for computing character offsets to the scanner.
Exposing this information to the XNI and DOM locators. Thanks to Ankit Pasricha for this contribution. Revision Changes Path 1.10 +10 -3 xml-xerces/java/src/org/apache/xerces/dom/DOMLocatorImpl.java Index: DOMLocatorImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMLocatorImpl.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- DOMLocatorImpl.java 24 Feb 2004 23:23:17 -0000 1.9 +++ DOMLocatorImpl.java 2 Sep 2004 15:43:26 -0000 1.10 @@ -81,6 +81,13 @@ fColumnNumber = columnNumber ; fUri = uri; } // DOMLocatorImpl (int lineNumber, int columnNumber, String uri ) + + public DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri ){ + fLineNumber = lineNumber ; + fColumnNumber = columnNumber ; + fUri = uri; + fUtf16Offset = utf16Offset; + } // DOMLocatorImpl (int lineNumber, int columnNumber, int utf16Offset, String uri ) public DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri ){ fLineNumber = lineNumber ; @@ -90,13 +97,13 @@ fUri = uri; } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri ) - public DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri, int utf16Offsert ){ + public DOMLocatorImpl (int lineNumber, int columnNumber, int byteoffset, Node relatedData, String uri, int utf16Offset ){ fLineNumber = lineNumber ; fColumnNumber = columnNumber ; fByteOffset = byteoffset ; fRelatedNode = relatedData ; fUri = uri; - fUtf16Offset = utf16Offsert; + fUtf16Offset = utf16Offset; } // DOMLocatorImpl (int lineNumber, int columnNumber, int offset, Node errorNode, String uri ) 1.12 +3 -3 xml-xerces/java/src/org/apache/xerces/dom/DOMErrorImpl.java Index: DOMErrorImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMErrorImpl.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- DOMErrorImpl.java 24 Feb 2004 23:23:18 -0000 1.11 +++ DOMErrorImpl.java 2 Sep 2004 15:43:26 -0000 1.12 @@ -100,8 +100,8 @@ // assuming DOMLocator wants the *expanded*, not the literal, URI of the doc... - neilg return new DOMLocatorImpl(exception.getLineNumber(), exception.getColumnNumber(), - exception.getExpandedSystemId() - ); + exception.getCharacterOffset(), + exception.getExpandedSystemId()); } // createDOMLocator() 1.10 +5 -3 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOMParser.java Index: SchemaDOMParser.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOMParser.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SchemaDOMParser.java 22 Jun 2004 04:08:45 -0000 1.9 +++ SchemaDOMParser.java 2 Sep 2004 15:43:26 -0000 1.10 @@ -222,7 +222,8 @@ } schemaDOM.startElement(element, attributes, fLocator.getLineNumber(), - fLocator.getColumnNumber()); + fLocator.getColumnNumber(), + fLocator.getCharacterOffset()); } @@ -262,7 +263,8 @@ schemaDOM.emptyElement(element, attributes, fLocator.getLineNumber(), - fLocator.getColumnNumber()); + fLocator.getColumnNumber(), + fLocator.getCharacterOffset()); if (fAnnotationDepth == -1) { // this is messed up, but a case to consider: 1.7 +20 -3 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/ElementImpl.java Index: ElementImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/ElementImpl.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ElementImpl.java 24 Feb 2004 22:59:11 -0000 1.6 +++ ElementImpl.java 2 Sep 2004 15:43:26 -0000 1.7 @@ -37,8 +37,9 @@ int line; int column; + int charOffset; - public ElementImpl(int line, int column) { + public ElementImpl(int line, int column, int offset) { row = -1; col = -1; parentRow = -1; @@ -46,11 +47,16 @@ this.line = line; this.column = column; + charOffset = offset; + } + + public ElementImpl(int line, int column) { + this(line, column, -1); } public ElementImpl(String prefix, String localpart, String rawname, - String uri, int line, int column) { + String uri, int line, int column, int offset) { super(prefix, localpart, rawname, uri, Node.ELEMENT_NODE); row = -1; col = -1; @@ -58,7 +64,13 @@ this.line = line; this.column = column; + charOffset = offset; } + + public ElementImpl(String prefix, String localpart, String rawname, + String uri, int line, int column) { + this(prefix, localpart, rawname, uri, line, column, -1); + } // @@ -224,6 +236,11 @@ /** Returns the column number. */ public int getColumnNumber() { return column; + } + + /** Returns the character offset. */ + public int getCharacterOffset() { + return charOffset; } } 1.8 +17 -6 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOM.java Index: SchemaDOM.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOM.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SchemaDOM.java 18 Jul 2004 20:04:36 -0000 1.7 +++ SchemaDOM.java 2 Sep 2004 15:43:26 -0000 1.8 @@ -57,8 +57,8 @@ public void startElement(QName element, XMLAttributes attributes, - int line, int column) { - ElementImpl node = new ElementImpl(line, column); + int line, int column, int offset) { + ElementImpl node = new ElementImpl(line, column, offset); processElement(element, attributes, node); // now the current node added, becomes the parent parent = node; @@ -66,11 +66,22 @@ public void emptyElement(QName element, XMLAttributes attributes, - int line, int column) { - ElementImpl node = new ElementImpl(line, column); + int line, int column, int offset) { + ElementImpl node = new ElementImpl(line, column, offset); processElement(element, attributes, node); } + public void startElement(QName element, XMLAttributes attributes, + int line, int column) { + startElement(element, attributes, line, column, -1); + } + + + public void emptyElement(QName element, XMLAttributes attributes, + int line, int column) { + emptyElement(element, attributes, line, column, -1); + } + private void processElement(QName element, XMLAttributes attributes, ElementImpl node) { @@ -248,7 +259,7 @@ for(int j=0; j<relations[i].length; j++) relations[i][j] = null; relations = new NodeImpl[relationsRowResizeFactor][]; - parent = new ElementImpl(0, 0); + parent = new ElementImpl(0, 0, 0); parent.rawname = "DOCUMENT_NODE"; currLoc = 0; nextFreeLoc = 1; 1.80 +3 -3 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java Index: XSDHandler.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java,v retrieving revision 1.79 retrieving revision 1.80 diff -u -r1.79 -r1.80 --- XSDHandler.java 23 Jul 2004 22:16:09 -0000 1.79 +++ XSDHandler.java 2 Sep 2004 15:43:29 -0000 1.80 @@ -256,7 +256,7 @@ // the Grammar Pool private XMLGrammarPool fGrammarPool; - + //************ Traversers ********** XSDAttributeGroupTraverser fAttributeGroupTraverser; XSDAttributeTraverser fAttributeTraverser; @@ -2106,7 +2106,7 @@ // line/column numbers are stored in the element node int line = ele.getLineNumber(); int column = ele.getColumnNumber(); - l.setValues(sid, sid, line, column); + l.setValues(sid, sid, line, column, ele.getCharacterOffset()); return true; } return false; 1.22 +40 -6 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java Index: XMLEntityScanner.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityScanner.java,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- XMLEntityScanner.java 1 Sep 2004 03:06:07 -0000 1.21 +++ XMLEntityScanner.java 2 Sep 2004 15:43:30 -0000 1.22 @@ -667,6 +667,7 @@ fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; load(1, false); fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; } // normalize newlines @@ -688,7 +689,9 @@ 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; } @@ -708,7 +711,9 @@ 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; } @@ -816,6 +821,7 @@ fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; load(1, false); fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; } // normalize newlines @@ -837,7 +843,9 @@ 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; } @@ -858,7 +866,9 @@ 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; } @@ -998,6 +1008,7 @@ bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false); fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; } if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) { @@ -1005,7 +1016,9 @@ 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; } @@ -1028,7 +1041,9 @@ 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; } @@ -1048,7 +1063,9 @@ 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; @@ -1242,10 +1259,12 @@ if (fCurrentEntity.position == fCurrentEntity.count - 1) { fCurrentEntity.ch[0] = (char)c; entityChanged = load(1, true); - if (!entityChanged) + if (!entityChanged) { // the load change the position to be 1, // need to restore it when entity not changed fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } } if (c == '\r' && external) { // REVISIT: Does this need to be updated to fix the @@ -1333,10 +1352,12 @@ if (fCurrentEntity.position == fCurrentEntity.count - 1) { fCurrentEntity.ch[0] = (char)c; entityChanged = load(1, true); - if (!entityChanged) + if (!entityChanged) { // the load change the position to be 1, // need to restore it when entity not changed fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; + } } if (c == '\r' && external) { // REVISIT: Does this need to be updated to fix the @@ -1425,6 +1446,7 @@ // 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; if (DEBUG_BUFFER) { System.out.print(")skipString, \""+s+"\": "); @@ -1597,7 +1619,16 @@ * @return The character offset, or -1 if none is available. */ public int getCharacterOffset() { - /** TODO: Implement this method. **/ + if (fCurrentEntity != null) { + if (fCurrentEntity.isExternal()) { + return fCurrentEntity.baseCharOffset + (fCurrentEntity.position - fCurrentEntity.startPosition); + } + else { + // ask current entity to find appropriate character offset + return fCurrentEntity.getCharacterOffset(); + } + } + return -1; } // getCharacterOffset():int @@ -1622,7 +1653,7 @@ return null; } // getEncoding():String - /** + /** * Returns the XML version of the current entity. This will normally be the * value from the XML or text declaration or defaulted by the parser. Note that * that this value may be different than the version of the processing rules @@ -1644,7 +1675,7 @@ } return null; } // getXMLVersion():String - + // allow entity manager to tell us what the current entityis: public void setCurrentEntity(XMLEntityManager.ScannedEntity ent) { fCurrentEntity = ent; @@ -1700,6 +1731,7 @@ System.out.println(); } + fCurrentEntity.baseCharOffset += (fCurrentEntity.position - fCurrentEntity.startPosition); // read characters int length = fCurrentEntity.mayReadChunks? (fCurrentEntity.ch.length - offset): @@ -1714,6 +1746,7 @@ if (count != 0) { fCurrentEntity.count = count + offset; fCurrentEntity.position = offset; + fCurrentEntity.startPosition = offset; } } @@ -1721,6 +1754,7 @@ else { fCurrentEntity.count = offset; fCurrentEntity.position = offset; + fCurrentEntity.startPosition = offset; entityChanged = true; if (changeEntity) { fEntityManager.endEntity(); 1.13 +3 -1 xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java Index: XMLVersionDetector.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLVersionDetector.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- XMLVersionDetector.java 27 Feb 2004 20:36:07 -0000 1.12 +++ XMLVersionDetector.java 2 Sep 2004 15:43:30 -0000 1.13 @@ -220,6 +220,8 @@ // prepend contents... System.arraycopy(scannedChars, 0, currentEntity.ch, 0, length); currentEntity.position = 0; + currentEntity.baseCharOffset = 0; + currentEntity.startPosition = 0; currentEntity.columnNumber = currentEntity.lineNumber = 1; } 1.83 +39 -17 xml-xerces/java/src/org/apache/xerces/impl/XMLEntityManager.java Index: XMLEntityManager.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XMLEntityManager.java,v retrieving revision 1.82 retrieving revision 1.83 diff -u -r1.82 -r1.83 --- XMLEntityManager.java 1 Sep 2004 03:06:07 -0000 1.82 +++ XMLEntityManager.java 2 Sep 2004 15:43:30 -0000 1.83 @@ -2307,7 +2307,7 @@ public int columnNumber = 1; // encoding - + /** Auto-detected encoding. */ public String encoding; @@ -2331,10 +2331,16 @@ /** Character buffer. */ public char[] ch = null; - + /** Position in character buffer. */ public int position; - + + /** Base character offset for computing absolute character offset. */ + public int baseCharOffset; + + /** Start position in character buffer. */ + public int startPosition; + /** Count of characters in buffer. */ public int count; @@ -2414,41 +2420,55 @@ } return null; } - + // return line number of position in most // recent external entity public int getLineNumber() { // search for the first external entity on the stack int size = fEntityStack.size(); for (int i=size-1; i>0 ; i--) { - ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); + ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); if (firstExternalEntity.isExternal()) { return firstExternalEntity.lineNumber; } } return -1; } - + // return column number of position in most // recent external entity public int getColumnNumber() { // search for the first external entity on the stack int size = fEntityStack.size(); for (int i=size-1; i>0 ; i--) { - ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); + ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); if (firstExternalEntity.isExternal()) { return firstExternalEntity.columnNumber; } } return -1; } - + + // return character offset of position in most + // recent external entity + public int getCharacterOffset() { + // search for the first external entity on the stack + int size = fEntityStack.size(); + for (int i=size-1; i>0 ; i--) { + ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); + if (firstExternalEntity.isExternal()) { + return firstExternalEntity.baseCharOffset + (firstExternalEntity.position - firstExternalEntity.startPosition); + } + } + return -1; + } + // return encoding of most recent external entity public String getEncoding() { // search for the first external entity on the stack int size = fEntityStack.size(); for (int i=size-1; i>0 ; i--) { - ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); + ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); if (firstExternalEntity.isExternal()) { return firstExternalEntity.encoding; } @@ -2461,29 +2481,31 @@ // search for the first external entity on the stack int size = fEntityStack.size(); for (int i=size-1; i>0 ; i--) { - ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); + ScannedEntity firstExternalEntity = (ScannedEntity)fEntityStack.elementAt(i); if (firstExternalEntity.isExternal()) { return firstExternalEntity.xmlVersion; } } return null; } - + // // Object methods // - + /** Returns a string representation of this object. */ public String toString() { - + StringBuffer str = new StringBuffer(); str.append("name=\""+name+'"'); str.append(",ch="); str.append(ch); - str.append(",position="+position); - str.append(",count="+count); + str.append(",position=" + position); + str.append(",count=" + count); + str.append(",baseCharOffset=" + baseCharOffset); + str.append(",startPosition=" + startPosition); return str.toString(); - + } // toString():String public boolean isDeclaredEncoding() { 1.13 +32 -3 xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java Index: XML11EntityScanner.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/XML11EntityScanner.java,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- XML11EntityScanner.java 24 Feb 2004 23:03:46 -0000 1.12 +++ XML11EntityScanner.java 2 Sep 2004 15:43:31 -0000 1.13 @@ -181,6 +181,7 @@ } offset = 0; if (load(length, false)) { + --fCurrentEntity.startPosition; --fCurrentEntity.position; break; } @@ -271,6 +272,7 @@ offset = 0; if (load(1, false)) { --fCurrentEntity.position; + --fCurrentEntity.startPosition; return null; } } @@ -334,6 +336,7 @@ offset = 0; if (load(length, false)) { --fCurrentEntity.position; + --fCurrentEntity.startPosition; break; } } @@ -424,6 +427,7 @@ offset = 0; if (load(1, false)) { --fCurrentEntity.position; + --fCurrentEntity.startPosition; return null; } } @@ -486,6 +490,7 @@ } offset = 0; if (load(length, false)) { + --fCurrentEntity.startPosition; --fCurrentEntity.position; break; } @@ -583,6 +588,7 @@ fCurrentEntity.ch[0] = ch; offset = 0; if (load(1, false)) { + --fCurrentEntity.startPosition; --fCurrentEntity.position; return false; } @@ -662,6 +668,7 @@ offset = 0; if (load(length, false)) { sawIncompleteSurrogatePair = true; + --fCurrentEntity.startPosition; --fCurrentEntity.position; break; } @@ -773,6 +780,7 @@ fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; load(1, false); fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; } // normalize newlines @@ -789,7 +797,9 @@ 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; } @@ -810,7 +820,9 @@ 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; } @@ -909,6 +921,7 @@ else if (fCurrentEntity.position == fCurrentEntity.count - 1) { fCurrentEntity.ch[0] = fCurrentEntity.ch[fCurrentEntity.count - 1]; load(1, false); + fCurrentEntity.startPosition = 0; fCurrentEntity.position = 0; } @@ -926,7 +939,9 @@ 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; } @@ -947,7 +962,9 @@ 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; } @@ -1067,6 +1084,7 @@ bNextEntity = load(fCurrentEntity.count - fCurrentEntity.position, false); fCurrentEntity.position = 0; + fCurrentEntity.startPosition = 0; } if (fCurrentEntity.position >= fCurrentEntity.count - delimLen) { @@ -1074,7 +1092,9 @@ 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; } @@ -1092,7 +1112,9 @@ 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; } @@ -1113,7 +1135,9 @@ 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; @@ -1318,10 +1342,12 @@ if (fCurrentEntity.position == fCurrentEntity.count - 1) { fCurrentEntity.ch[0] = (char)c; entityChanged = load(1, true); - if (!entityChanged) + if (!entityChanged) { // the load change the position to be 1, // need to restore it when entity not changed + fCurrentEntity.startPosition = 0; fCurrentEntity.position = 0; + } } if (c == '\r') { // REVISIT: Does this need to be updated to fix the @@ -1356,10 +1382,12 @@ if (fCurrentEntity.position == fCurrentEntity.count - 1) { fCurrentEntity.ch[0] = (char)c; entityChanged = load(1, true); - if (!entityChanged) + 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 { @@ -1413,6 +1441,7 @@ // 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; } 1.14 +4 -1 xml-xerces/java/src/org/apache/xerces/util/DOMErrorHandlerWrapper.java Index: DOMErrorHandlerWrapper.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/util/DOMErrorHandlerWrapper.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- DOMErrorHandlerWrapper.java 5 Jul 2004 22:29:30 -0000 1.13 +++ DOMErrorHandlerWrapper.java 2 Sep 2004 15:43:31 -0000 1.14 @@ -134,6 +134,7 @@ if (locator != null) { locator.fColumnNumber = exception.getColumnNumber(); locator.fLineNumber = exception.getLineNumber(); + locator.fUtf16Offset = exception.getCharacterOffset(); locator.fUri = exception.getExpandedSystemId(); locator.fRelatedNode = fCurrentNode; } @@ -169,6 +170,7 @@ if (locator != null) { locator.fColumnNumber = exception.getColumnNumber(); locator.fLineNumber = exception.getLineNumber(); + locator.fUtf16Offset = exception.getCharacterOffset(); locator.fUri = exception.getExpandedSystemId(); locator.fRelatedNode= fCurrentNode; } @@ -213,6 +215,7 @@ if (locator != null) { locator.fColumnNumber = exception.getColumnNumber(); locator.fLineNumber = exception.getLineNumber(); + locator.fUtf16Offset = exception.getCharacterOffset(); locator.fUri = exception.getExpandedSystemId(); locator.fRelatedNode = fCurrentNode; } 1.6 +53 -38 xml-xerces/java/src/org/apache/xerces/impl/xs/util/SimpleLocator.java Index: SimpleLocator.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/util/SimpleLocator.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SimpleLocator.java 1 Sep 2004 03:06:08 -0000 1.5 +++ SimpleLocator.java 2 Sep 2004 15:43:32 -0000 1.6 @@ -25,24 +25,36 @@ * @version $Id$ */ public class SimpleLocator implements XMLLocator { + String lsid, esid; int line, column; + int charOffset; public SimpleLocator() { } public SimpleLocator(String lsid, String esid, int line, int column) { + this(lsid, esid, line, column, -1); + } + + public void setValues(String lsid, String esid, int line, int column) { + setValues(lsid, esid, line, column, -1); + } + + public SimpleLocator(String lsid, String esid, int line, int column, int offset) { this.line = line; this.column = column; this.lsid = lsid; this.esid = esid; + charOffset = offset; } - public void setValues(String lsid, String esid, int line, int column) { + public void setValues(String lsid, String esid, int line, int column, int offset) { this.line = line; this.column = column; this.lsid = lsid; this.esid = esid; + charOffset = offset; } public int getLineNumber() { @@ -54,62 +66,66 @@ } public int getCharacterOffset() { - return -1; + return charOffset; } - + public String getPublicId() { return null; } - + public String getExpandedSystemId() { return esid; } - + public String getLiteralSystemId() { return lsid; } - + public String getBaseSystemId() { return null; } - /** - * @see org.apache.xerces.xni.XMLLocator#setColumnNumber(int) - */ - public void setColumnNumber(int col) { + /** + * @see org.apache.xerces.xni.XMLLocator#setColumnNumber(int) + */ + public void setColumnNumber(int col) { this.column = col; } - - /** - * @see org.apache.xerces.xni.XMLLocator#setLineNumber(int) - */ - public void setLineNumber(int line) { + + /** + * @see org.apache.xerces.xni.XMLLocator#setLineNumber(int) + */ + public void setLineNumber(int line) { this.line = line; } - - /** - * @see org.apache.xerces.xni.XMLResourceIdentifier#setBaseSystemId(String) - */ - public void setBaseSystemId(String systemId) {} - - /** - * @see org.apache.xerces.xni.XMLResourceIdentifier#setExpandedSystemId(String) - */ - public void setExpandedSystemId(String systemId) { + + public void setCharacterOffset(int offset) { + charOffset = offset; + } + + /** + * @see org.apache.xerces.xni.XMLResourceIdentifier#setBaseSystemId(String) + */ + public void setBaseSystemId(String systemId) {} + + /** + * @see org.apache.xerces.xni.XMLResourceIdentifier#setExpandedSystemId(String) + */ + public void setExpandedSystemId(String systemId) { esid = systemId; } - - /** - * @see org.apache.xerces.xni.XMLResourceIdentifier#setLiteralSystemId(String) - */ - public void setLiteralSystemId(String systemId) { + + /** + * @see org.apache.xerces.xni.XMLResourceIdentifier#setLiteralSystemId(String) + */ + public void setLiteralSystemId(String systemId) { lsid = systemId; } - - /** - * @see org.apache.xerces.xni.XMLResourceIdentifier#setPublicId(String) - */ - public void setPublicId(String publicId) {} - + + /** + * @see org.apache.xerces.xni.XMLResourceIdentifier#setPublicId(String) + */ + public void setPublicId(String publicId) {} + /** Returns the encoding of the current entity. * Since these locators are used in the construction of * XMLParseExceptions, which know nothing about encodings, there is @@ -123,5 +139,4 @@ public String getXMLVersion() { return null; } - } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]