Patch 8.2.0783
Problem:    Libvterm code lags behind the upstream version.
Solution:   Include revisions 728 - 729.
Files:      src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile,
            src/libvterm/src/keyboard.c, src/libvterm/t/25state_input.test,
            src/libvterm/t/harness.c, src/libvterm/src/vterm.c,
            src/libvterm/src/vterm_internal.h,
            src/libvterm/t/26state_query.test


*** ../vim-8.2.0782/src/Make_cyg_ming.mak       2020-05-01 14:26:17.124949293 
+0200
--- src/Make_cyg_ming.mak       2020-05-17 20:16:51.242595200 +0200
***************
*** 1246,1251 ****
--- 1246,1252 ----
  
  CCCTERM = $(CC) -c $(CFLAGS) -Ilibvterm/include -DINLINE="" \
          -DVSNPRINTF=vim_vsnprintf \
+         -DSNPRINTF=vim_snprintf \
          -DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
          -DWCWIDTH_FUNCTION=utf_uint2cells \
          -DGET_SPECIAL_PTY_TYPE_FUNCTION=get_special_pty_type
*** ../vim-8.2.0782/src/Make_mvc.mak    2020-05-15 18:21:47.286058929 +0200
--- src/Make_mvc.mak    2020-05-17 20:17:05.802552868 +0200
***************
*** 1812,1817 ****
--- 1812,1818 ----
  
  CCCTERM = $(CC) $(CFLAGS) -Ilibvterm/include -DINLINE="" \
        -DVSNPRINTF=vim_vsnprintf \
+       -DSNPRINTF=vim_snprintf \
        -DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
        -DWCWIDTH_FUNCTION=utf_uint2cells \
        -DGET_SPECIAL_PTY_TYPE_FUNCTION=get_special_pty_type \
*** ../vim-8.2.0782/src/Makefile        2020-05-11 22:13:24.793171617 +0200
--- src/Makefile        2020-05-17 20:17:12.986531988 +0200
***************
*** 3537,3542 ****
--- 3537,3543 ----
  # prefix vterm_ to avoid name clashes.
  CCCTERM = $(CCC_NF) $(VTERM_CFLAGS) $(ALL_CFLAGS) -DINLINE="" \
          -DVSNPRINTF=vim_vsnprintf \
+         -DSNPRINTF=vim_snprintf \
          -DIS_COMBINING_FUNCTION=utf_iscomposing_uint \
          -DWCWIDTH_FUNCTION=utf_uint2cells
  
*** ../vim-8.2.0782/src/libvterm/src/keyboard.c 2019-10-10 20:30:04.000000000 
+0200
--- src/libvterm/src/keyboard.c 2020-05-17 19:08:02.490010475 +0200
***************
*** 102,111 ****
  
  static keycodes_s keycodes_fn[] = {
    { KEYCODE_NONE,       0, 0 },   // F0 - shouldn't happen
!   { KEYCODE_CSI_CURSOR, 'P', 0 }, // F1
!   { KEYCODE_CSI_CURSOR, 'Q', 0 }, // F2
!   { KEYCODE_CSI_CURSOR, 'R', 0 }, // F3
!   { KEYCODE_CSI_CURSOR, 'S', 0 }, // F4
    { KEYCODE_CSINUM,     '~', 15 }, // F5
    { KEYCODE_CSINUM,     '~', 17 }, // F6
    { KEYCODE_CSINUM,     '~', 18 }, // F7
--- 102,111 ----
  
  static keycodes_s keycodes_fn[] = {
    { KEYCODE_NONE,       0, 0 },   // F0 - shouldn't happen
!   { KEYCODE_SS3,      'P', 0 }, // F1
!   { KEYCODE_SS3,      'Q', 0 }, // F2
!   { KEYCODE_SS3,      'R', 0 }, // F3
!   { KEYCODE_SS3,      'S', 0 }, // F4
    { KEYCODE_CSINUM,     '~', 15 }, // F5
    { KEYCODE_CSINUM,     '~', 17 }, // F6
    { KEYCODE_CSINUM,     '~', 18 }, // F7
*** ../vim-8.2.0782/src/libvterm/t/25state_input.test   2018-03-25 
14:54:41.000000000 +0200
--- src/libvterm/t/25state_input.test   2020-05-17 19:06:12.610362364 +0200
***************
*** 111,116 ****
--- 111,128 ----
  INKEY 0 Enter
    output "\x0d\x0a"
  
+ !Unmodified F1 is SS3 P
+ INKEY 0 F1
+   output "\eOP"
+ 
+ !Modified F1 is CSI P
+ INKEY S F1
+   output "\e[1;2P"
+ INKEY A F1
+   output "\e[1;3P"
+ INKEY C F1
+   output "\e[1;5P"
+ 
  !Keypad in DECKPNM
  INKEY 0 KP0
    output "0"
*** ../vim-8.2.0782/src/libvterm/t/harness.c    2020-04-12 14:50:22.317438970 
+0200
--- src/libvterm/t/harness.c    2020-05-17 19:06:12.610362364 +0200
***************
*** 47,52 ****
--- 47,53 ----
      { "Tab",   VTERM_KEY_TAB },
      { "Enter", VTERM_KEY_ENTER },
      { "KP0",   VTERM_KEY_KP_0 },
+     { "F1",    VTERM_KEY_FUNCTION(1) },
      { NULL,    VTERM_KEY_NONE },
    };
    int i;
*** ../vim-8.2.0782/src/libvterm/src/vterm.c    2019-12-04 22:08:47.000000000 
+0100
--- src/libvterm/src/vterm.c    2020-05-17 20:43:17.219953310 +0200
***************
*** 74,79 ****
--- 74,82 ----
      return NULL;
    }
  
