Patch 8.1.0918
Problem: MS-Windows: startup messages are not converted.
Solution: Convert messages when the current codepage differs from
'encoding'. (Yasuhiro Matsumoto, closes #3914)
Files: src/message.c, src/os_mswin.c, src/vim.h
*** ../vim-8.1.0917/src/message.c 2019-01-24 17:59:35.135217476 +0100
--- src/message.c 2019-02-14 14:04:44.531851174 +0100
***************
*** 2570,2626 ****
msg_puts_printf(char_u *str, int maxlen)
{
char_u *s = str;
! char_u buf[4];
! char_u *p;
! #ifdef WIN3264
! # if !defined(FEAT_GUI_MSWIN)
! char_u *ccp = NULL;
! # endif
if (!(silent_mode && p_verbose == 0))
! mch_settmode(TMODE_COOK); /* handle '\r' and '\n' correctly */
!
! # if !defined(FEAT_GUI_MSWIN)
! if (enc_codepage >= 0 && (int)GetConsoleCP() != enc_codepage)
! {
! int inlen = (int)STRLEN(str);
! int outlen;
! WCHAR *widestr = (WCHAR *)enc_to_utf16(str, &inlen);
!
! if (widestr != NULL)
! {
! WideCharToMultiByte_alloc(GetConsoleCP(), 0, widestr, inlen,
! (LPSTR *)&ccp, &outlen, 0, 0);
! vim_free(widestr);
! s = str = ccp;
! }
! }
! # endif
#endif
while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
{
if (!(silent_mode && p_verbose == 0))
{
! /* NL --> CR NL translation (for Unix, not for "--version") */
! p = &buf[0];
! if (*s == '\n' && !info_message)
! *p++ = '\r';
! #if defined(USE_CR)
! else
#endif
! *p++ = *s;
! *p = '\0';
! if (info_message) /* informative message, not an error */
! mch_msg((char *)buf);
! else
! mch_errmsg((char *)buf);
}
! /* primitive way to compute the current column */
#ifdef FEAT_RIGHTLEFT
if (cmdmsg_rl)
{
! if (*s == '\r' || *s == '\n')
msg_col = Columns - 1;
else
--msg_col;
--- 2570,2614 ----
msg_puts_printf(char_u *str, int maxlen)
{
char_u *s = str;
! char_u *buf = NULL;
! char_u *p = s;
! #ifdef WIN3264
if (!(silent_mode && p_verbose == 0))
! mch_settmode(TMODE_COOK); /* handle CR and NL correctly */
#endif
while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
{
if (!(silent_mode && p_verbose == 0))
{
! // NL --> CR NL translation (for Unix, not for "--version")
! if (*s == NL)
! {
! int n = (int)(s - p);
!
! buf = alloc(n + 3);
! memcpy(buf, p, n);
! if (!info_message)
! buf[n++] = CAR;
! #ifdef USE_CR
! else
#endif
! buf[n++] = NL;
! buf[n++] = NUL;
! if (info_message) // informative message, not an error
! mch_msg((char *)buf);
! else
! mch_errmsg((char *)buf);
! vim_free(buf);
! p = s + 1;
! }
}
! // primitive way to compute the current column
#ifdef FEAT_RIGHTLEFT
if (cmdmsg_rl)
{
! if (*s == CAR || *s == NL)
msg_col = Columns - 1;
else
--msg_col;
***************
*** 2628,2646 ****
else
#endif
{
! if (*s == '\r' || *s == '\n')
msg_col = 0;
else
++msg_col;
}
++s;
}
! msg_didout = TRUE; /* assume that line is not empty */
#ifdef WIN3264
- # if !defined(FEAT_GUI_MSWIN)
- vim_free(ccp);
- # endif
if (!(silent_mode && p_verbose == 0))
mch_settmode(TMODE_RAW);
#endif
--- 2616,2642 ----
else
#endif
{
! if (*s == CAR || *s == NL)
msg_col = 0;
else
++msg_col;
}
++s;
}
!
! if (*p != NUL && !(silent_mode && p_verbose == 0))
! {
! if (maxlen > 0 && STRLEN(p) > (size_t)maxlen)
! p[maxlen] = 0;
! if (info_message)
! mch_msg((char *)p);
! else
! mch_errmsg((char *)p);
! }
!
! msg_didout = TRUE; // assume that line is not empty
#ifdef WIN3264
if (!(silent_mode && p_verbose == 0))
mch_settmode(TMODE_RAW);
#endif
***************
*** 2941,2972 ****
void
mch_errmsg(char *str)
{
int len;
! #if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stderr if it's a tty.
* When not going to start the GUI also use stderr.
* On Mac, when started from Finder, stderr is the console. */
if (
! # ifdef UNIX
! # ifdef MACOS_X
(isatty(2) && strcmp("/dev/console", ttyname(2)) != 0)
! # else
isatty(2)
! # endif
! # ifdef FEAT_GUI
||
# endif
! # endif
! # ifdef FEAT_GUI
!(gui.in_use || gui.starting)
! # endif
)
{
fprintf(stderr, "%s", str);
return;
}
! #endif
/* avoid a delay for a message that isn't there */
emsg_on_display = FALSE;
--- 2937,2987 ----
void
mch_errmsg(char *str)
{
+ #if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
+ int len = STRLEN(str);
+ DWORD nwrite = 0;
+ DWORD mode = 0;
+ HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
+
+ if (GetConsoleMode(h, &mode) && enc_codepage >= 0
+ && (int)GetConsoleCP() != enc_codepage)
+ {
+ WCHAR *w = enc_to_utf16((char_u *)str, &len);
+
+ WriteConsoleW(h, w, len, &nwrite, NULL);
+ vim_free(w);
+ }
+ else
+ {
+ fprintf(stderr, "%s", str);
+ }
+ #else
int len;
! # if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stderr if it's a tty.
* When not going to start the GUI also use stderr.
* On Mac, when started from Finder, stderr is the console. */
if (
! # ifdef UNIX
! # ifdef MACOS_X
(isatty(2) && strcmp("/dev/console", ttyname(2)) != 0)
! # else
isatty(2)
! # endif
! # ifdef FEAT_GUI
||
+ # endif
# endif
! # ifdef FEAT_GUI
!(gui.in_use || gui.starting)
! # endif
)
{
fprintf(stderr, "%s", str);
return;
}
! # endif
/* avoid a delay for a message that isn't there */
emsg_on_display = FALSE;
***************
*** 2981,2987 ****
{
mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
(char_u *)str, len);
! #ifdef UNIX
/* remove CR characters, they are displayed */
{
char_u *p;
--- 2996,3002 ----
{
mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
(char_u *)str, len);
! # ifdef UNIX
/* remove CR characters, they are displayed */
{
char_u *p;
***************
*** 2995,3004 ****
*p = ' ';
}
}
! #endif
--len; /* don't count the NUL at the end */
error_ga.ga_len += len;
}
}
/*
--- 3010,3020 ----
*p = ' ';
}
}
! # endif
--len; /* don't count the NUL at the end */
error_ga.ga_len += len;
}
+ #endif
}
/*
***************
*** 3009,3015 ****
void
mch_msg(char *str)
{
! #if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stdout if we have a tty. This allows "vim -h | more" and
* uses mch_errmsg() when started from the desktop.
* When not going to start the GUI also use stdout.
--- 3025,3051 ----
void
mch_msg(char *str)
{
! #if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
! int len = STRLEN(str);
! DWORD nwrite = 0;
! DWORD mode;
! HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
!
!
! if (GetConsoleMode(h, &mode) && enc_codepage >= 0
! && (int)GetConsoleCP() != enc_codepage)
! {
! WCHAR *w = enc_to_utf16((char_u *)str, &len);
!
! WriteConsoleW(h, w, len, &nwrite, NULL);
! vim_free(w);
! }
! else
! {
! printf("%s", str);
! }
! #else
! # if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
/* On Unix use stdout if we have a tty. This allows "vim -h | more" and
* uses mch_errmsg() when started from the desktop.
* When not going to start the GUI also use stdout.
***************
*** 3035,3040 ****
--- 3071,3077 ----
}
# endif
mch_errmsg(str);
+ #endif
}
#endif /* USE_MCH_ERRMSG */
*** ../vim-8.1.0917/src/os_mswin.c 2019-02-12 23:12:33.600730918 +0100
--- src/os_mswin.c 2019-02-14 13:48:22.873645483 +0100
***************
*** 675,680 ****
--- 675,681 ----
# undef display_errors
#endif
+ #ifdef FEAT_GUI
/*
* Display the saved error message(s).
*/
***************
*** 690,702 ****
if (!isspace(*p))
{
(void)gui_mch_dialog(
- #ifdef FEAT_GUI
gui.starting ? VIM_INFO :
- #endif
VIM_ERROR,
- #ifdef FEAT_GUI
gui.starting ? (char_u *)_("Message") :
- #endif
(char_u *)_("Error"),
(char_u *)p, (char_u *)_("&Ok"),
1, NULL, FALSE);
--- 691,699 ----
***************
*** 705,710 ****
--- 702,714 ----
ga_clear(&error_ga);
}
}
+ #else
+ void
+ display_errors(void)
+ {
+ FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE));
+ }
+ #endif
#endif
*** ../vim-8.1.0917/src/vim.h 2019-02-01 20:42:18.718884011 +0100
--- src/vim.h 2019-02-14 13:48:22.873645483 +0100
***************
*** 2093,2099 ****
* functions of these names. The declarations would break if the defines had
* been seen at that stage. But it must be before globals.h, where error_ga
* is declared. */
! #if !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_X11) \
&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO)
# define mch_errmsg(str) fprintf(stderr, "%s", (str))
# define display_errors() fflush(stderr)
--- 2093,2099 ----
* functions of these names. The declarations would break if the defines had
* been seen at that stage. But it must be before globals.h, where error_ga
* is declared. */
! #if !defined(MSWIN) && !defined(FEAT_GUI_X11) \
&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO)
# define mch_errmsg(str) fprintf(stderr, "%s", (str))
# define display_errors() fflush(stderr)
*** ../vim-8.1.0917/src/version.c 2019-02-14 13:43:33.779220100 +0100
--- src/version.c 2019-02-14 13:49:48.741169891 +0100
***************
*** 785,786 ****
--- 785,788 ----
{ /* Add new patch number below this line */
+ /**/
+ 918,
/**/
--
BODY: I'm not dead!
CART DRIVER: 'Ere. He says he's not dead.
LARGE MAN: Yes he is.
BODY: I'm not!
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.