summaryrefslogtreecommitdiff
path: root/src/mbyte.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-09-26 19:10:37 +0200
committerBram Moolenaar <Bram@vim.org>2017-09-26 19:10:37 +0200
commit2a02745709127bd56ccdbac8c568b3c25f3072a7 (patch)
treed6a3e6c777a3e760df7de4ceca9aba4a510a7771 /src/mbyte.c
parent09ca932f8e7d63a83b39baa7c03d4c6145e3baab (diff)
downloadvim-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.c80
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)