+   vt->tmpbuffer_len = 64;
+   vt->tmpbuffer = vterm_allocator_malloc(vt, vt->tmpbuffer_len);
+ 
    return vt;
  }
  
***************
*** 135,201 ****
  INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t 
len)
  {
    if(len > vt->outbuffer_len - vt->outbuffer_cur) {
!     DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n");
!     len = vt->outbuffer_len - vt->outbuffer_cur;
    }
  
    memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len);
    vt->outbuffer_cur += len;
  }
  
- static int outbuffer_is_full(VTerm *vt)
- {
-   return vt->outbuffer_cur >= vt->outbuffer_len - 1;
- }
- 
  #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \
        || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE)
  # undef VSNPRINTF
  # define VSNPRINTF vsnprintf
  #else
  # ifdef VSNPRINTF
  // Use a provided vsnprintf() function.
  int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap);
  # endif
  #endif
  
  
  INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, 
va_list args)
  {
!   int written;
  #ifndef VSNPRINTF
    // When vsnprintf() is not available (C90) fall back to vsprintf().
    char buffer[1024]; // 1Kbyte is enough for everybody, right?
  #endif
  
-   if(outbuffer_is_full(vt)) {
-     DEBUG_LOG("vterm_push_output(): buffer overflow; truncating output\n");
-     return;
-   }
- 
  #ifdef VSNPRINTF
!   written = VSNPRINTF(vt->outbuffer + vt->outbuffer_cur,
!       vt->outbuffer_len - vt->outbuffer_cur,
!       format, args);
! 
!   if(written == (int)(vt->outbuffer_len - vt->outbuffer_cur)) {
!     // output was truncated
!     vt->outbuffer_cur = vt->outbuffer_len - 1;
!   }
!   else
!     vt->outbuffer_cur += written;
  #else
!   written = vsprintf(buffer, format, args);
! 
!   if(written >= (int)(vt->outbuffer_len - vt->outbuffer_cur - 1)) {
!     // output was truncated
!     written = vt->outbuffer_len - vt->outbuffer_cur - 1;
!   }
!   if (written > 0)
!   {
!     strncpy(vt->outbuffer + vt->outbuffer_cur, buffer, written + 1);
!     vt->outbuffer_cur += written;
!   }
  #endif
  }
  
--- 138,183 ----
  INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t 
len)
  {
    if(len > vt->outbuffer_len - vt->outbuffer_cur) {
!     DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping 
output\n");
!     return;
    }
  
    memcpy(vt->outbuffer + vt->outbuffer_cur, bytes, len);
    vt->outbuffer_cur += len;
  }
  
  #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \
        || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE)
  # undef VSNPRINTF
  # define VSNPRINTF vsnprintf
+ # undef SNPRINTF
+ # define SNPRINTF snprintf
  #else
  # ifdef VSNPRINTF
  // Use a provided vsnprintf() function.
  int VSNPRINTF(char *str, size_t str_m, const char *fmt, va_list ap);
  # endif
+ # ifdef SNPRINTF
+ // Use a provided snprintf() function.
+ int SNPRINTF(char *str, size_t str_m, const char *fmt, ...);
+ # endif
  #endif
  
  
  INTERNAL void vterm_push_output_vsprintf(VTerm *vt, const char *format, 
va_list args)
  {
!   size_t len;
  #ifndef VSNPRINTF
    // When vsnprintf() is not available (C90) fall back to vsprintf().
    char buffer[1024]; // 1Kbyte is enough for everybody, right?
  #endif
  
  #ifdef VSNPRINTF
!   len = VSNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len, format, args);
!   vterm_push_output_bytes(vt, vt->tmpbuffer, len);
  #else
