// Copyright 2016 PDFium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com #include "xfa/fde/cfde_txtedtbufiter.h" #include "xfa/fde/cfde_txtedtbuf.h" CFDE_TxtEdtBufIter::CFDE_TxtEdtBufIter(CFDE_TxtEdtBuf* pBuf, FX_WCHAR wcAlias) : m_pBuf(pBuf), m_nCurChunk(0), m_nCurIndex(0), m_nIndex(0), m_Alias(wcAlias) { ASSERT(m_pBuf); } CFDE_TxtEdtBufIter::~CFDE_TxtEdtBufIter() {} FX_BOOL CFDE_TxtEdtBufIter::Next(FX_BOOL bPrev) { if (bPrev) { if (m_nIndex == 0) { return FALSE; } ASSERT(m_nCurChunk < m_pBuf->m_Chunks.GetSize()); CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunk = nullptr; if (m_nCurIndex > 0) { m_nCurIndex--; } else { while (m_nCurChunk > 0) { --m_nCurChunk; lpChunk = m_pBuf->m_Chunks[m_nCurChunk]; if (lpChunk->nUsed > 0) { m_nCurIndex = lpChunk->nUsed - 1; break; } } } ASSERT(m_nCurChunk >= 0); m_nIndex--; return TRUE; } else { if (m_nIndex >= (m_pBuf->m_nTotal - 1)) { return FALSE; } ASSERT(m_nCurChunk < m_pBuf->m_Chunks.GetSize()); CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunk = m_pBuf->m_Chunks[m_nCurChunk]; if (lpChunk->nUsed != (m_nCurIndex + 1)) { m_nCurIndex++; } else { int32_t nEnd = m_pBuf->m_Chunks.GetSize() - 1; while (m_nCurChunk < nEnd) { m_nCurChunk++; CFDE_TxtEdtBuf::FDE_CHUNKHEADER* lpChunkTemp = m_pBuf->m_Chunks[m_nCurChunk]; if (lpChunkTemp->nUsed > 0) { m_nCurIndex = 0; break; } } } m_nIndex++; return TRUE; } } void CFDE_TxtEdtBufIter::SetAt(int32_t nIndex) { ASSERT(nIndex >= 0 && nIndex < m_pBuf->m_nTotal); CFDE_TxtEdtBuf::FDE_CHUNKPLACE cp; m_pBuf->Index2CP(nIndex, cp); m_nIndex = nIndex; m_nCurChunk = cp.nChunkIndex; m_nCurIndex = cp.nCharIndex; } int32_t CFDE_TxtEdtBufIter::GetAt() const { return m_nIndex; } FX_WCHAR CFDE_TxtEdtBufIter::GetChar() { ASSERT(m_nIndex >= 0 && m_nIndex < m_pBuf->m_nTotal); if (m_Alias == 0 || m_nIndex == (m_pBuf->m_nTotal - 1)) return m_pBuf->m_Chunks[m_nCurChunk]->wChars[m_nCurIndex]; return m_Alias; } FX_BOOL CFDE_TxtEdtBufIter::IsEOF(FX_BOOL bTail) const { return bTail ? m_nIndex == (m_pBuf->GetTextLength() - 2) : m_nIndex == 0; } IFX_CharIter* CFDE_TxtEdtBufIter::Clone() { CFDE_TxtEdtBufIter* pIter = new CFDE_TxtEdtBufIter(m_pBuf); pIter->m_nCurChunk = m_nCurChunk; pIter->m_nCurIndex = m_nCurIndex; pIter->m_nIndex = m_nIndex; pIter->m_Alias = m_Alias; return pIter; }