summaryrefslogtreecommitdiff
path: root/lib/compat
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compat')
-rw-r--r--lib/compat/Makemodule.am1
-rw-r--r--lib/compat/chdir.c27
-rw-r--r--lib/compat/path_to_windows.c43
3 files changed, 47 insertions, 24 deletions
diff --git a/lib/compat/Makemodule.am b/lib/compat/Makemodule.am
index fb37b46..7137f2c 100644
--- a/lib/compat/Makemodule.am
+++ b/lib/compat/Makemodule.am
@@ -1,5 +1,6 @@
libcompat_a_SOURCES = lib/compat/getline.c lib/compat/getsubopt.c
libcompat_a_SOURCES += lib/compat/strndup.c lib/compat/mockups.c
libcompat_a_SOURCES += lib/compat/chdir.c include/compat.h
+libcompat_a_SOURCES += lib/compat/path_to_windows.c
noinst_LIBRARIES += libcompat.a
diff --git a/lib/compat/chdir.c b/lib/compat/chdir.c
index b1b2d0c..04dcf17 100644
--- a/lib/compat/chdir.c
+++ b/lib/compat/chdir.c
@@ -10,37 +10,16 @@
#include "util/util.h"
#ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
#include <stdlib.h>
int chdir(const char *path)
{
- WCHAR *wpath, *ptr;
- DWORD length;
+ WCHAR *wpath;
int ret;
- length = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
- if (length <= 0) {
- fprintf(stderr, "Converting '%s' to UTF-16: %ld\n",
- path, GetLastError());
- return -1;
- }
-
- wpath = alloc_array(sizeof(wpath[0]), length + 1);
- if (wpath == NULL) {
- fprintf(stderr, "Converting '%s' to UTF-16: out of memory\n",
- path);
+ wpath = path_to_windows(path);
+ if (wpath == NULL)
return -1;
- }
-
- MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, length + 1);
- wpath[length] = '\0';
-
- for (ptr = wpath; *ptr != '\0'; ++ptr) {
- if (*ptr == '/')
- *ptr = '\\';
- }
if (!SetCurrentDirectoryW(wpath)) {
fprintf(stderr, "Switching to directory '%s': %ld\n",
diff --git a/lib/compat/path_to_windows.c b/lib/compat/path_to_windows.c
new file mode 100644
index 0000000..ff3a5d2
--- /dev/null
+++ b/lib/compat/path_to_windows.c
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+/*
+ * path_to_windows.c
+ *
+ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
+ */
+#include "config.h"
+#include "compat.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined(_WIN32) || defined(__WINDOWS__)
+WCHAR *path_to_windows(const char *input)
+{
+ WCHAR *wpath, *ptr;
+ DWORD length;
+
+ length = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
+ if (length <= 0) {
+ fprintf(stderr, "Converting UTF-8 path to UTF-16: %ld\n",
+ GetLastError());
+ return NULL;
+ }
+
+ wpath = calloc(sizeof(wpath[0]), length + 1);
+ if (wpath == NULL) {
+ fprintf(stderr,
+ "Converting UTF-8 path to UTF-16: out of memory\n");
+ return NULL;
+ }
+
+ MultiByteToWideChar(CP_UTF8, 0, input, -1, wpath, length + 1);
+ wpath[length] = '\0';
+
+ for (ptr = wpath; *ptr != '\0'; ++ptr) {
+ if (*ptr == '/')
+ *ptr = '\\';
+ }
+
+ return wpath;
+}
+#endif