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.

Raspunde prin e-mail lui