static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, const CFX_ByteString& csName, int& nIndex, CPDF_Array** ppFind, int nLevel = 0) { if (nLevel > nMaxRecursion) { return NULL; } CPDF_Array* pLimits = pNode->GetArrayBy("Limits"); if (pLimits) { CFX_ByteString csLeft = pLimits->GetStringAt(0); CFX_ByteString csRight = pLimits->GetStringAt(1); if (csLeft.Compare(csRight) > 0) { CFX_ByteString csTmp = csRight; csRight = csLeft; csLeft = csTmp; } if (csName.Compare(csLeft) < 0 || csName.Compare(csRight) > 0) { return NULL; } } CPDF_Array* pNames = pNode->GetArrayBy("Names"); if (pNames) { FX_DWORD dwCount = pNames->GetCount() / 2; for (FX_DWORD i = 0; i < dwCount; i++) { CFX_ByteString csValue = pNames->GetStringAt(i * 2); int32_t iCompare = csValue.Compare(csName); if (iCompare <= 0) { if (ppFind) { *ppFind = pNames; } if (iCompare < 0) { continue; } } else { break; } nIndex += i; return pNames->GetElementValue(i * 2 + 1); } nIndex += dwCount; return NULL; } CPDF_Array* pKids = pNode->GetArrayBy("Kids"); if (!pKids) { return NULL; } for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { CPDF_Dictionary* pKid = pKids->GetDictAt(i); if (!pKid) { continue; } CPDF_Object* pFound = SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1); if (pFound) { return pFound; } } return NULL; }
CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const { if (!m_pRoot) return nullptr; size_t nCurIndex = 0; return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, nullptr); }
CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const { if (!m_pRoot) { return NULL; } int nIndex = 0; return SearchNameNode(m_pRoot, csName, nIndex, NULL); }
static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, size_t nIndex, size_t& nCurIndex, CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0) { if (nLevel > nMaxRecursion) return nullptr; CPDF_Array* pNames = pNode->GetArrayBy("Names"); if (pNames) { size_t nCount = pNames->GetCount() / 2; if (nIndex >= nCurIndex + nCount) { nCurIndex += nCount; return nullptr; } if (ppFind) *ppFind = pNames; csName = pNames->GetStringAt((nIndex - nCurIndex) * 2); return pNames->GetDirectObjectAt((nIndex - nCurIndex) * 2 + 1); } CPDF_Array* pKids = pNode->GetArrayBy("Kids"); if (!pKids) return nullptr; for (size_t i = 0; i < pKids->GetCount(); i++) { CPDF_Dictionary* pKid = pKids->GetDictAt(i); if (!pKid) continue; CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1); if (pFound) return pFound; } return nullptr; }
CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, CFX_ByteString& csName) const { if (m_pRoot == NULL) { return NULL; } int nCurIndex = 0; return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL); }
int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const { if (!m_pRoot) return -1; size_t nIndex = 0; if (!SearchNameNode(m_pRoot, csName, nIndex, nullptr)) return -1; return nIndex; }
int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const { if (!m_pRoot) { return -1; } int nIndex = 0; if (!SearchNameNode(m_pRoot, csName, nIndex, NULL)) { return -1; } return nIndex; }
static CPDF_Object* SearchNameNode(CPDF_Dictionary* pNode, int nIndex, int& nCurIndex, CFX_ByteString& csName, CPDF_Array** ppFind, int nLevel = 0) { if (nLevel > nMaxRecursion) { return NULL; } CPDF_Array* pNames = pNode->GetArrayBy("Names"); if (pNames) { int nCount = pNames->GetCount() / 2; if (nIndex >= nCurIndex + nCount) { nCurIndex += nCount; return NULL; } if (ppFind) { *ppFind = pNames; } csName = pNames->GetStringAt((nIndex - nCurIndex) * 2); return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1); } CPDF_Array* pKids = pNode->GetArrayBy("Kids"); if (!pKids) { return NULL; } for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { CPDF_Dictionary* pKid = pKids->GetDictAt(i); if (!pKid) { continue; } CPDF_Object* pFound = SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1); if (pFound) { return pFound; } } return NULL; }