From 2ff7fb03d161a1785dbbc2f7c3e00473117d7f4a Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Sun, 2 Feb 2025 17:01:05 +0000 Subject: [PATCH] Replace hoehrmann_utf8 with SheenBidi --- 3rdParty/SheenBidi/CMakeLists.txt | 1 - 3rdParty/hoehrmann_utf8/CMakeLists.txt | 3 -- 3rdParty/hoehrmann_utf8/hoehrmann_utf8.h | 61 ------------------------ CMake/Dependencies.cmake | 2 - Source/CMakeLists.txt | 2 +- Source/utils/utf8.cpp | 29 +++++------ Source/utils/utf8.hpp | 2 +- uwp-project/devilutionx.vcxproj | 4 +- 8 files changed, 17 insertions(+), 87 deletions(-) delete mode 100644 3rdParty/hoehrmann_utf8/CMakeLists.txt delete mode 100644 3rdParty/hoehrmann_utf8/hoehrmann_utf8.h diff --git a/3rdParty/SheenBidi/CMakeLists.txt b/3rdParty/SheenBidi/CMakeLists.txt index 8ee64eb406c..7f8633c91b5 100644 --- a/3rdParty/SheenBidi/CMakeLists.txt +++ b/3rdParty/SheenBidi/CMakeLists.txt @@ -2,7 +2,6 @@ include(functions/FetchContent_ExcludeFromAll_backport) include(FetchContent) set(BUILD_TESTING OFF) -set(ENABLE_INSTALL OFF) set(ASAN OFF) set(UBSAN OFF) diff --git a/3rdParty/hoehrmann_utf8/CMakeLists.txt b/3rdParty/hoehrmann_utf8/CMakeLists.txt deleted file mode 100644 index b17b98472d3..00000000000 --- a/3rdParty/hoehrmann_utf8/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -add_library(hoehrmann_utf8 INTERFACE) - -target_include_directories(hoehrmann_utf8 INTERFACE ${CMAKE_CURRENT_LIST_DIR}) diff --git a/3rdParty/hoehrmann_utf8/hoehrmann_utf8.h b/3rdParty/hoehrmann_utf8/hoehrmann_utf8.h deleted file mode 100644 index bc914c15256..00000000000 --- a/3rdParty/hoehrmann_utf8/hoehrmann_utf8.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Adapted from: https://github.com/hoehrmann/utf-8-misc/blob/449221e7a693a9c7b8938721cd4244eed4ca9320/utf8_branch.h */ - -/*- - * Copyright (c) 2014 Taylor R Campbell - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -#define UTF8_ACCEPT 0 -#define UTF8_REJECT 0xf - -static const uint32_t utf8_classtab[0x10] = { - 0x88888888UL,0x88888888UL,0x99999999UL,0x99999999UL, - 0xaaaaaaaaUL,0xaaaaaaaaUL,0xaaaaaaaaUL,0xaaaaaaaaUL, - 0x222222ffUL,0x22222222UL,0x22222222UL,0x22222222UL, - 0x3333333bUL,0x33433333UL,0xfff5666cUL,0xffffffffUL, -}; - -static const uint32_t utf8_statetab[0x10] = { - 0xfffffff0UL,0xffffffffUL,0xfffffff1UL,0xfffffff3UL, - 0xfffffff4UL,0xfffffff7UL,0xfffffff6UL,0xffffffffUL, - 0x33f11f0fUL,0xf3311f0fUL,0xf33f110fUL,0xfffffff2UL, - 0xfffffff5UL,0xffffffffUL,0xffffffffUL,0xffffffffUL, -}; - -static inline uint8_t -utf8_decode_step(uint8_t state, uint8_t octet, uint32_t *cpp) -{ - const uint8_t reject = (state >> 3), nonascii = (octet >> 7); - const uint8_t klass = (!nonascii? 0 : - (0xf & (utf8_classtab[(octet >> 3) & 0xf] >> (4 * (octet & 7))))); - - *cpp = (state == UTF8_ACCEPT - ? (octet & (0xffU >> klass)) - : ((octet & 0x3fU) | (*cpp << 6))); - - return (reject? 0xf : - (0xf & (utf8_statetab[klass] >> (4 * (state & 7))))); -} diff --git a/CMake/Dependencies.cmake b/CMake/Dependencies.cmake index d14d00aff93..16714cb08ef 100644 --- a/CMake/Dependencies.cmake +++ b/CMake/Dependencies.cmake @@ -207,8 +207,6 @@ endif() add_subdirectory(3rdParty/tl) -add_subdirectory(3rdParty/hoehrmann_utf8) - if(NOT DEFINED DEVILUTIONX_SYSTEM_SHEENBIDI) find_package(SheenBidi QUIET) if(SheenBidi_FOUND) diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index c6389761010..c45f0bfbf01 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -522,7 +522,7 @@ add_devilutionx_object_library(libdevilutionx_utf8 utils/utf8.cpp ) target_link_dependencies(libdevilutionx_utf8 PRIVATE - hoehrmann_utf8 + SheenBidi::sheenbidi ) if(NOSOUND) diff --git a/Source/utils/utf8.cpp b/Source/utils/utf8.cpp index 50f46975eec..01f57c5e375 100644 --- a/Source/utils/utf8.cpp +++ b/Source/utils/utf8.cpp @@ -3,28 +3,25 @@ #include #include #include +#include -#include +extern "C" { +#include +} namespace devilution { char32_t DecodeFirstUtf8CodePoint(std::string_view input, std::size_t *len) { - uint32_t codepoint = 0; - uint8_t state = UTF8_ACCEPT; - for (std::size_t i = 0; i < input.size(); ++i) { - state = utf8_decode_step(state, static_cast(input[i]), &codepoint); - if (state == UTF8_ACCEPT) { - *len = i + 1; - return codepoint; - } - if (state == UTF8_REJECT) { - *len = i + 1; - return Utf8DecodeError; - } - } - *len = input.size(); - return Utf8DecodeError; + SBCodepointSequence seq { + .stringEncoding = SBStringEncodingUTF8, + .stringBuffer = const_cast(static_cast(input.data())), + .stringLength = static_cast(input.size()) + }; + SBUInteger index = 0; + SBCodepoint result = SBCodepointSequenceGetCodepointAt(&seq, &index); + *len = index; + return result; } std::string_view TruncateUtf8(std::string_view str, std::size_t len) diff --git a/Source/utils/utf8.hpp b/Source/utils/utf8.hpp index defdc3f971a..72c31f2ce42 100644 --- a/Source/utils/utf8.hpp +++ b/Source/utils/utf8.hpp @@ -6,7 +6,7 @@ namespace devilution { -constexpr char32_t Utf8DecodeError = 0xD83F; +constexpr char32_t Utf8DecodeError = 0xFFFD; /** * Decodes the first code point from UTF8-encoded input. diff --git a/uwp-project/devilutionx.vcxproj b/uwp-project/devilutionx.vcxproj index 4bac7a8ec31..f2ddbeec194 100644 --- a/uwp-project/devilutionx.vcxproj +++ b/uwp-project/devilutionx.vcxproj @@ -92,8 +92,8 @@ - sdl_image.lib;libpng16_static.lib;pkware.lib;fmt.lib;zlibstatic.lib;bzip2.lib;libsmackerdec.lib;libmpq.lib;libdevilutionx.lib;lua_static.lib;sdl2.lib;sdl_audiolib.lib;asio.lib;sodium.lib;zt.lib;lwip_pic.lib;miniupnpc_pic.lib;natpmp_pic.lib;zt_pic.lib;zto_pic.lib;shlwapi.lib;shell32.lib;%(AdditionalDependencies) - ..\build\SDL\VisualC-WinRT\x64\Release\SDL-UWP;..\build\3rdParty\SDL_image\Release;..\build\_deps\zlib-build\Release;..\build\3rdParty\PKWare\Release;..\build\3rdParty\bzip2\Release;..\build\3rdParty\libsmackerdec\Release;..\build\3rdParty\libmpq\Release;..\build\_deps\lua-build\lua-5.4.6\Release;..\build\_deps\sdl_audiolib-build\Release;..\build\3rdParty\asio\Release;..\build\_deps\libsodium-build\Release;..\build\_deps\libzt-build\lib\Release;..\build\_deps\libfmt-build\Release;..\build\_deps\libpng-build\Release;..\build\Source\libdevilutionx.dir\Release;%(AdditionalLibraryDirectories) + sdl_image.lib;libpng16_static.lib;pkware.lib;fmt.lib;zlibstatic.lib;bzip2.lib;libsmackerdec.lib;libmpq.lib;libdevilutionx.lib;lua_static.lib;sdl2.lib;sdl_audiolib.lib;sheenbidi.lib;asio.lib;sodium.lib;zt.lib;lwip_pic.lib;miniupnpc_pic.lib;natpmp_pic.lib;zt_pic.lib;zto_pic.lib;shlwapi.lib;shell32.lib;%(AdditionalDependencies) + ..\build\SDL\VisualC-WinRT\x64\Release\SDL-UWP;..\build\3rdParty\SDL_image\Release;..\build\_deps\zlib-build\Release;..\build\3rdParty\PKWare\Release;..\build\3rdParty\bzip2\Release;..\build\3rdParty\libsmackerdec\Release;..\build\3rdParty\libmpq\Release;..\build\_deps\lua-build\lua-5.4.6\Release;..\build\_deps\sdl_audiolib-build\Release;..\build\3rdParty\asio\Release;..\build\_deps\libsodium-build\Release;..\build\_deps\libzt-build\lib\Release;..\build\_deps\libfmt-build\Release;..\build\_deps\libpng-build\Release;..\build\_deps\sheenbidi-build\Release;..\build\Source\libdevilutionx.dir\Release;%(AdditionalLibraryDirectories) pch.h