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 263537ab..24c71095 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
@@ -2469,7 +2469,7 @@ protected boolean parsePI()
if(tokenize) posStart = pos;
final int curLine = lineNumber;
final int curColumn = columnNumber;
- int piTargetStart = pos + bufAbsoluteStart;
+ int piTargetStart = pos;
int piTargetEnd = -1;
final boolean normalizeIgnorableWS = tokenize == true && roundtripSupported == false;
boolean normalizedCR = false;
@@ -2495,7 +2495,7 @@ protected boolean parsePI()
seenQ = false;
} else {
if(piTargetEnd == -1 && isS(ch)) {
- piTargetEnd = pos - 1 + bufAbsoluteStart;
+ piTargetEnd = pos - 1;
// [17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))
if((piTargetEnd - piTargetStart) == 3) {
@@ -2520,7 +2520,7 @@ protected boolean parsePI()
}
parseXmlDecl(ch);
if(tokenize) posEnd = pos - 2;
- final int off = piTargetStart - bufAbsoluteStart + 3;
+ final int off = piTargetStart + 3;
final int len = pos - 2 - off;
xmlDeclContent = newString(buf, off, len);
return false;
@@ -2575,8 +2575,6 @@ protected boolean parsePI()
//throw new XmlPullParserException(
// "processing instruction must have PITarget name", this, null);
}
- piTargetStart -= bufAbsoluteStart;
- piTargetEnd -= bufAbsoluteStart;
if(tokenize) {
posEnd = pos - 2;
if(normalizeIgnorableWS) {
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 7a013933..be3559da 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
@@ -162,4 +162,70 @@ public void testProcessingInstruction()
assertEquals( XmlPullParser.TEXT, parser.nextToken() );
assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
}
+
+ public void testSubsequentProcessingInstructionShort()
+ throws Exception
+ {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("");
+ sb.append("");
+ sb.append("");
+ sb.append("");
+ sb.append("");
+
+
+ MXParser parser = new MXParser();
+ parser.setInput( new StringReader( sb.toString() ) );
+
+
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
+ }
+
+ public void testSubsequentProcessingInstructionMoreThan8k()
+ throws Exception
+ {
+ StringBuffer sb = new StringBuffer();
+
+ sb.append("");
+ sb.append("");
+
+
+ // add ten times 1000 chars as comment
+ for (int j = 0; j < 10; j++) {
+
+ sb.append("");
+ }
+
+ sb.append("");
+ sb.append("");
+
+
+ MXParser parser = new MXParser();
+ parser.setInput( new StringReader( sb.toString() ) );
+
+
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.COMMENT, parser.nextToken() );
+ assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
+ assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
+ }
}