/** * Normalizes the iteration mark character c * * @param c iteration mark character to normalize * @return normalized iteration mark * @throws IOException If there is a low-level I/O error. */ private char normalizeIterationMark(char c) throws IOException { // Case 1: Inside an iteration mark span if (bufferPosition < iterationMarkSpanEndPosition) { return normalize(sourceCharacter(bufferPosition, iterationMarksSpanSize), c); } // Case 2: New iteration mark spans starts where the previous one ended, which is illegal if (bufferPosition == iterationMarkSpanEndPosition) { // Emit the illegal iteration mark and increase end position to indicate that we can't // start a new span on the next position either iterationMarkSpanEndPosition++; return c; } // Case 3: New iteration mark span iterationMarksSpanSize = nextIterationMarkSpanSize(); iterationMarkSpanEndPosition = bufferPosition + iterationMarksSpanSize; return normalize(sourceCharacter(bufferPosition, iterationMarksSpanSize), c); }