diff options
author | Werner Koch <wk@gnupg.org> | 2020-10-09 15:36:51 +0200 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2020-10-09 15:36:51 +0200 |
commit | dbedf190969de1a796560cfa15fb4ea986bc79dc (patch) | |
tree | 9009cde2ee1a353955bbe5505c3aecbc258e0abe /tests | |
parent | 3a86bdb2aad31835c10b910c4564c73603694430 (diff) | |
download | libgpg-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.c | 99 |
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 (); |