Patch 8.2.0784
Problem:    Libvterm code lags behind the upstream version.
Solution:   Include revisions 730 - 733.
Files:      src/libvterm/src/vterm.c, src/libvterm/src/state.c,
            src/libvterm/include/vterm.h, src/libvterm/src/vterm_internal.h,
            src/libvterm/t/harness.c


*** ../vim-8.2.0783/src/libvterm/src/vterm.c    2020-05-17 20:52:40.733955160 
+0200
--- src/libvterm/src/vterm.c    2020-05-17 21:32:13.673312302 +0200
***************
*** 64,69 ****
--- 64,72 ----
      return NULL;
    }
  
+   vt->outfunc = NULL;
+   vt->outdata = NULL;
+ 
    vt->outbuffer_len = 200;
    vt->outbuffer_cur = 0;
    vt->outbuffer = vterm_allocator_malloc(vt, vt->outbuffer_len);
***************
*** 135,142 ****
--- 138,156 ----
    vt->mode.utf8 = is_utf8;
  }
  
+ void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void 
*user)
+ {
+   vt->outfunc = func;
+   vt->outdata = user;
+ }
+ 
  INTERNAL void vterm_push_output_bytes(VTerm *vt, const char *bytes, size_t 
len)
  {
+   if(vt->outfunc) {
+     (vt->outfunc)(bytes, len, vt->outdata);
+     return;
+   }
+ 
    if(len > vt->outbuffer_len - vt->outbuffer_cur) {
      DEBUG_LOG("vterm_push_output_bytes(): buffer overflow; dropping 
output\n");
      return;
***************
*** 146,169 ****
    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;
--- 160,165 ----
***************
*** 214,225 ****
    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);
--- 210,218 ----
    size_t cur;
    va_list args;
  
!   cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!       vt->mode.ctrl8bit ? "\x90" : ESC_S "P"); // DCS
! 
    if(cur >= vt->tmpbuffer_len)
      return;
    vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
***************
*** 228,239 ****
    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);
--- 221,228 ----
    vterm_push_output_vsprintf(vt, fmt, args);
    va_end(args);
  
!   cur = SNPRINTF(vt->tmpbuffer, vt->tmpbuffer_len,
!       vt->mode.ctrl8bit ? "\x9C" : ESC_S "\\"); // ST
    if(cur >= vt->tmpbuffer_len)
      return;
    vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
*** ../vim-8.2.0783/src/libvterm/src/state.c    2020-05-17 16:03:58.500875755 
+0200
--- src/libvterm/src/state.c    2020-05-17 21:25:26.042741204 +0200
***************
*** 1617,1622 ****
--- 1617,1624 ----
  
  static void request_status_string(VTermState *state, const char *command, 
size_t cmdlen)
  {
+   VTerm *vt = state->vt;
+ 
    if(cmdlen == 1)
      switch(command[0]) {
        case 'm': // Query SGR
***************
*** 1624,1645 ****
            long args[20];
            int argc = vterm_state_getpen(state, args, 
sizeof(args)/sizeof(args[0]));
          int argi;
!           vterm_push_output_sprintf_ctrl(state->vt, C1_DCS, "1$r");
!           for(argi = 0; argi < argc; argi++)
!             vterm_push_output_sprintf(state->vt,
!                 argi == argc - 1             ? "%d" :
!                 CSI_ARG_HAS_MORE(args[argi]) ? "%d:" :
!                                                "%d;",
!                 CSI_ARG(args[argi]));
!           vterm_push_output_sprintf(state->vt, "m");
!           vterm_push_output_sprintf_ctrl(state->vt, C1_ST, "");
          }
          return;
        case 'r': // Query DECSTBM
!         vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%dr", 
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
          return;
        case 's': // Query DECSLRM
!         vterm_push_output_sprintf_dcs(state->vt, "1$r%d;%ds", 
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
          return;
      }
  
--- 1626,1662 ----
            long args[20];
            int argc = vterm_state_getpen(state, args, 
sizeof(args)/sizeof(args[0]));
          int argi;
!           size_t cur = 0;
! 
!           cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
!               vt->mode.ctrl8bit ? "\x90" "1$r" : ESC_S "P" "1$r"); // DCS 1$r 
...
!           if(cur >= vt->tmpbuffer_len)
!             return;
! 
!           for(argi = 0; argi < argc; argi++) {
!             cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
!                 argi == argc - 1             ? "%ld" :
!                 CSI_ARG_HAS_MORE(args[argi]) ? "%ld:" :
!                                                "%ld;",
!                  CSI_ARG(args[argi]));
! 
!             if(cur >= vt->tmpbuffer_len)
!               return;
!           }
! 
!           cur += SNPRINTF(vt->tmpbuffer + cur, vt->tmpbuffer_len - cur,
!               vt->mode.ctrl8bit ? "m" "\x9C" : "m" ESC_S "\\"); // ... m ST
!           if(cur >= vt->tmpbuffer_len)
!             return;
! 
!           vterm_push_output_bytes(vt, vt->tmpbuffer, cur);
          }
          return;
        case 'r': // Query DECSTBM
