ConfigureChecks.cmake | 1 config.h.cmake | 3 -- poppler/PageLabelInfo.cc | 2 - poppler/PageLabelInfo_p.h | 45 +++++++++++++++++++------------------- qt5/tests/check_pagelabelinfo.cpp | 10 +------- qt6/tests/check_pagelabelinfo.cpp | 10 +------- 6 files changed, 28 insertions(+), 43 deletions(-)
New commits: commit cab257727998251bb29e9f150fd5df69d08a2758 Author: Albert Astals Cid <[email protected]> Date: Wed Dec 23 19:29:10 2020 +0100 Stop using std::codecvt_utf16 in fromDecimal It's deprecated since C++17 and since we only care about numbers we can just remove the first byte of the utf16 and treat it as a regular string diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake index e672abbe..e0826caf 100644 --- a/ConfigureChecks.cmake +++ b/ConfigureChecks.cmake @@ -25,7 +25,6 @@ check_include_files(stdlib.h HAVE_STDLIB_H) check_include_files(sys/mman.h HAVE_SYS_MMAN_H) check_include_files(sys/stat.h HAVE_SYS_STAT_H) check_include_files(unistd.h HAVE_UNISTD_H) -check_include_file_cxx(codecvt HAVE_CODECVT) check_function_exists(fseek64 HAVE_FSEEK64) check_symbol_exists(fseeko "stdio.h" HAVE_FSEEKO) diff --git a/config.h.cmake b/config.h.cmake index 2eaeb13f..1d66c9ba 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -108,9 +108,6 @@ /* Define to 1 if you have the <unistd.h> header file. */ #cmakedefine HAVE_UNISTD_H 1 -/* Define to 1 if you have the <codecvt> header file. */ -#cmakedefine HAVE_CODECVT - /* Define to 1 if you have a big endian machine */ #cmakedefine WORDS_BIGENDIAN 1 diff --git a/poppler/PageLabelInfo.cc b/poppler/PageLabelInfo.cc index dde5f332..be4f8fbe 100644 --- a/poppler/PageLabelInfo.cc +++ b/poppler/PageLabelInfo.cc @@ -128,7 +128,7 @@ bool PageLabelInfo::labelToIndex(GooString *label, int *index) const switch (interval.style) { case Interval::Arabic: - std::tie(number, ok) = fromDecimal(str + prefixLen, str + strLen, strUnicode); + std::tie(number, ok) = fromDecimal(label->toStr().substr(prefixLen), strUnicode); if (ok && number - interval.first < interval.length) { *index = interval.base + number - interval.first; return true; diff --git a/poppler/PageLabelInfo_p.h b/poppler/PageLabelInfo_p.h index ada3b0f7..ce6f2fb2 100644 --- a/poppler/PageLabelInfo_p.h +++ b/poppler/PageLabelInfo_p.h @@ -21,36 +21,37 @@ #include "config.h" -#ifdef HAVE_CODECVT -# include <locale> -# include <codecvt> -#endif - #include "goo/GooString.h" #include "Error.h" -static std::pair<int, bool> fromDecimal(const char *const begin, const char *const end, const bool unicode) +static std::pair<int, bool> fromDecimal(const std::string &str, const bool unicode) { -#ifdef HAVE_CODECVT - if (unicode) { - std::wstring_convert<std::codecvt_utf16<wchar_t>> converter("", L""); - const auto str = converter.from_bytes(begin, end); - - // Skip BOM since wcstol seems unable to handle it. - const wchar_t *c_str = str.c_str(); - if (*c_str == wchar_t { 0xfeff }) { - ++c_str; + if (unicode && (str.size() % 2 == 0)) { + if (GooString::hasUnicodeMarker(str)) { + // strip the marker if it is there + return fromDecimal(str.substr(2), true /*unicode*/); } - wchar_t *parsed; - const int number = std::wcstol(c_str, &parsed, 10); - if (parsed >= str.data() + str.size()) { - return std::make_pair(number, true); + // Since we only care about numbers here, the first byte needs to be + // 0 and second will be the actual ascii number, so we're going to reconstruct a + // non unicode string that then we will use strtol to "translate" + std::string newString; + bool allGood = true; + for (size_t i = 0; allGood && i < str.size(); i += 2) { + if (str[i] == 0) { + newString += str[i + 1]; + } else { + allGood = false; + } + } + + if (allGood) { + return fromDecimal(newString, false /*unicode*/); } } -#else - (void)unicode; -#endif + + const char *const begin = str.data(); + const char *const end = begin + str.size(); char *parsed; const int number = std::strtol(begin, &parsed, 10); diff --git a/qt5/tests/check_pagelabelinfo.cpp b/qt5/tests/check_pagelabelinfo.cpp index 042f1cf9..520a5f9b 100644 --- a/qt5/tests/check_pagelabelinfo.cpp +++ b/qt5/tests/check_pagelabelinfo.cpp @@ -23,7 +23,7 @@ private slots: void TestPageLabelInfo::testFromDecimal() { std::string str { "2342" }; - const auto res = fromDecimal(str.data(), str.data() + str.size(), false); + const auto res = fromDecimal(str, false); QCOMPARE(res.first, 2342); QCOMPARE(res.second, true); } @@ -31,14 +31,8 @@ void TestPageLabelInfo::testFromDecimal() void TestPageLabelInfo::testFromDecimalUnicode() { std::unique_ptr<GooString> str(Poppler::QStringToUnicodeGooString(QString::fromLocal8Bit("2342"))); - const auto res = fromDecimal(str->c_str(), str->c_str() + str->getLength(), str->hasUnicodeMarker()); -#ifndef HAVE_CODECVT - QEXPECT_FAIL("", "unicode text to index fails without codecvt", Continue); -#endif + const auto res = fromDecimal(str->toStr(), str->hasUnicodeMarker()); QCOMPARE(res.first, 2342); -#ifndef HAVE_CODECVT - QEXPECT_FAIL("", "unicode text to index fails without codecvt", Continue); -#endif QCOMPARE(res.second, true); } diff --git a/qt6/tests/check_pagelabelinfo.cpp b/qt6/tests/check_pagelabelinfo.cpp index 042f1cf9..520a5f9b 100644 --- a/qt6/tests/check_pagelabelinfo.cpp +++ b/qt6/tests/check_pagelabelinfo.cpp @@ -23,7 +23,7 @@ private slots: void TestPageLabelInfo::testFromDecimal() { std::string str { "2342" }; - const auto res = fromDecimal(str.data(), str.data() + str.size(), false); + const auto res = fromDecimal(str, false); QCOMPARE(res.first, 2342); QCOMPARE(res.second, true); } @@ -31,14 +31,8 @@ void TestPageLabelInfo::testFromDecimal() void TestPageLabelInfo::testFromDecimalUnicode() { std::unique_ptr<GooString> str(Poppler::QStringToUnicodeGooString(QString::fromLocal8Bit("2342"))); - const auto res = fromDecimal(str->c_str(), str->c_str() + str->getLength(), str->hasUnicodeMarker()); -#ifndef HAVE_CODECVT - QEXPECT_FAIL("", "unicode text to index fails without codecvt", Continue); -#endif + const auto res = fromDecimal(str->toStr(), str->hasUnicodeMarker()); QCOMPARE(res.first, 2342); -#ifndef HAVE_CODECVT - QEXPECT_FAIL("", "unicode text to index fails without codecvt", Continue); -#endif QCOMPARE(res.second, true); } _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
