summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xfa/fxfa/parser/xfa_utils.cpp23
-rw-r--r--xfa/fxfa/parser/xfa_utils_unittest.cpp9
2 files changed, 19 insertions, 13 deletions
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 6bd04c322f..75d017b070 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -6,6 +6,8 @@
#include "xfa/fxfa/parser/xfa_utils.h"
+#include <algorithm>
+
#include "core/fxcrt/fx_ext.h"
#include "xfa/fde/xml/cfde_xmlchardata.h"
#include "xfa/fde/xml/cfde_xmlelement.h"
@@ -432,19 +434,14 @@ const XFA_ATTRIBUTEINFO* XFA_GetAttributeByName(const CFX_WideStringC& wsName) {
if (wsName.IsEmpty())
return nullptr;
- uint32_t uHash = FX_HashCode_GetW(wsName, false);
- int32_t iStart = 0;
- int32_t iEnd = g_iXFAAttributeCount - 1;
- do {
- int32_t iMid = (iStart + iEnd) / 2;
- const XFA_ATTRIBUTEINFO* pInfo = g_XFAAttributeData + iMid;
- if (uHash == pInfo->uHash)
- return pInfo;
- if (uHash < pInfo->uHash)
- iEnd = iMid - 1;
- else
- iStart = iMid + 1;
- } while (iStart <= iEnd);
+ auto* it = std::lower_bound(g_XFAAttributeData,
+ g_XFAAttributeData + g_iXFAAttributeCount,
+ FX_HashCode_GetW(wsName, false),
+ [](const XFA_ATTRIBUTEINFO& arg, uint32_t hash) {
+ return arg.uHash < hash;
+ });
+ if (it != g_XFAAttributeData + g_iXFAAttributeCount && wsName == it->pName)
+ return it;
return nullptr;
}
diff --git a/xfa/fxfa/parser/xfa_utils_unittest.cpp b/xfa/fxfa/parser/xfa_utils_unittest.cpp
index e4dd09419e..1898a797ec 100644
--- a/xfa/fxfa/parser/xfa_utils_unittest.cpp
+++ b/xfa/fxfa/parser/xfa_utils_unittest.cpp
@@ -273,3 +273,12 @@ TEST_F(XFANodeIteratorTest, ChildAsRootNext) {
EXPECT_EQ(child6(), iter.MoveToNext());
EXPECT_EQ(nullptr, iter.MoveToNext());
}
+
+TEST(XFAUtilsTest, GetAttributeByName) {
+ EXPECT_EQ(nullptr, XFA_GetAttributeByName(L""));
+ EXPECT_EQ(nullptr, XFA_GetAttributeByName(L"clams"));
+ EXPECT_EQ(XFA_ATTRIBUTE_H, XFA_GetAttributeByName(L"h")->eName);
+ EXPECT_EQ(XFA_ATTRIBUTE_Short, XFA_GetAttributeByName(L"short")->eName);
+ EXPECT_EQ(XFA_ATTRIBUTE_DecipherOnly,
+ XFA_GetAttributeByName(L"decipherOnly")->eName);
+}