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