@@ -515,6 +515,7 @@ static char *null_libintl_textdomain(const char *);
515515static char * null_libintl_bindtextdomain (const char * , const char * );
516516static char * null_libintl_bind_textdomain_codeset (const char * , const char * );
517517static int null_libintl_putenv (const char * );
518+ static int null_libintl_wputenv (const wchar_t * );
518519
519520static HINSTANCE hLibintlDLL = NULL ;
520521char * (* dyn_libintl_gettext )(const char * ) = null_libintl_gettext ;
@@ -526,6 +527,7 @@ char *(*dyn_libintl_bindtextdomain)(const char *, const char *)
526527char * (* dyn_libintl_bind_textdomain_codeset )(const char * , const char * )
527528 = null_libintl_bind_textdomain_codeset ;
528529int (* dyn_libintl_putenv )(const char * ) = null_libintl_putenv ;
530+ int (* dyn_libintl_wputenv )(const wchar_t * ) = null_libintl_wputenv ;
529531
530532 int
531533dyn_libintl_init (void )
@@ -591,9 +593,14 @@ dyn_libintl_init(void)
591593 /* _putenv() function for the libintl.dll is optional. */
592594 hmsvcrt = find_imported_module_by_funcname (hLibintlDLL , "getenv" );
593595 if (hmsvcrt != NULL )
596+ {
594597 dyn_libintl_putenv = (void * )GetProcAddress (hmsvcrt , "_putenv" );
595- if (dyn_libintl_putenv == NULL || dyn_libintl_putenv == putenv )
598+ dyn_libintl_wputenv = (void * )GetProcAddress (hmsvcrt , "_wputenv" );
599+ }
600+ if (dyn_libintl_putenv == NULL || dyn_libintl_putenv == _putenv )
596601 dyn_libintl_putenv = null_libintl_putenv ;
602+ if (dyn_libintl_wputenv == NULL || dyn_libintl_wputenv == _wputenv )
603+ dyn_libintl_wputenv = null_libintl_wputenv ;
597604
598605 return 1 ;
599606}
@@ -610,6 +617,7 @@ dyn_libintl_end(void)
610617 dyn_libintl_bindtextdomain = null_libintl_bindtextdomain ;
611618 dyn_libintl_bind_textdomain_codeset = null_libintl_bind_textdomain_codeset ;
612619 dyn_libintl_putenv = null_libintl_putenv ;
620+ dyn_libintl_wputenv = null_libintl_wputenv ;
613621}
614622
615623/*ARGSUSED*/
@@ -658,6 +666,13 @@ null_libintl_putenv(const char *envstring)
658666 return 0 ;
659667}
660668
669+ /*ARGSUSED*/
670+ int
671+ null_libintl_wputenv (const wchar_t * envstring )
672+ {
673+ return 0 ;
674+ }
675+
661676#endif /* DYNAMIC_GETTEXT */
662677
663678/* This symbol is not defined in older versions of the SDK or Visual C++ */
@@ -6985,3 +7000,43 @@ fix_arg_enc(void)
69857000 set_alist_count ();
69867001}
69877002#endif
7003+
7004+ int
7005+ mch_setenv (char * var , char * value , int x )
7006+ {
7007+ char_u * envbuf ;
7008+
7009+ envbuf = alloc ((unsigned )(STRLEN (var ) + STRLEN (value ) + 2 ));
7010+ if (envbuf == NULL )
7011+ return -1 ;
7012+
7013+ sprintf ((char * )envbuf , "%s=%s" , var , value );
7014+
7015+ #ifdef FEAT_MBYTE
7016+ if (enc_codepage >= 0 && (int )GetACP () != enc_codepage )
7017+ {
7018+ WCHAR * p = enc_to_utf16 (envbuf , NULL );
7019+
7020+ vim_free (envbuf );
7021+ if (p == NULL )
7022+ return -1 ;
7023+ _wputenv (p );
7024+ # ifdef libintl_wputenv
7025+ libintl_wputenv (p );
7026+ # endif
7027+ /* Unlike Un*x systems, we can free the string for _wputenv(). */
7028+ vim_free (p );
7029+ }
7030+ else
7031+ #endif
7032+ {
7033+ _putenv ((char * )envbuf );
7034+ # ifdef libintl_putenv
7035+ libintl_putenv ((char * )envbuf );
7036+ # endif
7037+ /* Unlike Un*x systems, we can free the string for _putenv(). */
7038+ vim_free (envbuf );
7039+ }
7040+
7041+ return 0 ;
7042+ }
0 commit comments