Permalink
Browse files

patch 8.0.1152: encoding of error message wrong in Cygwin terminal

Problem:    Encoding of error message wrong in Cygwin terminal.
Solution:   Get locale from environment variables. (Ken Takata)
  • Loading branch information...
brammool committed Sep 26, 2017
1 parent 09ca932 commit 2a02745709127bd56ccdbac8c568b3c25f3072a7
Showing with 68 additions and 30 deletions.
  1. +15 −0 src/main.c
  2. +50 −30 src/mbyte.c
  3. +1 −0 src/proto/mbyte.pro
  4. +2 −0 src/version.c
View
@@ -2564,6 +2564,21 @@ check_tty(mparm_T *parmp)
#if defined(WIN3264) && !defined(FEAT_GUI_W32)
if (is_cygpty_used())
{
# if defined(FEAT_MBYTE) && defined(HAVE_BIND_TEXTDOMAIN_CODESET) \
&& defined(FEAT_GETTEXT)
char *s, *tofree = NULL;
/* Set the encoding of the error message based on $LC_ALL or
* other environment variables instead of 'encoding'.
* Note that the message is shown on a Cygwin terminal (e.g.
* mintty) which encoding is based on $LC_ALL or etc., not the
* current codepage used by normal Win32 console programs. */
tofree = s = enc_locale_env(NULL);

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Sep 27, 2017

cast to remove compiler warning.

diff --git a/src/main.c b/src/main.c
index 3b18bf1e4..4ff45ff5a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2573,7 +2573,7 @@ check_tty(mparm_T *parmp)
 	     * Note that the message is shown on a Cygwin terminal (e.g.
 	     * mintty) which encoding is based on $LC_ALL or etc., not the
 	     * current codepage used by normal Win32 console programs. */
-	    tofree = s = enc_locale_env(NULL);
+	    tofree = s = (char*) enc_locale_env(NULL);
 	    if (s == NULL)
 		s = "utf-8";	/* Use "utf-8" by default. */
 	    (void)bind_textdomain_codeset(VIMPACKAGE, s);
@mattn

mattn Sep 27, 2017

cast to remove compiler warning.

diff --git a/src/main.c b/src/main.c
index 3b18bf1e4..4ff45ff5a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2573,7 +2573,7 @@ check_tty(mparm_T *parmp)
 	     * Note that the message is shown on a Cygwin terminal (e.g.
 	     * mintty) which encoding is based on $LC_ALL or etc., not the
 	     * current codepage used by normal Win32 console programs. */
-	    tofree = s = enc_locale_env(NULL);
+	    tofree = s = (char*) enc_locale_env(NULL);
 	    if (s == NULL)
 		s = "utf-8";	/* Use "utf-8" by default. */
 	    (void)bind_textdomain_codeset(VIMPACKAGE, s);

This comment has been minimized.

Show comment
Hide comment
@k-takata

k-takata Sep 27, 2017

Member

Ouch!

@k-takata
if (s == NULL)
s = "utf-8"; /* Use "utf-8" by default. */
(void)bind_textdomain_codeset(VIMPACKAGE, s);
vim_free(tofree);
# endif
mch_errmsg(_("Vim: Error: This version of Vim does not run in a Cygwin terminal\n"));
exit(1);
}
View
@@ -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)
View
@@ -71,6 +71,7 @@ int mb_lefthalve(int row, int col);
int mb_fix_col(int col, int row);
char_u *enc_skip(char_u *p);
char_u *enc_canonize(char_u *enc);
char_u *enc_locale_env(char *locale);
char_u *enc_locale(void);
int encname2codepage(char_u *name);
void *my_iconv_open(char_u *to, char_u *from);
View
@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1152,
/**/
1151,
/**/

0 comments on commit 2a02745

Please sign in to comment.