14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdftext/cpdf_textpagefind.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <cwchar> 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <cwctype> 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector> 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdftext/cpdf_textpage.h" 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_string.h" 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_system.h" 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h" 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsIgnoreSpaceCharacter(FX_WCHAR curChar) { 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (curChar < 255 || (curChar >= 0x0600 && curChar <= 0x06FF) || 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0xFE70 && curChar <= 0xFEFF) || 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0xFB50 && curChar <= 0xFDFF) || 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0x0400 && curChar <= 0x04FF) || 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0x0500 && curChar <= 0x052F) || 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0xA640 && curChar <= 0xA69F) || 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0x2DE0 && curChar <= 0x2DFF) || curChar == 8467 || 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (curChar >= 0x2000 && curChar <= 0x206F)) { 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextPageFind::CPDF_TextPageFind(const CPDF_TextPage* pTextPage) 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : m_pTextPage(pTextPage), 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_flags(0), 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart(-1), 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart(-1), 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bMatchCase(false), 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bMatchWholeWord(false), 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart(0), 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resEnd(-1), 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind(false) { 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_strText = m_pTextPage->GetPageText(); 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nCount = pTextPage->CountChars(); 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nCount) 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex.push_back(0); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int i = 0; i < nCount; i++) { 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FPDF_CHAR_INFO info; 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pTextPage->GetCharInfo(i, &info); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int indexSize = pdfium::CollectionSize<int>(m_CharIndex); 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (info.m_Flag == FPDFTEXT_CHAR_NORMAL || 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann info.m_Flag == FPDFTEXT_CHAR_GENERATED) { 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (indexSize % 2) { 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex.push_back(1); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (indexSize <= 0) 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex[indexSize - 1] += 1; 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (indexSize % 2) { 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (indexSize <= 0) 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex[indexSize - 1] = i + 1; 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex.push_back(i + 1); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int indexSize = pdfium::CollectionSize<int>(m_CharIndex); 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (indexSize % 2) 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_CharIndex.erase(m_CharIndex.begin() + indexSize - 1); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPDF_TextPageFind::~CPDF_TextPageFind() {} 794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_TextPageFind::GetCharIndex(int index) const { 814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_pTextPage->CharIndexFromTextIndex(index); 824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_TextPageFind::FindFirst(const CFX_WideString& findwhat, 854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int flags, 864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int startPos) { 874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextPage) 884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_strText.IsEmpty() || m_bMatchCase != (flags & FPDFTEXT_MATCHCASE)) 904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_strText = m_pTextPage->GetPageText(); 914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString findwhatStr = findwhat; 924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findWhat = findwhatStr; 934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_flags = flags; 944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bMatchCase = flags & FPDFTEXT_MATCHCASE; 954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_strText.IsEmpty()) { 964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_STRSIZE len = findwhatStr.GetLength(); 1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_bMatchCase) { 1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann findwhatStr.MakeLower(); 1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_strText.MakeLower(); 1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_bMatchWholeWord = !!(flags & FPDFTEXT_MATCHWHOLEWORD); 1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart = startPos; 1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (startPos == -1) 1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = m_strText.GetLength() - 1; 1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = startPos; 1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.clear(); 1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int i = 0; 1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (i < len) { 1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (findwhatStr.GetAt(i) != ' ') 1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann i++; 1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (i < len) 1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ExtractFindWhat(findwhatStr); 1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.push_back(findwhatStr); 1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_csFindWhatArray.empty()) 1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = true; 1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart = 0; 1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resEnd = -1; 1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_TextPageFind::FindNext() { 1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextPage) 1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resArray.clear(); 1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_findNextStart == -1) 1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_strText.IsEmpty()) { 1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int strLen = m_strText.GetLength(); 1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_findNextStart > strLen - 1) { 1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nCount = pdfium::CollectionSize<int>(m_csFindWhatArray); 1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nResultPos = 0; 1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nStartPos = 0; 1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nStartPos = m_findNextStart; 1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bSpaceStart = false; 1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int iWord = 0; iWord < nCount; iWord++) { 1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString csWord = m_csFindWhatArray[iWord]; 1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (csWord.IsEmpty()) { 1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iWord == nCount - 1) { 1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR strInsert = m_strText.GetAt(nStartPos); 1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strInsert == TEXT_LINEFEED_CHAR || strInsert == TEXT_SPACE_CHAR || 1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strInsert == TEXT_RETURN_CHAR || strInsert == 160) { 1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nResultPos = nStartPos + 1; 1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWord = -1; 1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (iWord == 0) { 1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bSpaceStart = true; 1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int endIndex; 1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nResultPos = m_strText.Find(csWord.c_str(), nStartPos); 1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nResultPos == -1) { 1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann endIndex = nResultPos + csWord.GetLength() - 1; 1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iWord == 0) 1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart = nResultPos; 1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool bMatch = true; 1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (iWord != 0 && !bSpaceStart) { 1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int PreResEndPos = nStartPos; 1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int curChar = csWord.GetAt(0); 1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString lastWord = m_csFindWhatArray[iWord - 1]; 1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int lastChar = lastWord.GetAt(lastWord.GetLength() - 1); 1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nStartPos == nResultPos && 1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann !(IsIgnoreSpaceCharacter(lastChar) || 1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann IsIgnoreSpaceCharacter(curChar))) { 1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bMatch = false; 1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int d = PreResEndPos; d < nResultPos; d++) { 1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR strInsert = m_strText.GetAt(d); 1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_SPACE_CHAR && 1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strInsert != TEXT_RETURN_CHAR && strInsert != 160) { 1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bMatch = false; 1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else if (bSpaceStart) { 1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (nResultPos > 0) { 1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR strInsert = m_strText.GetAt(nResultPos - 1); 1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (strInsert != TEXT_LINEFEED_CHAR && strInsert != TEXT_SPACE_CHAR && 1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann strInsert != TEXT_RETURN_CHAR && strInsert != 160) { 1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bMatch = false; 1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart = nResultPos; 2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart = nResultPos - 1; 2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_bMatchWholeWord && bMatch) { 2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bMatch = IsMatchWholeWord(m_strText, nResultPos, endIndex); 2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nStartPos = endIndex + 1; 2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!bMatch) { 2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann iWord = -1; 2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (bSpaceStart) 2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nStartPos = m_resStart + m_csFindWhatArray[1].GetLength(); 2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann else 2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nStartPos = m_resStart + m_csFindWhatArray[0].GetLength(); 2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resEnd = nResultPos + m_csFindWhatArray.back().GetLength() - 1; 2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = true; 2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int resStart = GetCharIndex(m_resStart); 2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int resEnd = GetCharIndex(m_resEnd); 2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resArray = m_pTextPage->GetRectArray(resStart, resEnd - resStart + 1); 2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_flags & FPDFTEXT_CONSECUTIVE) { 2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart = m_resStart + 1; 2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = m_resEnd - 1; 2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart = m_resEnd + 1; 2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = m_resStart - 1; 2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_TextPageFind::FindPrev() { 2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!m_pTextPage) 2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resArray.clear(); 2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_strText.IsEmpty() || m_findPreStart < 0) { 2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CPDF_TextPageFind findEngine(m_pTextPage); 2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann bool ret = findEngine.FindFirst(m_findWhat, m_flags); 2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!ret) { 2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int order = -1, MatchedCount = 0; 2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (ret) { 2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ret = findEngine.FindNext(); 2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret) { 2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int order1 = findEngine.GetCurOrder(); 2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int MatchedCount1 = findEngine.GetMatchedCount(); 2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (((order1 + MatchedCount1) - 1) > m_findPreStart) 2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann order = order1; 2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann MatchedCount = MatchedCount1; 2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (order == -1) { 2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = false; 2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resStart = m_pTextPage->TextIndexFromCharIndex(order); 2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resEnd = m_pTextPage->TextIndexFromCharIndex(order + MatchedCount - 1); 2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_IsFind = true; 2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_resArray = m_pTextPage->GetRectArray(order, MatchedCount); 2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (m_flags & FPDFTEXT_CONSECUTIVE) { 2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart = m_resStart + 1; 2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = m_resEnd - 1; 2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findNextStart = m_resEnd + 1; 2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_findPreStart = m_resStart - 1; 2724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return m_IsFind; 2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPDF_TextPageFind::ExtractFindWhat(const CFX_WideString& findwhat) { 2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (findwhat.IsEmpty()) 2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return; 2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int index = 0; 2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (1) { 2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString csWord = TEXT_EMPTY; 2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int ret = 2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ExtractSubString(csWord, findwhat.c_str(), index, TEXT_SPACE_CHAR); 2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (csWord.IsEmpty()) { 2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (ret) { 2864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.push_back(L""); 2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } else { 2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int pos = 0; 2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (pos < csWord.GetLength()) { 2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString curStr = csWord.Mid(pos, 1); 2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR curChar = csWord.GetAt(pos); 2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (IsIgnoreSpaceCharacter(curChar)) { 2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pos > 0 && curChar == 0x2019) { 2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pos++; 3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pos > 0) 3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.push_back(csWord.Mid(0, pos)); 3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.push_back(curStr); 3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pos == csWord.GetLength() - 1) { 3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann csWord.clear(); 3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann break; 3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann csWord = csWord.Right(csWord.GetLength() - pos - 1); 3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pos = 0; 3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann continue; 3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann pos++; 3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!csWord.IsEmpty()) 3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann m_csFindWhatArray.push_back(csWord); 3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann index++; 3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_TextPageFind::IsMatchWholeWord(const CFX_WideString& csPageText, 3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int startPos, 3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int endPos) { 3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR char_left = 0; 3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR char_right = 0; 3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int char_count = endPos - startPos + 1; 3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (char_count < 1) 3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (char_count == 1 && csPageText.GetAt(startPos) > 255) 3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (startPos - 1 >= 0) 3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char_left = csPageText.GetAt(startPos - 1); 3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (startPos + char_count < csPageText.GetLength()) 3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char_right = csPageText.GetAt(startPos + char_count); 3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if ((char_left > 'A' && char_left < 'a') || 3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (char_left > 'a' && char_left < 'z') || 3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (char_left > 0xfb00 && char_left < 0xfb06) || std::iswdigit(char_left) || 3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (char_right > 'A' && char_right < 'a') || 3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (char_right > 'a' && char_right < 'z') || 3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann (char_right > 0xfb00 && char_right < 0xfb06) || 3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann std::iswdigit(char_right)) { 3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!(('A' > char_left || char_left > 'Z') && 3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ('a' > char_left || char_left > 'z') && 3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ('A' > char_right || char_right > 'Z') && 3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ('a' > char_right || char_right > 'z'))) { 3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (char_count > 0) { 3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (csPageText.GetAt(startPos) >= L'0' && 3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann csPageText.GetAt(startPos) <= L'9' && char_left >= L'0' && 3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char_left <= L'9') { 3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (csPageText.GetAt(endPos) >= L'0' && csPageText.GetAt(endPos) <= L'9' && 3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann char_right >= L'0' && char_right <= L'9') { 3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CPDF_TextPageFind::ExtractSubString(CFX_WideString& rString, 3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_WCHAR* lpszFullString, 3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int iSubString, 3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FX_WCHAR chSep) { 3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!lpszFullString) 3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (iSubString--) { 3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lpszFullString = std::wcschr(lpszFullString, chSep); 3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (!lpszFullString) { 3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rString.clear(); 3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return false; 3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lpszFullString++; 3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann while (*lpszFullString == chSep) 3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann lpszFullString++; 3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann const FX_WCHAR* lpchEnd = std::wcschr(lpszFullString, chSep); 3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nLen = lpchEnd ? (int)(lpchEnd - lpszFullString) 3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann : (int)FXSYS_wcslen(lpszFullString); 3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann ASSERT(nLen >= 0); 3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann FXSYS_memcpy(rString.GetBuffer(nLen), lpszFullString, 3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann nLen * sizeof(FX_WCHAR)); 3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann rString.ReleaseBuffer(); 3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return true; 3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_WideString CPDF_TextPageFind::MakeReverse(const CFX_WideString& str) { 3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann CFX_WideString str2; 3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str2.clear(); 3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int nlen = str.GetLength(); 3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int i = nlen - 1; i >= 0; i--) 3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann str2 += str.GetAt(i); 3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return str2; 3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_TextPageFind::GetCurOrder() const { 4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return GetCharIndex(m_resStart); 4014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 4024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint CPDF_TextPageFind::GetMatchedCount() const { 4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int resStart = GetCharIndex(m_resStart); 4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int resEnd = GetCharIndex(m_resEnd); 4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return resEnd - resStart + 1; 4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 408