From: Maxim Valyanskiy Date: Tue, 6 Jul 2010 15:45:36 +0000 (+0000) Subject: HWPF: better fix for TextPieceTable.getCharIndex() X-Git-Tag: REL_3_7_BETA2~33 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=06b37ca45bb8192b2965942fd1d7f9dca73b0b85;p=poi.git HWPF: better fix for TextPieceTable.getCharIndex() git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@960922 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java index fae08e03f5..11a5b372ee 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/model/TextPieceTable.java @@ -242,29 +242,50 @@ public final class TextPieceTable implements CharIndexTranslator { return false; } - public int getCharIndex(int bytePos) { - int charCount = 0; + public int getCharIndex(int bytePos) { + int charCount = 0; for(TextPiece tp : _textPiecesFCOrder) { int pieceStart = tp.getPieceDescriptor().getFilePosition(); - if (pieceStart >= bytePos) { - break; + + if (bytePos > pieceStart + tp.bytesLength()) { + continue; + } + + if (pieceStart > bytePos) { + bytePos = pieceStart; } - int bytesLength = tp.bytesLength(); - int pieceEnd = pieceStart + bytesLength; + break; + } + + for(TextPiece tp : _textPieces) { + int pieceStart = tp.getPieceDescriptor().getFilePosition(); - int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength - (pieceEnd - bytePos); + int bytesLength = tp.bytesLength(); + int pieceEnd = pieceStart + bytesLength; - if (tp.isUnicode()) { - charCount += toAdd / 2; - } else { - charCount += toAdd; - } - } + int toAdd; - return charCount; - } + if (bytePos< pieceStart || bytePos > pieceEnd) { + toAdd = bytesLength; + } else { + toAdd = bytesLength - (pieceEnd - bytePos); + } + + if (tp.isUnicode()) { + charCount += toAdd / 2; + } else { + charCount += toAdd; + } + + if (bytePos>=pieceStart && bytePos<=pieceEnd) { + break; + } + } + + return charCount; + } private static class FCComparator implements Comparator { public int compare(TextPiece textPiece, TextPiece textPiece1) {