@@ -2003,10 +2003,41 @@ int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
2003
2003
*/
2004
2004
int _CRT_glob = 0 ;
2005
2005
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
+
2006
2013
void mingw_startup ()
2007
2014
{
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 );
2010
2041
2011
2042
/* initialize critical section for waitpid pinfo_t list */
2012
2043
InitializeCriticalSection (& pinfo_cs );
0 commit comments