diff --git a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
index 40a12a21..1acd1fae 100644
--- a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
+++ b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java
@@ -460,7 +460,7 @@ private void reset()
// System.out.println("reset() called");
location = null;
lineNumber = 1;
- columnNumber = 0;
+ columnNumber = 1;
seenRoot = false;
reachedEnd = false;
eventType = START_DOCUMENT;
@@ -2918,7 +2918,7 @@ private void parseComment()
posStart = pos;
final int curLine = lineNumber;
- final int curColumn = columnNumber;
+ final int curColumn = columnNumber - 4;
try
{
final boolean normalizeIgnorableWS = tokenize && !roundtripSupported;
@@ -2930,7 +2930,11 @@ private void parseComment()
{
// scan until it hits -->
ch = more();
- if ( seenDashDash && ch != '>' )
+ if ( ch == (char)-1 )
+ {
+ throw new EOFException( "no more data available" + getPositionDescription() );
+ }
+ else if ( seenDashDash && ch != '>' )
{
throw new XmlPullParserException( "in comment after two dashes (--) next character must be >"
+ " not " + printable( ch ), this, null );
@@ -3035,7 +3039,7 @@ private boolean parsePI()
if ( tokenize )
posStart = pos;
final int curLine = lineNumber;
- final int curColumn = columnNumber;
+ final int curColumn = columnNumber - 2;
int piTargetStart = pos;
int piTargetEnd = -1;
final boolean normalizeIgnorableWS = tokenize && !roundtripSupported;
@@ -3057,7 +3061,11 @@ private boolean parsePI()
// scan until it hits ?>
// ch = more();
- if ( ch == '?' )
+ if ( ch == (char)-1 )
+ {
+ throw new EOFException( "no more data available" + getPositionDescription() );
+ }
+ else if ( ch == '?' )
{
if ( !seenPITarget )
{
diff --git a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
index 0cb9c061..2f7c350b 100644
--- a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
+++ b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java
@@ -286,6 +286,35 @@ public void testValidCharacterReferenceDecimal()
}
}
+ @Test
+ public void testParserPosition()
+ throws Exception
+ {
+ String input = " \n \tnnn\n";
+
+ MXParser parser = new MXParser();
+ parser.setInput( new StringReader( input ) );
+
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertPosition( 1, 39, parser );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 1, 49, parser );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertPosition( 2, 3, parser ); // end when next token starts
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 2, 12, parser );
+ assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
+ assertPosition( 2, 18, parser );
+ assertEquals( XmlPullParser.TEXT, parser.nextToken() );
+ assertPosition( 2, 23, parser ); // end when next token starts
+ assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
+ assertPosition( 2, 29, parser );
+ assertEquals( XmlPullParser.IGNORABLE_WHITESPACE, parser.nextToken() );
+ assertPosition( 3, 2, parser ); // end when next token starts
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertPosition( 4, 6, parser );
+ }
+
@Test
public void testProcessingInstruction()
throws Exception
@@ -517,7 +546,7 @@ public void testMalformedProcessingInstructionNoClosingQuestionMark()
}
catch ( XmlPullParserException ex )
{
- assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 2 was not closed" ) );
+ assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 1 was not closed" ) );
}
}
@@ -545,7 +574,59 @@ public void testSubsequentMalformedProcessingInstructionNoClosingQuestionMark()
}
catch ( XmlPullParserException ex )
{
- assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 13 was not closed" ) );
+ assertTrue( ex.getMessage().contains( "processing instruction started on line 1 and column 12 was not closed" ) );
+ }
+ }
+
+ @Test
+ public void testSubsequentAbortedProcessingInstruction()
+ throws Exception
+ {
+ MXParser parser = new MXParser();
+ StringBuilder sb = new StringBuilder();
+ sb.append( "" );
+ sb.append( "" );
+ sb.append( "