diff options
author | Choe Hwanjin <choe.hwanjin@gmail.com> | 2023-03-12 11:05:23 +0900 |
---|---|---|
committer | Choe Hwanjin <choe.hwanjin@gmail.com> | 2023-03-12 11:05:23 +0900 |
commit | eb2189dada182848d05466abbae885c3bd4fdba0 (patch) | |
tree | b17ddd874a96a8511a7e7d7ed3c71d7e7fa0d9bc | |
parent | 3db276b40c0b82f26d4d013d70d380d8baf173e0 (diff) | |
parent | 011d98801d705347446f49ba8acad512ea705061 (diff) | |
download | libhangul-eb2189dada182848d05466abbae885c3bd4fdba0.tar.gz |
Merge branch 'win32-glob' of https://github.com/wkpark/libhangul
win32: ENABLE_EXTERNAL_KEYBOARDS 지원 #73
https://github.com/libhangul/libhangul/pull/73
* 'win32-glob' of https://github.com/wkpark/libhangul:
win32: add the -p:ExternalKeyboard property option.
win32: fix for win32.
win32: fix hangul_keyboard_get_default_keyboard_path()
win32: use Find*File() for win32
cmake: check glob.h and add config.h.cmake.in
-rw-r--r-- | CMakeLists.txt | 7 | ||||
-rw-r--r-- | config.h.cmake.in | 1 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | hangul/CMakeLists.txt | 5 | ||||
-rw-r--r-- | hangul/hangulkeyboard.c | 104 | ||||
-rw-r--r-- | libhangul.vcxproj | 21 |
6 files changed, 132 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 8adbdb8..8aafe38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ option(ENABLE_UNIT_TEST include(CTest) include(GNUInstallDirs) +include(CheckIncludeFiles) set(LIBHANGUL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR}/hangul-1.0") set(LIBHANGUL_LIBRARY_DIR "${CMAKE_INSTALL_LIBDIR}") @@ -56,6 +57,12 @@ if(BUILD_TESTING) add_subdirectory(test EXCLUDE_FROM_ALL) endif() +check_include_files(glob.h HAVE_GLOB_H) +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/config.h" +) + include(CMakePackageConfigHelpers) configure_package_config_file(hangul-config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/hangul-config.cmake" diff --git a/config.h.cmake.in b/config.h.cmake.in new file mode 100644 index 0000000..6ef3caa --- /dev/null +++ b/config.h.cmake.in @@ -0,0 +1 @@ +#cmakedefine HAVE_GLOB_H 1 diff --git a/configure.ac b/configure.ac index f1e85b9..65d13b9 100644 --- a/configure.ac +++ b/configure.ac @@ -41,6 +41,7 @@ AC_PROG_INSTALL AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h string.h limits.h]) AC_CHECK_HEADERS([langinfo.h]) +AC_CHECK_HEADERS([glob.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL diff --git a/hangul/CMakeLists.txt b/hangul/CMakeLists.txt index 93f7fb4..14fde95 100644 --- a/hangul/CMakeLists.txt +++ b/hangul/CMakeLists.txt @@ -44,12 +44,17 @@ add_library(hangul ) target_compile_definitions(hangul + PRIVATE -DHAVE_CONFIG_H PRIVATE -DLOCALEDIR=\"${CMAKE_INSTALL_FULL_LOCALEDIR}\" PRIVATE -DLIBHANGUL_DEFAULT_HANJA_DIC=\"${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}/hanja/hanja.txt\" PRIVATE -DLIBHANGUL_DATA_DIR=\"${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}\" PRIVATE -DTOP_SRCDIR=\"${CMAKE_SOURCE_DIR}\" ) +target_include_directories(hangul + PRIVATE "${CMAKE_BINARY_DIR}" +) + if(ENABLE_EXTERNAL_KEYBOARDS) target_compile_definitions(hangul PRIVATE -DENABLE_EXTERNAL_KEYBOARDS=1 diff --git a/hangul/hangulkeyboard.c b/hangul/hangulkeyboard.c index 9e1e599..97be149 100644 --- a/hangul/hangulkeyboard.c +++ b/hangul/hangulkeyboard.c @@ -26,8 +26,9 @@ #if ENABLE_EXTERNAL_KEYBOARDS #include <locale.h> +#ifdef HAVE_GLOB_H #include <glob.h> -#include <libgen.h> +#endif /* HAVE_GLOB_H */ #include <expat.h> #endif /* ENABLE_EXTERNAL_KEYBOARDS */ @@ -36,8 +37,11 @@ #include "hangulinternals.h" #ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include <fileapi.h> #define strdup _strdup -#endif +#endif /* _WIN32 */ /** * @file hangulkeyboard.c @@ -674,8 +678,11 @@ on_element_start(void* data, const XML_Char* element, const XML_Char** attr) strncpy(path, file, n); } else { char* orig_path = strdup(context->path_stack[top]); - char* dir = dirname(orig_path); - snprintf(path, n, "%s/%s", dir, file); + char* last_slash = strrchr(orig_path, '/'); + if (last_slash) + last_slash[0] = '\0'; + + snprintf(path, n, "%s/%s", orig_path, file); free(orig_path); } @@ -798,6 +805,7 @@ hangul_keyboard_list_load_dir(const char* path) snprintf(pattern, len, "%s%s", path, subpattern); +#ifdef HAVE_GLOB_H glob_t result; int res = glob(pattern, GLOB_ERR, NULL, &result); if (res != 0) { @@ -815,6 +823,54 @@ hangul_keyboard_list_load_dir(const char* path) globfree(&result); free(pattern); +#else /* _WIN32 */ + WIN32_FIND_DATAW findFileData; + HANDLE hFind; + int n = (strlen(pattern) + 1) * sizeof(WCHAR); + + LPWSTR wpattern = (LPWSTR)malloc(n); + if (wpattern == NULL) { + free(pattern); + return 0; + } + + MultiByteToWideChar(CP_ACP, 0, pattern, -1, wpattern, n); + + hFind = FindFirstFileW(wpattern, &findFileData); + if (hFind == INVALID_HANDLE_VALUE) { + free(wpattern); + free(pattern); + return 0; + } + + do { + n = WideCharToMultiByte(CP_ACP, 0, findFileData.cFileName, -1, NULL, 0, NULL, NULL); + if (n == 0) + continue; + + int path_len = strlen(path); + len = path_len + n + 2; + char* file = (char*)malloc(len); + if (file == NULL) + continue; + + memcpy(file, path, path_len); + file[path_len] = '/'; + char* pfile = &file[path_len + 1]; + WideCharToMultiByte(CP_ACP, 0, findFileData.cFileName, -1, pfile, n, NULL, NULL); + + HangulKeyboard* keyboard = hangul_keyboard_new_from_file(file); + free(file); + + if (keyboard == NULL) + continue; + hangul_keyboard_list_append(keyboard); + } while(FindNextFileW(hFind, &findFileData)); + + FindClose(hFind); + free(wpattern); + free(pattern); +#endif /* HAVE_GLOB_H */ return hangul_keyboards.n; } @@ -845,6 +901,38 @@ hangul_keyboard_get_default_keyboard_path() /* default LIBHANGUL_KEYBOARD_PATH is * SYSTEM_KEYBOARD_DIR:USER_KEYBOARD_DIR */ +#ifdef _WIN32 + /* system default dir */ + char* system_dir = NULL; + const char* data_dir = getenv("APPDATA"); + if (data_dir != NULL) { + const char* subdir = "/libhangul/keyboards"; + size_t system_dir_len = strlen(data_dir) + strlen(subdir) + 1; + system_dir = (char*)malloc(system_dir_len); + if (system_dir != NULL) { + snprintf(system_dir, system_dir_len, "%s%s", data_dir, subdir); + keyboard_path_len += strlen(system_dir); + } + } + /* user default dir */ + char* home_dir = getenv("USERPROFILE"); + if (home_dir == NULL) { + /* no user data dir */ + return system_dir; + } else { + const char* subdir = "/.libhangul/keyboards"; + keyboard_path_len += strlen(home_dir) + strlen(subdir); + keyboard_path = (char*)malloc(keyboard_path_len); + if (keyboard_path != NULL) { + if (system_dir != NULL) { + keyboard_path_len++; + snprintf(keyboard_path, keyboard_path_len, "%s;%s%s", system_dir, home_dir, subdir); + } else { + snprintf(keyboard_path, keyboard_path_len, "%s%s", home_dir, subdir); + } + } + } +#else /* system default dir */ const char* system_dir = LIBHANGUL_KEYBOARD_DIR; keyboard_path_len += strlen(system_dir); @@ -875,6 +963,7 @@ hangul_keyboard_get_default_keyboard_path() snprintf(keyboard_path, keyboard_path_len, "%s:%s%s", system_dir, xdg_data_home, subdir); } } +#endif /* _WIN32 */ return keyboard_path; } @@ -914,8 +1003,13 @@ hangul_keyboard_list_init() unsigned n = 0; char* dir = libhangul_keyboard_path; +#ifdef _WIN32 + char sep = ';'; +#else + char sep = ':'; +#endif /* _WIN32 */ while (dir != NULL && dir[0] != '\0') { - char* next = strchr(dir, ':'); + char* next = strchr(dir, sep); if (next != NULL) { next[0] = '\0'; ++next; diff --git a/libhangul.vcxproj b/libhangul.vcxproj index 906a374..aa261dc 100644 --- a/libhangul.vcxproj +++ b/libhangul.vcxproj @@ -25,6 +25,9 @@ <RootNamespace>libhangul</RootNamespace> <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion> </PropertyGroup> + <PropertyGroup> + <ExternalKeyboard>NO</ExternalKeyboard> + </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <ConfigurationType>StaticLibrary</ConfigurationType> @@ -36,7 +39,6 @@ <ConfigurationType>StaticLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> <SpectreMitigation>false</SpectreMitigation> </PropertyGroup> @@ -50,7 +52,6 @@ <ConfigurationType>StaticLibrary</ConfigurationType> <UseDebugLibraries>false</UseDebugLibraries> <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> <CharacterSet>Unicode</CharacterSet> </PropertyGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> @@ -73,27 +74,34 @@ <PropertyGroup Label="UserMacros" /> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <LinkIncremental>true</LinkIncremental> + <LibraryPath Condition="'$(ExternalKeyboard)'=='YES'">$(ProjectDir)libexpat\x86;$(LibraryPath)</LibraryPath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <LinkIncremental>true</LinkIncremental> + <LibraryPath Condition="'$(ExternalKeyboard)'=='YES'">$(ProjectDir)libexpat\x64;$(LibraryPath)</LibraryPath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <LinkIncremental>true</LinkIncremental> + <LibraryPath Condition="'$(ExternalKeyboard)'=='YES'">$(ProjectDir)libexpat\x86;$(LibraryPath)</LibraryPath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <LinkIncremental>true</LinkIncremental> + <LibraryPath Condition="'$(ExternalKeyboard)'=='YES'">$(ProjectDir)libexpat\x64;$(LibraryPath)</LibraryPath> </PropertyGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> <AdditionalIncludeDirectories>.;.\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(ExternalKeyboard)'=='YES'">.\libexpat\expat\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;ENABLE_EXTERNAL_KEYBOARDS=0;%(PreprocessorDefinitions);_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(ExternalKeyboard)'=='YES'">%(PreprocessorDefinitions);ENABLE_EXTERNAL_KEYBOARDS=1</PreprocessorDefinitions> <AdditionalOptions>/utf-8</AdditionalOptions> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies Condition="'$(ExternalKeyboard)'=='YES'">libexpatd.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> @@ -101,12 +109,15 @@ <WarningLevel>Level3</WarningLevel> <Optimization>Disabled</Optimization> <AdditionalIncludeDirectories>.;.\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(ExternalKeyboard)'=='YES'">.\libexpat\expat\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;ENABLE_EXTERNAL_KEYBOARDS=0;%(PreprocessorDefinitions);_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(ExternalKeyboard)'=='YES'">%(PreprocessorDefinitions);ENABLE_EXTERNAL_KEYBOARDS=1</PreprocessorDefinitions> <AdditionalOptions>/utf-8</AdditionalOptions> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies Condition="'$(ExternalKeyboard)'=='YES'">libexpatd.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> @@ -115,13 +126,16 @@ <Optimization>MaxSpeed</Optimization> <IntrinsicFunctions>true</IntrinsicFunctions> <AdditionalIncludeDirectories>.;.\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(ExternalKeyboard)'=='YES'">.\libexpat\expat\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_LIB;ENABLE_EXTERNAL_KEYBOARDS=0;%(PreprocessorDefinitions);_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(ExternalKeyboard)'=='YES'">%(PreprocessorDefinitions);ENABLE_EXTERNAL_KEYBOARDS=1</PreprocessorDefinitions> <AdditionalOptions>/utf-8</AdditionalOptions> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies Condition="'$(ExternalKeyboard)'=='YES'">libexpat.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> @@ -130,13 +144,16 @@ <Optimization>MaxSpeed</Optimization> <IntrinsicFunctions>true</IntrinsicFunctions> <AdditionalIncludeDirectories>.;.\win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(ExternalKeyboard)'=='YES'">.\libexpat\expat\lib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <PreprocessorDefinitions>WIN32;_LIB;ENABLE_EXTERNAL_KEYBOARDS=0;%(PreprocessorDefinitions);_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions> + <PreprocessorDefinitions Condition="'$(ExternalKeyboard)'=='YES'">%(PreprocessorDefinitions);ENABLE_EXTERNAL_KEYBOARDS=1</PreprocessorDefinitions> <AdditionalOptions>/utf-8</AdditionalOptions> </ClCompile> <Link> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies Condition="'$(ExternalKeyboard)'=='YES'">libexpat.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup Condition="'$(ConfigurationType)'=='DynamicLibrary'"> |