From 22730f9a12e7e448cfb2d7ec8800b816de78915d Mon Sep 17 00:00:00 2001 From: Maxim Valyanskiy Date: Tue, 6 Jul 2010 15:45:36 +0000 Subject: [PATCH] HWPF: better fix for TextPieceTable.getCharIndex() git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@960922 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hwpf/model/TextPieceTable.java | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) 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 fae08e03f..11a5b372e 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; + } - int toAdd = bytePos > pieceEnd ? bytesLength : bytesLength - (pieceEnd - bytePos); + for(TextPiece tp : _textPieces) { + int pieceStart = tp.getPieceDescriptor().getFilePosition(); - if (tp.isUnicode()) { - charCount += toAdd / 2; - } else { - charCount += toAdd; - } - } + int bytesLength = tp.bytesLength(); + int pieceEnd = pieceStart + bytesLength; - return charCount; - } + int toAdd; + + 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) {