diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-09-26 19:10:37 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-09-26 19:10:37 +0200 |
commit | 2a02745709127bd56ccdbac8c568b3c25f3072a7 (patch) | |
tree | d6a3e6c777a3e760df7de4ceca9aba4a510a7771 /src/mbyte.c | |
parent | 09ca932f8e7d63a83b39baa7c03d4c6145e3baab (diff) | |
download | vim-git-2a02745709127bd56ccdbac8c568b3c25f3072a7.tar.gz |
patch 8.0.1152: encoding of error message wrong in Cygwin terminalv8.0.1152
Problem: Encoding of error message wrong in Cygwin terminal.
Solution: Get locale from environment variables. (Ken Takata)
Diffstat (limited to 'src/mbyte.c')
-rw-r--r-- | src/mbyte.c | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/src/mbyte.c b/src/mbyte.c index 29385a957..fe5673129 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4385,45 +4385,31 @@ enc_alias_search(char_u *name) #if defined(FEAT_MBYTE) || defined(PROTO) -#ifdef HAVE_LANGINFO_H -# include <langinfo.h> -#endif +# ifdef HAVE_LANGINFO_H +# include <langinfo.h> +# endif +# ifndef FEAT_GUI_W32 /* - * Get the canonicalized encoding of the current locale. + * Get the canonicalized encoding from the specified locale string "locale" + * or from the environment variables LC_ALL, LC_CTYPE and LANG. * Returns an allocated string when successful, NULL when not. */ char_u * -enc_locale(void) +enc_locale_env(char *locale) { -#ifndef WIN3264 - char *s; + char *s = locale; char *p; int i; -#endif char buf[50]; -#ifdef WIN3264 - long acp = GetACP(); - if (acp == 1200) - STRCPY(buf, "ucs-2le"); - else if (acp == 1252) /* cp1252 is used as latin1 */ - STRCPY(buf, "latin1"); - else - sprintf(buf, "cp%ld", acp); -#else -# ifdef HAVE_NL_LANGINFO_CODESET - if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL) -# endif -# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) - if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL) -# endif - if ((s = getenv("LC_ALL")) == NULL || *s == NUL) - if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL) - s = getenv("LANG"); + if (s == NULL || *s == NUL) + if ((s = getenv("LC_ALL")) == NULL || *s == NUL) + if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL) + s = getenv("LANG"); if (s == NULL || *s == NUL) - return FAIL; + return NULL; /* The most generic locale format is: * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]] @@ -4458,12 +4444,46 @@ enc_locale(void) break; } buf[i] = NUL; -#endif return enc_canonize((char_u *)buf); } +# endif + +/* + * Get the canonicalized encoding of the current locale. + * Returns an allocated string when successful, NULL when not. + */ + char_u * +enc_locale(void) +{ +# ifdef WIN3264 + char buf[50]; + long acp = GetACP(); + + if (acp == 1200) + STRCPY(buf, "ucs-2le"); + else if (acp == 1252) /* cp1252 is used as latin1 */ + STRCPY(buf, "latin1"); + else + sprintf(buf, "cp%ld", acp); + + return enc_canonize((char_u *)buf); +# else + char *s; + +# ifdef HAVE_NL_LANGINFO_CODESET + if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL) +# endif +# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) + if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL) +# endif + s = NULL; + + return enc_locale_env(s); +# endif +} -#if defined(WIN3264) || defined(PROTO) || defined(FEAT_CYGWIN_WIN32_CLIPBOARD) +# if defined(WIN3264) || defined(PROTO) || defined(FEAT_CYGWIN_WIN32_CLIPBOARD) /* * Convert an encoding name to an MS-Windows codepage. * Returns zero if no codepage can be figured out. @@ -4490,7 +4510,7 @@ encname2codepage(char_u *name) return cp; return 0; } -#endif +# endif # if defined(USE_ICONV) || defined(PROTO) |