From 9653dfa28602b442937e04b8c66e4e7368800f51 Mon Sep 17 00:00:00 2001 From: Karsten Blees Date: Sun, 16 Jan 2011 18:28:27 +0100 Subject: [PATCH] Win32: Unicode arguments (incoming) Convert command line arguments from UTF-16 to UTF-8 on startup. Signed-off-by: Karsten Blees --- compat/mingw.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/compat/mingw.c b/compat/mingw.c index 069fd62502..d8cfea5984 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -2048,10 +2048,41 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen) */ int _CRT_glob = 0; +typedef struct { + int newmode; +} _startupinfo; + +extern int __wgetmainargs(int *argc, wchar_t ***argv, wchar_t ***env, int glob, + _startupinfo *si); + void mingw_startup() { - /* copy executable name to argv[0] */ - __argv[0] = xstrdup(_pgmptr); + int i, len, maxlen, argc; + char *buffer; + wchar_t **wenv, **wargv; + _startupinfo si; + + /* get wide char arguments and environment */ + si.newmode = 0; + __wgetmainargs(&argc, &wargv, &wenv, _CRT_glob, &si); + + /* determine size of argv and environ conversion buffer */ + maxlen = wcslen(_wpgmptr); + for (i = 1; i < argc; i++) + maxlen = max(maxlen, wcslen(wargv[i])); + + /* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */ + maxlen = 3 * maxlen + 1; + buffer = xmalloc(maxlen); + + /* convert command line arguments and environment to UTF-8 */ + len = xwcstoutf(buffer, _wpgmptr, maxlen); + __argv[0] = xmemdupz(buffer, len); + for (i = 1; i < argc; i++) { + len = xwcstoutf(buffer, wargv[i], maxlen); + __argv[i] = xmemdupz(buffer, len); + } + free(buffer); /* initialize critical section for waitpid pinfo_t list */ InitializeCriticalSection(&pinfo_cs); -- 2.11.4.GIT