Skip to content
This repository was archived by the owner on Nov 9, 2017. It is now read-only.

Commit bc636e5

Browse files
kbleeskasal
authored andcommitted
Win32: Unicode arguments (incoming)
Convert command line arguments from UTF-16 to UTF-8 on startup. Signed-off-by: Karsten Blees <[email protected]>
1 parent 82d17a5 commit bc636e5

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

compat/mingw.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,10 +2003,41 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
20032003
*/
20042004
int _CRT_glob = 0;
20052005

2006+
typedef struct {
2007+
int newmode;
2008+
} _startupinfo;
2009+
2010+
extern int __wgetmainargs(int *argc, wchar_t ***argv, wchar_t ***env, int glob,
2011+
_startupinfo *si);
2012+
20062013
void mingw_startup()
20072014
{
2008-
/* copy executable name to argv[0] */
2009-
__argv[0] = xstrdup(_pgmptr);
2015+
int i, len, maxlen, argc;
2016+
char *buffer;
2017+
wchar_t **wenv, **wargv;
2018+
_startupinfo si;
2019+
2020+
/* get wide char arguments and environment */
2021+
si.newmode = 0;
2022+
__wgetmainargs(&argc, &wargv, &wenv, _CRT_glob, &si);
2023+
2024+
/* determine size of argv and environ conversion buffer */
2025+
maxlen = wcslen(_wpgmptr);
2026+
for (i = 1; i < argc; i++)
2027+
maxlen = max(maxlen, wcslen(wargv[i]));
2028+
2029+
/* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
2030+
maxlen = 3 * maxlen + 1;
2031+
buffer = xmalloc(maxlen);
2032+
2033+
/* convert command line arguments and environment to UTF-8 */
2034+
len = xwcstoutf(buffer, _wpgmptr, maxlen);
2035+
__argv[0] = xmemdupz(buffer, len);
2036+
for (i = 1; i < argc; i++) {
2037+
len = xwcstoutf(buffer, wargv[i], maxlen);
2038+
__argv[i] = xmemdupz(buffer, len);
2039+
}
2040+
free(buffer);
20102041

20112042
/* initialize critical section for waitpid pinfo_t list */
20122043
InitializeCriticalSection(&pinfo_cs);

0 commit comments

Comments
 (0)