!         vterm_push_output_sprintf_dcs(vt, "1$r%d;%dr", 
state->scrollregion_top+1, SCROLLREGION_BOTTOM(state));
          return;
        case 's': // Query DECSLRM
!         vterm_push_output_sprintf_dcs(vt, "1$r%d;%ds", 
SCROLLREGION_LEFT(state)+1, SCROLLREGION_RIGHT(state));
          return;
      }
  
***************
*** 1653,1663 ****
        }
        if(state->mode.cursor_blink)
          reply--;
!       vterm_push_output_sprintf_dcs(state->vt, "1$r%d q", reply);
        return;
      }
      else if(strneq(command, "\"q", 2)) {
!       vterm_push_output_sprintf_dcs(state->vt, "1$r%d\"q", 
state->protected_cell ? 1 : 2);
        return;
      }
    }
--- 1670,1680 ----
        }
        if(state->mode.cursor_blink)
          reply--;
!       vterm_push_output_sprintf_dcs(vt, "1$r%d q", reply);
        return;
      }
      else if(strneq(command, "\"q", 2)) {
!       vterm_push_output_sprintf_dcs(vt, "1$r%d\"q", state->protected_cell ? 1 
: 2);
        return;
      }
    }
*** ../vim-8.2.0783/src/libvterm/include/vterm.h        2019-12-04 
22:09:41.000000000 +0100
--- src/libvterm/include/vterm.h        2020-05-17 21:30:06.857756057 +0200
***************
*** 194,203 ****
--- 194,210 ----
  
  size_t vterm_input_write(VTerm *vt, const char *bytes, size_t len);
  
+ /* Setting output callback will override the buffer logic */
+ typedef void VTermOutputCallback(const char *s, size_t len, void *user);
+ void vterm_output_set_callback(VTerm *vt, VTermOutputCallback *func, void 
*user);
+ 
+ /* These buffer functions only work if output callback is NOT set
+  * These are deprecated and will be removed in a later version */
  size_t vterm_output_get_buffer_size(const VTerm *vt);
  size_t vterm_output_get_buffer_current(const VTerm *vt);
  size_t vterm_output_get_buffer_remaining(const VTerm *vt);
  
+ /* This too */
  size_t vterm_output_read(VTerm *vt, char *buffer, size_t len);
  
  int vterm_is_modify_other_keys(VTerm *vt);
*** ../vim-8.2.0783/src/libvterm/src/vterm_internal.h   2020-05-17 
20:52:40.733955160 +0200
--- src/libvterm/src/vterm_internal.h   2020-05-17 21:30:06.857756057 +0200
***************
*** 207,212 ****
--- 207,215 ----
  
    // len == malloc()ed size; cur == number of valid bytes
  
+   VTermOutputCallback *outfunc;
+   void                *outdata;
+ 
    char  *outbuffer;
    size_t outbuffer_len;
    size_t outbuffer_cur;
***************
*** 268,271 ****
--- 271,294 ----
  int vterm_unicode_is_ambiguous(uint32_t codepoint);
  int vterm_get_special_pty_type(void);
  
+ #if (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 500) \
+       || defined(_ISOC99_SOURCE) || defined(_BSD_SOURCE)
+ # undef VSNPRINTF
+ # define VSNPRINTF vsnprintf
+ # undef 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
+ #ifndef SNPRINTF
+ # define SNPRINTF snprintf
+ #endif
+ 
+ 
  #endif
*** ../vim-8.2.0783/src/libvterm/t/harness.c    2020-05-17 20:52:40.733955160 
+0200
--- src/libvterm/t/harness.c    2020-05-17 21:44:50.631596712 +0200
***************
*** 483,488 ****
--- 483,491 ----
      if(streq(line, "INIT")) {
        if(!vt)
          vt = vterm_new(25, 80);
+ 
+       // Somehow this makes tests fail
+       // vterm_output_set_callback(vt, term_output, NULL);
      }
  
      else if(streq(line, "WANTPARSER")) {
*** ../vim-8.2.0783/src/version.c       2020-05-17 20:52:40.733955160 +0200
--- src/version.c       2020-05-17 21:48:32.038954920 +0200
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     784,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
122. You ask if the Netaholics Anonymous t-shirt you ordered can be
     sent to you via e-mail.

 /// Bram Moolenaar -- b...@moolenaar.net -- 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 vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202005172021.04HKLcmN005967%40masaka.moolenaar.net.

Raspunde prin e-mail lui