summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2020-10-09 15:36:51 +0200
committerWerner Koch <wk@gnupg.org>2020-10-09 15:36:51 +0200
commitdbedf190969de1a796560cfa15fb4ea986bc79dc (patch)
tree9009cde2ee1a353955bbe5505c3aecbc258e0abe /tests
parent3a86bdb2aad31835c10b910c4564c73603694430 (diff)
downloadlibgpg-error-dbedf190969de1a796560cfa15fb4ea986bc79dc.tar.gz
w32: Support utf8 also for getcwd.
* src/sysutils.c (_gpgrt_getcwd) [W32]: Implement utf-8 support. * src/w32-gettext.c (wchar_to_native): Factor some code out to .. (wchar_to_cp): new. (_gpgrt_wchar_to_utf8): New. * tests/t-stringutils.c: Include windows.h. (utf8_to_wchar): New. (wchar_to_utf8): New. (mygetcwd): Use wchar version for Windows. (main): New option --pwd.
Diffstat (limited to 'tests')
-rw-r--r--tests/t-stringutils.c99
1 files changed, 98 insertions, 1 deletions
diff --git a/tests/t-stringutils.c b/tests/t-stringutils.c
index 01094bf..a7351e5 100644
--- a/tests/t-stringutils.c
+++ b/tests/t-stringutils.c
@@ -35,6 +35,9 @@
# include <pwd.h>
#endif
#include <errno.h>
+#ifdef HAVE_W32_SYSTEM
+# include <windows.h>
+#endif
#define PGM "t-stringutils"
#include "t-common.h"
@@ -81,9 +84,80 @@ mygethome (void)
}
+#ifdef HAVE_W32_SYSTEM
+static wchar_t *
+utf8_to_wchar (const char *string)
+{
+ int n;
+ wchar_t *result;
+ size_t nbytes;
+ int cbmultibyte = -1;
+
+ n = MultiByteToWideChar (CP_UTF8, 0, string, cbmultibyte, NULL, 0);
+ if (n < 0 || (n+1) <= 0)
+ die ("utf8_to_wchar failed\n");
+ nbytes = (size_t)(n+1) * sizeof(*result);
+ if (nbytes / sizeof(*result) != (n+1))
+ die ("utf8_to_wchar failed\n");
+ result = xmalloc (nbytes);
+ n = MultiByteToWideChar (CP_UTF8, 0, string, cbmultibyte, result, n);
+ if (n < 0)
+ die ("utf8_to_wchar failed\n");
+ return result;
+
+}
+
+
+static char *
+wchar_to_utf8 (const wchar_t *string, size_t length)
+{
+ int n;
+ char *result;
+
+ n = WideCharToMultiByte (CP_UTF8, 0, string, length, NULL, 0, NULL, NULL);
+ if (n < 0 || (n+1) <= 0)
+ die ("wchar_to_utf8 failed\n");
+
+ result = xmalloc (n+1);
+ if (!result)
+ die ("wchar_to_utf8 failed\n");
+ n = WideCharToMultiByte (CP_UTF8, 0, string, length, result, n, NULL, NULL);
+ if (n < 0)
+ die ("wchar_to_utf8 failed\n");
+ result[n] = 0;
+ return result;
+}
+#endif
+
static char *
mygetcwd (void)
{
+#ifdef HAVE_W32_SYSTEM
+ wchar_t wbuffer[MAX_PATH + sizeof(wchar_t)];
+ wchar_t *wp;
+ DWORD wlen;
+ char *buf, *p;
+
+ wlen = GetCurrentDirectoryW (MAX_PATH, wbuffer);
+ if (!wlen)
+ die ("GCDW failed - error code: %d\n", (int)GetLastError ());
+ else if (wlen > MAX_PATH)
+ die ("GCDW failed - wlen too large\n");
+
+ buf = wchar_to_utf8 (wbuffer, wlen);
+
+ /* Quick test that the reverse works. */
+ wp = utf8_to_wchar (buf);
+ if (wcscmp (wp, wbuffer))
+ die ("GCDW: reverse converting failed\n");
+ xfree (wp);
+
+ for (p=buf; *p; p++)
+ if (*p == '\\')
+ *p = '/';
+ return buf;
+
+#else
char *buffer;
size_t size = 100;
@@ -91,12 +165,15 @@ mygetcwd (void)
{
buffer = xmalloc (size+1);
if (getcwd (buffer, size) == buffer)
- return buffer;
+ {
+ return buffer;
+ }
xfree (buffer);
if (errno != ERANGE)
die ("error getting current cwd: %s\n", strerror (errno));
size *= 2;
}
+#endif
}
@@ -254,9 +331,12 @@ main (int argc, char **argv)
gpgrt_opt_t opts[] = {
ARGPARSE_x ('v', "verbose", NONE, 0, "Print more diagnostics"),
ARGPARSE_s_n('d', "debug", "Flyswatter"),
+ ARGPARSE_x (501, "pwd", NONE, 0, "Print working directory"),
ARGPARSE_end()
};
gpgrt_argparse_t pargs = { &argc, &argv, 0 };
+ char *cwd;
+ int opt_pwd = 0;
gpgrt_set_strusage (my_strusage);
gpgrt_log_set_prefix (gpgrt_strusage (11), GPGRT_LOG_WITH_PREFIX);
@@ -267,11 +347,28 @@ main (int argc, char **argv)
{
case 'v': verbose++; break;
case 'd': debug++; break;
+ case 501: opt_pwd = 1; break;
default : pargs.err = ARGPARSE_PRINT_ERROR; break;
}
}
gpgrt_argparse (NULL, &pargs, NULL);
+ cwd = gpgrt_getcwd ();
+ if (!cwd)
+ fail ("gpgrt_getcwd returned error: %s\n",
+ gpg_strerror (gpg_error_from_syserror ()));
+ else
+ {
+ if (opt_pwd)
+ {
+ int save_verbose = verbose;
+ verbose = 1;
+ show ("getcwd -> '%s'\n", cwd);
+ verbose = save_verbose;
+ }
+ xfree (cwd);
+ }
+
show ("testing string utilities\n");
check_fnameconcat ();