summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChoe Hwanjin <choe.hwanjin@gmail.com>2023-03-12 11:05:23 +0900
committerChoe Hwanjin <choe.hwanjin@gmail.com>2023-03-12 11:05:23 +0900
commiteb2189dada182848d05466abbae885c3bd4fdba0 (patch)
treeb17ddd874a96a8511a7e7d7ed3c71d7e7fa0d9bc
parent3db276b40c0b82f26d4d013d70d380d8baf173e0 (diff)
parent011d98801d705347446f49ba8acad512ea705061 (diff)
downloadlibhangul-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.txt7
-rw-r--r--config.h.cmake.in1
-rw-r--r--configure.ac1
-rw-r--r--hangul/CMakeLists.txt5
-rw-r--r--hangul/hangulkeyboard.c104
-rw-r--r--libhangul.vcxproj21
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'">