!   len = vsprintf(buffer, format, args);
!   vterm_push_output_bytes(vt, buffer, len);
  #endif
  }
  
***************
*** 209,248 ****
  
  INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, 
const char *fmt, ...)
  {
!   size_t orig_cur = vt->outbuffer_cur;
    va_list args;
  
    if(ctrl >= 0x80 && !vt->mode.ctrl8bit)
!     vterm_push_output_sprintf(vt, ESC_S "%c", ctrl - 0x40);
    else
!     vterm_push_output_sprintf(vt, "%c", ctrl);
  
    va_start(args, fmt);
    vterm_push_output_vsprintf(vt, fmt, args);
    va_end(args);
- 
-   if(outbuffer_is_full(vt))
-     vt->outbuffer_cur = orig_cur;
  }
  
  INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...)
  {
!   size_t orig_cur = vt->outbuffer_cur;
    va_list args;
  
    if(!vt->mode.ctrl8bit)
!     vterm_push_output_sprintf(vt, ESC_S "%c", C1_DCS - 0x40);
    else
!     vterm_push_output_sprintf(vt, "%c", C1_DCS);
  
    va_start(args, fmt);
    vterm_push_output_vsprintf(vt, fmt, args);
    va_end(args);
  
!   vterm_push_output_sprintf_ctrl(vt, C1_ST, "");
! 
!   if(outbuffer_is_full(vt))
!     vt->outbuffer_cur = orig_cur;
  }
  
  size_t vterm_output_get_buffer_size(const VTerm *vt)
--- 191,242 ----
  
  INTERNAL void vterm_push_output_sprintf_ctrl(VTerm *vt, unsigned char ctrl, 
const char *fmt, ...)
  {
!   size_t cur;
    va_list args;
  
    if(ctrl >= 0x80 && !vt->mode.ctrl8bit)
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         ESC_S "%c", ctrl - 0x40);
    else
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         "%c", ctrl);
!   if(cur >= vt->tmpbuffer_len)
!     return;
!   vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
  
    va_start(args, fmt);
    vterm_push_output_vsprintf(vt, fmt, args);
    va_end(args);
  }
  
  INTERNAL void vterm_push_output_sprintf_dcs(VTerm *vt, const char *fmt, ...)
  {
!   size_t cur;
    va_list args;
  
    if(!vt->mode.ctrl8bit)
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         ESC_S "%c", C1_DCS - 0x40);
    else
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         "%c", C1_DCS);
!   if(cur >= vt->tmpbuffer_len)
!     return;
!   vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
  
    va_start(args, fmt);
    vterm_push_output_vsprintf(vt, fmt, args);
    va_end(args);
  
!   if(!vt->mode.ctrl8bit)
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         ESC_S "%c", C1_ST - 0x40);
!   else
!     cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!         "%c", C1_ST);
!   if(cur >= vt->tmpbuffer_len)
!     return;
!   vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
  }
  
  size_t vterm_output_get_buffer_size(const VTerm *vt)
*** ../vim-8.2.0782/src/libvterm/src/vterm_internal.h   2019-10-10 
19:44:39.000000000 +0200
--- src/libvterm/src/vterm_internal.h   2020-05-17 19:10:17.189581332 +0200
***************
*** 211,216 ****
--- 211,219 ----
    size_t outbuffer_len;
    size_t outbuffer_cur;
  
+   char  *tmpbuffer;
+   size_t tmpbuffer_len;
+ 
    VTermState *state;
    VTermScreen *screen;
  
*** ../vim-8.2.0782/src/libvterm/t/26state_query.test   2019-08-18 
20:58:44.000000000 +0200
--- src/libvterm/t/26state_query.test   2020-05-17 19:28:35.090835607 +0200
***************
*** 59,62 ****
  
  !Truncation on attempted buffer overflow
  PUSH "\e[6n" x 30
!   output "\e[10;10R" x 24
--- 59,62 ----
  
  !Truncation on attempted buffer overflow
  PUSH "\e[6n" x 30
!   output "\e[10;10R" x 25
*** ../vim-8.2.0782/src/version.c       2020-05-17 18:53:22.104931177 +0200
--- src/version.c       2020-05-17 20:51:43.394153355 +0200
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     783,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
121. You ask for e-mail adresses instead of telephone numbers.

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202005171853.04HIraG8007742%40masaka.moolenaar.net.

Raspunde prin e-mail lui